On Thu, Oct 29, 2009 at 12:30:02PM +0100, Màrius Montón wrote: > Lennart Sorensen wrote: > > On Tue, Oct 27, 2009 at 04:05:25PM +0100, Màrius Montón wrote: > > > Màrius Montón wrote: > > > Hello, > > For my PCI device to QEMU, I need the real address the PCI bus is > using > to access my device. For a IO BAR (PCI_ADDRESS_SPACE_IO), I > receive the > real address (like 0xc200 or similar), but when registering a > PCI_ADDRESS_SPACE_MEM I only receive the offset to the BAR. > > How I can receive or obtaint the real address on each access to > my device? > > Cjeers, > > Màrius > > > > nobody can tell me anything? :( > > > Add the offset to the address in the bar? > > The problem is how to know what bar is accessing in case I have only one > function for all BARs.
I expect that's unusual: different BARs usually have different functionality. Just implement different functions and pass calls on to a shared helper? > After all the OS is allowed to change your BAR if it wants to. > So internally the only thing that makes sense to a PCI device is the > offset from it's base address. > > You listen to addresses at your IO range, and at your memory BAR range. > What you do when you see a request for your range then depends on the > offset that address had from the current base. This would also be true > for the IO. > > I know all PCI internals, but I don't understand why for IO I receive all > address and only the offset for MEM BARs (or I'm wrong?) > > Màrius PCI only calls a map method. I think this gets a 32 bit address, not BAR offset: r->addr = new_addr; if (r->addr != -1) { r->map_func(d, i, r->addr, r->size, r->type); } -- MST