Subject: sparse vs. dense pci space
To: None <port-alpha@NetBSD.ORG>
From: Andrew Gallatin <gallatin@cs.duke.edu>
List: port-alpha
Date: 12/13/1997 20:05:35
I'm attempting to get my 3rd-party Myrinet device driver going under
NetBSD/alpha.
I last had it working in a -current source tree dated late spring or
early summer. Since then, it looks like external access to
pci_mem_find() has been revoked. So, I went about changing my pci
attach function to use pci_mapreg_map(). I ended up panic'ing when
attempting to read from the memory mapped area returned to me by
pci_mapreg_map().
I eventually turned on extent debugging in
arch/alpha/pci/cia_swiz_bus_mem.c From the output of the debugging
printfs in pci_swiz_bus_mem_chipdep.c, it looks like I'm getting back
a handle for a sparse address. The problem is that I need a
dense-space address. I came up with a gross workaround to force
bus_space_map to give me back the sort of address I can use. Doing
what I'm doing right now strikes me as wrong; can somebody offer a
suggestion as to how I should approach this? Since there isn't a way
to specify dense/sparse, I think I must be doing something wrong.
To clarify, here's code snippets from my attach function, and some
of the printfs from arch/alpha/pci/cia_swiz_bus_mem.c
(running on a AS600/266).
What I used to do:
if (pci_mem_find(pa->pa_pc, pa->pa_tag, 0x10, ®base,
®size, &cacheable))
return;
if (bus_space_map(sc->myri_bustag, regbase, regsize, cacheable,
&sc->myri_bushandle))
return;
What I think I should be able to do:
if (pci_mapreg_map(pa, 0x10, PCI_MAPREG_TYPE_MEM, 0,
&sc->myri_bustag, &sc->myri_bushandle,
®base, ®size)) {
printf(": can't map registers\n");
return;
}
What I'm doing right now:
if (pci_mapreg_info(pa->pa_pc, pa->pa_tag, 0x10, PCI_MAPREG_TYPE_MEM,
®base, ®size, &cacheable))
return;
if (bus_space_map(sc->myri_bustag, regbase, regsize, cacheable|BUS_SPACE_MAP_CACHEABLE,
&sc->myri_bushandle))
return;
An example of the faulting read:
mb = (struct MYRINET_BOARD *)sc->myri_bushandle;
sc->myri_eeprom = (struct MYRINET_EEPROM *)&mb->lanai_eeprom[0];
The dense & sparce extents that were printed out from extent_print():
extent `cia_swiz_bus_dmem' (0x0 - 0xffffffffffffffff), flags = 0x1
0x100000000 - 0xfffffffffffffffe
extent `cia_swiz_bus_smem' (0x0 - 0xffffffffffffffff), flags = 0x1
0x4000000 - 0x7fffffff
0xa8000000 - 0xfffffffffffffffe
The value of the sparse handle I was getting back before my
workaround:
regbase = 0x82000000
sc->myri_bushandle = 0x7ffffe402000000
And after:
regbase = 0x82000000
sc->myri_bushandle = 0x7ffffe402000000
sc->myri_bushandle = 0xfffffc8682000000
Thanks,
Drew
------------------------------------------------------------------------------
Andrew Gallatin, Sr Systems Programmer http://www.cs.duke.edu/~gallatin
Duke University Email: gallatin@cs.duke.edu
Department of Computer Science Phone: (919) 660-6590