Ben, Can I check in this patch firstly without your real platform testing? Since you might not be able to test it very soon. And when later there is a bug, I can provide additional patch to fix it.
Regards, Ray >-----Original Message----- >From: Laszlo Ersek [mailto:[email protected]] >Sent: Thursday, February 25, 2016 5:22 PM >To: Ni, Ruiyu <[email protected]>; [email protected] >Cc: Benjamin Herrenschmidt <[email protected]>; Andrew Fish <[email protected]>; >Fan, Jeff <[email protected]> >Subject: Re: [edk2] [Patch V4 3/3] MdeModuelPkg/PciBus: Return >AddrTranslationOffset in GetBarAttributes > >On 02/25/16 01:56, Ruiyu Ni wrote: >> Some platform doesn't use CPU(HOST)/Device 1:1 mapping for PCI Bus. >> But PCI IO doesn't have interface to tell caller (device driver) >> whether the address returned by GetBarAttributes() is HOST address >> or device address. >> UEFI Spec 2.6 addresses this issue by clarifying the address returned >> is HOST address and caller can use AddrTranslationOffset to calculate >> the device address. >> >> Contributed-under: TianoCore Contribution Agreement 1.0 >> Signed-off-by: Ruiyu Ni <[email protected]> >> Cc: Benjamin Herrenschmidt <[email protected]> >> Cc: Andrew Fish <[email protected]> >> Cc: Jeff Fan <[email protected]> >> --- >> MdeModulePkg/Bus/Pci/PciBusDxe/PciIo.c | 62 >> ++++++++++++++++++++++++++++++++++ >> 1 file changed, 62 insertions(+) > >Reviewed-by: Laszlo Ersek <[email protected]> > >Thanks! > >> diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciIo.c >> b/MdeModulePkg/Bus/Pci/PciBusDxe/PciIo.c >> index 334a6ac..f72598d 100644 >> --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciIo.c >> +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciIo.c >> @@ -1744,6 +1744,53 @@ PciIoAttributes ( >> } >> >> /** >> + Retrieve the AddrTranslationOffset from RootBridgeIo for the >> + specified range. >> + >> + @param RootBridgeIo Root Bridge IO instance. >> + @param AddrRangeMin The base address of the MMIO. >> + @param AddrLen The length of the MMIO. >> + >> + @retval The AddrTranslationOffset from RootBridgeIo for the >> + specified range, or (UINT64) -1 if the range is not >> + found in RootBridgeIo. >> +**/ >> +UINT64 >> +GetMmioAddressTranslationOffset ( >> + EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *RootBridgeIo, >> + UINT64 AddrRangeMin, >> + UINT64 AddrLen >> + ) >> +{ >> + EFI_STATUS Status; >> + EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Configuration; >> + >> + Status = RootBridgeIo->Configuration ( >> + RootBridgeIo, >> + (VOID **) &Configuration >> + ); >> + if (EFI_ERROR (Status)) { >> + return (UINT64) -1; >> + } >> + >> + while (Configuration->Desc == ACPI_ADDRESS_SPACE_DESCRIPTOR) { >> + if ((Configuration->ResType == ACPI_ADDRESS_SPACE_TYPE_MEM) && >> + (Configuration->AddrRangeMin <= AddrRangeMin) && >> + (Configuration->AddrRangeMin + Configuration->AddrLen >= >> AddrRangeMin + AddrLen) >> + ) { >> + return Configuration->AddrTranslationOffset; >> + } >> + Configuration++; >> + } >> + >> + // >> + // The resource occupied by BAR should be in the range reported by >> RootBridge. >> + // >> + ASSERT (FALSE); >> + return (UINT64) -1; >> +} >> + >> +/** >> Gets the attributes that this PCI controller supports setting on a BAR >> using >> SetBarAttributes(), and retrieves the list of resource descriptors for a >> BAR. >> >> @@ -1867,6 +1914,21 @@ PciIoGetBarAttributes ( >> End = (EFI_ACPI_END_TAG_DESCRIPTOR *) (Descriptor + 1); >> End->Desc = ACPI_END_TAG_DESCRIPTOR; >> End->Checksum = 0; >> + >> + // >> + // Get the Address Translation Offset >> + // >> + if (Descriptor->ResType == ACPI_ADDRESS_SPACE_TYPE_MEM) { >> + Descriptor->AddrTranslationOffset = GetMmioAddressTranslationOffset ( >> + PciIoDevice->PciRootBridgeIo, >> + Descriptor->AddrRangeMin, >> + Descriptor->AddrLen >> + ); >> + if (Descriptor->AddrTranslationOffset == (UINT64) -1) { >> + FreePool (Descriptor); >> + return EFI_UNSUPPORTED; >> + } >> + } >> } >> >> return EFI_SUCCESS; >> _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

