On 05/18/16 10:16, Ni, Ruiyu wrote:
>>-----Original Message-----
>>From: Laszlo Ersek [mailto:ler...@redhat.com]
>>Sent: Tuesday, May 17, 2016 8:23 PM
>>To: Ni, Ruiyu <ruiyu...@intel.com>
>>Cc: edk2-de...@ml01.01.org
>>Subject: Re: [edk2] [Patch 0/4] MdeModulePkg/PciBus Do not improperly degrade 
>>resource
>>
>>On 05/17/16 04:03, Ruiyu Ni wrote:
>>> The patch serials refined the PciBus code and adds a new feature following
>>> PI spec 1.4a to not improperly degrade resource.
>>>
>>> Ruiyu Ni (4):
>>>   MdeModulePkg/PciBus: use better name for local variables.
>>>   MdeModulePkg/PciBus: Remove unused fields in PCI_BAR
>>>   MdeModulePkg/PciBus: Use shorter global variable name
>>>   MdeModulePkg/PciBus: do not improperly degrade resource
>>>
>>>  MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.c            |  6 +--
>>>  MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.h            |  5 +-
>>>  .../Bus/Pci/PciBusDxe/PciEnumeratorSupport.c       | 58 
>>> +++++++++++++++++-----
>>>  .../Bus/Pci/PciBusDxe/PciResourceSupport.c         | 26 ++++++----
>>>  4 files changed, 65 insertions(+), 30 deletions(-)
>>>
>>
>>* Please add the following reference to patch #4:
>>
>>https://mantis.uefi.org/mantis/view.php?id=1529
> 
> I think it might not be proper to include the member only
> web page in the commit message.

I disagree -- I think the mantis ticket number should always be included in a 
commit message, if the patch is related to a Mantis ticket. Sharing just the 
number of the mantis ticket does not disclose any information that is not also 
publicly available from the UEFI spec itself (the UEFI spec starts with a long 
changelog of Mantis tickets).

The contents of the mantis ticket *are* private, but for actually reading a 
ticket, general UEFI membership and the appropriate WG membership are required 
too. So, capturing the mantis ticket number in the commit message helps 
contributors that have access to Mantis, without disclosing sensitive 
information to those who haven't.

Personally I frequently go to Mantis to understand the background of UEFI or PI 
spec changes better. The ECRs attached to Mantis tickets often describe use 
cases that are not carried over to the spec, but are important background.

In this specific case, the PI spec 1.4a, Volume 5, has the following in its 
changelog:

  1529 address space granularity errata


>>* I'm interested in this work primarily due to GPU assignment to
>>QEMU/KVM virtual machines. So I built OVMF applied with these patches,
>>and checked if they made a difference for the PCI resource map, with an
>>Nvidia GTX750 assigned to the guest.
>>
>>There's no difference; the 256MB BAR is still allocated under 4GB.
>>
>>* Apparently, EFI_INCOMPATIBLE_PCI_DEVICE_SUPPORT_PROTOCOL must be a
>>singleton protocol; it should come from the platform firmware, not from
>>the option ROM. In that case, how could OVMF implement this protocol, so
>>that such a GPU BAR would be allocated high?
> 
> Option ROM depends on the PCI resource assignment so it’s like a
> chicken-egg problem if we let option rom produce such protocol.
> Singleton is enough I think.

I agree.

>>Looking at the CheckDevice() spec, I guess we could hard-code some PCI
>>vendor and device IDs, and set AddrSpaceGranularity to 64. However,
>>that's the only thing we should do; I don't think we should do the rest
>>of the PCI BAR probing.
> 
> PCI BAR probing is still needed. We do not change the granularity
> for 32bit BAR.
>>
>>... The only thing I'd like to say to the resource allocator is,
>>
>>  If CSM is disabled, then please don't degrade the MMIO64 BARs of this
>>  device, just because it has an oprom.
>>
>>(In fact, the device is not an incompatible PCI device.)
> 
> I agree. But another rule is MdeModulePkg cannot depend
> on IntelFrameworkPkg. PciBusDxe is in MdeModulePkg; LegacyBios
> protocol is defined in IntelFrameworkPkg.

That's fine; I'm not suggesting that PciBusDxe itself look for the legacy BIOS 
protocol. Instead, platform code in OvmfPkg could look for the legacy BIOS 
protocol (or determine CSM presence in another way), and then instruct 
PciBusDxe through a well-defined interface not to degrade the 64-bit MMIO BARs.

My interest is in such a well-defined interface.

>>* By following the links in Mantis #1529 (recursively), I arrived at a
>>message that points to the following driver:
>>
>>  MdeModulePkg/Bus/Pci/IncompatiblePciDeviceSupportDxe
>>
>>OVMF does not include this driver at the moment. It is a small driver
>>and I guess we could fork it for OvmfPkg, but how should we fill in the
>>"mIncompatiblePciDeviceList" array?
>>
> 
> Try to use below value to disable all MMIO degrade.
> Not tested.
> 
> GLOBAL_REMOVE_IF_UNREFERENCED UINT64 mIncompatiblePciDeviceList[] = {
>   //
>   // DEVICE_INF_TAG,
>   // PCI_DEVICE_ID (VendorID, DeviceID, Revision, SubVendorId, SubDeviceId),
>   // DEVICE_RES_TAG,
>   // ResType,  GFlag , SFlag,   Granularity,  RangeMin,
>   // RangeMax, Offset, AddrLen
>   //
>   DEVICE_INF_TAG,
>   PCI_DEVICE_ID(DEVICE_ID_NOCARE, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE,
> DEVICE_ID_NOCARE, DEVICE_ID_NOCARE),
>   DEVICE_RES_TAG,
>   PCI_BAR_TYPE_MEM,
>   PCI_ACPI_UNUSED,
>   PCI_ACPI_UNUSED,
>  64,
>   PCI_ACPI_UNUSED,
>   PCI_BAR_OLD_ALIGN,
>   PCI_BAR_ALL,
>   PCI_BAR_NOCHANGE,

Ah, thanks a lot! Now I have taken a much closer look at

  Table 20. ACPI 2.0 & 3.0 QWORD Address Space Descriptor Usage

plus I reviewed the UpdatePciInfo() function with more context (including your 
patch #4).

It looks like I can express exactly what I want.

I did my best to carefully review your patches. Patches 1-3 are mechanic and I 
think they are correct.

For #1 through #3:
Reviewed-by: Laszlo Ersek <ler...@redhat.com>

For patch #4, I have the following comments:

- Please consider adding the reference to mantis ticket 1529.

- I think the patch does a little bit more than documented in the subject and 
in the commit message. The main topic is of course the prevention of improper 
degradation; however the patch also handles the other case, when a 64-bit MMIO 
BAR is forced under the 4GB limit. I think it is correct and these things do 
belong to the same patch, but maybe the commit message could mention it 
briefly. I don't insist of course.

- Anyway I'll leave the above two points up to your consideration. For patch #4 
too:
Reviewed-by: Laszlo Ersek <ler...@redhat.com>

Independently, I noticed that the interpretation of the

  EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR.AddrTranslationOffset

field might not  comply with the PI spec. Namely, in Table 20, the BAR index 
wildcard is (UINT64)-1 (== MAX_UINT64). However, the value used for recognizing 
the wildcard, in the UpdatePciInfo() function, is PCI_BAR_ALL, which is only 
0xFF.

Similarly, the AddrRangeMax field ("Used to convey the alignment information") 
should be zero if no special alignment is required. But, PCI_BAR_OLD_ALIGN has 
value 0xFFFFFFFFFFFFFFFFULL.

> diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c 
> b/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c
> index a6ade26e3a09..089919d59d9e 100644
> --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c
> +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c
> @@ -1327,8 +1327,8 @@ UpdatePciInfo (
>    )
>  {
>    EFI_STATUS                        Status;
> -  UINTN                             BarIndex;
> -  UINTN                             BarEndIndex;
> +  UINT64                            BarIndex;
> +  UINT64                            BarEndIndex;
>    BOOLEAN                           SetFlag;
>    VOID                              *Configuration;
>    EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Ptr;
> diff --git a/MdePkg/Include/IndustryStandard/Pci22.h 
> b/MdePkg/Include/IndustryStandard/Pci22.h
> index 0b3a785ef1e6..3419ad4ce2cd 100644
> --- a/MdePkg/Include/IndustryStandard/Pci22.h
> +++ b/MdePkg/Include/IndustryStandard/Pci22.h
> @@ -763,7 +763,7 @@ typedef struct {
>
>  #define PCI_ACPI_UNUSED     0
>  #define PCI_BAR_NOCHANGE    0
> -#define PCI_BAR_OLD_ALIGN   0xFFFFFFFFFFFFFFFFULL
> +#define PCI_BAR_OLD_ALIGN   0
>  #define PCI_BAR_EVEN_ALIGN  0xFFFFFFFFFFFFFFFEULL
>  #define PCI_BAR_SQUAD_ALIGN 0xFFFFFFFFFFFFFFFDULL
>  #define PCI_BAR_DQUAD_ALIGN 0xFFFFFFFFFFFFFFFCULL
> @@ -774,7 +774,7 @@ typedef struct {
>  #define PCI_BAR_IDX3        0x03
>  #define PCI_BAR_IDX4        0x04
>  #define PCI_BAR_IDX5        0x05
> -#define PCI_BAR_ALL         0xFF
> +#define PCI_BAR_ALL         0xFFFFFFFFFFFFFFFFULL
>
>  ///
>  /// EFI PCI Option ROM definitions

What do you think? (In any case, this change would be separate from your 
series.)


I'll seek to write a minimal EFI_INCOMPATIBLE_PCI_DEVICE_SUPPORT_PROTOCOL 
implementation OvmfPkg that puts this series to use. As long as I use the same 
macro names as the PCI bus driver, in order to fill in the ACPI resource 
descriptor, there will be an understanding, regardless of the actual macro 
values.

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

Reply via email to