Thanks,

Andrew Fish




> On Aug 25, 2015, at 2:18 PM, Benjamin Herrenschmidt 
> <[email protected]> wrote:
> 
> On Tue, 2015-08-25 at 06:47 -0700, Andrew Fish wrote:
> 
>>> Sadly it doesn't seem like the UEFI spec caters well to that non
>>> -1:1
>>> mapping (which is quite common outside of the x86 world), and
>>> doesn't
>>> really sat what GetBarAttributes() is supposed to return. However,
>>> practically, for GOP drivers (and possibly others) to work, we need
>>> to
>>> return a CPU physical address, so we need to *translate* the BAR
>>> value.
>>> 
>> I think you have it backwards. The UEFI spec abstracts PCI properly,
>> and drivers are implemented incorrectly, but they work due to x86 PC
>> assumptions. 
>> 
>> GetBarAttributes() returns the BAR. 
> 
> Well, the spec doesn't spell it out precisely but …
> 

The BAR is a PCI address by definition. 

>> That is the correct thing to do. If that Bar was accessed via>
>> EFI_PCI_IO_PROTOCOL.Mem.Read()/EFI_PCI_IO_PROTOCOL.Mem.Write()//EFI_P
>> CI_IO_PROTOCOL.CopyMem()  then it is being accessed relative to the
>> BAR and everything should work. Casting a pointer to the value
>> returned in GetBarAttributes() is not guaranteed to work. 
> 
> Except that a lot drivers do it :-(
> 

Then we should get these drivers fixed. 

> For example anything using OptionRomPkg/Library/BitBltLib does it.
> 
> So the GOP drivers in-tree in EDK2 do it, I can ask nVidia what their
> EFI driver does but I woudn't be surprised if it's everywhere.
> 

Well the GOP returns a FrameBuffer, so that address needs to be adjusted. So 
that seems to be the bug in the spec. I’ll bring this up to the UEFI Forum. 

But I think for the non FrameBuffer case it would be better to fix the drivers. 

Thanks,

Andrew Fish

> UfsPciHcDxe is another one in the tree.
> 
> Arguably it's the only way to have usable performance out of a GOP...
> So in any case, it doesn't change the situation. A spec not follow by
> drivers is worthless, only what the drivers do actually matter and thus
> I need to provide something that will make them work (famous Linus
> quote more/less :-)
> 
> One could argue that the BAR can be read just fine by a driver using a
> PCI configuration space read, and thus GetBarAttribute() is the perfect
> place to return the CPU address. This would be a nop on platforms using
> a 1:1 mapping and make things "just work" on others. That would require
> a simple clarification in the next spec version.
> 
>> There have  also been lots of bugs in regards to DMA. Drivers don’t
>> use Map()/Unmap()/AllocateBuffer() correctly, but since x86 makes DMA
>> cache coherent it all seems to work. When we did the 1st port to ARM
>> even the edk2 USB stack had issues not doing DMA correctly (On ARM
>> you end up doing DMA into non-cached buffers, so you need to follow
>> the rules).
> 
> Well, on some ARMs at least but yes. I see.
> 
>> Adding hacks to work around broken drivers is just going to cause
>> chaos. 
> 
> While I generally agree, I think in this specific case, it does make
> sense to redefine the semantics of GetBarAttributes(). That or provided
> a new optional protocol to allow direct mapping of the BAR into the CPU
> space.
> 
> Something tells me that otherwise a bunch of drivers are essentially
> going to be unfixable (/me eyes GPUs ...)
> 
>> You are going to need to work with the driver writers to get their
>> driver fixed.
>> 
>> https://urldefense.proofpoint.com/v2/url?u=http-3A__tianocore.sourceforge.net_wiki_UEFI-5FDriver-5FWriter-27s-5FGuide&d=BQIDaQ&c=eEvniauFctOgLOKGJOplqw&r=1HnUuXD1wDvw67rut5_idw&m=hlb6m5Pc6p6DlF5msA_xOLq7RbOHDol2huBe2-9uvT8&s=GZPYMjLcMvwAh5svYi8l4whKOKof3r3JVWIZUXsBB4g&e=
>>  
>> The PCI I/O Protocol provides services that allow a PCI driver to
>> easily access the resources of the PCI controllers it is currently
>> managing. These services hide platform- specific implementation
>> details and prevent a PCI driver from inadvertently accessing
>> resources of the motherboard or other PCI controllers. The PCI I/O
>> Protocol has also been designed to simplify the implementation of PCI
>> drivers. For example, a PCI driver should never read the BARs in the
>> PCI configuration header. Instead, the PCI driver passes in a
>> BarIndex and Offset into the PCI I/O Protocol services. The PCI bus
>> driver is responsible for managing the PCI controller’s BARs.
> 
> Yes, I understand that, but in practice I very much doubt those drivers
> will be fixed and the end user is going to blame the platform instead.
> 
> Ben.
> 
>> Thanks,
>> 
>> Andrew Fish
>> 
>>> Cheers,
>>> Ben.
>>> _______________________________________________
>>> edk2-devel mailing list
>>> [email protected]
>>> https://urldefense.proofpoint.com/v2/url?u=https-3A__lists.01.org_m
>>> ailman_listinfo_edk2
>>> -2Ddevel&d=BQICAg&c=eEvniauFctOgLOKGJOplqw&r=1HnUuXD1wDvw67rut5_idw
>>> &m=QE9d1rL3ijH-gexHgoNe54QWnW
>>> -gCrncwCMR3WJMIDs&s=MyGORn2OZERedpoAMdvuxIcbai_x3TEDR9WZqoxJmJg&e= 

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to