summaryrefslogtreecommitdiffstats
path: root/OvmfPkg/AcpiPlatformDxe
diff options
context:
space:
mode:
authorCorvin Köhne <corvink@freebsd.org>2023-06-21 09:31:13 +0200
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>2023-06-23 17:26:37 +0000
commitea88df6b26e93bfe12cea6804631d84e871be77c (patch)
treeadc570473574a81a4486e754e80e7a57eee6f136 /OvmfPkg/AcpiPlatformDxe
parentf5d851673d4d646c129dca4018258f184ab70cbc (diff)
downloadedk2-ea88df6b26e93bfe12cea6804631d84e871be77c.tar.gz
edk2-ea88df6b26e93bfe12cea6804631d84e871be77c.tar.bz2
edk2-ea88df6b26e93bfe12cea6804631d84e871be77c.zip
OvmfPkg: move PciEncoding into AcpiPlatformLib
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@FreeBSD.org> Acked-by: Peter Grehan <grehan@freebsd.org>
Diffstat (limited to 'OvmfPkg/AcpiPlatformDxe')
-rw-r--r--OvmfPkg/AcpiPlatformDxe/AcpiPlatform.h18
-rw-r--r--OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf5
-rw-r--r--OvmfPkg/AcpiPlatformDxe/PciDecoding.c234
-rw-r--r--OvmfPkg/AcpiPlatformDxe/QemuFwCfgAcpi.c1
4 files changed, 2 insertions, 256 deletions
diff --git a/OvmfPkg/AcpiPlatformDxe/AcpiPlatform.h b/OvmfPkg/AcpiPlatformDxe/AcpiPlatform.h
index 3ec5098658..1328f6d1cb 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/AcpiPlatformDxe/AcpiPlatformDxe.inf b/OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf
index 3fd0483b50..b22aad95e0 100644
--- a/OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf
+++ b/OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf
@@ -26,7 +26,6 @@
BootScript.c
CloudHvAcpi.c
EntryPoint.c
- PciDecoding.c
QemuFwCfgAcpi.c
[Packages]
@@ -35,15 +34,13 @@
OvmfPkg/OvmfPkg.dec
[LibraryClasses]
+ AcpiPlatformLib
BaseLib
BaseMemoryLib
- DebugLib
MemoryAllocationLib
OrderedCollectionLib
- PcdLib
QemuFwCfgLib
QemuFwCfgS3Lib
- UefiBootServicesTableLib
UefiDriverEntryPoint
HobLib
TpmMeasurementLib
diff --git a/OvmfPkg/AcpiPlatformDxe/PciDecoding.c b/OvmfPkg/AcpiPlatformDxe/PciDecoding.c
deleted file mode 100644
index c7dbfb1baa..0000000000
--- a/OvmfPkg/AcpiPlatformDxe/PciDecoding.c
+++ /dev/null
@@ -1,234 +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/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.
-
- 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/QemuFwCfgAcpi.c b/OvmfPkg/AcpiPlatformDxe/QemuFwCfgAcpi.c
index a073b292b7..3de039d574 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()