From: "Ni, Ray" <ray.ni@intel.com>
To: "Liu, Zhiguang" <zhiguang.liu@intel.com>,
"devel@edk2.groups.io" <devel@edk2.groups.io>
Cc: "Wang, Jian J" <jian.j.wang@intel.com>,
"Wu, Hao A" <hao.a.wu@intel.com>,
"Bi, Dandan" <dandan.bi@intel.com>,
Liming Gao <gaoliming@byosoft.com.cn>
Subject: Re: [Patch V2 1/2] MdeModulePkg/ACPI: Install ACPI table from HOB.
Date: Tue, 23 Mar 2021 03:44:43 +0000 [thread overview]
Message-ID: <CO1PR11MB493015BC8F2A015D889210FF8C649@CO1PR11MB4930.namprd11.prod.outlook.com> (raw)
In-Reply-To: <20210323032438.950-1-zhiguang.liu@intel.com>
Reviewed-by: Ray Ni <ray.ni@intel.com>
> -----Original Message-----
> From: Liu, Zhiguang <zhiguang.liu@intel.com>
> Sent: Tuesday, March 23, 2021 11:25 AM
> To: devel@edk2.groups.io
> Cc: Wang, Jian J <jian.j.wang@intel.com>; Wu, Hao A <hao.a.wu@intel.com>; Bi, Dandan <dandan.bi@intel.com>; Liming Gao
> <gaoliming@byosoft.com.cn>; Ni, Ray <ray.ni@intel.com>
> Subject: [Patch V2 1/2] MdeModulePkg/ACPI: Install ACPI table from HOB.
>
> 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.wang@intel.com>
> Cc: Hao A Wu <hao.a.wu@intel.com>
> Cc: Dandan Bi <dandan.bi@intel.com>
> Cc: Liming Gao <gaoliming@byosoft.com.cn>
> Cc: Ray Ni <ray.ni@intel.com>
> Signed-off-by: Zhiguang Liu <zhiguang.liu@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
prev parent reply other threads:[~2021-03-23 3:44 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-23 3:24 [Patch V2 1/2] MdeModulePkg/ACPI: Install ACPI table from HOB Zhiguang Liu
2021-03-23 3:24 ` [Patch V2 2/2] UefiPayloadPkg: Remove code that installs APCI Zhiguang Liu
2021-03-23 3:44 ` Ni, Ray
2021-03-23 5:19 ` Guo Dong
2021-03-23 3:24 ` [Patch V2 0/2] Let AcpiTableDxe driver install Acpi table from Hob Zhiguang Liu
2021-03-23 12:40 ` [edk2-devel] " Laszlo Ersek
2021-03-23 15:45 ` Guo Dong
2021-03-23 16:12 ` Andrew Fish
2021-03-23 17:29 ` Guo Dong
2021-03-24 5:30 ` Ni, Ray
2021-03-23 16:48 ` Laszlo Ersek
2021-03-23 17:15 ` Guo Dong
2021-03-24 9:50 ` Laszlo Ersek
2021-03-24 4:09 ` Ni, Ray
2021-03-24 10:29 ` Laszlo Ersek
2021-03-23 23:52 ` Benjamin Doron
2021-03-24 9:53 ` Laszlo Ersek
2021-03-24 16:55 ` Benjamin Doron
2021-03-24 18:33 ` Laszlo Ersek
2021-03-25 1:10 ` Ni, Ray
2021-03-25 3:55 ` Andrew Fish
2021-03-25 17:35 ` Laszlo Ersek
2021-03-25 17:33 ` Laszlo Ersek
2021-03-25 1:39 ` Benjamin Doron
2021-03-23 3:44 ` Ni, Ray [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CO1PR11MB493015BC8F2A015D889210FF8C649@CO1PR11MB4930.namprd11.prod.outlook.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox