public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
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


      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