[edk2-devel] [PATCH v2 1/4] OvmfPkg: Extract functions form PciHostBridgeLib

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


From: Yubo Miao <miaoyubo at huawei.com>

Introduce a new PciHostBridgeUtilityLib class to share duplicate code
between OvmfPkg and ArmVirtPkg.

Extract function PciHostBridgeResourceConflict from
OvmfPkg/PciHostBridgeLib.

Cc: Jordan Justen <jordan.l.justen at intel.com>
Cc: Laszlo Ersek <lersek at redhat.com>
Cc: Ard Biesheuvel <ard.biesheuvel at arm.com>
Signed-off-by: Yubo Miao <miaoyubo at huawei.com>
Signed-off-by: Jiahui Cen <cenjiahui at huawei.com>
---
 OvmfPkg/OvmfPkgIa32.dsc                                             |  1 +
 OvmfPkg/OvmfPkgIa32X64.dsc                                          |  1 +
 OvmfPkg/OvmfPkgX64.dsc                                              |  1 +
 OvmfPkg/OvmfXen.dsc                                                 |  1 +
 OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf               |  1 +
 OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.inf | 49 +++++++++++++
 OvmfPkg/Include/Library/PciHostBridgeUtilityLib.h                   | 33 +++++++++
 OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.c                 | 64 +----------------
 OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.c   | 74 ++++++++++++++++++++
 9 files changed, 162 insertions(+), 63 deletions(-)

diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc
index 58d9f292f9ac..0c2bf0b13c34 100644
--- a/OvmfPkg/OvmfPkgIa32.dsc
+++ b/OvmfPkg/OvmfPkgIa32.dsc
@@ -738,6 +738,7 @@ [Components]
     <LibraryClasses>

       PciHostBridgeLib|OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf

       NULL|OvmfPkg/Library/PlatformHasIoMmuLib/PlatformHasIoMmuLib.inf

+      PciHostBridgeUtilityLib|OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.inf

   }

   MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf {

     <LibraryClasses>

diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc
index 3551f9710a6c..baf36a4f7a54 100644
--- a/OvmfPkg/OvmfPkgIa32X64.dsc
+++ b/OvmfPkg/OvmfPkgIa32X64.dsc
@@ -752,6 +752,7 @@ [Components.X64]
     <LibraryClasses>

       PciHostBridgeLib|OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf

       NULL|OvmfPkg/Library/PlatformHasIoMmuLib/PlatformHasIoMmuLib.inf

+      PciHostBridgeUtilityLib|OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.inf

   }

   MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf {

     <LibraryClasses>

diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc
index 7a8bdb8a8697..219b5f559b53 100644
--- a/OvmfPkg/OvmfPkgX64.dsc
+++ b/OvmfPkg/OvmfPkgX64.dsc
@@ -748,6 +748,7 @@ [Components]
     <LibraryClasses>

       PciHostBridgeLib|OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf

       NULL|OvmfPkg/Library/PlatformHasIoMmuLib/PlatformHasIoMmuLib.inf

+      PciHostBridgeUtilityLib|OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.inf

   }

   MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf {

     <LibraryClasses>

diff --git a/OvmfPkg/OvmfXen.dsc b/OvmfPkg/OvmfXen.dsc
index 34c9de19dfba..442c0730ef32 100644
--- a/OvmfPkg/OvmfXen.dsc
+++ b/OvmfPkg/OvmfXen.dsc
@@ -544,6 +544,7 @@ [Components]
     <LibraryClasses>

       PciHostBridgeLib|OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf

       NULL|OvmfPkg/Library/PlatformHasIoMmuLib/PlatformHasIoMmuLib.inf

+      PciHostBridgeUtilityLib|OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.inf

   }

   MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf {

     <LibraryClasses>

diff --git a/OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf b/OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf
index 6ec9ec751478..7d01528c94f1 100644
--- a/OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf
+++ b/OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf
@@ -41,6 +41,7 @@ [LibraryClasses]
   MemoryAllocationLib

   PciLib

   QemuFwCfgLib

+  PciHostBridgeUtilityLib

 

 [Pcd]

   gUefiOvmfPkgTokenSpaceGuid.PcdPciIoBase

diff --git a/OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.inf b/OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.inf
new file mode 100644
index 000000000000..c88ab8e4155d
--- /dev/null
+++ b/OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.inf
@@ -0,0 +1,49 @@
+## @file

+#  OVMF and Arm's instance of the PCI Host Bridge Utility Library.

+#

+#  Copyright (C) 2016, Red Hat, Inc.

+#  Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>

+#

+#  SPDX-License-Identifier: BSD-2-Clause-Patent

+#

+#

+##

+

+[Defines]

+  INF_VERSION                    = 0x00010005

+  BASE_NAME                      = PciHostBridgeUtilityLib

+  FILE_GUID                      = e3aa5932-527a-42e7-86f5-81b144c7e5f1

+  MODULE_TYPE                    = DXE_DRIVER

+  VERSION_STRING                 = 1.0

+  LIBRARY_CLASS                  = PciHostBridgeUtilityLib

+

+#

+# The following information is for reference only and not required by the build

+# tools.

+#

+#  VALID_ARCHITECTURES           = IA32 X64 EBC

+#

+

+[Sources]

+  PciHostBridgeUtilityLib.c

+

+[Packages]

+  MdePkg/MdePkg.dec

+  OvmfPkg/OvmfPkg.dec

+

+[LibraryClasses]

+  BaseMemoryLib

+  DebugLib

+  DevicePathLib

+  MemoryAllocationLib

+  PciLib

+  QemuFwCfgLib

+

+[Pcd]

+  gUefiOvmfPkgTokenSpaceGuid.PcdPciIoBase

+  gUefiOvmfPkgTokenSpaceGuid.PcdPciIoSize

+  gUefiOvmfPkgTokenSpaceGuid.PcdPciMmio32Base

+  gUefiOvmfPkgTokenSpaceGuid.PcdPciMmio32Size

+  gUefiOvmfPkgTokenSpaceGuid.PcdPciMmio64Base

+  gUefiOvmfPkgTokenSpaceGuid.PcdPciMmio64Size

+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfHostBridgePciDevId

diff --git a/OvmfPkg/Include/Library/PciHostBridgeUtilityLib.h b/OvmfPkg/Include/Library/PciHostBridgeUtilityLib.h
new file mode 100644
index 000000000000..d2622fd907e6
--- /dev/null
+++ b/OvmfPkg/Include/Library/PciHostBridgeUtilityLib.h
@@ -0,0 +1,33 @@
+/** @file

+  PCI Host Bridge Library consumed by PciHostBridgeDxe driver returning

+  the platform specific information about the PCI Host Bridge.

+

+  Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>

+  SPDX-License-Identifier: BSD-2-Clause-Patent

+

+**/

+#ifndef __PCI_HOST_BRIDGE_UTILITY_LIB_H__

+#define __PCI_HOST_BRIDGE_UTILITY_LIB_H__

+

+/**

+  Inform the platform that the resource conflict happens.

+

+  @param HostBridgeHandle Handle of the Host Bridge.

+  @param Configuration    Pointer to PCI I/O and PCI memory resource

+                          descriptors. The Configuration contains the resources

+                          for all the root bridges. The resource for each root

+                          bridge is terminated with END descriptor and an

+                          additional END is appended indicating the end of the

+                          entire resources. The resource descriptor field

+                          values follow the description in

+                          EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL

+                          .SubmitResources().

+**/

+VOID

+EFIAPI

+PciHostBridgeResourceConflict (

+  EFI_HANDLE                        HostBridgeHandle,

+  VOID                              *Configuration

+  );

+

+#endif

diff --git a/OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.c b/OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.c
index e850f7d183ee..1c8f465834f3 100644
--- a/OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.c
+++ b/OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.c
@@ -22,6 +22,7 @@
 #include <Library/PciHostBridgeLib.h>

 #include <Library/PciLib.h>

 #include <Library/QemuFwCfgLib.h>

+#include <Library/PciHostBridgeUtilityLib.h>

 #include "PciHostBridge.h"

 

 

@@ -33,12 +34,6 @@ typedef struct {
 #pragma pack ()

 

 

-GLOBAL_REMOVE_IF_UNREFERENCED

-CHAR16 *mPciHostBridgeLibAcpiAddressSpaceTypeStr[] = {

-  L"Mem", L"I/O", L"Bus"

-};

-

-

 STATIC

 CONST

 OVMF_PCI_ROOT_BRIDGE_DEVICE_PATH mRootBridgeDevicePathTemplate = {

@@ -384,60 +379,3 @@ PciHostBridgeFreeRootBridges (
 

   FreePool (Bridges);

 }

-

-

-/**

-  Inform the platform that the resource conflict happens.

-

-  @param HostBridgeHandle Handle of the Host Bridge.

-  @param Configuration    Pointer to PCI I/O and PCI memory resource

-                          descriptors. The Configuration contains the resources

-                          for all the root bridges. The resource for each root

-                          bridge is terminated with END descriptor and an

-                          additional END is appended indicating the end of the

-                          entire resources. The resource descriptor field

-                          values follow the description in

-                          EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL

-                          .SubmitResources().

-**/

-VOID

-EFIAPI

-PciHostBridgeResourceConflict (

-  EFI_HANDLE                        HostBridgeHandle,

-  VOID                              *Configuration

-  )

-{

-  EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Descriptor;

-  UINTN                             RootBridgeIndex;

-  DEBUG ((DEBUG_ERROR, "PciHostBridge: Resource conflict happens!\n"));

-

-  RootBridgeIndex = 0;

-  Descriptor = (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *) Configuration;

-  while (Descriptor->Desc == ACPI_ADDRESS_SPACE_DESCRIPTOR) {

-    DEBUG ((DEBUG_ERROR, "RootBridge[%d]:\n", RootBridgeIndex++));

-    for (; Descriptor->Desc == ACPI_ADDRESS_SPACE_DESCRIPTOR; Descriptor++) {

-      ASSERT (Descriptor->ResType <

-              ARRAY_SIZE (mPciHostBridgeLibAcpiAddressSpaceTypeStr)

-              );

-      DEBUG ((DEBUG_ERROR, " %s: Length/Alignment = 0x%lx / 0x%lx\n",

-              mPciHostBridgeLibAcpiAddressSpaceTypeStr[Descriptor->ResType],

-              Descriptor->AddrLen, Descriptor->AddrRangeMax

-              ));

-      if (Descriptor->ResType == ACPI_ADDRESS_SPACE_TYPE_MEM) {

-        DEBUG ((DEBUG_ERROR, "     Granularity/SpecificFlag = %ld / %02x%s\n",

-                Descriptor->AddrSpaceGranularity, Descriptor->SpecificFlag,

-                ((Descriptor->SpecificFlag &

-                  EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_CACHEABLE_PREFETCHABLE

-                  ) != 0) ? L" (Prefetchable)" : L""

-                ));

-      }

-    }

-    //

-    // Skip the END descriptor for root bridge

-    //

-    ASSERT (Descriptor->Desc == ACPI_END_TAG_DESCRIPTOR);

-    Descriptor = (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *)(

-                   (EFI_ACPI_END_TAG_DESCRIPTOR *)Descriptor + 1

-                   );

-  }

-}

diff --git a/OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.c b/OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.c
new file mode 100644
index 000000000000..7e9512dc08f1
--- /dev/null
+++ b/OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.c
@@ -0,0 +1,74 @@
+/** @file

+  OVMF's instance of the PCI Host Bridge Library.

+

+  Copyright (c) 2020, Huawei Corporation. All rights reserved.<BR>

+

+  SPDX-License-Identifier: BSD-2-Clause-Patent

+

+**/

+#include <Library/DebugLib.h>

+#include <Library/PciHostBridgeUtilityLib.h>

+

+

+GLOBAL_REMOVE_IF_UNREFERENCED

+CHAR16 *mPciHostBridgeLibAcpiAddressSpaceTypeStr[] = {

+  L"Mem", L"I/O", L"Bus"

+};

+

+

+/**

+  Inform the platform that the resource conflict happens.

+

+  @param HostBridgeHandle Handle of the Host Bridge.

+  @param Configuration    Pointer to PCI I/O and PCI memory resource

+                          descriptors. The Configuration contains the resources

+                          for all the root bridges. The resource for each root

+                          bridge is terminated with END descriptor and an

+                          additional END is appended indicating the end of the

+                          entire resources. The resource descriptor field

+                          values follow the description in

+                          EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL

+                          .SubmitResources().

+**/

+VOID

+EFIAPI

+PciHostBridgeResourceConflict (

+  EFI_HANDLE                        HostBridgeHandle,

+  VOID                              *Configuration

+  )

+{

+  EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Descriptor;

+  UINTN                             RootBridgeIndex;

+  DEBUG ((DEBUG_ERROR, "PciHostBridge: Resource conflict happens!\n"));

+

+  RootBridgeIndex = 0;

+  Descriptor = (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *) Configuration;

+  while (Descriptor->Desc == ACPI_ADDRESS_SPACE_DESCRIPTOR) {

+    DEBUG ((DEBUG_ERROR, "RootBridge[%d]:\n", RootBridgeIndex++));

+    for (; Descriptor->Desc == ACPI_ADDRESS_SPACE_DESCRIPTOR; Descriptor++) {

+      ASSERT (Descriptor->ResType <

+              ARRAY_SIZE (mPciHostBridgeLibAcpiAddressSpaceTypeStr)

+              );

+      DEBUG ((DEBUG_ERROR, " %s: Length/Alignment = 0x%lx / 0x%lx\n",

+              mPciHostBridgeLibAcpiAddressSpaceTypeStr[Descriptor->ResType],

+              Descriptor->AddrLen, Descriptor->AddrRangeMax

+              ));

+      if (Descriptor->ResType == ACPI_ADDRESS_SPACE_TYPE_MEM) {

+        DEBUG ((DEBUG_ERROR, "     Granularity/SpecificFlag = %ld / %02x%s\n",

+                Descriptor->AddrSpaceGranularity, Descriptor->SpecificFlag,

+                ((Descriptor->SpecificFlag &

+                  EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_CACHEABLE_PREFETCHABLE

+                  ) != 0) ? L" (Prefetchable)" : L""

+                ));

+      }

+    }

+    //

+    // Skip the END descriptor for root bridge

+    //

+    ASSERT (Descriptor->Desc == ACPI_END_TAG_DESCRIPTOR);

+    Descriptor = (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *)(

+                   (EFI_ACPI_END_TAG_DESCRIPTOR *)Descriptor + 1

+                   );

+  }

+}

+

-- 
2.28.0



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