On 01/19/21 02:13, Jiahui Cen via groups.io wrote: > 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.jus...@intel.com> > Cc: Laszlo Ersek <ler...@redhat.com> > Cc: Ard Biesheuvel <ard.biesheu...@arm.com> > Signed-off-by: Jiahui Cen <cenjia...@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));
(1) The "%d" format specifier is appropriate for INT32 values. But UINTN is either UINT32 or UINT64 (dependent on the edk2 architecture the platform is built for). The safe way to print a UINTN value is to (a) cast it to UINT64, and (b) use the "%Lu" (or "%Lx") format specifier. I'll fix this up for you. > + *Count = 0; (2) As I said under patch v6 07/11, this zeroing should be centralized at the top of the function. I'll fix it up for you. > + 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 (3) s/givin/a given/ I'll fix it. > + // less, i.e. (BusMax - BusMin). If QEME hint exceeds that, we have > invalid (4) s/QEME/the QEMU/ I'll fix it. > + // 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; Side remark (nothing to fix): I'm slightly curious what would happen if the DTB on the arm/aarch64 "virt" machine reported a BusMin different from 0. What does that mean for the MMCONFIG offsets? If BusMin is nonzero, does that mean we have a unused slice at the start of MMCONFIG? Or does it mean that we need to shift down the bus references so that BusMin does map to offset 0 in MMCONFIG? (See also the "PCI_ROOT_BRIDGE.Bus.Translation" field.) Anyway, we can look at this later, if such a DTB ever occurs in practice. (I doubt that it ever will.) > > // > // 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, > Reviewed-by: Laszlo Ersek <ler...@redhat.com> Thanks Laszlo -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#70581): https://edk2.groups.io/g/devel/message/70581 Mute This Topic: https://groups.io/mt/79941629/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-