qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] Re: PCI address question


From: Màrius Montón
Subject: [Qemu-devel] Re: PCI address question
Date: Thu, 29 Oct 2009 14:05:22 +0100
User-agent: Thunderbird 2.0.0.23 (X11/20090817)


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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]