From: "Laszlo Ersek" <lersek@redhat.com>
To: devel@edk2.groups.io, cenjiahui@huawei.com
Cc: Jordan Justen <jordan.l.justen@intel.com>,
Ard Biesheuvel <ard.biesheuvel@arm.com>,
Rebecca Cran <rebecca@bsdio.com>,
Peter Grehan <grehan@freebsd.org>,
Anthony Perard <anthony.perard@citrix.com>,
Julien Grall <julien@xen.org>, Leif Lindholm <leif@nuviainc.com>,
Sami Mujawar <sami.mujawar@arm.com>,
xieyingtai@huawei.com, wu.wubin@huawei.com,
Yubo Miao <miaoyubo@huawei.com>
Subject: Re: [edk2-devel] [PATCH v6 04/11] OvmfPkg/PciHostBridgeLib: Extract InitRootBridge() / UninitRootBridge()
Date: Wed, 20 Jan 2021 13:36:52 +0100 [thread overview]
Message-ID: <a8dfd9a2-26d4-d9a5-d1cf-e4646125fd65@redhat.com> (raw)
In-Reply-To: <20210119011302.10908-5-cenjiahui@huawei.com>
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.justen@intel.com>
> Cc: Laszlo Ersek <lersek@redhat.com>
> Cc: Ard Biesheuvel <ard.biesheuvel@arm.com>
> Cc: Anthony Perard <anthony.perard@citrix.com>
> Cc: Julien Grall <julien@xen.org>
> Signed-off-by: Jiahui Cen <cenjiahui@huawei.com>
> Signed-off-by: Yubo Miao <miaoyubo@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 <lersek@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.
>
>
next prev parent reply other threads:[~2021-01-20 12:37 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-19 1:12 [PATCH v6 00/11] Add extra pci roots support for Arm Jiahui Cen
2021-01-19 1:12 ` [PATCH v6 01/11] OvmfPkg: Introduce PciHostBridgeUtilityLib class Jiahui Cen
2021-01-20 11:47 ` [edk2-devel] " Laszlo Ersek
2021-01-19 1:12 ` [PATCH v6 02/11] ArmVirtPkg: Refactor with PciHostBridgeUtilityLib Jiahui Cen
2021-01-19 1:12 ` [PATCH v6 03/11] OvmfPkg/PciHostBridgeLib: List missing PcdLib dependency Jiahui Cen
2021-01-20 12:14 ` [edk2-devel] " Laszlo Ersek
2021-01-20 13:29 ` Laszlo Ersek
2021-01-19 1:12 ` [PATCH v6 04/11] OvmfPkg/PciHostBridgeLib: Extract InitRootBridge() / UninitRootBridge() Jiahui Cen
2021-01-20 12:36 ` Laszlo Ersek [this message]
2021-01-19 1:12 ` [PATCH v6 05/11] OvmfPkg/PciHostBridgeUtilityLib: Extend parameters of InitRootBridge() Jiahui Cen
2021-01-20 12:41 ` [edk2-devel] " Laszlo Ersek
2021-01-19 1:12 ` [PATCH v6 06/11] ArmVirtPkg/FdtPciHostBridgeLib: Refactor init/uninit of root bridge Jiahui Cen
2021-01-20 12:46 ` [edk2-devel] " Laszlo Ersek
2021-01-19 1:12 ` [PATCH v6 07/11] OvmfPkg/PciHostBridgeLib: Extract GetRootBridges() / FreeRootBridges() Jiahui Cen
2021-01-20 13:07 ` [edk2-devel] " Laszlo Ersek
2021-01-19 1:12 ` [PATCH v6 08/11] OvmfPkg/PciHostBridgeUtilityLib: Extend parameter list of GetRootBridges Jiahui Cen
2021-01-20 13:34 ` [edk2-devel] " Laszlo Ersek
2021-01-19 1:13 ` [PATCH v6 09/11] OvmfPkg/PciHostBridgeUtilityLib: Extend GetRootBridges() with BusMin/BusMax Jiahui Cen
2021-01-20 14:01 ` [edk2-devel] " Laszlo Ersek
2021-01-19 1:13 ` [PATCH v6 10/11] ArmVirtPkg/FdtPciHostBridgeLib: Add extra pci root buses support Jiahui Cen
2021-01-20 14:06 ` [edk2-devel] " Laszlo Ersek
2021-01-19 1:13 ` [PATCH v6 11/11] ArmVirtPkg/ArmVirtQemu: Add support for HotPlug Jiahui Cen
2021-01-20 14:09 ` [edk2-devel] " Laszlo Ersek
2021-01-20 16:26 ` [edk2-devel] [PATCH v6 00/11] Add extra pci roots support for Arm Laszlo Ersek
2021-01-21 1:26 ` Jiahui Cen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=a8dfd9a2-26d4-d9a5-d1cf-e4646125fd65@redhat.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox