From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from szxga06-in.huawei.com (szxga06-in.huawei.com [45.249.212.32]) by mx.groups.io with SMTP id smtpd.web12.5518.1611018901761625442 for ; Mon, 18 Jan 2021 17:15:02 -0800 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: huawei.com, ip: 45.249.212.32, mailfrom: cenjiahui@huawei.com) Received: from DGGEMS401-HUB.china.huawei.com (unknown [172.30.72.58]) by szxga06-in.huawei.com (SkyGuard) with ESMTP id 4DKVzc3pdjzj8GX; Tue, 19 Jan 2021 09:14:04 +0800 (CST) Received: from localhost (10.174.184.155) by DGGEMS401-HUB.china.huawei.com (10.3.19.201) with Microsoft SMTP Server id 14.3.498.0; Tue, 19 Jan 2021 09:14:50 +0800 From: "Jiahui Cen" To: CC: Jordan Justen , Laszlo Ersek , Ard Biesheuvel , Rebecca Cran , Peter Grehan , Anthony Perard , Julien Grall , Leif Lindholm , Sami Mujawar , , , Jiahui Cen Subject: [PATCH v6 09/11] OvmfPkg/PciHostBridgeUtilityLib: Extend GetRootBridges() with BusMin/BusMax Date: Tue, 19 Jan 2021 09:13:00 +0800 Message-ID: <20210119011302.10908-10-cenjiahui@huawei.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210119011302.10908-1-cenjiahui@huawei.com> References: <20210119011302.10908-1-cenjiahui@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.174.184.155] X-CFilter-Loop: Reflected Content-Type: text/plain Content-Transfer-Encoding: quoted-printable 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=3D3059 Cc: Jordan Justen Cc: Laszlo Ersek Cc: Ard Biesheuvel Signed-off-by: Jiahui Cen --- 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 ( =20 @param[in] NoExtendedConfigSpace No Extended Config Space. =20 + @param[in] BusMin Minimum Bus number, inclusive. + + @param[in] BusMax Maximum Bus number, inclusive. + @param[in] Io IO aperture. =20 @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/OvmfPk= g/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) !=3D INTEL_Q35_MCH_DEVICE_ID, + 0, + PCI_MAX_BUS, &Io, &Mem, &MemAbove4G, diff --git a/OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtility= Lib.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 ( =20 @param[in] NoExtendedConfigSpace No Extended Config Space. =20 + @param[in] BusMin Minimum Bus number, inclusive. + + @param[in] BusMax Maximum Bus number, inclusive. + @param[in] Io IO aperture. =20 @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; =20 + if (BusMin > BusMax || BusMax > PCI_MAX_BUS) { + DEBUG ((DEBUG_ERROR, "%a: invalid bus range with BusMin %d and BusMa= x %d\n", + __FUNCTION__, BusMin, BusMax)); + *Count =3D 0; + return NULL; + } + // // QEMU provides the number of extra root buses, shortening the exhaus= tive // search below. If there is no hint, the feature is missing. @@ -247,7 +260,14 @@ PciHostBridgeUtilityGetRootBridges ( QemuFwCfgSelectItem (FwCfgItem); QemuFwCfgReadBytes (FwCfgSize, &ExtraRootBridges); =20 - 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" roo= t 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 =3D 0; @@ -271,15 +291,15 @@ PciHostBridgeUtilityGetRootBridges ( // // The "main" root bus is always there. // - LastRootBridgeNumber =3D 0; + LastRootBridgeNumber =3D BusMin; =20 // // Scan all other root buses. If function 0 of any device on a bus ret= urns a // VendorId register value different from all-bits-one, then that bus = is // alive. // - for (RootBridgeNumber =3D 1; - RootBridgeNumber <=3D PCI_MAX_BUS && Initialized < ExtraRootBridg= es; + for (RootBridgeNumber =3D BusMin + 1; + RootBridgeNumber <=3D BusMax && Initialized < ExtraRootBridges; ++RootBridgeNumber) { UINTN Device; =20 @@ -329,7 +349,7 @@ PciHostBridgeUtilityGetRootBridges ( DmaAbove4G, NoExtendedConfigSpace, (UINT8) LastRootBridgeNumber, - PCI_MAX_BUS, + (UINT8) BusMax, Io, Mem, MemAbove4G, --=20 2.29.2