Subject: Re: Any way to get virtual addr from pci_mapreg_map()?
To: Dave Huang <khym@bga.com>
From: Chris G. Demetriou <cgd@pa.dec.com>
List: tech-kern
Date: 08/12/1997 10:34:28
> I'm using pci_mapreg_map() to map the chip's RAM, passing it
> PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT for the "expected"
> argument. This gets me a tag and handle that I can use with the
> bus_space_* macros/functions to access the memory. However, the driver
> wants to be able to access the memory as a struct, and do stuff like
> "scriptstruct->member = somevalue".
"so, fix it." That is not portable code. Device memory may not be
mapped linearly, and indeed on many systems _is not_ mapped inearly.
Do you know off-hand whether the mapping registers say that the region
is prefetchable or not? (I'm just wondering for my own curiosity; it
doesn't affect anything i've said here.)
> I could use the bus_space_write*
> macros, but that kinda seems like it'd make the code harder to read,
No, it makes the code _correct_, not harder to read.
Code that isn't correct is useless (if what you want to do is use it
successfully 8-), regardless of how easy to read it is.
> so I'm wondering if it's possible to get a virtual address out of the
> tag and handle that I can assign to a pointer.
You can't. There's no necessary correspondence between handle
representation and virtual address, and even if there were, as i said,
the memory may not be mapped linearly. (I can easily imagine
cases/systems where you might want and be able to to access memory in
such a way that it's not even mapped into kernel VA space.)
> As a workaround, I'm just using the bus_space_handle_t that I get back
> as the pointer to the memory (since at least on the i386, that's what
> it is), but this is probably not a good MI thing to be doing :)
That is _not_ a good MI thing to be doing, and isn't even a
particularly good MD thing to be doing.
cgd