From ea88df6b26e93bfe12cea6804631d84e871be77c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Corvin=20K=C3=B6hne?= Date: Wed, 21 Jun 2023 09:31:13 +0200 Subject: OvmfPkg: move PciEncoding into AcpiPlatformLib MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Acked-by: Peter Grehan --- OvmfPkg/AcpiPlatformDxe/AcpiPlatform.h | 18 --- OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf | 5 +- OvmfPkg/AcpiPlatformDxe/PciDecoding.c | 234 ---------------------------- OvmfPkg/AcpiPlatformDxe/QemuFwCfgAcpi.c | 1 + 4 files changed, 2 insertions(+), 256 deletions(-) delete mode 100644 OvmfPkg/AcpiPlatformDxe/PciDecoding.c (limited to 'OvmfPkg/AcpiPlatformDxe') diff --git a/OvmfPkg/AcpiPlatformDxe/AcpiPlatform.h b/OvmfPkg/AcpiPlatformDxe/AcpiPlatform.h index 3ec5098..1328f6d 100644 --- a/OvmfPkg/AcpiPlatformDxe/AcpiPlatform.h +++ b/OvmfPkg/AcpiPlatformDxe/AcpiPlatform.h @@ -10,12 +10,6 @@ #define ACPI_PLATFORM_H_ #include // EFI_ACPI_TABLE_PROTOCOL -#include // 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 3fd0483..b22aad9 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 c7dbfb1..0000000 --- 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 // DEBUG() -#include // AllocatePool() -#include // 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 a073b29..3de039d 100644 --- a/OvmfPkg/AcpiPlatformDxe/QemuFwCfgAcpi.c +++ b/OvmfPkg/AcpiPlatformDxe/QemuFwCfgAcpi.c @@ -11,6 +11,7 @@ #include // EFI_ACPI_DESCRIPTION_HEADER #include // QEMU_LOADER_FNAME_SIZE #include +#include #include // AsciiStrCmp() #include // CopyMem() #include // DEBUG() -- cgit v1.1