public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Ni, Ray" <ray.ni@intel.com>
To: "Dong, Guo" <guo.dong@intel.com>,
	"devel@edk2.groups.io" <devel@edk2.groups.io>
Cc: "Ma, Maurice" <maurice.ma@intel.com>,
	"You, Benjamin" <benjamin.you@intel.com>
Subject: Re: [`edk2-devel][PATCH V2] UefiPayloadPkg: Build a HOB from bootloader ACPI table
Date: Wed, 29 Sep 2021 14:13:57 +0000	[thread overview]
Message-ID: <CY4PR1101MB2072500148A144E207C60E3D8CA99@CY4PR1101MB2072.namprd11.prod.outlook.com> (raw)
In-Reply-To: <20210928171857.1552-1-guo.dong@intel.com>

Reviewed-by: Ray Ni <ray.ni@intel.com>

> -----Original Message-----
> From: Dong, Guo <guo.dong@intel.com>
> Sent: Wednesday, September 29, 2021 1:19 AM
> To: devel@edk2.groups.io
> Cc: Dong, Guo <guo.dong@intel.com>; Ni, Ray <ray.ni@intel.com>; Ma, Maurice <maurice.ma@intel.com>; You, Benjamin
> <benjamin.you@intel.com>
> Subject: [`edk2-devel][PATCH V2] UefiPayloadPkg: Build a HOB from bootloader ACPI table
> 
> From: Guo Dong <guo.dong@intel.com>
> 
> V2: Update BuildHobFromAcpi() to return a HOB pointer.
> 
> For universal UEFI payload, build a HOB from the ACPI table, so that
> other modules could use this info from HOB at very early DXE phase.
> This code are shared by universal payload and non universal payload.
> 
> Cc: Ray Ni <ray.ni@intel.com>
> Cc: Maurice Ma <maurice.ma@intel.com>
> Cc: Benjamin You <benjamin.you@intel.com>
> Signed-off-by: Guo Dong <guo.dong@intel.com>
> ---
>  UefiPayloadPkg/UefiPayloadEntry/AcpiTable.c               | 202
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c        | 176 ++++-----------------------------------------------------------------------
> -----------------------------------------------------------------------------------------------------
>  UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h        |  13 +++++++++++++
>  UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf      |   1 +
>  UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c   |  12 ++++++++++++
>  UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf |   2 +-
>  6 files changed, 233 insertions(+), 173 deletions(-)
> 
> diff --git a/UefiPayloadPkg/UefiPayloadEntry/AcpiTable.c b/UefiPayloadPkg/UefiPayloadEntry/AcpiTable.c
> new file mode 100644
> index 0000000000..e5f2a2b124
> --- /dev/null
> +++ b/UefiPayloadPkg/UefiPayloadEntry/AcpiTable.c
> @@ -0,0 +1,202 @@
> +/** @file
> 
> +
> 
> +
> 
> +  Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
> 
> +
> 
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> +
> 
> +**/
> 
> +
> 
> +#include "UefiPayloadEntry.h"
> 
> +
> 
> +
> 
> +/**
> 
> +  Find the board related info from ACPI table
> 
> +
> 
> +  @param  AcpiTableBase          ACPI table start address in memory
> 
> +  @param  AcpiBoardInfo          Pointer to the acpi board info strucutre
> 
> +
> 
> +  @retval RETURN_SUCCESS     Successfully find out all the required information.
> 
> +  @retval RETURN_NOT_FOUND   Failed to find the required info.
> 
> +
> 
> +**/
> 
> +RETURN_STATUS
> 
> +ParseAcpiInfo (
> 
> +  IN   UINT64                                   AcpiTableBase,
> 
> +  OUT  ACPI_BOARD_INFO                          *AcpiBoardInfo
> 
> +  )
> 
> +{
> 
> +  EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER  *Rsdp;
> 
> +  EFI_ACPI_DESCRIPTION_HEADER                   *Rsdt;
> 
> +  UINT32                                        *Entry32;
> 
> +  UINTN                                         Entry32Num;
> 
> +  EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE     *Fadt;
> 
> +  EFI_ACPI_DESCRIPTION_HEADER                   *Xsdt;
> 
> +  UINT64                                        *Entry64;
> 
> +  UINTN                                         Entry64Num;
> 
> +  UINTN                                         Idx;
> 
> +  UINT32                                        *Signature;
> 
> +  EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *MmCfgHdr;
> 
> +  EFI_ACPI_MEMORY_MAPPED_ENHANCED_CONFIGURATION_SPACE_BASE_ADDRESS_ALLOCATION_STRUCTURE
> *MmCfgBase;
> 
> +
> 
> +  Rsdp = (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *)(UINTN)AcpiTableBase;
> 
> +  DEBUG ((DEBUG_INFO, "Rsdp at 0x%p\n", Rsdp));
> 
> +  DEBUG ((DEBUG_INFO, "Rsdt at 0x%x, Xsdt at 0x%lx\n", Rsdp->RsdtAddress, Rsdp->XsdtAddress));
> 
> +
> 
> +  //
> 
> +  // Search Rsdt First
> 
> +  //
> 
> +  Fadt     = NULL;
> 
> +  MmCfgHdr = NULL;
> 
> +  Rsdt     = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)(Rsdp->RsdtAddress);
> 
> +  if (Rsdt != NULL) {
> 
> +    Entry32  = (UINT32 *)(Rsdt + 1);
> 
> +    Entry32Num = (Rsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) >> 2;
> 
> +    for (Idx = 0; Idx < Entry32Num; Idx++) {
> 
> +      Signature = (UINT32 *)(UINTN)Entry32[Idx];
> 
> +      if (*Signature == EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {
> 
> +        Fadt = (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)Signature;
> 
> +        DEBUG ((DEBUG_INFO, "Found Fadt in Rsdt\n"));
> 
> +      }
> 
> +
> 
> +      if (*Signature ==
> EFI_ACPI_5_0_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE)
> {
> 
> +        MmCfgHdr = (EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *)Signature;
> 
> +        DEBUG ((DEBUG_INFO, "Found MM config address in Rsdt\n"));
> 
> +      }
> 
> +
> 
> +      if ((Fadt != NULL) && (MmCfgHdr != NULL)) {
> 
> +        goto Done;
> 
> +      }
> 
> +    }
> 
> +  }
> 
> +
> 
> +  //
> 
> +  // Search Xsdt Second
> 
> +  //
> 
> +  Xsdt     = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)(Rsdp->XsdtAddress);
> 
> +  if (Xsdt != NULL) {
> 
> +    Entry64  = (UINT64 *)(Xsdt + 1);
> 
> +    Entry64Num = (Xsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) >> 3;
> 
> +    for (Idx = 0; Idx < Entry64Num; Idx++) {
> 
> +      Signature = (UINT32 *)(UINTN)Entry64[Idx];
> 
> +      if (*Signature == EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {
> 
> +        Fadt = (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)Signature;
> 
> +        DEBUG ((DEBUG_INFO, "Found Fadt in Xsdt\n"));
> 
> +      }
> 
> +
> 
> +      if (*Signature ==
> EFI_ACPI_5_0_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE)
> {
> 
> +        MmCfgHdr = (EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *)Signature;
> 
> +        DEBUG ((DEBUG_INFO, "Found MM config address in Xsdt\n"));
> 
> +      }
> 
> +
> 
> +      if ((Fadt != NULL) && (MmCfgHdr != NULL)) {
> 
> +        goto Done;
> 
> +      }
> 
> +    }
> 
> +  }
> 
> +
> 
> +  if (Fadt == NULL) {
> 
> +    return RETURN_NOT_FOUND;
> 
> +  }
> 
> +
> 
> +Done:
> 
> +
> 
> +  AcpiBoardInfo->PmCtrlRegBase   = Fadt->Pm1aCntBlk;
> 
> +  AcpiBoardInfo->PmTimerRegBase  = Fadt->PmTmrBlk;
> 
> +  AcpiBoardInfo->ResetRegAddress = Fadt->ResetReg.Address;
> 
> +  AcpiBoardInfo->ResetValue      = Fadt->ResetValue;
> 
> +  AcpiBoardInfo->PmEvtBase       = Fadt->Pm1aEvtBlk;
> 
> +  AcpiBoardInfo->PmGpeEnBase     = Fadt->Gpe0Blk + Fadt->Gpe0BlkLen / 2;
> 
> +
> 
> +  if (MmCfgHdr != NULL) {
> 
> +    MmCfgBase =
> (EFI_ACPI_MEMORY_MAPPED_ENHANCED_CONFIGURATION_SPACE_BASE_ADDRESS_ALLOCATION_STRUCTURE *)((UINT8*)
> MmCfgHdr + sizeof (*MmCfgHdr));
> 
> +    AcpiBoardInfo->PcieBaseAddress = MmCfgBase->BaseAddress;
> 
> +    AcpiBoardInfo->PcieBaseSize = (MmCfgBase->EndBusNumber + 1 - MmCfgBase->StartBusNumber) * 4096 * 32 * 8;
> 
> +  } else {
> 
> +    AcpiBoardInfo->PcieBaseAddress = 0;
> 
> +    AcpiBoardInfo->PcieBaseSize = 0;
> 
> +  }
> 
> +  DEBUG ((DEBUG_INFO, "PmCtrl  Reg 0x%lx\n",  AcpiBoardInfo->PmCtrlRegBase));
> 
> +  DEBUG ((DEBUG_INFO, "PmTimer Reg 0x%lx\n",  AcpiBoardInfo->PmTimerRegBase));
> 
> +  DEBUG ((DEBUG_INFO, "Reset   Reg 0x%lx\n",  AcpiBoardInfo->ResetRegAddress));
> 
> +  DEBUG ((DEBUG_INFO, "Reset   Value 0x%x\n", AcpiBoardInfo->ResetValue));
> 
> +  DEBUG ((DEBUG_INFO, "PmEvt   Reg 0x%lx\n",  AcpiBoardInfo->PmEvtBase));
> 
> +  DEBUG ((DEBUG_INFO, "PmGpeEn Reg 0x%lx\n",  AcpiBoardInfo->PmGpeEnBase));
> 
> +  DEBUG ((DEBUG_INFO, "PcieBaseAddr 0x%lx\n", AcpiBoardInfo->PcieBaseAddress));
> 
> +  DEBUG ((DEBUG_INFO, "PcieBaseSize 0x%lx\n", AcpiBoardInfo->PcieBaseSize));
> 
> +
> 
> +  //
> 
> +  // Verify values for proper operation
> 
> +  //
> 
> +  ASSERT(Fadt->Pm1aCntBlk != 0);
> 
> +  ASSERT(Fadt->PmTmrBlk != 0);
> 
> +  ASSERT(Fadt->ResetReg.Address != 0);
> 
> +  ASSERT(Fadt->Pm1aEvtBlk != 0);
> 
> +  ASSERT(Fadt->Gpe0Blk != 0);
> 
> +
> 
> +  DEBUG_CODE_BEGIN ();
> 
> +    BOOLEAN    SciEnabled;
> 
> +
> 
> +    //
> 
> +    // Check the consistency of SCI enabling
> 
> +    //
> 
> +
> 
> +    //
> 
> +    // Get SCI_EN value
> 
> +    //
> 
> +   if (Fadt->Pm1CntLen == 4) {
> 
> +      SciEnabled = (IoRead32 (Fadt->Pm1aCntBlk) & BIT0)? TRUE : FALSE;
> 
> +    } else {
> 
> +      //
> 
> +      // if (Pm1CntLen == 2), use 16 bit IO read;
> 
> +      // if (Pm1CntLen != 2 && Pm1CntLen != 4), use 16 bit IO read as a fallback
> 
> +      //
> 
> +      SciEnabled = (IoRead16 (Fadt->Pm1aCntBlk) & BIT0)? TRUE : FALSE;
> 
> +    }
> 
> +
> 
> +    if (!(Fadt->Flags & EFI_ACPI_5_0_HW_REDUCED_ACPI) &&
> 
> +        (Fadt->SmiCmd == 0) &&
> 
> +       !SciEnabled) {
> 
> +      //
> 
> +      // The ACPI enabling status is inconsistent: SCI is not enabled but ACPI
> 
> +      // table does not provide a means to enable it through FADT->SmiCmd
> 
> +      //
> 
> +      DEBUG ((DEBUG_ERROR, "ERROR: The ACPI enabling status is inconsistent: SCI is not"
> 
> +        " enabled but the ACPI table does not provide a means to enable it through FADT->SmiCmd."
> 
> +        " This may cause issues in OS.\n"));
> 
> +    }
> 
> +  DEBUG_CODE_END ();
> 
> +
> 
> +  return RETURN_SUCCESS;
> 
> +}
> 
> +
> 
> +
> 
> +/**
> 
> +  Build ACPI board info HOB using infomation from ACPI table
> 
> +
> 
> +  @param  AcpiTableBase      ACPI table start address in memory
> 
> +
> 
> +  @retval  A pointer to ACPI board HOB ACPI_BOARD_INFO. Null if build HOB failure.
> 
> +**/
> 
> +ACPI_BOARD_INFO *
> 
> +BuildHobFromAcpi (
> 
> +  IN   UINT64                           AcpiTableBase
> 
> +  )
> 
> +{
> 
> +  EFI_STATUS                            Status;
> 
> +  ACPI_BOARD_INFO                       AcpiBoardInfo;
> 
> +  ACPI_BOARD_INFO                       *NewAcpiBoardInfo;
> 
> +
> 
> +  NewAcpiBoardInfo = NULL;
> 
> +  Status = ParseAcpiInfo (AcpiTableBase, &AcpiBoardInfo);
> 
> +  ASSERT_EFI_ERROR (Status);
> 
> +  if (!EFI_ERROR (Status)) {
> 
> +    NewAcpiBoardInfo = BuildGuidHob (&gUefiAcpiBoardInfoGuid, sizeof (ACPI_BOARD_INFO));
> 
> +    ASSERT (NewAcpiBoardInfo != NULL);
> 
> +    CopyMem (NewAcpiBoardInfo, &AcpiBoardInfo, sizeof (ACPI_BOARD_INFO));
> 
> +    DEBUG ((DEBUG_INFO, "Create acpi board info guid hob\n"));
> 
> +  }
> 
> +  return NewAcpiBoardInfo;
> 
> +}
> 
> +
> 
> +
> 
> diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c
> index ae16f25c7c..a12d9961f1 100644
> --- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c
> +++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c
> @@ -212,167 +212,6 @@ MemInfoCallback (
> 
> 
> 
> 
> 
> 
> -/**
> 
> -  Find the board related info from ACPI table
> 
> -
> 
> -  @param  AcpiTableBase          ACPI table start address in memory
> 
> -  @param  AcpiBoardInfo          Pointer to the acpi board info strucutre
> 
> -
> 
> -  @retval RETURN_SUCCESS     Successfully find out all the required information.
> 
> -  @retval RETURN_NOT_FOUND   Failed to find the required info.
> 
> -
> 
> -**/
> 
> -RETURN_STATUS
> 
> -ParseAcpiInfo (
> 
> -  IN   UINT64                                   AcpiTableBase,
> 
> -  OUT  ACPI_BOARD_INFO                          *AcpiBoardInfo
> 
> -  )
> 
> -{
> 
> -  EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER  *Rsdp;
> 
> -  EFI_ACPI_DESCRIPTION_HEADER                   *Rsdt;
> 
> -  UINT32                                        *Entry32;
> 
> -  UINTN                                         Entry32Num;
> 
> -  EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE     *Fadt;
> 
> -  EFI_ACPI_DESCRIPTION_HEADER                   *Xsdt;
> 
> -  UINT64                                        *Entry64;
> 
> -  UINTN                                         Entry64Num;
> 
> -  UINTN                                         Idx;
> 
> -  UINT32                                        *Signature;
> 
> -  EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *MmCfgHdr;
> 
> -  EFI_ACPI_MEMORY_MAPPED_ENHANCED_CONFIGURATION_SPACE_BASE_ADDRESS_ALLOCATION_STRUCTURE
> *MmCfgBase;
> 
> -
> 
> -  Rsdp = (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *)(UINTN)AcpiTableBase;
> 
> -  DEBUG ((DEBUG_INFO, "Rsdp at 0x%p\n", Rsdp));
> 
> -  DEBUG ((DEBUG_INFO, "Rsdt at 0x%x, Xsdt at 0x%lx\n", Rsdp->RsdtAddress, Rsdp->XsdtAddress));
> 
> -
> 
> -  //
> 
> -  // Search Rsdt First
> 
> -  //
> 
> -  Fadt     = NULL;
> 
> -  MmCfgHdr = NULL;
> 
> -  Rsdt     = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)(Rsdp->RsdtAddress);
> 
> -  if (Rsdt != NULL) {
> 
> -    Entry32  = (UINT32 *)(Rsdt + 1);
> 
> -    Entry32Num = (Rsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) >> 2;
> 
> -    for (Idx = 0; Idx < Entry32Num; Idx++) {
> 
> -      Signature = (UINT32 *)(UINTN)Entry32[Idx];
> 
> -      if (*Signature == EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {
> 
> -        Fadt = (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)Signature;
> 
> -        DEBUG ((DEBUG_INFO, "Found Fadt in Rsdt\n"));
> 
> -      }
> 
> -
> 
> -      if (*Signature ==
> EFI_ACPI_5_0_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE)
> {
> 
> -        MmCfgHdr = (EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *)Signature;
> 
> -        DEBUG ((DEBUG_INFO, "Found MM config address in Rsdt\n"));
> 
> -      }
> 
> -
> 
> -      if ((Fadt != NULL) && (MmCfgHdr != NULL)) {
> 
> -        goto Done;
> 
> -      }
> 
> -    }
> 
> -  }
> 
> -
> 
> -  //
> 
> -  // Search Xsdt Second
> 
> -  //
> 
> -  Xsdt     = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)(Rsdp->XsdtAddress);
> 
> -  if (Xsdt != NULL) {
> 
> -    Entry64  = (UINT64 *)(Xsdt + 1);
> 
> -    Entry64Num = (Xsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) >> 3;
> 
> -    for (Idx = 0; Idx < Entry64Num; Idx++) {
> 
> -      Signature = (UINT32 *)(UINTN)Entry64[Idx];
> 
> -      if (*Signature == EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {
> 
> -        Fadt = (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)Signature;
> 
> -        DEBUG ((DEBUG_INFO, "Found Fadt in Xsdt\n"));
> 
> -      }
> 
> -
> 
> -      if (*Signature ==
> EFI_ACPI_5_0_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE)
> {
> 
> -        MmCfgHdr = (EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *)Signature;
> 
> -        DEBUG ((DEBUG_INFO, "Found MM config address in Xsdt\n"));
> 
> -      }
> 
> -
> 
> -      if ((Fadt != NULL) && (MmCfgHdr != NULL)) {
> 
> -        goto Done;
> 
> -      }
> 
> -    }
> 
> -  }
> 
> -
> 
> -  if (Fadt == NULL) {
> 
> -    return RETURN_NOT_FOUND;
> 
> -  }
> 
> -
> 
> -Done:
> 
> -
> 
> -  AcpiBoardInfo->PmCtrlRegBase   = Fadt->Pm1aCntBlk;
> 
> -  AcpiBoardInfo->PmTimerRegBase  = Fadt->PmTmrBlk;
> 
> -  AcpiBoardInfo->ResetRegAddress = Fadt->ResetReg.Address;
> 
> -  AcpiBoardInfo->ResetValue      = Fadt->ResetValue;
> 
> -  AcpiBoardInfo->PmEvtBase       = Fadt->Pm1aEvtBlk;
> 
> -  AcpiBoardInfo->PmGpeEnBase     = Fadt->Gpe0Blk + Fadt->Gpe0BlkLen / 2;
> 
> -
> 
> -  if (MmCfgHdr != NULL) {
> 
> -    MmCfgBase =
> (EFI_ACPI_MEMORY_MAPPED_ENHANCED_CONFIGURATION_SPACE_BASE_ADDRESS_ALLOCATION_STRUCTURE *)((UINT8*)
> MmCfgHdr + sizeof (*MmCfgHdr));
> 
> -    AcpiBoardInfo->PcieBaseAddress = MmCfgBase->BaseAddress;
> 
> -    AcpiBoardInfo->PcieBaseSize = (MmCfgBase->EndBusNumber + 1 - MmCfgBase->StartBusNumber) * 4096 * 32 * 8;
> 
> -  } else {
> 
> -    AcpiBoardInfo->PcieBaseAddress = 0;
> 
> -    AcpiBoardInfo->PcieBaseSize = 0;
> 
> -  }
> 
> -  DEBUG ((DEBUG_INFO, "PmCtrl  Reg 0x%lx\n",  AcpiBoardInfo->PmCtrlRegBase));
> 
> -  DEBUG ((DEBUG_INFO, "PmTimer Reg 0x%lx\n",  AcpiBoardInfo->PmTimerRegBase));
> 
> -  DEBUG ((DEBUG_INFO, "Reset   Reg 0x%lx\n",  AcpiBoardInfo->ResetRegAddress));
> 
> -  DEBUG ((DEBUG_INFO, "Reset   Value 0x%x\n", AcpiBoardInfo->ResetValue));
> 
> -  DEBUG ((DEBUG_INFO, "PmEvt   Reg 0x%lx\n",  AcpiBoardInfo->PmEvtBase));
> 
> -  DEBUG ((DEBUG_INFO, "PmGpeEn Reg 0x%lx\n",  AcpiBoardInfo->PmGpeEnBase));
> 
> -  DEBUG ((DEBUG_INFO, "PcieBaseAddr 0x%lx\n", AcpiBoardInfo->PcieBaseAddress));
> 
> -  DEBUG ((DEBUG_INFO, "PcieBaseSize 0x%lx\n", AcpiBoardInfo->PcieBaseSize));
> 
> -
> 
> -  //
> 
> -  // Verify values for proper operation
> 
> -  //
> 
> -  ASSERT(Fadt->Pm1aCntBlk != 0);
> 
> -  ASSERT(Fadt->PmTmrBlk != 0);
> 
> -  ASSERT(Fadt->ResetReg.Address != 0);
> 
> -  ASSERT(Fadt->Pm1aEvtBlk != 0);
> 
> -  ASSERT(Fadt->Gpe0Blk != 0);
> 
> -
> 
> -  DEBUG_CODE_BEGIN ();
> 
> -    BOOLEAN    SciEnabled;
> 
> -
> 
> -    //
> 
> -    // Check the consistency of SCI enabling
> 
> -    //
> 
> -
> 
> -    //
> 
> -    // Get SCI_EN value
> 
> -    //
> 
> -   if (Fadt->Pm1CntLen == 4) {
> 
> -      SciEnabled = (IoRead32 (Fadt->Pm1aCntBlk) & BIT0)? TRUE : FALSE;
> 
> -    } else {
> 
> -      //
> 
> -      // if (Pm1CntLen == 2), use 16 bit IO read;
> 
> -      // if (Pm1CntLen != 2 && Pm1CntLen != 4), use 16 bit IO read as a fallback
> 
> -      //
> 
> -      SciEnabled = (IoRead16 (Fadt->Pm1aCntBlk) & BIT0)? TRUE : FALSE;
> 
> -    }
> 
> -
> 
> -    if (!(Fadt->Flags & EFI_ACPI_5_0_HW_REDUCED_ACPI) &&
> 
> -        (Fadt->SmiCmd == 0) &&
> 
> -       !SciEnabled) {
> 
> -      //
> 
> -      // The ACPI enabling status is inconsistent: SCI is not enabled but ACPI
> 
> -      // table does not provide a means to enable it through FADT->SmiCmd
> 
> -      //
> 
> -      DEBUG ((DEBUG_ERROR, "ERROR: The ACPI enabling status is inconsistent: SCI is not"
> 
> -        " enabled but the ACPI table does not provide a means to enable it through FADT->SmiCmd."
> 
> -        " This may cause issues in OS.\n"));
> 
> -    }
> 
> -  DEBUG_CODE_END ();
> 
> -
> 
> -  return RETURN_SUCCESS;
> 
> -}
> 
> -
> 
> -
> 
>  /**
> 
>    It will build HOBs based on information from bootloaders.
> 
> 
> 
> @@ -387,8 +226,7 @@ BuildHobFromBl (
>    EFI_STATUS                       Status;
> 
>    SYSTEM_TABLE_INFO                SysTableInfo;
> 
>    SYSTEM_TABLE_INFO                *NewSysTableInfo;
> 
> -  ACPI_BOARD_INFO                  AcpiBoardInfo;
> 
> -  ACPI_BOARD_INFO                  *NewAcpiBoardInfo;
> 
> +  ACPI_BOARD_INFO                  *AcpiBoardInfo;
> 
>    EFI_PEI_GRAPHICS_INFO_HOB        GfxInfo;
> 
>    EFI_PEI_GRAPHICS_INFO_HOB        *NewGfxInfo;
> 
>    EFI_PEI_GRAPHICS_DEVICE_INFO_HOB GfxDeviceInfo;
> 
> @@ -471,20 +309,14 @@ BuildHobFromBl (
>    //
> 
>    // Create guid hob for acpi board information
> 
>    //
> 
> -  Status = ParseAcpiInfo (SysTableInfo.AcpiTableBase, &AcpiBoardInfo);
> 
> -  ASSERT_EFI_ERROR (Status);
> 
> -  if (!EFI_ERROR (Status)) {
> 
> -    NewAcpiBoardInfo = BuildGuidHob (&gUefiAcpiBoardInfoGuid, sizeof (ACPI_BOARD_INFO));
> 
> -    ASSERT (NewAcpiBoardInfo != NULL);
> 
> -    CopyMem (NewAcpiBoardInfo, &AcpiBoardInfo, sizeof (ACPI_BOARD_INFO));
> 
> -    DEBUG ((DEBUG_INFO, "Create acpi board info guid hob\n"));
> 
> -  }
> 
> +  AcpiBoardInfo = BuildHobFromAcpi (SysTableInfo.AcpiTableBase);
> 
> +  ASSERT (AcpiBoardInfo != NULL);
> 
> 
> 
>    //
> 
>    // Parse memory info and build memory HOBs for reserved DRAM and MMIO
> 
>    //
> 
>    DEBUG ((DEBUG_INFO , "Building ResourceDescriptorHobs for reserved memory:\n"));
> 
> -  Status = ParseMemoryInfo (MemInfoCallbackMmio, &AcpiBoardInfo);
> 
> +  Status = ParseMemoryInfo (MemInfoCallbackMmio, AcpiBoardInfo);
> 
>    if (EFI_ERROR(Status)) {
> 
>      return Status;
> 
>    }
> 
> diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
> index 331724c687..9922b56b39 100644
> --- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
> +++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
> @@ -204,4 +204,17 @@ FvFindFileByTypeGuid (
>    IN  EFI_GUID                    *Guid           OPTIONAL,
> 
>    OUT EFI_FFS_FILE_HEADER         **FileHeader
> 
>    );
> 
> +
> 
> +/**
> 
> +  Build ACPI board info HOB using infomation from ACPI table
> 
> +
> 
> +  @param  AcpiTableBase      ACPI table start address in memory
> 
> +
> 
> +  @retval  A pointer to ACPI board HOB ACPI_BOARD_INFO. Null if build HOB failure.
> 
> +**/
> 
> +ACPI_BOARD_INFO *
> 
> +BuildHobFromAcpi (
> 
> +  IN   UINT64                           AcpiTableBase
> 
> +  );
> 
> +
> 
>  #endif
> 
> diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf
> index 8d42925fcd..4c5170d9cc 100644
> --- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf
> +++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf
> @@ -25,6 +25,7 @@
>    UefiPayloadEntry.c
> 
>    LoadDxeCore.c
> 
>    MemoryAllocation.c
> 
> +  AcpiTable.c
> 
> 
> 
>  [Sources.Ia32]
> 
>    X64/VirtualMemory.h
> 
> diff --git a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
> b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
> index 03ad9c457b..7e67cf0f04 100644
> --- a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
> +++ b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
> @@ -260,6 +260,8 @@ BuildHobs (
>    UNIVERSAL_PAYLOAD_EXTRA_DATA     *ExtraData;
> 
>    UINT8                            *GuidHob;
> 
>    EFI_HOB_FIRMWARE_VOLUME          *FvHob;
> 
> +  UNIVERSAL_PAYLOAD_ACPI_TABLE     *AcpiTable;
> 
> +  ACPI_BOARD_INFO                  *AcpiBoardInfo;
> 
> 
> 
>    Hob.Raw = (UINT8 *) BootloaderParameter;
> 
>    MinimalNeededSize = FixedPcdGet32 (PcdSystemMemoryUefiRegionSize);
> 
> @@ -351,6 +353,16 @@ BuildHobs (
>    *DxeFv = (EFI_FIRMWARE_VOLUME_HEADER *) (UINTN) ExtraData->Entry[0].Base;
> 
>    ASSERT ((*DxeFv)->FvLength == ExtraData->Entry[0].Size);
> 
> 
> 
> +  //
> 
> +  // Create guid hob for acpi board information
> 
> +  //
> 
> +  GuidHob = GetFirstGuidHob(&gUniversalPayloadAcpiTableGuid);
> 
> +  if (GuidHob != NULL) {
> 
> +    AcpiTable = (UNIVERSAL_PAYLOAD_ACPI_TABLE *) GET_GUID_HOB_DATA (GuidHob);
> 
> +    AcpiBoardInfo = BuildHobFromAcpi ((UINT64)AcpiTable->Rsdp);
> 
> +    ASSERT (AcpiBoardInfo != NULL);
> 
> +  }
> 
> +
> 
>    //
> 
>    // Update DXE FV information to first fv hob in the hob list, which
> 
>    // is the empty FvHob created before.
> 
> diff --git a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
> b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
> index 3ee449219d..e7e05b744a 100644
> --- a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
> +++ b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
> @@ -25,6 +25,7 @@
>    LoadDxeCore.c
> 
>    MemoryAllocation.c
> 
>    PrintHob.c
> 
> +  AcpiTable.c
> 
> 
> 
>  [Sources.Ia32]
> 
>    X64/VirtualMemory.h
> 
> @@ -61,7 +62,6 @@
>    gEfiGraphicsDeviceInfoHobGuid
> 
>    gUefiAcpiBoardInfoGuid
> 
>    gEfiSmbiosTableGuid
> 
> -  gEfiAcpiTableGuid
> 
>    gUefiSerialPortInfoGuid
> 
>    gUniversalPayloadExtraDataGuid
> 
>    gPcdDataBaseHobGuid
> 
> --
> 2.32.0.windows.2


      reply	other threads:[~2021-09-29 14:14 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-28 17:18 [`edk2-devel][PATCH V2] UefiPayloadPkg: Build a HOB from bootloader ACPI table Guo Dong
2021-09-29 14:13 ` 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=CY4PR1101MB2072500148A144E207C60E3D8CA99@CY4PR1101MB2072.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