mirror of https://github.com/acidanthera/audk.git
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:
parent
14d4b6be56
commit
f4a257a355
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in New Issue