[edk2-devel] [PATCH v3 3/6] OvmfPkg: move PciEncoding into AcpiPlatformLib

Corvin Köhne corvink at FreeBSD.org
Tue Jun 20 12:53:37 UTC 2023


Bhyve supports providing ACPI tables by FwCfg. Therefore,
InstallQemuFwCfgTables should be moved to AcpiPlatformLib to reuse the
code. As first step, move PciEncoding into AcpiPlatformLib.

Signed-off-by: Corvin Köhne <corvink at FreeBSD.org>
Cc: Ard Biesheuvel <ardb+tianocore at kernel.org>
Cc: Gerd Hoffmann <kraxel at redhat.com>
Cc: Jiewen Yao <jiewen.yao at intel.com>
Cc: Jordan Justen <jordan.l.justen at intel.com>
Cc: Leif Lindholm <quic_llindhol at quicinc.com>
Cc: Peter Grehan <grehan at freebsd.org>
Cc: Rebecca Cran <rebecca at bsdio.com>
Cc: Sami Mujawar <sami.mujawar at arm.com>
---
 ArmVirtPkg/ArmVirtQemu.dsc                    |   1 +
 ArmVirtPkg/ArmVirtQemuKernel.dsc              |   1 +
 OvmfPkg/AmdSev/AmdSevX64.dsc                  |   1 +
 OvmfPkg/CloudHv/CloudHvX64.dsc                |   1 +
 OvmfPkg/IntelTdx/IntelTdxX64.dsc              |   1 +
 OvmfPkg/Microvm/MicrovmX64.dsc                |   1 +
 OvmfPkg/OvmfPkgIa32.dsc                       |   1 +
 OvmfPkg/OvmfPkgIa32X64.dsc                    |   1 +
 OvmfPkg/OvmfPkgX64.dsc                        |   1 +
 OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc           |   1 +
 OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf   |   5 +-
 .../Bhyve/AcpiPlatformDxe/AcpiPlatformDxe.inf |   1 -
 .../AcpiPlatformLib/DxeAcpiPlatformLib.inf    |   7 +
 OvmfPkg/AcpiPlatformDxe/AcpiPlatform.h        |  18 --
 OvmfPkg/Bhyve/AcpiPlatformDxe/AcpiPlatform.h  |  17 --
 OvmfPkg/Include/Library/AcpiPlatformLib.h     |  18 ++
 OvmfPkg/AcpiPlatformDxe/QemuFwCfgAcpi.c       |   1 +
 OvmfPkg/Bhyve/AcpiPlatformDxe/PciDecoding.c   | 232 ------------------
 .../AcpiPlatformLib}/PciDecoding.c            |   3 +-
 19 files changed, 38 insertions(+), 274 deletions(-)
 delete mode 100644 OvmfPkg/Bhyve/AcpiPlatformDxe/PciDecoding.c
 rename OvmfPkg/{AcpiPlatformDxe => Library/AcpiPlatformLib}/PciDecoding.c (96%)

diff --git a/ArmVirtPkg/ArmVirtQemu.dsc b/ArmVirtPkg/ArmVirtQemu.dsc
index d998f816b2b3..1e0225951aef 100644
--- a/ArmVirtPkg/ArmVirtQemu.dsc
+++ b/ArmVirtPkg/ArmVirtQemu.dsc
@@ -111,6 +111,7 @@ [LibraryClasses.AARCH64.PEIM]
   ArmMmuLib|ArmPkg/Library/ArmMmuLib/ArmMmuPeiLib.inf
 
 [LibraryClasses.common.DXE_DRIVER]
+  AcpiPlatformLib|OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.inf
   ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf
 
 !if $(TPM2_ENABLE) == TRUE
diff --git a/ArmVirtPkg/ArmVirtQemuKernel.dsc b/ArmVirtPkg/ArmVirtQemuKernel.dsc
index c9d2b18392b9..8ef5927b53ff 100644
--- a/ArmVirtPkg/ArmVirtQemuKernel.dsc
+++ b/ArmVirtPkg/ArmVirtQemuKernel.dsc
@@ -83,6 +83,7 @@ [LibraryClasses.common]
   TpmPlatformHierarchyLib|SecurityPkg/Library/PeiDxeTpmPlatformHierarchyLibNull/PeiDxeTpmPlatformHierarchyLib.inf
 
 [LibraryClasses.common.DXE_DRIVER]
+  AcpiPlatformLib|OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.inf
   ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf
 
 [LibraryClasses.common.UEFI_DRIVER]
diff --git a/OvmfPkg/AmdSev/AmdSevX64.dsc b/OvmfPkg/AmdSev/AmdSevX64.dsc
index d24909e847b4..2c6ed7c9745f 100644
--- a/OvmfPkg/AmdSev/AmdSevX64.dsc
+++ b/OvmfPkg/AmdSev/AmdSevX64.dsc
@@ -329,6 +329,7 @@ [LibraryClasses.common.UEFI_DRIVER]
   PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf
 
 [LibraryClasses.common.DXE_DRIVER]
+  AcpiPlatformLib|OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.inf
   PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
   TimerLib|OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf
   ResetSystemLib|OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf
diff --git a/OvmfPkg/CloudHv/CloudHvX64.dsc b/OvmfPkg/CloudHv/CloudHvX64.dsc
index dd9aa403d6a0..e000deed9e4d 100644
--- a/OvmfPkg/CloudHv/CloudHvX64.dsc
+++ b/OvmfPkg/CloudHv/CloudHvX64.dsc
@@ -366,6 +366,7 @@ [LibraryClasses.common.UEFI_DRIVER]
   PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf
 
 [LibraryClasses.common.DXE_DRIVER]
+  AcpiPlatformLib|OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.inf
   PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
   TimerLib|OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf
   ResetSystemLib|OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf
diff --git a/OvmfPkg/IntelTdx/IntelTdxX64.dsc b/OvmfPkg/IntelTdx/IntelTdxX64.dsc
index db4953a82ec6..193657ff2d61 100644
--- a/OvmfPkg/IntelTdx/IntelTdxX64.dsc
+++ b/OvmfPkg/IntelTdx/IntelTdxX64.dsc
@@ -289,6 +289,7 @@ [LibraryClasses.common.UEFI_DRIVER]
   PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf
 
 [LibraryClasses.common.DXE_DRIVER]
+  AcpiPlatformLib|OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.inf
   PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
   TimerLib|OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf
   ResetSystemLib|OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf
diff --git a/OvmfPkg/Microvm/MicrovmX64.dsc b/OvmfPkg/Microvm/MicrovmX64.dsc
index 82da3a7e7cce..2f7585639374 100644
--- a/OvmfPkg/Microvm/MicrovmX64.dsc
+++ b/OvmfPkg/Microvm/MicrovmX64.dsc
@@ -368,6 +368,7 @@ [LibraryClasses.common.UEFI_DRIVER]
   PciExpressLib|OvmfPkg/Library/BaseCachingPciExpressLib/BaseCachingPciExpressLib.inf
 
 [LibraryClasses.common.DXE_DRIVER]
+  AcpiPlatformLib|OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.inf
   PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
   ResetSystemLib|OvmfPkg/Library/ResetSystemLib/DxeResetSystemLibMicrovm.inf
   HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc
index 08b04e65cab7..8d1ef4e833b2 100644
--- a/OvmfPkg/OvmfPkgIa32.dsc
+++ b/OvmfPkg/OvmfPkgIa32.dsc
@@ -373,6 +373,7 @@ [LibraryClasses.common.UEFI_DRIVER]
   PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf
 
 [LibraryClasses.common.DXE_DRIVER]
+  AcpiPlatformLib|OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.inf
   PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
   TimerLib|OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf
   ResetSystemLib|OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf
diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc
index d456896a45fb..afee349910a2 100644
--- a/OvmfPkg/OvmfPkgIa32X64.dsc
+++ b/OvmfPkg/OvmfPkgIa32X64.dsc
@@ -378,6 +378,7 @@ [LibraryClasses.common.UEFI_DRIVER]
   PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf
 
 [LibraryClasses.common.DXE_DRIVER]
+  AcpiPlatformLib|OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.inf
   PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
   TimerLib|OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf
   ResetSystemLib|OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf
diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc
index e1c0a6fe9ff7..24ac834e0631 100644
--- a/OvmfPkg/OvmfPkgX64.dsc
+++ b/OvmfPkg/OvmfPkgX64.dsc
@@ -399,6 +399,7 @@ [LibraryClasses.common.UEFI_DRIVER]
   PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf
 
 [LibraryClasses.common.DXE_DRIVER]
+  AcpiPlatformLib|OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.inf
   PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
   TimerLib|OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf
   ResetSystemLib|OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf
diff --git a/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc b/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc
index 414d186179fb..06c300c4e850 100644
--- a/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc
+++ b/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc
@@ -113,6 +113,7 @@ [LibraryClasses.common]
 !endif
 
 [LibraryClasses.common.DXE_DRIVER]
+  AcpiPlatformLib|OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.inf
   ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf
   PciExpressLib|OvmfPkg/Library/BaseCachingPciExpressLib/BaseCachingPciExpressLib.inf
 
diff --git a/OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf b/OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf
index 3fd0483b50eb..b22aad95e081 100644
--- a/OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf
+++ b/OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf
@@ -26,7 +26,6 @@ [Sources]
   BootScript.c
   CloudHvAcpi.c
   EntryPoint.c
-  PciDecoding.c
   QemuFwCfgAcpi.c
 
 [Packages]
@@ -35,15 +34,13 @@ [Packages]
   OvmfPkg/OvmfPkg.dec
 
 [LibraryClasses]
+  AcpiPlatformLib
   BaseLib
   BaseMemoryLib
-  DebugLib
   MemoryAllocationLib
   OrderedCollectionLib
-  PcdLib
   QemuFwCfgLib
   QemuFwCfgS3Lib
-  UefiBootServicesTableLib
   UefiDriverEntryPoint
   HobLib
   TpmMeasurementLib
diff --git a/OvmfPkg/Bhyve/AcpiPlatformDxe/AcpiPlatformDxe.inf b/OvmfPkg/Bhyve/AcpiPlatformDxe/AcpiPlatformDxe.inf
index 75ed8e4a7deb..2e228d815b87 100644
--- a/OvmfPkg/Bhyve/AcpiPlatformDxe/AcpiPlatformDxe.inf
+++ b/OvmfPkg/Bhyve/AcpiPlatformDxe/AcpiPlatformDxe.inf
@@ -26,7 +26,6 @@ [Sources]
   AcpiPlatform.h
   Bhyve.c
   EntryPoint.c
-  PciDecoding.c
 
 [Packages]
   MdePkg/MdePkg.dec
diff --git a/OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.inf b/OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.inf
index dfe0e5623d32..4be501bb2c58 100644
--- a/OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.inf
+++ b/OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.inf
@@ -16,11 +16,18 @@ [Defines]
 
 [Sources]
   DxeAcpiPlatformLib.c
+  PciDecoding.c
 
 [Packages]
+  MdeModulePkg/MdeModulePkg.dec
   MdePkg/MdePkg.dec
   OvmfPkg/OvmfPkg.dec
 
 [LibraryClasses]
   BaseLib
   DebugLib
+  PcdLib
+  UefiBootServicesTableLib
+
+[Pcd]
+  gEfiMdeModulePkgTokenSpaceGuid.PcdPciDisableBusEnumeration
diff --git a/OvmfPkg/AcpiPlatformDxe/AcpiPlatform.h b/OvmfPkg/AcpiPlatformDxe/AcpiPlatform.h
index 3ec509865863..1328f6d1cba6 100644
--- a/OvmfPkg/AcpiPlatformDxe/AcpiPlatform.h
+++ b/OvmfPkg/AcpiPlatformDxe/AcpiPlatform.h
@@ -10,12 +10,6 @@
 #define ACPI_PLATFORM_H_
 
 #include <Protocol/AcpiTable.h> // EFI_ACPI_TABLE_PROTOCOL
-#include <Protocol/PciIo.h>     // EFI_PCI_IO_PROTOCOL
-
-typedef struct {
-  EFI_PCI_IO_PROTOCOL    *PciIo;
-  UINT64                 PciAttributes;
-} ORIGINAL_ATTRIBUTES;
 
 typedef struct S3_CONTEXT S3_CONTEXT;
 
@@ -43,18 +37,6 @@ InstallAcpiTables (
   IN   EFI_ACPI_TABLE_PROTOCOL  *AcpiTable
   );
 
-VOID
-EnablePciDecoding (
-  OUT ORIGINAL_ATTRIBUTES  **OriginalAttributes,
-  OUT UINTN                *Count
-  );
-
-VOID
-RestorePciDecoding (
-  IN ORIGINAL_ATTRIBUTES  *OriginalAttributes,
-  IN UINTN                Count
-  );
-
 EFI_STATUS
 AllocateS3Context (
   OUT S3_CONTEXT  **S3Context,
diff --git a/OvmfPkg/Bhyve/AcpiPlatformDxe/AcpiPlatform.h b/OvmfPkg/Bhyve/AcpiPlatformDxe/AcpiPlatform.h
index 54d1af073eab..b75292b73546 100644
--- a/OvmfPkg/Bhyve/AcpiPlatformDxe/AcpiPlatform.h
+++ b/OvmfPkg/Bhyve/AcpiPlatformDxe/AcpiPlatform.h
@@ -21,11 +21,6 @@
 #include <Library/XenPlatformLib.h>
 #include <IndustryStandard/Acpi.h>
 
-typedef struct {
-  EFI_PCI_IO_PROTOCOL    *PciIo;
-  UINT64                 PciAttributes;
-} ORIGINAL_ATTRIBUTES;
-
 typedef struct S3_CONTEXT S3_CONTEXT;
 
 EFI_STATUS
@@ -58,16 +53,4 @@ InstallAcpiTables (
   IN   EFI_ACPI_TABLE_PROTOCOL  *AcpiTable
   );
 
-VOID
-EnablePciDecoding (
-  OUT ORIGINAL_ATTRIBUTES  **OriginalAttributes,
-  OUT UINTN                *Count
-  );
-
-VOID
-RestorePciDecoding (
-  IN ORIGINAL_ATTRIBUTES  *OriginalAttributes,
-  IN UINTN                Count
-  );
-
 #endif /* _ACPI_PLATFORM_H_INCLUDED_ */
diff --git a/OvmfPkg/Include/Library/AcpiPlatformLib.h b/OvmfPkg/Include/Library/AcpiPlatformLib.h
index 617265000315..167d6c49d6e2 100644
--- a/OvmfPkg/Include/Library/AcpiPlatformLib.h
+++ b/OvmfPkg/Include/Library/AcpiPlatformLib.h
@@ -8,6 +8,12 @@
 #define ACPI_PLATFORM_LIB_H_
 
 #include <Protocol/AcpiTable.h>
+#include <Protocol/PciIo.h>
+
+typedef struct {
+  EFI_PCI_IO_PROTOCOL    *PciIo;
+  UINT64                 PciAttributes;
+} ORIGINAL_ATTRIBUTES;
 
 /**
   Searches and returns the address of the ACPI Root System Description Pointer (RSDP) in system memory.
@@ -51,4 +57,16 @@ InstallAcpiTablesFromRsdp (
   IN EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER  *Rsdp
   );
 
+VOID
+EnablePciDecoding (
+  OUT ORIGINAL_ATTRIBUTES  **OriginalAttributes,
+  OUT UINTN                *Count
+  );
+
+VOID
+RestorePciDecoding (
+  IN ORIGINAL_ATTRIBUTES  *OriginalAttributes,
+  IN UINTN                Count
+  );
+
 #endif
diff --git a/OvmfPkg/AcpiPlatformDxe/QemuFwCfgAcpi.c b/OvmfPkg/AcpiPlatformDxe/QemuFwCfgAcpi.c
index a073b292b743..3de039d57414 100644
--- a/OvmfPkg/AcpiPlatformDxe/QemuFwCfgAcpi.c
+++ b/OvmfPkg/AcpiPlatformDxe/QemuFwCfgAcpi.c
@@ -11,6 +11,7 @@
 #include <IndustryStandard/Acpi.h>            // EFI_ACPI_DESCRIPTION_HEADER
 #include <IndustryStandard/QemuLoader.h>      // QEMU_LOADER_FNAME_SIZE
 #include <IndustryStandard/UefiTcgPlatform.h>
+#include <Library/AcpiPlatformLib.h>
 #include <Library/BaseLib.h>                  // AsciiStrCmp()
 #include <Library/BaseMemoryLib.h>            // CopyMem()
 #include <Library/DebugLib.h>                 // DEBUG()
diff --git a/OvmfPkg/Bhyve/AcpiPlatformDxe/PciDecoding.c b/OvmfPkg/Bhyve/AcpiPlatformDxe/PciDecoding.c
deleted file mode 100644
index 0dcf3517f1e7..000000000000
--- a/OvmfPkg/Bhyve/AcpiPlatformDxe/PciDecoding.c
+++ /dev/null
@@ -1,232 +0,0 @@
-/** @file
-  Temporarily enable IO and MMIO decoding for all PCI devices while QEMU
-  regenerates the ACPI tables.
-
-  Copyright (C) 2016, Red Hat, Inc.
-
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-**/
-
-#include <Library/MemoryAllocationLib.h>
-
-#include "AcpiPlatform.h"
-
-/**
-  Collect all PciIo protocol instances in the system. Save their original
-  attributes, and enable IO and MMIO decoding for each.
-
-  This is a best effort function; it doesn't return status codes. Its
-  caller is supposed to proceed even if this function fails.
-
-  @param[out] OriginalAttributes  On output, a dynamically allocated array of
-                                  ORIGINAL_ATTRIBUTES elements. The array lists
-                                  the PciIo protocol instances found in the
-                                  system at the time of the call, plus the
-                                  original PCI attributes for each.
-
-                                  Before returning, the function enables IO and
-                                  MMIO decoding for each PciIo instance it
-                                  finds.
-
-                                  On error, or when no such instances are
-                                  found, OriginalAttributes is set to NULL.
-
-  @param[out] Count               On output, the number of elements in
-                                  OriginalAttributes. On error it is set to
-                                  zero.
-**/
-VOID
-EnablePciDecoding (
-  OUT ORIGINAL_ATTRIBUTES  **OriginalAttributes,
-  OUT UINTN                *Count
-  )
-{
-  EFI_STATUS           Status;
-  UINTN                NoHandles;
-  EFI_HANDLE           *Handles;
-  ORIGINAL_ATTRIBUTES  *OrigAttrs;
-  UINTN                Idx;
-
-  *OriginalAttributes = NULL;
-  *Count              = 0;
-
-  if (PcdGetBool (PcdPciDisableBusEnumeration)) {
-    //
-    // The platform downloads ACPI tables from QEMU in general, but there are
-    // no root bridges in this execution. We're done.
-    //
-    return;
-  }
-
-  Status = gBS->LocateHandleBuffer (
-                  ByProtocol,
-                  &gEfiPciIoProtocolGuid,
-                  NULL /* SearchKey */,
-                  &NoHandles,
-                  &Handles
-                  );
-  if (Status == EFI_NOT_FOUND) {
-    //
-    // No PCI devices were found on either of the root bridges. We're done.
-    //
-    return;
-  }
-
-  if (EFI_ERROR (Status)) {
-    DEBUG ((
-      DEBUG_WARN,
-      "%a: LocateHandleBuffer(): %r\n",
-      __func__,
-      Status
-      ));
-    return;
-  }
-
-  OrigAttrs = AllocatePool (NoHandles * sizeof *OrigAttrs);
-  if (OrigAttrs == NULL) {
-    DEBUG ((
-      DEBUG_WARN,
-      "%a: AllocatePool(): out of resources\n",
-      __func__
-      ));
-    goto FreeHandles;
-  }
-
-  for (Idx = 0; Idx < NoHandles; ++Idx) {
-    EFI_PCI_IO_PROTOCOL  *PciIo;
-    UINT64               Attributes;
-
-    //
-    // Look up PciIo on the handle and stash it
-    //
-    Status = gBS->HandleProtocol (
-                    Handles[Idx],
-                    &gEfiPciIoProtocolGuid,
-                    (VOID **)&PciIo
-                    );
-    ASSERT_EFI_ERROR (Status);
-    OrigAttrs[Idx].PciIo = PciIo;
-
-    //
-    // Stash the current attributes
-    //
-    Status = PciIo->Attributes (
-                      PciIo,
-                      EfiPciIoAttributeOperationGet,
-                      0,
-                      &OrigAttrs[Idx].PciAttributes
-                      );
-    if (EFI_ERROR (Status)) {
-      DEBUG ((
-        DEBUG_WARN,
-        "%a: EfiPciIoAttributeOperationGet: %r\n",
-        __func__,
-        Status
-        ));
-      goto RestoreAttributes;
-    }
-
-    //
-    // Retrieve supported attributes
-    //
-    Status = PciIo->Attributes (
-                      PciIo,
-                      EfiPciIoAttributeOperationSupported,
-                      0,
-                      &Attributes
-                      );
-    if (EFI_ERROR (Status)) {
-      DEBUG ((
-        DEBUG_WARN,
-        "%a: EfiPciIoAttributeOperationSupported: %r\n",
-        __func__,
-        Status
-        ));
-      goto RestoreAttributes;
-    }
-
-    //
-    // Enable IO and MMIO decoding
-    //
-    Attributes &= EFI_PCI_IO_ATTRIBUTE_IO | EFI_PCI_IO_ATTRIBUTE_MEMORY;
-    Status      = PciIo->Attributes (
-                           PciIo,
-                           EfiPciIoAttributeOperationEnable,
-                           Attributes,
-                           NULL
-                           );
-    if (EFI_ERROR (Status)) {
-      DEBUG ((
-        DEBUG_WARN,
-        "%a: EfiPciIoAttributeOperationEnable: %r\n",
-        __func__,
-        Status
-        ));
-      goto RestoreAttributes;
-    }
-  }
-
-  //
-  // Success
-  //
-  FreePool (Handles);
-  *OriginalAttributes = OrigAttrs;
-  *Count              = NoHandles;
-  return;
-
-RestoreAttributes:
-  while (Idx > 0) {
-    --Idx;
-    OrigAttrs[Idx].PciIo->Attributes (
-                            OrigAttrs[Idx].PciIo,
-                            EfiPciIoAttributeOperationSet,
-                            OrigAttrs[Idx].PciAttributes,
-                            NULL
-                            );
-  }
-
-  FreePool (OrigAttrs);
-
-FreeHandles:
-  FreePool (Handles);
-}
-
-/**
-  Restore the original PCI attributes saved with EnablePciDecoding().
-
-  @param[in] OriginalAttributes  The array allocated and populated by
-                                 EnablePciDecoding(). This parameter may be
-                                 NULL. If OriginalAttributes is NULL, then the
-                                 function is a no-op; otherwise the PciIo
-                                 attributes will be restored, and the
-                                 OriginalAttributes array will be freed.
-
-  @param[in] Count               The Count value stored by EnablePciDecoding(),
-                                 the number of elements in OriginalAttributes.
-                                 Count may be zero if and only if
-                                 OriginalAttributes is NULL.
-**/
-VOID
-RestorePciDecoding (
-  IN ORIGINAL_ATTRIBUTES  *OriginalAttributes,
-  IN UINTN                Count
-  )
-{
-  UINTN  Idx;
-
-  ASSERT ((OriginalAttributes == NULL) == (Count == 0));
-  if (OriginalAttributes == NULL) {
-    return;
-  }
-
-  for (Idx = 0; Idx < Count; ++Idx) {
-    OriginalAttributes[Idx].PciIo->Attributes (
-                                     OriginalAttributes[Idx].PciIo,
-                                     EfiPciIoAttributeOperationSet,
-                                     OriginalAttributes[Idx].PciAttributes,
-                                     NULL
-                                     );
-  }
-
-  FreePool (OriginalAttributes);
-}
diff --git a/OvmfPkg/AcpiPlatformDxe/PciDecoding.c b/OvmfPkg/Library/AcpiPlatformLib/PciDecoding.c
similarity index 96%
rename from OvmfPkg/AcpiPlatformDxe/PciDecoding.c
rename to OvmfPkg/Library/AcpiPlatformLib/PciDecoding.c
index c7dbfb1baaea..58fbfeefda36 100644
--- a/OvmfPkg/AcpiPlatformDxe/PciDecoding.c
+++ b/OvmfPkg/Library/AcpiPlatformLib/PciDecoding.c
@@ -7,12 +7,11 @@
   SPDX-License-Identifier: BSD-2-Clause-Patent
 **/
 
+#include <Library/AcpiPlatformLib.h>
 #include <Library/DebugLib.h>                  // DEBUG()
 #include <Library/MemoryAllocationLib.h>       // AllocatePool()
 #include <Library/UefiBootServicesTableLib.h>  // gBS
 
-#include "AcpiPlatform.h"
-
 /**
   Collect all PciIo protocol instances in the system. Save their original
   attributes, and enable IO and MMIO decoding for each.
-- 
2.41.0



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