On 01/19/21 02:12, Jiahui Cen via groups.io wrote: > Extract InitRootBridge() / UninitRootBridge() to PciHostBridgeUtilityLib > as common utility functions. No change of functionality. > > 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> > Cc: Anthony Perard <anthony.per...@citrix.com> > Cc: Julien Grall <jul...@xen.org> > Signed-off-by: Jiahui Cen <cenjia...@huawei.com> > Signed-off-by: Yubo Miao <miaoy...@huawei.com> > --- > OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf | 2 - > OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.inf | 8 + > OvmfPkg/Include/Library/PciHostBridgeUtilityLib.h | 77 > ++++++++++ > OvmfPkg/Library/PciHostBridgeLib/PciHostBridge.h | 56 > ------- > OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.c | 158 > +------------------- > OvmfPkg/Library/PciHostBridgeLib/XenSupport.c | 3 +- > OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.c | 158 > ++++++++++++++++++++ > 7 files changed, 249 insertions(+), 213 deletions(-) >
Reviewed-by: Laszlo Ersek <ler...@redhat.com> Thanks Laszlo > diff --git a/OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf > b/OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf > index cec3f1631a72..7944f94b7743 100644 > --- a/OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf > +++ b/OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf > @@ -37,7 +37,6 @@ [Packages] > [LibraryClasses] > BaseMemoryLib > DebugLib > - DevicePathLib > MemoryAllocationLib > PcdLib > PciHostBridgeUtilityLib > @@ -51,5 +50,4 @@ [Pcd] > gUefiOvmfPkgTokenSpaceGuid.PcdPciMmio32Size > gUefiOvmfPkgTokenSpaceGuid.PcdPciMmio64Base > gUefiOvmfPkgTokenSpaceGuid.PcdPciMmio64Size > - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfHostBridgePciDevId > gEfiMdeModulePkgTokenSpaceGuid.PcdPciDisableBusEnumeration > diff --git > a/OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.inf > b/OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.inf > index 1ba8ec3e03c7..e3d0a3740952 100644 > --- a/OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.inf > +++ b/OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.inf > @@ -30,8 +30,16 @@ [Sources] > PciHostBridgeUtilityLib.c > > [Packages] > + MdeModulePkg/MdeModulePkg.dec > MdePkg/MdePkg.dec > OvmfPkg/OvmfPkg.dec > > [LibraryClasses] > + BaseMemoryLib > DebugLib > + DevicePathLib > + MemoryAllocationLib > + PcdLib > + > +[Pcd] > + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfHostBridgePciDevId > diff --git a/OvmfPkg/Include/Library/PciHostBridgeUtilityLib.h > b/OvmfPkg/Include/Library/PciHostBridgeUtilityLib.h > index 5ea25ed2f4f4..8a1ddc2f5e02 100644 > --- a/OvmfPkg/Include/Library/PciHostBridgeUtilityLib.h > +++ b/OvmfPkg/Include/Library/PciHostBridgeUtilityLib.h > @@ -14,6 +14,83 @@ > #define __PCI_HOST_BRIDGE_UTILITY_LIB_H__ > > > +#include <Library/PciHostBridgeLib.h> > + > + > +/** > + Utility function to initialize a PCI_ROOT_BRIDGE structure. > + > + @param[in] Supports Supported attributes. > + > + @param[in] Attributes Initial attributes. > + > + @param[in] AllocAttributes Allocation attributes. > + > + @param[in] RootBusNumber The bus number to store in RootBus. > + > + @param[in] MaxSubBusNumber The inclusive maximum bus number that can be > + assigned to any subordinate bus found behind > any > + PCI bridge hanging off this root bus. > + > + The caller is repsonsible for ensuring that > + RootBusNumber <= MaxSubBusNumber. If > + RootBusNumber equals MaxSubBusNumber, then the > + root bus has no room for subordinate buses. > + > + @param[in] Io IO aperture. > + > + @param[in] Mem MMIO aperture. > + > + @param[in] MemAbove4G MMIO aperture above 4G. > + > + @param[in] PMem Prefetchable MMIO aperture. > + > + @param[in] PMemAbove4G Prefetchable MMIO aperture above 4G. > + > + @param[out] RootBus The PCI_ROOT_BRIDGE structure (allocated by > the > + caller) that should be filled in by this > + function. > + > + @retval EFI_SUCCESS Initialization successful. A device path > + consisting of an ACPI device path node, with > + UID = RootBusNumber, has been allocated and > + linked into RootBus. > + > + @retval EFI_OUT_OF_RESOURCES Memory allocation failed. > +**/ > +EFI_STATUS > +EFIAPI > +PciHostBridgeUtilityInitRootBridge ( > + IN UINT64 Supports, > + IN UINT64 Attributes, > + IN UINT64 AllocAttributes, > + IN UINT8 RootBusNumber, > + IN UINT8 MaxSubBusNumber, > + IN PCI_ROOT_BRIDGE_APERTURE *Io, > + IN PCI_ROOT_BRIDGE_APERTURE *Mem, > + IN PCI_ROOT_BRIDGE_APERTURE *MemAbove4G, > + IN PCI_ROOT_BRIDGE_APERTURE *PMem, > + IN PCI_ROOT_BRIDGE_APERTURE *PMemAbove4G, > + OUT PCI_ROOT_BRIDGE *RootBus > + ); > + > + > +/** > + Utility function to uninitialize a PCI_ROOT_BRIDGE structure set up with > + PciHostBridgeUtilityInitRootBridge(). > + > + @param[in] RootBus The PCI_ROOT_BRIDGE structure, allocated by the caller > and > + initialized with PciHostBridgeUtilityInitRootBridge(), > + that should be uninitialized. This function doesn't > free > + RootBus. > +**/ > +VOID > +EFIAPI > +PciHostBridgeUtilityUninitRootBridge ( > + IN PCI_ROOT_BRIDGE *RootBus > + ); > + > + > /** > Utility function to inform the platform that the resource conflict happens. > > diff --git a/OvmfPkg/Library/PciHostBridgeLib/PciHostBridge.h > b/OvmfPkg/Library/PciHostBridgeLib/PciHostBridge.h > index 134d7411214d..a2e4d8696281 100644 > --- a/OvmfPkg/Library/PciHostBridgeLib/PciHostBridge.h > +++ b/OvmfPkg/Library/PciHostBridgeLib/PciHostBridge.h > @@ -11,59 +11,3 @@ PCI_ROOT_BRIDGE * > ScanForRootBridges ( > UINTN *NumberOfRootBridges > ); > - > -/** > - Initialize a PCI_ROOT_BRIDGE structure. > - > - @param[in] Supports Supported attributes. > - > - @param[in] Attributes Initial attributes. > - > - @param[in] AllocAttributes Allocation attributes. > - > - @param[in] RootBusNumber The bus number to store in RootBus. > - > - @param[in] MaxSubBusNumber The inclusive maximum bus number that can be > - assigned to any subordinate bus found behind > any > - PCI bridge hanging off this root bus. > - > - The caller is repsonsible for ensuring that > - RootBusNumber <= MaxSubBusNumber. If > - RootBusNumber equals MaxSubBusNumber, then the > - root bus has no room for subordinate buses. > - > - @param[in] Io IO aperture. > - > - @param[in] Mem MMIO aperture. > - > - @param[in] MemAbove4G MMIO aperture above 4G. > - > - @param[in] PMem Prefetchable MMIO aperture. > - > - @param[in] PMemAbove4G Prefetchable MMIO aperture above 4G. > - > - @param[out] RootBus The PCI_ROOT_BRIDGE structure (allocated by > the > - caller) that should be filled in by this > - function. > - > - @retval EFI_SUCCESS Initialization successful. A device path > - consisting of an ACPI device path node, with > - UID = RootBusNumber, has been allocated and > - linked into RootBus. > - > - @retval EFI_OUT_OF_RESOURCES Memory allocation failed. > -**/ > -EFI_STATUS > -InitRootBridge ( > - IN UINT64 Supports, > - IN UINT64 Attributes, > - IN UINT64 AllocAttributes, > - IN UINT8 RootBusNumber, > - IN UINT8 MaxSubBusNumber, > - IN PCI_ROOT_BRIDGE_APERTURE *Io, > - IN PCI_ROOT_BRIDGE_APERTURE *Mem, > - IN PCI_ROOT_BRIDGE_APERTURE *MemAbove4G, > - IN PCI_ROOT_BRIDGE_APERTURE *PMem, > - IN PCI_ROOT_BRIDGE_APERTURE *PMemAbove4G, > - OUT PCI_ROOT_BRIDGE *RootBus > - ); > diff --git a/OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.c > b/OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.c > index bf32455b9f0d..07fa98110e98 100644 > --- a/OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.c > +++ b/OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.c > @@ -10,14 +10,12 @@ > #include <PiDxe.h> > > #include <IndustryStandard/Pci.h> > -#include <IndustryStandard/Q35MchIch9.h> > > #include <Protocol/PciHostBridgeResourceAllocation.h> > #include <Protocol/PciRootBridgeIo.h> > > #include <Library/BaseMemoryLib.h> > #include <Library/DebugLib.h> > -#include <Library/DevicePathLib.h> > #include <Library/MemoryAllocationLib.h> > #include <Library/PcdLib.h> > #include <Library/PciHostBridgeLib.h> > @@ -27,156 +25,8 @@ > #include "PciHostBridge.h" > > > -#pragma pack(1) > -typedef struct { > - ACPI_HID_DEVICE_PATH AcpiDevicePath; > - EFI_DEVICE_PATH_PROTOCOL EndDevicePath; > -} OVMF_PCI_ROOT_BRIDGE_DEVICE_PATH; > -#pragma pack () > - > - > -STATIC > -CONST > -OVMF_PCI_ROOT_BRIDGE_DEVICE_PATH mRootBridgeDevicePathTemplate = { > - { > - { > - ACPI_DEVICE_PATH, > - ACPI_DP, > - { > - (UINT8) (sizeof(ACPI_HID_DEVICE_PATH)), > - (UINT8) ((sizeof(ACPI_HID_DEVICE_PATH)) >> 8) > - } > - }, > - EISA_PNP_ID(0x0A03), // HID > - 0 // UID > - }, > - > - { > - END_DEVICE_PATH_TYPE, > - END_ENTIRE_DEVICE_PATH_SUBTYPE, > - { > - END_DEVICE_PATH_LENGTH, > - 0 > - } > - } > -}; > - > STATIC PCI_ROOT_BRIDGE_APERTURE mNonExistAperture = { MAX_UINT64, 0 }; > > -/** > - Initialize a PCI_ROOT_BRIDGE structure. > - > - @param[in] Supports Supported attributes. > - > - @param[in] Attributes Initial attributes. > - > - @param[in] AllocAttributes Allocation attributes. > - > - @param[in] RootBusNumber The bus number to store in RootBus. > - > - @param[in] MaxSubBusNumber The inclusive maximum bus number that can be > - assigned to any subordinate bus found behind > any > - PCI bridge hanging off this root bus. > - > - The caller is repsonsible for ensuring that > - RootBusNumber <= MaxSubBusNumber. If > - RootBusNumber equals MaxSubBusNumber, then the > - root bus has no room for subordinate buses. > - > - @param[in] Io IO aperture. > - > - @param[in] Mem MMIO aperture. > - > - @param[in] MemAbove4G MMIO aperture above 4G. > - > - @param[in] PMem Prefetchable MMIO aperture. > - > - @param[in] PMemAbove4G Prefetchable MMIO aperture above 4G. > - > - @param[out] RootBus The PCI_ROOT_BRIDGE structure (allocated by > the > - caller) that should be filled in by this > - function. > - > - @retval EFI_SUCCESS Initialization successful. A device path > - consisting of an ACPI device path node, with > - UID = RootBusNumber, has been allocated and > - linked into RootBus. > - > - @retval EFI_OUT_OF_RESOURCES Memory allocation failed. > -**/ > -EFI_STATUS > -InitRootBridge ( > - IN UINT64 Supports, > - IN UINT64 Attributes, > - IN UINT64 AllocAttributes, > - IN UINT8 RootBusNumber, > - IN UINT8 MaxSubBusNumber, > - IN PCI_ROOT_BRIDGE_APERTURE *Io, > - IN PCI_ROOT_BRIDGE_APERTURE *Mem, > - IN PCI_ROOT_BRIDGE_APERTURE *MemAbove4G, > - IN PCI_ROOT_BRIDGE_APERTURE *PMem, > - IN PCI_ROOT_BRIDGE_APERTURE *PMemAbove4G, > - OUT PCI_ROOT_BRIDGE *RootBus > - ) > -{ > - OVMF_PCI_ROOT_BRIDGE_DEVICE_PATH *DevicePath; > - > - // > - // Be safe if other fields are added to PCI_ROOT_BRIDGE later. > - // > - ZeroMem (RootBus, sizeof *RootBus); > - > - RootBus->Segment = 0; > - > - RootBus->Supports = Supports; > - RootBus->Attributes = Attributes; > - > - RootBus->DmaAbove4G = FALSE; > - > - RootBus->AllocationAttributes = AllocAttributes; > - RootBus->Bus.Base = RootBusNumber; > - RootBus->Bus.Limit = MaxSubBusNumber; > - CopyMem (&RootBus->Io, Io, sizeof (*Io)); > - CopyMem (&RootBus->Mem, Mem, sizeof (*Mem)); > - CopyMem (&RootBus->MemAbove4G, MemAbove4G, sizeof (*MemAbove4G)); > - CopyMem (&RootBus->PMem, PMem, sizeof (*PMem)); > - CopyMem (&RootBus->PMemAbove4G, PMemAbove4G, sizeof (*PMemAbove4G)); > - > - RootBus->NoExtendedConfigSpace = (PcdGet16 (PcdOvmfHostBridgePciDevId) != > - INTEL_Q35_MCH_DEVICE_ID); > - > - DevicePath = AllocateCopyPool (sizeof mRootBridgeDevicePathTemplate, > - &mRootBridgeDevicePathTemplate); > - if (DevicePath == NULL) { > - DEBUG ((DEBUG_ERROR, "%a: %r\n", __FUNCTION__, EFI_OUT_OF_RESOURCES)); > - return EFI_OUT_OF_RESOURCES; > - } > - DevicePath->AcpiDevicePath.UID = RootBusNumber; > - RootBus->DevicePath = (EFI_DEVICE_PATH_PROTOCOL *)DevicePath; > - > - DEBUG ((DEBUG_INFO, > - "%a: populated root bus %d, with room for %d subordinate bus(es)\n", > - __FUNCTION__, RootBusNumber, MaxSubBusNumber - RootBusNumber)); > - return EFI_SUCCESS; > -} > - > - > -/** > - Uninitialize a PCI_ROOT_BRIDGE structure set up with InitRootBridge(). > - > - param[in] RootBus The PCI_ROOT_BRIDGE structure, allocated by the caller > and > - initialized with InitRootBridge(), that should be > - uninitialized. This function doesn't free RootBus. > -**/ > -STATIC > -VOID > -UninitRootBridge ( > - IN PCI_ROOT_BRIDGE *RootBus > - ) > -{ > - FreePool (RootBus->DevicePath); > -} > - > > /** > Return all the root bridge instances in an array. > @@ -297,7 +147,7 @@ PciHostBridgeGetRootBridges ( > // because now we know how big a bus number range *that* one has, for > any > // subordinate buses that might exist behind PCI bridges hanging off > it. > // > - Status = InitRootBridge ( > + Status = PciHostBridgeUtilityInitRootBridge ( > Attributes, > Attributes, > AllocationAttributes, > @@ -322,7 +172,7 @@ PciHostBridgeGetRootBridges ( > // Install the last root bus (which might be the only, ie. main, root bus, > if > // we've found no extra root buses). > // > - Status = InitRootBridge ( > + Status = PciHostBridgeUtilityInitRootBridge ( > Attributes, > Attributes, > AllocationAttributes, > @@ -346,7 +196,7 @@ PciHostBridgeGetRootBridges ( > FreeBridges: > while (Initialized > 0) { > --Initialized; > - UninitRootBridge (&Bridges[Initialized]); > + PciHostBridgeUtilityUninitRootBridge (&Bridges[Initialized]); > } > > FreePool (Bridges); > @@ -375,7 +225,7 @@ PciHostBridgeFreeRootBridges ( > > do { > --Count; > - UninitRootBridge (&Bridges[Count]); > + PciHostBridgeUtilityUninitRootBridge (&Bridges[Count]); > } while (Count > 0); > > FreePool (Bridges); > diff --git a/OvmfPkg/Library/PciHostBridgeLib/XenSupport.c > b/OvmfPkg/Library/PciHostBridgeLib/XenSupport.c > index 95ed0a280b9b..5dfeba0e6e23 100644 > --- a/OvmfPkg/Library/PciHostBridgeLib/XenSupport.c > +++ b/OvmfPkg/Library/PciHostBridgeLib/XenSupport.c > @@ -19,6 +19,7 @@ > #include <Library/MemoryAllocationLib.h> > #include <Library/PcdLib.h> > #include <Library/PciHostBridgeLib.h> > +#include <Library/PciHostBridgeUtilityLib.h> > #include <Library/PciLib.h> > #include "PciHostBridge.h" > > @@ -453,7 +454,7 @@ ScanForRootBridges ( > RootBridges > ); > ASSERT (RootBridges != NULL); > - InitRootBridge ( > + PciHostBridgeUtilityInitRootBridge ( > Attributes, Attributes, 0, > (UINT8) PrimaryBus, (UINT8) SubBus, > &Io, &Mem, &MemAbove4G, &mNonExistAperture, &mNonExistAperture, > diff --git > a/OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.c > b/OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.c > index ac94e62612be..92b42566e5f8 100644 > --- a/OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.c > +++ b/OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.c > @@ -11,16 +11,174 @@ > **/ > > #include <IndustryStandard/Acpi10.h> > +#include <IndustryStandard/Q35MchIch9.h> > +#include <Library/BaseMemoryLib.h> > #include <Library/DebugLib.h> > +#include <Library/DevicePathLib.h> > +#include <Library/MemoryAllocationLib.h> > +#include <Library/PcdLib.h> > #include <Library/PciHostBridgeUtilityLib.h> > > > +#pragma pack(1) > +typedef struct { > + ACPI_HID_DEVICE_PATH AcpiDevicePath; > + EFI_DEVICE_PATH_PROTOCOL EndDevicePath; > +} OVMF_PCI_ROOT_BRIDGE_DEVICE_PATH; > +#pragma pack () > + > + > GLOBAL_REMOVE_IF_UNREFERENCED > CHAR16 *mPciHostBridgeUtilityLibAcpiAddressSpaceTypeStr[] = { > L"Mem", L"I/O", L"Bus" > }; > > > +STATIC > +CONST > +OVMF_PCI_ROOT_BRIDGE_DEVICE_PATH mRootBridgeDevicePathTemplate = { > + { > + { > + ACPI_DEVICE_PATH, > + ACPI_DP, > + { > + (UINT8) (sizeof(ACPI_HID_DEVICE_PATH)), > + (UINT8) ((sizeof(ACPI_HID_DEVICE_PATH)) >> 8) > + } > + }, > + EISA_PNP_ID(0x0A03), // HID > + 0 // UID > + }, > + > + { > + END_DEVICE_PATH_TYPE, > + END_ENTIRE_DEVICE_PATH_SUBTYPE, > + { > + END_DEVICE_PATH_LENGTH, > + 0 > + } > + } > +}; > + > + > +/** > + Utility function to initialize a PCI_ROOT_BRIDGE structure. > + > + @param[in] Supports Supported attributes. > + > + @param[in] Attributes Initial attributes. > + > + @param[in] AllocAttributes Allocation attributes. > + > + @param[in] RootBusNumber The bus number to store in RootBus. > + > + @param[in] MaxSubBusNumber The inclusive maximum bus number that can be > + assigned to any subordinate bus found behind > any > + PCI bridge hanging off this root bus. > + > + The caller is repsonsible for ensuring that > + RootBusNumber <= MaxSubBusNumber. If > + RootBusNumber equals MaxSubBusNumber, then the > + root bus has no room for subordinate buses. > + > + @param[in] Io IO aperture. > + > + @param[in] Mem MMIO aperture. > + > + @param[in] MemAbove4G MMIO aperture above 4G. > + > + @param[in] PMem Prefetchable MMIO aperture. > + > + @param[in] PMemAbove4G Prefetchable MMIO aperture above 4G. > + > + @param[out] RootBus The PCI_ROOT_BRIDGE structure (allocated by > the > + caller) that should be filled in by this > + function. > + > + @retval EFI_SUCCESS Initialization successful. A device path > + consisting of an ACPI device path node, with > + UID = RootBusNumber, has been allocated and > + linked into RootBus. > + > + @retval EFI_OUT_OF_RESOURCES Memory allocation failed. > +**/ > +EFI_STATUS > +EFIAPI > +PciHostBridgeUtilityInitRootBridge ( > + IN UINT64 Supports, > + IN UINT64 Attributes, > + IN UINT64 AllocAttributes, > + IN UINT8 RootBusNumber, > + IN UINT8 MaxSubBusNumber, > + IN PCI_ROOT_BRIDGE_APERTURE *Io, > + IN PCI_ROOT_BRIDGE_APERTURE *Mem, > + IN PCI_ROOT_BRIDGE_APERTURE *MemAbove4G, > + IN PCI_ROOT_BRIDGE_APERTURE *PMem, > + IN PCI_ROOT_BRIDGE_APERTURE *PMemAbove4G, > + OUT PCI_ROOT_BRIDGE *RootBus > + ) > +{ > + OVMF_PCI_ROOT_BRIDGE_DEVICE_PATH *DevicePath; > + > + // > + // Be safe if other fields are added to PCI_ROOT_BRIDGE later. > + // > + ZeroMem (RootBus, sizeof *RootBus); > + > + RootBus->Segment = 0; > + > + RootBus->Supports = Supports; > + RootBus->Attributes = Attributes; > + > + RootBus->DmaAbove4G = FALSE; > + > + RootBus->AllocationAttributes = AllocAttributes; > + RootBus->Bus.Base = RootBusNumber; > + RootBus->Bus.Limit = MaxSubBusNumber; > + CopyMem (&RootBus->Io, Io, sizeof (*Io)); > + CopyMem (&RootBus->Mem, Mem, sizeof (*Mem)); > + CopyMem (&RootBus->MemAbove4G, MemAbove4G, sizeof (*MemAbove4G)); > + CopyMem (&RootBus->PMem, PMem, sizeof (*PMem)); > + CopyMem (&RootBus->PMemAbove4G, PMemAbove4G, sizeof (*PMemAbove4G)); > + > + RootBus->NoExtendedConfigSpace = (PcdGet16 (PcdOvmfHostBridgePciDevId) != > + INTEL_Q35_MCH_DEVICE_ID); > + > + DevicePath = AllocateCopyPool (sizeof mRootBridgeDevicePathTemplate, > + &mRootBridgeDevicePathTemplate); > + if (DevicePath == NULL) { > + DEBUG ((DEBUG_ERROR, "%a: %r\n", __FUNCTION__, EFI_OUT_OF_RESOURCES)); > + return EFI_OUT_OF_RESOURCES; > + } > + DevicePath->AcpiDevicePath.UID = RootBusNumber; > + RootBus->DevicePath = (EFI_DEVICE_PATH_PROTOCOL *)DevicePath; > + > + DEBUG ((DEBUG_INFO, > + "%a: populated root bus %d, with room for %d subordinate bus(es)\n", > + __FUNCTION__, RootBusNumber, MaxSubBusNumber - RootBusNumber)); > + return EFI_SUCCESS; > +} > + > + > +/** > + Utility function to uninitialize a PCI_ROOT_BRIDGE structure set up with > + PciHostBridgeUtilityInitRootBridge(). > + > + @param[in] RootBus The PCI_ROOT_BRIDGE structure, allocated by the caller > and > + initialized with PciHostBridgeUtilityInitRootBridge(), > + that should be uninitialized. This function doesn't > free > + RootBus. > +**/ > +VOID > +EFIAPI > +PciHostBridgeUtilityUninitRootBridge ( > + IN PCI_ROOT_BRIDGE *RootBus > + ) > +{ > + FreePool (RootBus->DevicePath); > +} > + > + > /** > Utility function to inform the platform that the resource conflict happens. > > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#70574): https://edk2.groups.io/g/devel/message/70574 Mute This Topic: https://groups.io/mt/79941617/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-