OvmfPkg/PciHostBridgeUtilityLib: Extend GetRootBridges() with BusMin/BusMax

Extend parameter list of PciHostBridgeUtilityGetRootBridges() with BusMin/
BusMax, so that the utility function could be compatible with ArmVirtPkg
who uses mutable bus range [BusMin, BusMax] insteand of [0, PCI_MAX_BUS].

BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3059

Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Ard Biesheuvel <ard.biesheuvel@arm.com>
Signed-off-by: Jiahui Cen <cenjiahui@huawei.com>
Message-Id: <20210119011302.10908-10-cenjiahui@huawei.com>
[lersek@redhat.com: fix logging of UINTN values BusMin, BusMax]
[lersek@redhat.com: keep zeroing of (*Count) centralized]
[lersek@redhat.com: fix typos in ExtraRootBridges comment]
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
This commit is contained in:
Jiahui Cen via groups.io 2021-01-19 09:13:00 +08:00 committed by mergify[bot]
parent 14d4b6be56
commit f4a257a355
3 changed files with 32 additions and 5 deletions

View File

@ -112,6 +112,10 @@ PciHostBridgeUtilityUninitRootBridge (
@param[in] NoExtendedConfigSpace No Extended Config Space. @param[in] NoExtendedConfigSpace No Extended Config Space.
@param[in] BusMin Minimum Bus number, inclusive.
@param[in] BusMax Maximum Bus number, inclusive.
@param[in] Io IO aperture. @param[in] Io IO aperture.
@param[in] Mem MMIO aperture. @param[in] Mem MMIO aperture.
@ -132,6 +136,8 @@ PciHostBridgeUtilityGetRootBridges (
IN UINT64 AllocationAttributes, IN UINT64 AllocationAttributes,
IN BOOLEAN DmaAbove4G, IN BOOLEAN DmaAbove4G,
IN BOOLEAN NoExtendedConfigSpace, IN BOOLEAN NoExtendedConfigSpace,
IN UINTN BusMin,
IN UINTN BusMax,
IN PCI_ROOT_BRIDGE_APERTURE *Io, IN PCI_ROOT_BRIDGE_APERTURE *Io,
IN PCI_ROOT_BRIDGE_APERTURE *Mem, IN PCI_ROOT_BRIDGE_APERTURE *Mem,
IN PCI_ROOT_BRIDGE_APERTURE *MemAbove4G, IN PCI_ROOT_BRIDGE_APERTURE *MemAbove4G,

View File

@ -85,6 +85,8 @@ PciHostBridgeGetRootBridges (
AllocationAttributes, AllocationAttributes,
FALSE, FALSE,
PcdGet16 (PcdOvmfHostBridgePciDevId) != INTEL_Q35_MCH_DEVICE_ID, PcdGet16 (PcdOvmfHostBridgePciDevId) != INTEL_Q35_MCH_DEVICE_ID,
0,
PCI_MAX_BUS,
&Io, &Io,
&Mem, &Mem,
&MemAbove4G, &MemAbove4G,

View File

@ -200,6 +200,10 @@ PciHostBridgeUtilityUninitRootBridge (
@param[in] NoExtendedConfigSpace No Extended Config Space. @param[in] NoExtendedConfigSpace No Extended Config Space.
@param[in] BusMin Minimum Bus number, inclusive.
@param[in] BusMax Maximum Bus number, inclusive.
@param[in] Io IO aperture. @param[in] Io IO aperture.
@param[in] Mem MMIO aperture. @param[in] Mem MMIO aperture.
@ -220,6 +224,8 @@ PciHostBridgeUtilityGetRootBridges (
IN UINT64 AllocationAttributes, IN UINT64 AllocationAttributes,
IN BOOLEAN DmaAbove4G, IN BOOLEAN DmaAbove4G,
IN BOOLEAN NoExtendedConfigSpace, IN BOOLEAN NoExtendedConfigSpace,
IN UINTN BusMin,
IN UINTN BusMax,
IN PCI_ROOT_BRIDGE_APERTURE *Io, IN PCI_ROOT_BRIDGE_APERTURE *Io,
IN PCI_ROOT_BRIDGE_APERTURE *Mem, IN PCI_ROOT_BRIDGE_APERTURE *Mem,
IN PCI_ROOT_BRIDGE_APERTURE *MemAbove4G, IN PCI_ROOT_BRIDGE_APERTURE *MemAbove4G,
@ -238,6 +244,12 @@ PciHostBridgeUtilityGetRootBridges (
*Count = 0; *Count = 0;
if (BusMin > BusMax || BusMax > PCI_MAX_BUS) {
DEBUG ((DEBUG_ERROR, "%a: invalid bus range with BusMin %Lu and BusMax "
"%Lu\n", __FUNCTION__, (UINT64)BusMin, (UINT64)BusMax));
return NULL;
}
// //
// QEMU provides the number of extra root buses, shortening the exhaustive // QEMU provides the number of extra root buses, shortening the exhaustive
// search below. If there is no hint, the feature is missing. // search below. If there is no hint, the feature is missing.
@ -249,7 +261,14 @@ PciHostBridgeUtilityGetRootBridges (
QemuFwCfgSelectItem (FwCfgItem); QemuFwCfgSelectItem (FwCfgItem);
QemuFwCfgReadBytes (FwCfgSize, &ExtraRootBridges); QemuFwCfgReadBytes (FwCfgSize, &ExtraRootBridges);
if (ExtraRootBridges > PCI_MAX_BUS) { //
// Validate the number of extra root bridges. As BusMax is inclusive, the
// max bus count is (BusMax - BusMin + 1). From that, the "main" root bus
// is always a given, so the max count for the "extra" root bridges is one
// less, i.e. (BusMax - BusMin). If the QEMU hint exceeds that, we have
// invalid behavior.
//
if (ExtraRootBridges > BusMax - BusMin) {
DEBUG ((DEBUG_ERROR, "%a: invalid count of extra root buses (%Lu) " DEBUG ((DEBUG_ERROR, "%a: invalid count of extra root buses (%Lu) "
"reported by QEMU\n", __FUNCTION__, ExtraRootBridges)); "reported by QEMU\n", __FUNCTION__, ExtraRootBridges));
return NULL; return NULL;
@ -271,15 +290,15 @@ PciHostBridgeUtilityGetRootBridges (
// //
// The "main" root bus is always there. // The "main" root bus is always there.
// //
LastRootBridgeNumber = 0; LastRootBridgeNumber = BusMin;
// //
// Scan all other root buses. If function 0 of any device on a bus returns a // Scan all other root buses. If function 0 of any device on a bus returns a
// VendorId register value different from all-bits-one, then that bus is // VendorId register value different from all-bits-one, then that bus is
// alive. // alive.
// //
for (RootBridgeNumber = 1; for (RootBridgeNumber = BusMin + 1;
RootBridgeNumber <= PCI_MAX_BUS && Initialized < ExtraRootBridges; RootBridgeNumber <= BusMax && Initialized < ExtraRootBridges;
++RootBridgeNumber) { ++RootBridgeNumber) {
UINTN Device; UINTN Device;
@ -329,7 +348,7 @@ PciHostBridgeUtilityGetRootBridges (
DmaAbove4G, DmaAbove4G,
NoExtendedConfigSpace, NoExtendedConfigSpace,
(UINT8) LastRootBridgeNumber, (UINT8) LastRootBridgeNumber,
PCI_MAX_BUS, (UINT8) BusMax,
Io, Io,
Mem, Mem,
MemAbove4G, MemAbove4G,