Laszlo,
How about using a flag NoExtendedConfigSpace?
Since for most cases the PCI CFG space limit is 0xFFF, so I think it's better 
to choose a flag whose
default value meets most of the cases. For a Boolean flag inside a structure 
when the structure
is allocated using AllocateZeroPool, the flag value is FALSE.

Regards,
Ray

From: Marcel Apfelbaum [mailto:[email protected]]
Sent: Tuesday, March 1, 2016 1:30 AM
To: Laszlo Ersek <[email protected]>; [email protected]
Cc: Ni, Ruiyu <[email protected]>; Justen, Jordan L <[email protected]>
Subject: Re: [PATCH v2] MdeModulePkg: PciHostBridgeDxe: don't assume extended 
config space

On 02/29/2016 03:15 PM, Laszlo Ersek wrote:
> The "pc" ("pc-i440fx-*") machine types of QEMU don't support extended
> config space. Accordingly, OVMF will use the following library instances
> in connection with the core PciHostBridgeDxe driver:
>
>    BasePciSegmentLibPci [class: PciSegmentLib]
>      BasePciLibCf8      [class: PciLib]
>        BasePciCf8Lib    [class: PciCf8Lib]
>
> Add a new field to the PCI_ROOT_BRIDGE structure so that
> RootBridgeIoCheckParameter() can catch config space offsets above 0xFF on
> such old (emulated) platforms.
>
> Cc: Ruiyu Ni <[email protected]<mailto:[email protected]>>
> Cc: Jordan Justen 
> <[email protected]<mailto:[email protected]>>
> Cc: Marcel Apfelbaum <[email protected]<mailto:[email protected]>>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Laszlo Ersek <[email protected]<mailto:[email protected]>>
> ---
>
> Notes:
>      v2:
>      - replace the PCI config space "aperture" with a dedicated BOOLEAN flag
>        called ExtendedConfigSpace [Ray]
>      - simplify the commit message
>
>   MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridge.h   | 1 +
>   MdeModulePkg/Include/Library/PciHostBridgeLib.h         | 4 ++++
>   MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c | 4 +++-
>   3 files changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridge.h 
> b/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridge.h
> index b1e83f1c9089..f9839fed4628 100644
> --- a/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridge.h
> +++ b/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridge.h
> @@ -72,6 +72,7 @@ typedef struct {
>     PCI_ROOT_BRIDGE_APERTURE          MemAbove4G;
>     PCI_ROOT_BRIDGE_APERTURE          PMemAbove4G;
>     BOOLEAN                           DmaAbove4G;
> +  BOOLEAN                           ExtendedConfigSpace;
>     VOID                              *ConfigBuffer;
>     EFI_DEVICE_PATH_PROTOCOL          *DevicePath;
>     CHAR16                            *DevicePathStr;
> diff --git a/MdeModulePkg/Include/Library/PciHostBridgeLib.h 
> b/MdeModulePkg/Include/Library/PciHostBridgeLib.h
> index b1dba0f754d7..fbf3be860c13 100644
> --- a/MdeModulePkg/Include/Library/PciHostBridgeLib.h
> +++ b/MdeModulePkg/Include/Library/PciHostBridgeLib.h
> @@ -34,6 +34,10 @@ typedef struct {
>                                                    ///< and SetAttributes() 
> in EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL.
>     BOOLEAN                  DmaAbove4G;           ///< DMA above 4GB memory.
>                                                    ///< Set to TRUE when root 
> bridge supports DMA above 4GB memory.
> +  BOOLEAN                  ExtendedConfigSpace;  ///< When TRUE, the root 
> bridge supports
> +                                                 ///< Extended (4096-byte) 
> Configuration Space.
> +                                                 ///< When FALSE, the root 
> bridge supports
> +                                                 ///< 256-byte Configuration 
> Space only.
>     UINT64                   AllocationAttributes; ///< Allocation attributes.
>                                                    ///< Refer to 
> EFI_PCI_HOST_BRIDGE_COMBINE_MEM_PMEM and
>                                                    ///< 
> EFI_PCI_HOST_BRIDGE_MEM64_DECODE used by GetAllocAttributes()
> diff --git a/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c 
> b/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c
> index 332860eb3819..b0b1a2c18cca 100644
> --- a/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c
> +++ b/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c
> @@ -80,6 +80,7 @@ CreateRootBridge (
>     DEBUG ((EFI_D_INFO, "%s\n", DevicePathStr = ConvertDevicePathToText 
> (Bridge->DevicePath, FALSE, FALSE)));
>     DEBUG ((EFI_D_INFO, "Support/Attr: %lx / %lx\n", Bridge->Supports, 
> Bridge->Attributes));
>     DEBUG ((EFI_D_INFO, "  DmaAbove4G: %s\n", Bridge->DmaAbove4G ? L"Yes" : 
> L"No"));
> +  DEBUG ((EFI_D_INFO, "ExtConfSpace: %s\n", Bridge->ExtendedConfigSpace ? 
> L"Yes" : L"No"));
>     DEBUG ((EFI_D_INFO, "   AllocAttr: %lx (%s%s)\n", 
> Bridge->AllocationAttributes,
>             (Bridge->AllocationAttributes & 
> EFI_PCI_HOST_BRIDGE_COMBINE_MEM_PMEM) != 0 ? L"CombineMemPMem " : L"",
>             (Bridge->AllocationAttributes & EFI_PCI_HOST_BRIDGE_MEM64_DECODE) 
> != 0 ? L"Mem64Decode" : L""
> @@ -155,6 +156,7 @@ CreateRootBridge (
>     RootBridge->Supports = Bridge->Supports;
>     RootBridge->Attributes = Bridge->Attributes;
>     RootBridge->DmaAbove4G = Bridge->DmaAbove4G;
> +  RootBridge->ExtendedConfigSpace = Bridge->ExtendedConfigSpace;
>     RootBridge->AllocationAttributes = Bridge->AllocationAttributes;
>     RootBridge->DevicePath = DuplicateDevicePath (Bridge->DevicePath);
>     RootBridge->DevicePathStr = DevicePathStr;
> @@ -351,7 +353,7 @@ RootBridgeIoCheckParameter (
>         Address = PciRbAddr->Register;
>       }
>       Base = 0;
> -    Limit = 0xFFF;
> +    Limit = RootBridge->ExtendedConfigSpace ? 0xFFF : 0xFF;
>     }
>
>     if (Address < Base) {
>


With my limited OVMF knowledge it looks OK to me.

Reviewed-by: Marcel Apfelbaum <[email protected]<mailto:[email protected]>>


Thanks,
Marcel
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to