[edk2-devel] [PATCH v6 04/11] OvmfPkg/PciHostBridgeLib: Extract InitRootBridge() / UninitRootBridge()

Laszlo Ersek lersek at redhat.com
Wed Jan 20 12:36:52 UTC 2021


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 at intel.com>
> Cc: Laszlo Ersek <lersek at redhat.com>
> Cc: Ard Biesheuvel <ard.biesheuvel at arm.com>
> Cc: Anthony Perard <anthony.perard at citrix.com>
> Cc: Julien Grall <julien at xen.org>
> Signed-off-by: Jiahui Cen <cenjiahui at huawei.com>
> Signed-off-by: Yubo Miao <miaoyubo at 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 at 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/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-





More information about the edk2-devel-archive mailing list