[edk2-devel] [PATCH v2 4/4] ArmVirtPkg: Support extra pci roots

Jiahui Cen via groups.io cenjiahui=huawei.com at groups.io
Mon Nov 9 13:05:11 UTC 2020


From: Yubo Miao <miaoyubo at huawei.com>

As the implementation of extra pci roots is shared in
PciHostBridgeUtilityLib, let's call PciHostBridgeExtraRoots
to support it.

Cc: Laszlo Ersek <lersek at redhat.com>
Cc: Ard Biesheuvel <ard.biesheuvel at arm.com>
Cc: Leif Lindholm <leif at nuviainc.com>
Signed-off-by: Yubo Miao <miaoyubo at huawei.com>
Signed-off-by: Jiahui Cen <cenjiahui at huawei.com>
---
 ArmVirtPkg/Library/FdtPciHostBridgeLib/FdtPciHostBridgeLib.inf |   3 +
 ArmVirtPkg/Library/FdtPciHostBridgeLib/FdtPciHostBridgeLib.c   | 162 +++++++++++++-------
 2 files changed, 111 insertions(+), 54 deletions(-)

diff --git a/ArmVirtPkg/Library/FdtPciHostBridgeLib/FdtPciHostBridgeLib.inf b/ArmVirtPkg/Library/FdtPciHostBridgeLib/FdtPciHostBridgeLib.inf
index 97e9368c8e9f..1b0f9a2b9013 100644
--- a/ArmVirtPkg/Library/FdtPciHostBridgeLib/FdtPciHostBridgeLib.inf
+++ b/ArmVirtPkg/Library/FdtPciHostBridgeLib/FdtPciHostBridgeLib.inf
@@ -39,6 +39,9 @@ [LibraryClasses]
   DxeServicesTableLib

   MemoryAllocationLib

   PciPcdProducerLib

+  PciHostBridgeLib

+  BaseMemoryLib

+  QemuFwCfgLib

   PciHostBridgeUtilityLib

 

 [FixedPcd]

diff --git a/ArmVirtPkg/Library/FdtPciHostBridgeLib/FdtPciHostBridgeLib.c b/ArmVirtPkg/Library/FdtPciHostBridgeLib/FdtPciHostBridgeLib.c
index 3952f511b4d2..d33f833a5040 100644
--- a/ArmVirtPkg/Library/FdtPciHostBridgeLib/FdtPciHostBridgeLib.c
+++ b/ArmVirtPkg/Library/FdtPciHostBridgeLib/FdtPciHostBridgeLib.c
@@ -15,6 +15,11 @@
 #include <Library/PcdLib.h>

 #include <Library/UefiBootServicesTableLib.h>

 #include <Library/PciHostBridgeUtilityLib.h>

+#include <Library/QemuFwCfgLib.h>

+#include <Library/PciLib.h>

+#include <IndustryStandard/Pci.h>

+#include <Library/BaseMemoryLib.h>

+#include "Library/PciHostBridgeLib/PciHostBridge.h"

 

 #include <Protocol/FdtClient.h>

 #include <Protocol/PciRootBridgeIo.h>

@@ -304,7 +309,60 @@ ProcessPciHost (
   return Status;

 }

 

-STATIC PCI_ROOT_BRIDGE mRootBridge;

+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

+  )

+{

+  EFI_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->ResourceAssigned   = FALSE;

+  RootBus->Supports   = Supports;

+  RootBus->Attributes = Attributes;

+

+  RootBus->DmaAbove4G = TRUE;

+

+  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 = FALSE;

+

+  DevicePath = AllocateCopyPool (sizeof mEfiPciRootBridgeDevicePath,

+                 &mEfiPciRootBridgeDevicePath);

+  if (DevicePath == NULL) {

+    DEBUG ((EFI_D_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 ((EFI_D_INFO,

+    "%a: populated root bus %d, with room for %d subordinate bus(es)\n",

+    __FUNCTION__, RootBusNumber, MaxSubBusNumber - RootBusNumber));

+  return EFI_SUCCESS;

+}

 

 /**

   Return all the root bridge instances in an array.

@@ -321,11 +379,19 @@ PciHostBridgeGetRootBridges (
   UINTN *Count

   )

 {

-  UINT64              IoBase, IoSize;

-  UINT64              Mmio32Base, Mmio32Size;

-  UINT64              Mmio64Base, Mmio64Size;

-  UINT32              BusMin, BusMax;

-  EFI_STATUS          Status;

+  UINT64                   IoBase, IoSize;

+  UINT64                   Mmio32Base, Mmio32Size;

+  UINT64                   Mmio64Base, Mmio64Size;

+  UINT32                   BusMin, BusMax;

+  PCI_ROOT_BRIDGE          *Bridges;

+  UINT64                   Attributes;

+  UINT64                   AllocationAttributes;

+  EFI_STATUS               Status;

+  PCI_ROOT_BRIDGE_APERTURE Io;

+  PCI_ROOT_BRIDGE_APERTURE PMem;

+  PCI_ROOT_BRIDGE_APERTURE PMemAbove4G;

+  PCI_ROOT_BRIDGE_APERTURE Mem;

+  PCI_ROOT_BRIDGE_APERTURE MemAbove4G;

 

   if (PcdGet64 (PcdPciExpressBaseAddress) == 0) {

     DEBUG ((EFI_D_INFO, "%a: PCI host bridge not present\n", __FUNCTION__));

@@ -343,33 +409,27 @@ PciHostBridgeGetRootBridges (
     return NULL;

   }

 

-  *Count = 1;

+  ZeroMem (&Io, sizeof (Io));

+  ZeroMem (&Mem, sizeof (Mem));

+  ZeroMem (&MemAbove4G, sizeof (MemAbove4G));

 

-  mRootBridge.Segment               = 0;

-  mRootBridge.Supports              = EFI_PCI_ATTRIBUTE_ISA_IO_16 |

-                                      EFI_PCI_ATTRIBUTE_ISA_MOTHERBOARD_IO |

-                                      EFI_PCI_ATTRIBUTE_VGA_IO_16  |

-                                      EFI_PCI_ATTRIBUTE_VGA_PALETTE_IO_16;

-  mRootBridge.Attributes            = mRootBridge.Supports;

+  Attributes = EFI_PCI_ATTRIBUTE_ISA_IO_16 |

+               EFI_PCI_ATTRIBUTE_ISA_MOTHERBOARD_IO |

+               EFI_PCI_ATTRIBUTE_VGA_IO_16  |

+               EFI_PCI_ATTRIBUTE_VGA_PALETTE_IO_16;

 

-  mRootBridge.DmaAbove4G            = TRUE;

-  mRootBridge.NoExtendedConfigSpace = FALSE;

-  mRootBridge.ResourceAssigned      = FALSE;

+  AllocationAttributes  = EFI_PCI_HOST_BRIDGE_COMBINE_MEM_PMEM;

 

-  mRootBridge.AllocationAttributes  = EFI_PCI_HOST_BRIDGE_COMBINE_MEM_PMEM;

-

-  mRootBridge.Bus.Base              = BusMin;

-  mRootBridge.Bus.Limit             = BusMax;

-  mRootBridge.Io.Base               = IoBase;

-  mRootBridge.Io.Limit              = IoBase + IoSize - 1;

-  mRootBridge.Mem.Base              = Mmio32Base;

-  mRootBridge.Mem.Limit             = Mmio32Base + Mmio32Size - 1;

+  Io.Base               = IoBase;

+  Io.Limit              = IoBase + IoSize - 1;

+  Mem.Base              = Mmio32Base;

+  Mem.Limit             = Mmio32Base + Mmio32Size - 1;

 

   if (sizeof (UINTN) == sizeof (UINT64)) {

-    mRootBridge.MemAbove4G.Base       = Mmio64Base;

-    mRootBridge.MemAbove4G.Limit      = Mmio64Base + Mmio64Size - 1;

+    MemAbove4G.Base       = Mmio64Base;

+    MemAbove4G.Limit      = Mmio64Base + Mmio64Size - 1;

     if (Mmio64Size > 0) {

-      mRootBridge.AllocationAttributes |= EFI_PCI_HOST_BRIDGE_MEM64_DECODE;

+      AllocationAttributes |= EFI_PCI_HOST_BRIDGE_MEM64_DECODE;

     }

   } else {

     //

@@ -378,37 +438,31 @@ PciHostBridgeGetRootBridges (
     // BARs unless they are allocated below 4 GB. So ignore the range above

     // 4 GB in this case.

     //

-    mRootBridge.MemAbove4G.Base       = MAX_UINT64;

-    mRootBridge.MemAbove4G.Limit      = 0;

+    MemAbove4G.Base       = MAX_UINT64;

+    MemAbove4G.Limit      = 0;

   }

 

   //

   // No separate ranges for prefetchable and non-prefetchable BARs

   //

-  mRootBridge.PMem.Base             = MAX_UINT64;

-  mRootBridge.PMem.Limit            = 0;

-  mRootBridge.PMemAbove4G.Base      = MAX_UINT64;

-  mRootBridge.PMemAbove4G.Limit     = 0;

+  PMem.Base             = MAX_UINT64;

+  PMem.Limit            = 0;

+  PMemAbove4G.Base      = MAX_UINT64;

+  PMemAbove4G.Limit     = 0;

 

-  mRootBridge.DevicePath = (EFI_DEVICE_PATH_PROTOCOL *)&mEfiPciRootBridgeDevicePath;

-

-  return &mRootBridge;

+  Bridges = PciHostBridgeExtraRoots (

+    Count,

+    PMem,

+    PMemAbove4G,

+    BusMax,

+    Attributes,

+    AllocationAttributes,

+    Io,

+    Mem,

+    MemAbove4G

+  );

+  if (Bridges) {

+    return Bridges;

+  }

+  return NULL;

 }

-

-/**

-  Free the root bridge instances array returned from

-  PciHostBridgeGetRootBridges().

-

-  @param Bridges The root bridge instances array.

-  @param Count   The count of the array.

-**/

-VOID

-EFIAPI

-PciHostBridgeFreeRootBridges (

-  PCI_ROOT_BRIDGE *Bridges,

-  UINTN           Count

-  )

-{

-  ASSERT (Count == 1);

-}

-

-- 
2.28.0



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#67184): https://edk2.groups.io/g/devel/message/67184
Mute This Topic: https://groups.io/mt/78135585/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