Michael S. Tsirkin wrote: > 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? > > It is because I'm trying to add PCI devices from a configuration file (no hot-plug), and this way was the easies way I found... any idea? >> 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); > } > > > I may study that functions
Màrius