If HOB contains APCI table information, entry point of AcpiTableDxe.inf should parse the APCI table from HOB, and install these tables. We assume the whole ACPI table (starting with EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER) is contained by a single gEfiAcpiTableGuid HOB.
Cc: Jian J Wang <jian.j.w...@intel.com> Cc: Hao A Wu <hao.a...@intel.com> Cc: Dandan Bi <dandan...@intel.com> Cc: Liming Gao <gaolim...@byosoft.com.cn> Cc: Ray Ni <ray...@intel.com> Signed-off-by: Zhiguang Liu <zhiguang....@intel.com> --- MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf | 3 ++- MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c | 134 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 128 insertions(+), 9 deletions(-) diff --git a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf index d341df439e..473127368d 100644 --- a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf +++ b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf @@ -4,7 +4,7 @@ # This driver initializes ACPI tables (Rsdp, Rsdt and Xsdt) and produces UEFI/PI # services to install/uninstall/manage ACPI tables. # -# Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> +# Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.<BR> # Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR> # SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -51,6 +51,7 @@ DebugLib BaseLib PcdLib + HobLib [Guids] gEfiAcpi10TableGuid ## PRODUCES ## SystemTable diff --git a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c index 5a2afdff27..6b58759620 100644 --- a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c +++ b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c @@ -1,7 +1,7 @@ /** @file ACPI Table Protocol Implementation - Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> + Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.<BR> Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR> SPDX-License-Identifier: BSD-2-Clause-Patent @@ -11,6 +11,8 @@ // Includes // #include "AcpiTable.h" +#include <Library/HobLib.h> + // // The maximum number of tables that pre-allocated. // @@ -30,6 +32,7 @@ STATIC EFI_ALLOCATE_TYPE mAcpiTableAllocType; @param Table Table to add. @param Checksum Does the table require checksumming. @param Version The version of the list to add the table to. + @param IsFromHob True, if add Apci Table from Hob List. @param Handle Pointer for returning the handle. @return EFI_SUCCESS The function completed successfully. @@ -44,6 +47,7 @@ AddTableToList ( IN VOID *Table, IN BOOLEAN Checksum, IN EFI_ACPI_TABLE_VERSION Version, + IN BOOLEAN IsFromHob, OUT UINTN *Handle ); @@ -238,6 +242,7 @@ InstallAcpiTable ( AcpiTableBufferConst, TRUE, Version, + FALSE, TableKey ); if (!EFI_ERROR (Status)) { @@ -472,6 +477,7 @@ FreeTableMemory ( @param Table Table to add. @param Checksum Does the table require checksumming. @param Version The version of the list to add the table to. + @param IsFromHob True, if add Apci Table from Hob List. @param Handle Pointer for returning the handle. @return EFI_SUCCESS The function completed successfully. @@ -487,6 +493,7 @@ AddTableToList ( IN VOID *Table, IN BOOLEAN Checksum, IN EFI_ACPI_TABLE_VERSION Version, + IN BOOLEAN IsFromHob, OUT UINTN *Handle ) { @@ -552,13 +559,17 @@ AddTableToList ( // could be updated by OS present agent. For example, BufferPtrAddress in // SMM communication ACPI table. // - ASSERT ((EFI_PAGE_SIZE % 64) == 0); - Status = gBS->AllocatePages ( - AllocateMaxAddress, - EfiACPIMemoryNVS, - EFI_SIZE_TO_PAGES (CurrentTableList->TableSize), - &AllocPhysAddress - ); + if (IsFromHob){ + AllocPhysAddress = (UINTN)Table; + } else { + ASSERT ((EFI_PAGE_SIZE % 64) == 0); + Status = gBS->AllocatePages ( + AllocateMaxAddress, + EfiACPIMemoryNVS, + EFI_SIZE_TO_PAGES (CurrentTableList->TableSize), + &AllocPhysAddress + ); + } } else if (mAcpiTableAllocType == AllocateAnyPages) { // // If there is no allocation limit, there is also no need to use page @@ -1689,6 +1700,111 @@ ChecksumCommonTables ( return EFI_SUCCESS; } +/** + This function will find Guid Hob gEfiAcpiTableGuid, and install Acpi table from it. + + @param AcpiTableInstance Protocol instance private data. + + @return EFI_SUCCESS The function completed successfully. + @return EFI_NOT_FOUND The function doesn't find the gEfiAcpiTableGuid Guid Hob. + @return EFI_ABORTED The function could not complete successfully. + +**/ +EFI_STATUS +InstallAcpiTableFromHob ( + EFI_ACPI_TABLE_INSTANCE *AcpiTableInstance + ) +{ + EFI_HOB_GUID_TYPE *GuidHob; + EFI_ACPI_TABLE_VERSION Version; + EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *Rsdp; + EFI_ACPI_DESCRIPTION_HEADER *Rsdt; + EFI_ACPI_DESCRIPTION_HEADER *ChildTable; + UINT64 ChildTableAddress; + UINTN Count; + UINTN Index; + UINTN TableKey; + EFI_STATUS Status; + UINTN EntrySize; + + TableKey = 0; + Version = PcdGet32 (PcdAcpiExposedTableVersions); + + // + // HOB only contains the ACPI table in 2.0+ format. + // + GuidHob = GetFirstGuidHob (&gEfiAcpiTableGuid); + if (GuidHob == NULL) { + return EFI_NOT_FOUND; + } + Rsdp = (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER*) (UINTN)(*((UINT64*)GET_GUID_HOB_DATA (GuidHob))); + + // + // An ACPI-compatible OS must use the XSDT if present. + // It shouldn't happen that XsdtAddress points beyond 4G range in 32-bit environment. + // + ASSERT ((UINTN) Rsdp->XsdtAddress == Rsdp->XsdtAddress); + + EntrySize = sizeof (UINT64); + Rsdt = (EFI_ACPI_DESCRIPTION_HEADER*) (UINTN) Rsdp->XsdtAddress; + if (Rsdt == NULL) { + // + // XsdtAddress is zero, then we use Rsdt which has 32 bit entry + // + Rsdt = (EFI_ACPI_DESCRIPTION_HEADER*) (UINTN) Rsdp->RsdtAddress; + EntrySize = sizeof (UINT32); + } + Count = (Rsdt->Length - sizeof (EFI_ACPI_DESCRIPTION_HEADER))/EntrySize; + + for (Index = 0; Index < Count; Index++){ + ChildTableAddress = 0; + CopyMem(&ChildTableAddress, (VOID*)((UINTN) Rsdt + EntrySize * Index + sizeof (EFI_ACPI_DESCRIPTION_HEADER)), EntrySize); + // + // If the address is of UINT64 while this module runs at 32 bits, + // make sure the upper bits are all-zeros. + // + ASSERT (ChildTableAddress == (UINTN) ChildTableAddress); + + ChildTable = (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) ChildTableAddress; + Status = AddTableToList ( + AcpiTableInstance, + ChildTable, + TRUE, + Version, + TRUE, + &TableKey + ); + if (ChildTable->Signature == EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE){ + // + // Add the FACS and DSDT tables. + // + Status = AddTableToList ( + AcpiTableInstance, + (VOID *) (UINTN)((EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE*)ChildTable)->FirmwareCtrl, + TRUE, + Version, + TRUE, + &TableKey + ); + Status = AddTableToList ( + AcpiTableInstance, + (VOID *) (UINTN)((EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE*)ChildTable)->Dsdt, + TRUE, + Version, + TRUE, + &TableKey + ); + } + } + if (!EFI_ERROR (Status)) { + Status = PublishTables ( + AcpiTableInstance, + Version + ); + } + ASSERT_EFI_ERROR (Status); + return Status; +} /** Constructor for the ACPI table protocol. Initializes instance @@ -1918,6 +2034,8 @@ AcpiTableAcpiTableConstructor ( ChecksumCommonTables (AcpiTableInstance); + InstallAcpiTableFromHob (AcpiTableInstance); + // // Completed successfully // -- 2.30.0.windows.2 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#73172): https://edk2.groups.io/g/devel/message/73172 Mute This Topic: https://groups.io/mt/81543415/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-