public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Ni, Ruiyu" <ruiyu.ni@Intel.com>
To: "Ard Biesheuvel <ard.biesheuvel@linaro.org>;Guo Heyi"
	<heyi.guo@linaro.org>,
	"Rothman, Michael A" <michael.a.rothman@intel.com>
Cc: "Dong, Eric" <eric.dong@intel.com>,
	Guo Heyi <heyi.guo@linaro.org>, Dong Wei <Dong.Wei@arm.com>,
	linaro-uefi <linaro-uefi@lists.linaro.org>,
	"Kinney, Michael D" <michael.d.kinney@intel.com>,
	"edk2-devel@lists.01.org" <edk2-devel@lists.01.org>,
	"Zeng, Star" <star.zeng@intel.com>
Subject: Re: [RFC] MdeModulePkg/PciHostBridgeDxe: Add support for address translation
Date: Mon, 5 Feb 2018 16:06:58 +0800	[thread overview]
Message-ID: <7fab5279-9f46-93c2-6a90-3b6d957b2f27@Intel.com> (raw)
In-Reply-To: <734D49CCEBEEF84792F5B80ED585239D5BB845A2@SHSMSX104.ccr.corp.intel.com>

On 2/3/2018 2:00 PM, Ni, Ruiyu wrote:
> 
> 
>> -----Original Message-----
>> From: Ard Biesheuvel [mailto:ard.biesheuvel@linaro.org]
>> Sent: Friday, February 2, 2018 4:22 PM
>> To: Ni, Ruiyu <ruiyu.ni@intel.com>
>> Cc: Guo Heyi <heyi.guo@linaro.org>,Dong Wei <Dong.Wei@arm.com>; Dong,
>> Eric <eric.dong@intel.com>; edk2-devel@lists.01.org; linaro-uefi <linaro-
>> uefi@lists.linaro.org>; Kinney, Michael D <michael.d.kinney@intel.com>; Zeng,
>> Star <star.zeng@intel.com>
>> Subject: Re: [edk2] [RFC] MdeModulePkg/PciHostBridgeDxe: Add support for
>> address translation
>>
>> On 2 February 2018 at 00:34, Ni, Ruiyu <ruiyu.ni@intel.com> wrote:
>>>
>>>
>>>> -----Original Message-----
>>>> From: Ard Biesheuvel [mailto:ard.biesheuvel@linaro.org]
>>>> Sent: Friday, February 2, 2018 1:23 AM
>>>> To: Ni, Ruiyu <ruiyu.ni@intel.com>
>>>> Cc: Guo Heyi <heyi.guo@linaro.org>,Dong Wei <Dong.Wei@arm.com>;
>> Dong,
>>>> Eric <eric.dong@intel.com>; edk2-devel@lists.01.org; linaro-uefi
>>>> <linaro- uefi@lists.linaro.org>; Kinney, Michael D
>>>> <michael.d.kinney@intel.com>; Zeng, Star <star.zeng@intel.com>
>>>> Subject: Re: [edk2] [RFC] MdeModulePkg/PciHostBridgeDxe: Add support
>>>> for address translation
>>>>
>>>> On 1 February 2018 at 05:03, Ni, Ruiyu <ruiyu.ni@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.guo@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.guo@linaro.org>
>>>>>>>>>> Cc: Ruiyu Ni <ruiyu.ni@intel.com>
>>>>>>>>>> Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
>>>>>>>>>> Cc: Star Zeng <star.zeng@intel.com>
>>>>>>>>>> Cc: Eric Dong <eric.dong@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/Hi
>>>>>> sil
>>>>>> 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.htm
>>>>> l 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.
> 
> Copy Mike for opinions.

Ard, Heyi,
If there is no feedback from Mike. I prefer to not violate the UEFI
Spec, though UEFI spec and ACPI spec have differences on this.

What do you think?

> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel
> 


-- 
Thanks,
Ray


  reply	other threads:[~2018-02-05  8:01 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-01-15 14:46 [RFC] MdeModulePkg/PciHostBridgeDxe: Add support for address translation Heyi Guo
2018-01-17 14:08 ` Ard Biesheuvel
2018-01-18  1:26   ` Guo Heyi
2018-01-22  3:36     ` Ni, Ruiyu
2018-01-29  8:50       ` Guo Heyi
     [not found]         ` <685b27a9-e620-e7e7-e0fb-8cebe16e7b1a@Intel.com>
2018-02-01 17:22           ` Ard Biesheuvel
2018-02-02  0:34             ` Ni, Ruiyu
2018-02-02  8:22               ` Ard Biesheuvel
2018-02-03  6:00                 ` Ni, Ruiyu
2018-02-05  8:06                   ` Ni, Ruiyu [this message]
2018-02-05  9:11                     ` Ard Biesheuvel
2018-02-06  1:12                       ` Guo Heyi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=7fab5279-9f46-93c2-6a90-3b6d957b2f27@Intel.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox