[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] Re: Re: PCI address question
From: |
Michael S. Tsirkin |
Subject: |
[Qemu-devel] Re: Re: PCI address question |
Date: |
Thu, 29 Oct 2009 14:12:22 +0200 |
User-agent: |
Mutt/1.5.19 (2009-01-05) |
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