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] BusMin Minimum Bus number, inclusive.
@param[in] BusMax Maximum Bus number, inclusive.
@param[in] Io IO aperture.
@param[in] Mem MMIO aperture.
@ -132,6 +136,8 @@ PciHostBridgeUtilityGetRootBridges (
IN UINT64 AllocationAttributes,
IN BOOLEAN DmaAbove4G,
IN BOOLEAN NoExtendedConfigSpace,
IN UINTN BusMin,
IN UINTN BusMax,
IN PCI_ROOT_BRIDGE_APERTURE *Io,
IN PCI_ROOT_BRIDGE_APERTURE *Mem,
IN PCI_ROOT_BRIDGE_APERTURE *MemAbove4G,

View File

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

View File

@ -200,6 +200,10 @@ PciHostBridgeUtilityUninitRootBridge (
@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] Mem MMIO aperture.
@ -220,6 +224,8 @@ PciHostBridgeUtilityGetRootBridges (
IN UINT64 AllocationAttributes,
IN BOOLEAN DmaAbove4G,
IN BOOLEAN NoExtendedConfigSpace,
IN UINTN BusMin,
IN UINTN BusMax,
IN PCI_ROOT_BRIDGE_APERTURE *Io,
IN PCI_ROOT_BRIDGE_APERTURE *Mem,
IN PCI_ROOT_BRIDGE_APERTURE *MemAbove4G,
@ -238,6 +244,12 @@ PciHostBridgeUtilityGetRootBridges (
*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
// search below. If there is no hint, the feature is missing.
@ -249,7 +261,14 @@ PciHostBridgeUtilityGetRootBridges (
QemuFwCfgSelectItem (FwCfgItem);
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) "
"reported by QEMU\n", __FUNCTION__, ExtraRootBridges));
return NULL;
@ -271,15 +290,15 @@ PciHostBridgeUtilityGetRootBridges (
//
// 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
// VendorId register value different from all-bits-one, then that bus is
// alive.
//
for (RootBridgeNumber = 1;
RootBridgeNumber <= PCI_MAX_BUS && Initialized < ExtraRootBridges;
for (RootBridgeNumber = BusMin + 1;
RootBridgeNumber <= BusMax && Initialized < ExtraRootBridges;
++RootBridgeNumber) {
UINTN Device;
@ -329,7 +348,7 @@ PciHostBridgeUtilityGetRootBridges (
DmaAbove4G,
NoExtendedConfigSpace,
(UINT8) LastRootBridgeNumber,
PCI_MAX_BUS,
(UINT8) BusMax,
Io,
Mem,
MemAbove4G,