Thanks, Andrew Fish
> On Aug 25, 2015, at 2:43 PM, Benjamin Herrenschmidt <[email protected]> wrote: > > On Wed, 2015-08-26 at 07:18 +1000, Benjamin Herrenschmidt wrote: >> >>> 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 ... >> >>> 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 :-( >> >> 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. > > Ok, correction, this is even worse. You *cannot* implement a complete > GOP driver without that assumption. A GOP driver is supposed to provide > a EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE structure, which contains a > FrameBufferBase which is defined to be the CPU physical address of the > frame buffer. > > So if we stick to the definition of GetBarAttributes() only returning a > BAR value, then it's impossible to implement a PCI GOP driver by > following the spec. > I came to that conclusion too. > Now, there's one thing that might work, which would be to exploit the > "AddressTranslationOffset" field of the ACPI resource descriptor. > How do you represent a system like this in ACPI? It might be a good idea to solve it in a similar way. > AFAIK, the UEFI spec doesn't do a very good job at describing how it > uses these descriptors (this is an interesting "dependency" between > UEFI and ACPI btw, my platform otherwise doesn't use ACPI). EDK2 > hijacks that field for other means bct that should be fixable. > > I'll try to hop on the UEFI call tomorrow (morning my time, ie, .au) in > place of the IBM rep (it's too early for Jeremy anyway) and start that > discussion. > > As it is, there is a contradiction in the spec between PCI trying to > prevent direct access to BAR regions and at least GOP requiring to pass > a physical address pointing to the device (and possibly other IO > protocols, I haven't looked in details). > The PCI IO was designed to not required the 1:1 mapping. The direct access to the Framebuffer came along later, as was mostly a fallback for the OS on a safe mode boot kind of thing. I think we missed passing the frame buffer out on a system that was not 1:1. Thanks, Andrew Fish > Cheers, > Ben. > _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

