On 02/29/16 14:15, 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]>
> Cc: Jordan Justen <[email protected]>
> Cc: Marcel Apfelbaum <[email protected]>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Laszlo Ersek <[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) {
>
I'll note that in <https://github.com/tianocore/edk2/issues/32> we're
forming a plan to use ECAM on Q35. So in the longer term OVMF will not
set the ExtendedConfigSpace field to *constant* FALSE -- in the longer
term, on Q35 it will be set to TRUE. (The underlying PciLib instance
will switch between 0xCF8 vs. MMCONFIG dynamically.)
Thanks
Laszlo
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel