mirror of https://github.com/acidanthera/audk.git
MdeModulePkg: PciHostBridgeDxe: don't assume extended config space
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 <ruiyu.ni@intel.com> Cc: Jordan Justen <jordan.l.justen@intel.com> Cc: Marcel Apfelbaum <marcel@redhat.com> Cc: Michael Kinney <michael.d.kinney@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Laszlo Ersek <lersek@redhat.com> Reviewed-by: Michael Kinney <michael.d.kinney@intel.com> Reviewed-by: Jordan Justen <jordan.l.justen@intel.com> Reviewed-by: Marcel Apfelbaum <marcel@redhat.com> Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com>
This commit is contained in:
parent
3da829657e
commit
014b472053
|
@ -72,6 +72,7 @@ typedef struct {
|
||||||
PCI_ROOT_BRIDGE_APERTURE MemAbove4G;
|
PCI_ROOT_BRIDGE_APERTURE MemAbove4G;
|
||||||
PCI_ROOT_BRIDGE_APERTURE PMemAbove4G;
|
PCI_ROOT_BRIDGE_APERTURE PMemAbove4G;
|
||||||
BOOLEAN DmaAbove4G;
|
BOOLEAN DmaAbove4G;
|
||||||
|
BOOLEAN NoExtendedConfigSpace;
|
||||||
VOID *ConfigBuffer;
|
VOID *ConfigBuffer;
|
||||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||||
CHAR16 *DevicePathStr;
|
CHAR16 *DevicePathStr;
|
||||||
|
|
|
@ -80,6 +80,7 @@ CreateRootBridge (
|
||||||
DEBUG ((EFI_D_INFO, "%s\n", DevicePathStr = ConvertDevicePathToText (Bridge->DevicePath, FALSE, FALSE)));
|
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, " 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, " DmaAbove4G: %s\n", Bridge->DmaAbove4G ? L"Yes" : L"No"));
|
||||||
|
DEBUG ((EFI_D_INFO, "NoExtConfSpace: %s\n", Bridge->NoExtendedConfigSpace ? L"Yes" : L"No"));
|
||||||
DEBUG ((EFI_D_INFO, " AllocAttr: %lx (%s%s)\n", Bridge->AllocationAttributes,
|
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_COMBINE_MEM_PMEM) != 0 ? L"CombineMemPMem " : L"",
|
||||||
(Bridge->AllocationAttributes & EFI_PCI_HOST_BRIDGE_MEM64_DECODE) != 0 ? L"Mem64Decode" : L""
|
(Bridge->AllocationAttributes & EFI_PCI_HOST_BRIDGE_MEM64_DECODE) != 0 ? L"Mem64Decode" : L""
|
||||||
|
@ -155,6 +156,7 @@ CreateRootBridge (
|
||||||
RootBridge->Supports = Bridge->Supports;
|
RootBridge->Supports = Bridge->Supports;
|
||||||
RootBridge->Attributes = Bridge->Attributes;
|
RootBridge->Attributes = Bridge->Attributes;
|
||||||
RootBridge->DmaAbove4G = Bridge->DmaAbove4G;
|
RootBridge->DmaAbove4G = Bridge->DmaAbove4G;
|
||||||
|
RootBridge->NoExtendedConfigSpace = Bridge->NoExtendedConfigSpace;
|
||||||
RootBridge->AllocationAttributes = Bridge->AllocationAttributes;
|
RootBridge->AllocationAttributes = Bridge->AllocationAttributes;
|
||||||
RootBridge->DevicePath = DuplicateDevicePath (Bridge->DevicePath);
|
RootBridge->DevicePath = DuplicateDevicePath (Bridge->DevicePath);
|
||||||
RootBridge->DevicePathStr = DevicePathStr;
|
RootBridge->DevicePathStr = DevicePathStr;
|
||||||
|
@ -351,7 +353,7 @@ RootBridgeIoCheckParameter (
|
||||||
Address = PciRbAddr->Register;
|
Address = PciRbAddr->Register;
|
||||||
}
|
}
|
||||||
Base = 0;
|
Base = 0;
|
||||||
Limit = 0xFFF;
|
Limit = RootBridge->NoExtendedConfigSpace ? 0xFF : 0xFFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Address < Base) {
|
if (Address < Base) {
|
||||||
|
|
|
@ -34,6 +34,10 @@ typedef struct {
|
||||||
///< and SetAttributes() in EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL.
|
///< and SetAttributes() in EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL.
|
||||||
BOOLEAN DmaAbove4G; ///< DMA above 4GB memory.
|
BOOLEAN DmaAbove4G; ///< DMA above 4GB memory.
|
||||||
///< Set to TRUE when root bridge supports DMA above 4GB memory.
|
///< Set to TRUE when root bridge supports DMA above 4GB memory.
|
||||||
|
BOOLEAN NoExtendedConfigSpace; ///< When FALSE, the root bridge supports
|
||||||
|
///< Extended (4096-byte) Configuration Space.
|
||||||
|
///< When TRUE, the root bridge supports
|
||||||
|
///< 256-byte Configuration Space only.
|
||||||
UINT64 AllocationAttributes; ///< Allocation attributes.
|
UINT64 AllocationAttributes; ///< Allocation attributes.
|
||||||
///< Refer to EFI_PCI_HOST_BRIDGE_COMBINE_MEM_PMEM and
|
///< Refer to EFI_PCI_HOST_BRIDGE_COMBINE_MEM_PMEM and
|
||||||
///< EFI_PCI_HOST_BRIDGE_MEM64_DECODE used by GetAllocAttributes()
|
///< EFI_PCI_HOST_BRIDGE_MEM64_DECODE used by GetAllocAttributes()
|
||||||
|
|
Loading…
Reference in New Issue