On 2 February 2018 at 00:34, Ni, Ruiyu <ruiyu...@intel.com> wrote: > > >> -----Original Message----- >> From: Ard Biesheuvel [mailto:ard.biesheu...@linaro.org] >> Sent: Friday, February 2, 2018 1:23 AM >> To: Ni, Ruiyu <ruiyu...@intel.com> >> Cc: Guo Heyi <heyi....@linaro.org>,Dong Wei <dong....@arm.com>; Dong, >> Eric <eric.d...@intel.com>; edk2-devel@lists.01.org; linaro-uefi <linaro- >> u...@lists.linaro.org>; Kinney, Michael D <michael.d.kin...@intel.com>; Zeng, >> Star <star.z...@intel.com> >> Subject: Re: [edk2] [RFC] MdeModulePkg/PciHostBridgeDxe: Add support for >> address translation >> >> On 1 February 2018 at 05:03, Ni, Ruiyu <ruiyu...@intel.com> wrote: >> > On 1/29/2018 4:50 PM, Guo Heyi wrote: >> >> >> >> Sorry for the late; I caught cold and didn't work for several days >> >> last week :( Please see my comments below: >> >> >> >> >> >> On Mon, Jan 22, 2018 at 11:36:14AM +0800, Ni, Ruiyu wrote: >> >>> >> >>> On 1/18/2018 9:26 AM, Guo Heyi wrote: >> >>>> >> >>>> On Wed, Jan 17, 2018 at 02:08:06PM +0000, Ard Biesheuvel wrote: >> >>>>> >> >>>>> On 15 January 2018 at 14:46, Heyi Guo <heyi....@linaro.org> wrote: >> >>>>>> >> >>>>>> This is the draft patch for the discussion posted in edk2-devel >> >>>>>> mailing list: >> >>>>>> https://lists.01.org/pipermail/edk2-devel/2017-December/019289.ht >> >>>>>> ml >> >>>>>> >> >>>>>> As discussed in the mailing list, we'd like to add support for >> >>>>>> PCI address translation which is necessary for some non-x86 >> >>>>>> platforms. I also want to minimize the changes to the generic >> >>>>>> host bridge driver and platform PciHostBridgeLib implemetations, >> >>>>>> so additional two interfaces are added to expose translation >> >>>>>> information of the platform. To be generic, I add translation for >> >>>>>> each type of IO or memory resources. >> >>>>>> >> >>>>>> The patch is still a RFC, so I only passed the build for qemu64 >> >>>>>> and the function has not been tested yet. >> >>>>>> >> >>>>>> Please let me know your comments about it. >> >>>>>> >> >>>>>> Thanks. >> >>>>>> >> >>>>>> Contributed-under: TianoCore Contribution Agreement 1.1 >> >>>>>> Signed-off-by: Heyi Guo <heyi....@linaro.org> >> >>>>>> Cc: Ruiyu Ni <ruiyu...@intel.com> >> >>>>>> Cc: Ard Biesheuvel <ard.biesheu...@linaro.org> >> >>>>>> Cc: Star Zeng <star.z...@intel.com> >> >>>>>> Cc: Eric Dong <eric.d...@intel.com> >> >>>>>> --- >> >>>>>> .../FdtPciHostBridgeLib/FdtPciHostBridgeLib.c | 19 ++++ >> >>>>>> .../Bus/Pci/PciHostBridgeDxe/PciHostBridge.c | 53 ++++++++--- >> >>>>>> .../Bus/Pci/PciHostBridgeDxe/PciRootBridge.h | 8 +- >> >>>>>> .../Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c | 101 >> >>>>>> ++++++++++++++++++--- >> >>>>>> MdeModulePkg/Include/Library/PciHostBridgeLib.h | 36 ++++++++ >> >>>>>> 5 files changed, 192 insertions(+), 25 deletions(-) >> >>>>>> >> >>>>>> diff --git >> >>>>>> a/ArmVirtPkg/Library/FdtPciHostBridgeLib/FdtPciHostBridgeLib.c >> >>>>>> b/ArmVirtPkg/Library/FdtPciHostBridgeLib/FdtPciHostBridgeLib.c >> >>>>>> index 5b9c887..0c8371a 100644 >> >>>>>> --- >> >>>>>> a/ArmVirtPkg/Library/FdtPciHostBridgeLib/FdtPciHostBridgeLib.c >> >>>>>> +++ b/ArmVirtPkg/Library/FdtPciHostBridgeLib/FdtPciHostBridgeLib. >> >>>>>> +++ c >> >>>>>> @@ -360,6 +360,16 @@ PciHostBridgeGetRootBridges ( >> >>>>>> return &mRootBridge; >> >>>>>> } >> >>>>>> >> >>>>>> +PCI_ROOT_BRIDGE_TRANSLATION * >> >>>>>> +EFIAPI >> >>>>>> +PciHostBridgeGetTranslations ( >> >>>>>> + UINTN *Count >> >>>>>> + ) >> >>>>>> +{ >> >>>>>> + *Count = 0; >> >>>>>> + return NULL; >> >>>>>> +} >> >>>>>> + >> >>>>>> /** >> >>>>>> Free the root bridge instances array returned from >> >>>>>> PciHostBridgeGetRootBridges(). >> >>>>>> @@ -377,6 +387,15 @@ PciHostBridgeFreeRootBridges ( >> >>>>>> ASSERT (Count == 1); >> >>>>>> } >> >>>>>> >> >>>>>> +VOID >> >>>>>> +EFIAPI >> >>>>>> +PciHostBridgeFreeTranslations ( >> >>>>>> + PCI_ROOT_BRIDGE_TRANSLATION *Translations, >> >>>>>> + UINTN Count >> >>>>>> + ) >> >>>>>> +{ >> >>>>>> +} >> >>>>>> + >> >>>>>> /** >> >>>>>> Inform the platform that the resource conflict happens. >> >>>>>> >> >>>>>> diff --git >> >>>>>> asame/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciHostBridge.c >> >>>>>> b/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciHostBridge.c >> >>>>>> index 1494848..835e411 100644 >> >>>>>> --- a/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciHostBridge.c >> >>>>>> +++ b/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciHostBridge.c >> >>>>>> @@ -360,18 +360,38 @@ InitializePciHostBridge ( >> >>>>>> PCI_HOST_BRIDGE_INSTANCE *HostBridge; >> >>>>>> PCI_ROOT_BRIDGE_INSTANCE *RootBridge; >> >>>>>> PCI_ROOT_BRIDGE *RootBridges; >> >>>>>> + PCI_ROOT_BRIDGE_TRANSLATION *Translations; >> >>>>>> UINTN RootBridgeCount; >> >>>>>> + UINTN TranslationCount; >> >>>>>> UINTN Index; >> >>>>>> PCI_ROOT_BRIDGE_APERTURE *MemApertures[4]; >> >>>>> >> >>>>> >> >>>>> Wouldn't it be much better to add a 'translation' member to >> >>>>> PCI_ROOT_BRIDGE_APERTURE? That way, existing code just default to >> >>>>> a translation of 0, and all the handling of the separate array can >> >>>>> be dropped. >> >>>>> >> >>>> Actually my first idea was the same, but when I looked at the >> >>>> implementation of PciHostBridgeLib of Ovmf, I found it a little >> >>>> tedious to change the existing code in this way. We'll need to >> >>>> check everywhere PCI_ROOT_BRIDGE_APERTURE or PCI_ROOT_BRIDGE is >> >>>> used, to make sure the translation field is initialized to be zero, >> >>>> e.g. line 235~245. >> >>>> >> >>>> What I did in this RFC is not so straightforward indeed. So I can >> >>>> change the code if we all agree to add Translation field into >> >>>> PCI_ROOT_BRIDGE_APERTURE directly. >> >>>> >> >>>> Thanks, >> >>>> >> >>>> Gary (Heyi Guo) >> >>> >> >>> >> >>> I also agree to put the translation fields into the >> >>> PCI_ROOT_BRIDGE_APERTURE. >> >>> >> >>> >> >>> But I think we may have different understandings to the address >> >>> translation. >> >>> My understanding to the whole translation: >> >>> 1. PciHostBridsamesamege.GetProposedResources () returns resource >> information >> >>> for a single root bridge. It only carries the address range in PCI >> >>> view. >> >>> The address range/resource is reported/submitted by PciHostBridgeLib. >> >>> Before the change, CPU view equals to PCI view. So PciHostBridgeDxe >> >>> driver directly adds the resource to GCD. >> >>> In your change, PciHostBridgeDxe assumes the source is in PCI view >> >>> and it adds offset to convert to CPU view. >> >>> CPU-address = PCI-address + offset. <-- Equation #A >> >>> >> >>> >> >>> 2. PciRootBridgeIo.Configuration() returns the resource information >> >>> for a single root bridge. It carries the address range in CPU view, >> >>> and the translation offset. >> >>> However, per UEFI spec, "Address Translation Offset. Offset to apply >> >>> to the Starting address of a BAR to convert it to a PCI address. " >> >>> PCI-address = CPU-address + offset. <-- Equation #B >> >> >> >> >> >> If we get Equation #B from the statement in UEFI spec, does it also >> >> imply Starting address is "Address Range Minimum" and so it is CPU view >> address? >> >> >> >> If we use Equation #B, can offset be a negative value? If it is not, >> >> then it will make translation useless, since we cannot change CPU >> >> address above 4G into PCI address under 4G for legacy compatibility. >> >> >> >> Equation #B is also not consistent with how OS treats address >> >> translation; please see the ACPI ASL code which works well for OS: >> >> >> >> https://github.com/tianocore/edk2-platforms/blob/master/Silicon/Hisil >> >> icon/Hi1616/D05AcpiTables/Dsdt/D05Pci.asl#L201 >> > >> > >> > I agree with your statement about the ASL code. >> > I copied the following wordings from ACPI spec: >> > >> > Byte 14 Address range minimum, >> > _MIN bits[7:0] >> > For bridges that translate addresses, this is the address space on the >> > secondary side of the bridge. >> > >> > Byte 30 Address Translation >> > offset, _TRA bits[7:0] >> > For bridges that translate addresses across the bridge, this is the >> > offset that must be added to the address on the secondary side to >> > obtain the address on the primary side. Non-bridge devices must list 0 >> > for all Address Translation offset bits. >> > >> > It seems UEFI Spec conflicts with ACPI Spec. >> > UEFI Spec: AddressRangeMin = CPU-view address ACPI Spec: >> > AddressRangeMin = PCI-view address >> > >> > I remembered that this topic was discussed long time ago and >> > re-discussed in year 2017. >> > There is no conclusion. >> > >> > I tend to agree to align to ACPI spec. >> > But I am not sure what impact it may cause. >> > >> > Actually this CPU/PCI address topic was discussed long time ago and >> > re-discussed in patch mail: >> > https://lists.01.org/pipermail/edk2-devel/2017-September/014425.html >> > No conclusion so the patch was also not checked in. >> > >> > With your proposed patch (maybe refine or address translation logic >> > updates are needed), I think it's a good opportunity for us to review >> > the whole PCI resource allocation logic in PciHostBridge/PciBus /GCD, >> > and propose a consistent/clear solution. >> > >> > >> >> This has indeed been discussed many times, but the UEFI spec is quite clear >> that >> its definition of the QWORD address space descriptor supersedes the one in >> the >> ACPI spec. >> >> Given that an offset can be both positive and negative, it is reasonable to >> assume that this field may be interpreted as signed and/or may be truncated >> on >> 64-bit overflow (which come down to the same thing) >> >> I would rather not park this discussion again. The UEFI spec may be quirky >> in this >> regard, but it is perfectly clear. > > Ard, > In my opinion, to align UEFI Spec to ACPI spec on this sounds like reasonable. > Do you see any real problem if we change the meeting of AddressRangeMin? >
I agree it would be best to fix the spec, but only if it applies retroactively, i.e., if it is incorporated as an erratum into the current version. _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel