[edk2-devel] [PATCH v6 09/11] OvmfPkg/PciHostBridgeUtilityLib: Extend GetRootBridges() with BusMin/BusMax

Jiahui Cen via groups.io cenjiahui=huawei.com at groups.io
Tue Jan 19 01:13:00 UTC 2021


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 at intel.com>
Cc: Laszlo Ersek <lersek at redhat.com>
Cc: Ard Biesheuvel <ard.biesheuvel at arm.com>
Signed-off-by: Jiahui Cen <cenjiahui at huawei.com>
---
 OvmfPkg/Include/Library/PciHostBridgeUtilityLib.h                 |  6 ++++
 OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.c               |  2 ++
 OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.c | 30 ++++++++++++++++----
 3 files changed, 33 insertions(+), 5 deletions(-)

diff --git a/OvmfPkg/Include/Library/PciHostBridgeUtilityLib.h b/OvmfPkg/Include/Library/PciHostBridgeUtilityLib.h
index a0ea44d96a67..d2dc18a1afad 100644
--- a/OvmfPkg/Include/Library/PciHostBridgeUtilityLib.h
+++ b/OvmfPkg/Include/Library/PciHostBridgeUtilityLib.h
@@ -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,
diff --git a/OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.c b/OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.c
index 91b9e6baa1e8..7d9fb0fb293a 100644
--- a/OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.c
+++ b/OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.c
@@ -85,6 +85,8 @@ PciHostBridgeGetRootBridges (
     AllocationAttributes,
     FALSE,
     PcdGet16 (PcdOvmfHostBridgePciDevId) != INTEL_Q35_MCH_DEVICE_ID,
+    0,
+    PCI_MAX_BUS,
     &Io,
     &Mem,
     &MemAbove4G,
diff --git a/OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.c b/OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.c
index 1d78984b83ad..69bed5c7843f 100644
--- a/OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.c
+++ b/OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.c
@@ -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,
@@ -236,6 +242,13 @@ PciHostBridgeUtilityGetRootBridges (
   UINTN                LastRootBridgeNumber;
   UINTN                RootBridgeNumber;
 
+  if (BusMin > BusMax || BusMax > PCI_MAX_BUS) {
+    DEBUG ((DEBUG_ERROR, "%a: invalid bus range with BusMin %d and BusMax %d\n",
+      __FUNCTION__, BusMin, BusMax));
+    *Count = 0;
+    return NULL;
+  }
+
   //
   // QEMU provides the number of extra root buses, shortening the exhaustive
   // search below. If there is no hint, the feature is missing.
@@ -247,7 +260,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 givin, so the max count for the "extra" root bridges is one
+    // less, i.e. (BusMax - BusMin). If QEME 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));
       *Count = 0;
@@ -271,15 +291,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 +349,7 @@ PciHostBridgeUtilityGetRootBridges (
     DmaAbove4G,
     NoExtendedConfigSpace,
     (UINT8) LastRootBridgeNumber,
-    PCI_MAX_BUS,
+    (UINT8) BusMax,
     Io,
     Mem,
     MemAbove4G,
-- 
2.29.2



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#70522): https://edk2.groups.io/g/devel/message/70522
Mute This Topic: https://groups.io/mt/79941629/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-






More information about the edk2-devel-archive mailing list