From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by mx.groups.io with SMTP id smtpd.web10.27055.1611146225640281069 for ; Wed, 20 Jan 2021 04:37:05 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=AV1nFccE; spf=pass (domain: redhat.com, ip: 63.128.21.124, mailfrom: lersek@redhat.com) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1611146224; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=kJGoygZ0p5FcSECDvy+5up2m55RLV1sC8otrNdOvI0c=; b=AV1nFccE6J4hfsKEG71NIvXoQDc+u/vqJ6zXmjk667cq0iL2pFQZFCNFNmFkbm+bsjnVxf 0e5+uW9E4d4yKzCkqDqjaxkP8Ivx3nFCKomXWwqSP9c+P2NbSGl6nLc/uJpLOZONJ+7TxG y85GezlFnJGL5ALb/t5MEVU1+0HQU1c= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-418-fGZhbMtIOVKkTbK3yqqDgQ-1; Wed, 20 Jan 2021 07:36:59 -0500 X-MC-Unique: fGZhbMtIOVKkTbK3yqqDgQ-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id AC101802B40; Wed, 20 Jan 2021 12:36:56 +0000 (UTC) Received: from lacos-laptop-7.usersys.redhat.com (ovpn-115-96.ams2.redhat.com [10.36.115.96]) by smtp.corp.redhat.com (Postfix) with ESMTP id 601CB2BFE4; Wed, 20 Jan 2021 12:36:53 +0000 (UTC) Subject: Re: [edk2-devel] [PATCH v6 04/11] OvmfPkg/PciHostBridgeLib: Extract InitRootBridge() / UninitRootBridge() To: devel@edk2.groups.io, cenjiahui@huawei.com Cc: Jordan Justen , Ard Biesheuvel , Rebecca Cran , Peter Grehan , Anthony Perard , Julien Grall , Leif Lindholm , Sami Mujawar , xieyingtai@huawei.com, wu.wubin@huawei.com, Yubo Miao References: <20210119011302.10908-1-cenjiahui@huawei.com> <20210119011302.10908-5-cenjiahui@huawei.com> From: "Laszlo Ersek" Message-ID: Date: Wed, 20 Jan 2021 13:36:52 +0100 MIME-Version: 1.0 In-Reply-To: <20210119011302.10908-5-cenjiahui@huawei.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=lersek@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit 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 > Cc: Laszlo Ersek > Cc: Ard Biesheuvel > Cc: Anthony Perard > Cc: Julien Grall > Signed-off-by: Jiahui Cen > Signed-off-by: Yubo Miao > --- > 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 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 > + > + > +/** > + 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 > > #include > -#include > > #include > #include > > #include > #include > -#include > #include > #include > #include > @@ -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 > #include > #include > +#include > #include > #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 > +#include > +#include > #include > +#include > +#include > +#include > #include > > > +#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. > >