]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiPayloadPkg: Build a HOB from bootloader ACPI table
authorGuo Dong <guo.dong@intel.com>
Tue, 28 Sep 2021 16:38:53 +0000 (09:38 -0700)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Wed, 29 Sep 2021 04:41:08 +0000 (04:41 +0000)
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>
Reviewed-by: Ray Ni <ray.ni@intel.com>
Signed-off-by: Guo Dong <guo.dong@intel.com>
UefiPayloadPkg/UefiPayloadEntry/AcpiTable.c [new file with mode: 0644]
UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c
UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf
UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf

diff --git a/UefiPayloadPkg/UefiPayloadEntry/AcpiTable.c b/UefiPayloadPkg/UefiPayloadEntry/AcpiTable.c
new file mode 100644 (file)
index 0000000..e5f2a2b
--- /dev/null
@@ -0,0 +1,202 @@
+/** @file\r
+\r
+\r
+  Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>\r
+\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+\r
+#include "UefiPayloadEntry.h"\r
+\r
+\r
+/**\r
+  Find the board related info from ACPI table\r
+\r
+  @param  AcpiTableBase          ACPI table start address in memory\r
+  @param  AcpiBoardInfo          Pointer to the acpi board info strucutre\r
+\r
+  @retval RETURN_SUCCESS     Successfully find out all the required information.\r
+  @retval RETURN_NOT_FOUND   Failed to find the required info.\r
+\r
+**/\r
+RETURN_STATUS\r
+ParseAcpiInfo (\r
+  IN   UINT64                                   AcpiTableBase,\r
+  OUT  ACPI_BOARD_INFO                          *AcpiBoardInfo\r
+  )\r
+{\r
+  EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER  *Rsdp;\r
+  EFI_ACPI_DESCRIPTION_HEADER                   *Rsdt;\r
+  UINT32                                        *Entry32;\r
+  UINTN                                         Entry32Num;\r
+  EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE     *Fadt;\r
+  EFI_ACPI_DESCRIPTION_HEADER                   *Xsdt;\r
+  UINT64                                        *Entry64;\r
+  UINTN                                         Entry64Num;\r
+  UINTN                                         Idx;\r
+  UINT32                                        *Signature;\r
+  EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *MmCfgHdr;\r
+  EFI_ACPI_MEMORY_MAPPED_ENHANCED_CONFIGURATION_SPACE_BASE_ADDRESS_ALLOCATION_STRUCTURE *MmCfgBase;\r
+\r
+  Rsdp = (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *)(UINTN)AcpiTableBase;\r
+  DEBUG ((DEBUG_INFO, "Rsdp at 0x%p\n", Rsdp));\r
+  DEBUG ((DEBUG_INFO, "Rsdt at 0x%x, Xsdt at 0x%lx\n", Rsdp->RsdtAddress, Rsdp->XsdtAddress));\r
+\r
+  //\r
+  // Search Rsdt First\r
+  //\r
+  Fadt     = NULL;\r
+  MmCfgHdr = NULL;\r
+  Rsdt     = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)(Rsdp->RsdtAddress);\r
+  if (Rsdt != NULL) {\r
+    Entry32  = (UINT32 *)(Rsdt + 1);\r
+    Entry32Num = (Rsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) >> 2;\r
+    for (Idx = 0; Idx < Entry32Num; Idx++) {\r
+      Signature = (UINT32 *)(UINTN)Entry32[Idx];\r
+      if (*Signature == EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {\r
+        Fadt = (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)Signature;\r
+        DEBUG ((DEBUG_INFO, "Found Fadt in Rsdt\n"));\r
+      }\r
+\r
+      if (*Signature == EFI_ACPI_5_0_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE) {\r
+        MmCfgHdr = (EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *)Signature;\r
+        DEBUG ((DEBUG_INFO, "Found MM config address in Rsdt\n"));\r
+      }\r
+\r
+      if ((Fadt != NULL) && (MmCfgHdr != NULL)) {\r
+        goto Done;\r
+      }\r
+    }\r
+  }\r
+\r
+  //\r
+  // Search Xsdt Second\r
+  //\r
+  Xsdt     = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)(Rsdp->XsdtAddress);\r
+  if (Xsdt != NULL) {\r
+    Entry64  = (UINT64 *)(Xsdt + 1);\r
+    Entry64Num = (Xsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) >> 3;\r
+    for (Idx = 0; Idx < Entry64Num; Idx++) {\r
+      Signature = (UINT32 *)(UINTN)Entry64[Idx];\r
+      if (*Signature == EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {\r
+        Fadt = (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)Signature;\r
+        DEBUG ((DEBUG_INFO, "Found Fadt in Xsdt\n"));\r
+      }\r
+\r
+      if (*Signature == EFI_ACPI_5_0_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE) {\r
+        MmCfgHdr = (EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *)Signature;\r
+        DEBUG ((DEBUG_INFO, "Found MM config address in Xsdt\n"));\r
+      }\r
+\r
+      if ((Fadt != NULL) && (MmCfgHdr != NULL)) {\r
+        goto Done;\r
+      }\r
+    }\r
+  }\r
+\r
+  if (Fadt == NULL) {\r
+    return RETURN_NOT_FOUND;\r
+  }\r
+\r
+Done:\r
+\r
+  AcpiBoardInfo->PmCtrlRegBase   = Fadt->Pm1aCntBlk;\r
+  AcpiBoardInfo->PmTimerRegBase  = Fadt->PmTmrBlk;\r
+  AcpiBoardInfo->ResetRegAddress = Fadt->ResetReg.Address;\r
+  AcpiBoardInfo->ResetValue      = Fadt->ResetValue;\r
+  AcpiBoardInfo->PmEvtBase       = Fadt->Pm1aEvtBlk;\r
+  AcpiBoardInfo->PmGpeEnBase     = Fadt->Gpe0Blk + Fadt->Gpe0BlkLen / 2;\r
+\r
+  if (MmCfgHdr != NULL) {\r
+    MmCfgBase = (EFI_ACPI_MEMORY_MAPPED_ENHANCED_CONFIGURATION_SPACE_BASE_ADDRESS_ALLOCATION_STRUCTURE *)((UINT8*) MmCfgHdr + sizeof (*MmCfgHdr));\r
+    AcpiBoardInfo->PcieBaseAddress = MmCfgBase->BaseAddress;\r
+    AcpiBoardInfo->PcieBaseSize = (MmCfgBase->EndBusNumber + 1 - MmCfgBase->StartBusNumber) * 4096 * 32 * 8;\r
+  } else {\r
+    AcpiBoardInfo->PcieBaseAddress = 0;\r
+    AcpiBoardInfo->PcieBaseSize = 0;\r
+  }\r
+  DEBUG ((DEBUG_INFO, "PmCtrl  Reg 0x%lx\n",  AcpiBoardInfo->PmCtrlRegBase));\r
+  DEBUG ((DEBUG_INFO, "PmTimer Reg 0x%lx\n",  AcpiBoardInfo->PmTimerRegBase));\r
+  DEBUG ((DEBUG_INFO, "Reset   Reg 0x%lx\n",  AcpiBoardInfo->ResetRegAddress));\r
+  DEBUG ((DEBUG_INFO, "Reset   Value 0x%x\n", AcpiBoardInfo->ResetValue));\r
+  DEBUG ((DEBUG_INFO, "PmEvt   Reg 0x%lx\n",  AcpiBoardInfo->PmEvtBase));\r
+  DEBUG ((DEBUG_INFO, "PmGpeEn Reg 0x%lx\n",  AcpiBoardInfo->PmGpeEnBase));\r
+  DEBUG ((DEBUG_INFO, "PcieBaseAddr 0x%lx\n", AcpiBoardInfo->PcieBaseAddress));\r
+  DEBUG ((DEBUG_INFO, "PcieBaseSize 0x%lx\n", AcpiBoardInfo->PcieBaseSize));\r
+\r
+  //\r
+  // Verify values for proper operation\r
+  //\r
+  ASSERT(Fadt->Pm1aCntBlk != 0);\r
+  ASSERT(Fadt->PmTmrBlk != 0);\r
+  ASSERT(Fadt->ResetReg.Address != 0);\r
+  ASSERT(Fadt->Pm1aEvtBlk != 0);\r
+  ASSERT(Fadt->Gpe0Blk != 0);\r
+\r
+  DEBUG_CODE_BEGIN ();\r
+    BOOLEAN    SciEnabled;\r
+\r
+    //\r
+    // Check the consistency of SCI enabling\r
+    //\r
+\r
+    //\r
+    // Get SCI_EN value\r
+    //\r
+   if (Fadt->Pm1CntLen == 4) {\r
+      SciEnabled = (IoRead32 (Fadt->Pm1aCntBlk) & BIT0)? TRUE : FALSE;\r
+    } else {\r
+      //\r
+      // if (Pm1CntLen == 2), use 16 bit IO read;\r
+      // if (Pm1CntLen != 2 && Pm1CntLen != 4), use 16 bit IO read as a fallback\r
+      //\r
+      SciEnabled = (IoRead16 (Fadt->Pm1aCntBlk) & BIT0)? TRUE : FALSE;\r
+    }\r
+\r
+    if (!(Fadt->Flags & EFI_ACPI_5_0_HW_REDUCED_ACPI) &&\r
+        (Fadt->SmiCmd == 0) &&\r
+       !SciEnabled) {\r
+      //\r
+      // The ACPI enabling status is inconsistent: SCI is not enabled but ACPI\r
+      // table does not provide a means to enable it through FADT->SmiCmd\r
+      //\r
+      DEBUG ((DEBUG_ERROR, "ERROR: The ACPI enabling status is inconsistent: SCI is not"\r
+        " enabled but the ACPI table does not provide a means to enable it through FADT->SmiCmd."\r
+        " This may cause issues in OS.\n"));\r
+    }\r
+  DEBUG_CODE_END ();\r
+\r
+  return RETURN_SUCCESS;\r
+}\r
+\r
+\r
+/**\r
+  Build ACPI board info HOB using infomation from ACPI table\r
+\r
+  @param  AcpiTableBase      ACPI table start address in memory\r
+\r
+  @retval  A pointer to ACPI board HOB ACPI_BOARD_INFO. Null if build HOB failure.\r
+**/\r
+ACPI_BOARD_INFO *\r
+BuildHobFromAcpi (\r
+  IN   UINT64                           AcpiTableBase\r
+  )\r
+{\r
+  EFI_STATUS                            Status;\r
+  ACPI_BOARD_INFO                       AcpiBoardInfo;\r
+  ACPI_BOARD_INFO                       *NewAcpiBoardInfo;\r
+\r
+  NewAcpiBoardInfo = NULL;\r
+  Status = ParseAcpiInfo (AcpiTableBase, &AcpiBoardInfo);\r
+  ASSERT_EFI_ERROR (Status);\r
+  if (!EFI_ERROR (Status)) {\r
+    NewAcpiBoardInfo = BuildGuidHob (&gUefiAcpiBoardInfoGuid, sizeof (ACPI_BOARD_INFO));\r
+    ASSERT (NewAcpiBoardInfo != NULL);\r
+    CopyMem (NewAcpiBoardInfo, &AcpiBoardInfo, sizeof (ACPI_BOARD_INFO));\r
+    DEBUG ((DEBUG_INFO, "Create acpi board info guid hob\n"));\r
+  }\r
+  return NewAcpiBoardInfo;\r
+}\r
+\r
+\r
index ae16f25c7c0e0023282f7cbfc1075e0fc7fdc23c..a12d9961f1b80daf9c7cfd9741c920637c951c5d 100644 (file)
@@ -212,167 +212,6 @@ MemInfoCallback (
 \r
 \r
 \r
-/**\r
-  Find the board related info from ACPI table\r
-\r
-  @param  AcpiTableBase          ACPI table start address in memory\r
-  @param  AcpiBoardInfo          Pointer to the acpi board info strucutre\r
-\r
-  @retval RETURN_SUCCESS     Successfully find out all the required information.\r
-  @retval RETURN_NOT_FOUND   Failed to find the required info.\r
-\r
-**/\r
-RETURN_STATUS\r
-ParseAcpiInfo (\r
-  IN   UINT64                                   AcpiTableBase,\r
-  OUT  ACPI_BOARD_INFO                          *AcpiBoardInfo\r
-  )\r
-{\r
-  EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER  *Rsdp;\r
-  EFI_ACPI_DESCRIPTION_HEADER                   *Rsdt;\r
-  UINT32                                        *Entry32;\r
-  UINTN                                         Entry32Num;\r
-  EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE     *Fadt;\r
-  EFI_ACPI_DESCRIPTION_HEADER                   *Xsdt;\r
-  UINT64                                        *Entry64;\r
-  UINTN                                         Entry64Num;\r
-  UINTN                                         Idx;\r
-  UINT32                                        *Signature;\r
-  EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *MmCfgHdr;\r
-  EFI_ACPI_MEMORY_MAPPED_ENHANCED_CONFIGURATION_SPACE_BASE_ADDRESS_ALLOCATION_STRUCTURE *MmCfgBase;\r
-\r
-  Rsdp = (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *)(UINTN)AcpiTableBase;\r
-  DEBUG ((DEBUG_INFO, "Rsdp at 0x%p\n", Rsdp));\r
-  DEBUG ((DEBUG_INFO, "Rsdt at 0x%x, Xsdt at 0x%lx\n", Rsdp->RsdtAddress, Rsdp->XsdtAddress));\r
-\r
-  //\r
-  // Search Rsdt First\r
-  //\r
-  Fadt     = NULL;\r
-  MmCfgHdr = NULL;\r
-  Rsdt     = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)(Rsdp->RsdtAddress);\r
-  if (Rsdt != NULL) {\r
-    Entry32  = (UINT32 *)(Rsdt + 1);\r
-    Entry32Num = (Rsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) >> 2;\r
-    for (Idx = 0; Idx < Entry32Num; Idx++) {\r
-      Signature = (UINT32 *)(UINTN)Entry32[Idx];\r
-      if (*Signature == EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {\r
-        Fadt = (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)Signature;\r
-        DEBUG ((DEBUG_INFO, "Found Fadt in Rsdt\n"));\r
-      }\r
-\r
-      if (*Signature == EFI_ACPI_5_0_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE) {\r
-        MmCfgHdr = (EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *)Signature;\r
-        DEBUG ((DEBUG_INFO, "Found MM config address in Rsdt\n"));\r
-      }\r
-\r
-      if ((Fadt != NULL) && (MmCfgHdr != NULL)) {\r
-        goto Done;\r
-      }\r
-    }\r
-  }\r
-\r
-  //\r
-  // Search Xsdt Second\r
-  //\r
-  Xsdt     = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)(Rsdp->XsdtAddress);\r
-  if (Xsdt != NULL) {\r
-    Entry64  = (UINT64 *)(Xsdt + 1);\r
-    Entry64Num = (Xsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) >> 3;\r
-    for (Idx = 0; Idx < Entry64Num; Idx++) {\r
-      Signature = (UINT32 *)(UINTN)Entry64[Idx];\r
-      if (*Signature == EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {\r
-        Fadt = (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)Signature;\r
-        DEBUG ((DEBUG_INFO, "Found Fadt in Xsdt\n"));\r
-      }\r
-\r
-      if (*Signature == EFI_ACPI_5_0_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE) {\r
-        MmCfgHdr = (EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *)Signature;\r
-        DEBUG ((DEBUG_INFO, "Found MM config address in Xsdt\n"));\r
-      }\r
-\r
-      if ((Fadt != NULL) && (MmCfgHdr != NULL)) {\r
-        goto Done;\r
-      }\r
-    }\r
-  }\r
-\r
-  if (Fadt == NULL) {\r
-    return RETURN_NOT_FOUND;\r
-  }\r
-\r
-Done:\r
-\r
-  AcpiBoardInfo->PmCtrlRegBase   = Fadt->Pm1aCntBlk;\r
-  AcpiBoardInfo->PmTimerRegBase  = Fadt->PmTmrBlk;\r
-  AcpiBoardInfo->ResetRegAddress = Fadt->ResetReg.Address;\r
-  AcpiBoardInfo->ResetValue      = Fadt->ResetValue;\r
-  AcpiBoardInfo->PmEvtBase       = Fadt->Pm1aEvtBlk;\r
-  AcpiBoardInfo->PmGpeEnBase     = Fadt->Gpe0Blk + Fadt->Gpe0BlkLen / 2;\r
-\r
-  if (MmCfgHdr != NULL) {\r
-    MmCfgBase = (EFI_ACPI_MEMORY_MAPPED_ENHANCED_CONFIGURATION_SPACE_BASE_ADDRESS_ALLOCATION_STRUCTURE *)((UINT8*) MmCfgHdr + sizeof (*MmCfgHdr));\r
-    AcpiBoardInfo->PcieBaseAddress = MmCfgBase->BaseAddress;\r
-    AcpiBoardInfo->PcieBaseSize = (MmCfgBase->EndBusNumber + 1 - MmCfgBase->StartBusNumber) * 4096 * 32 * 8;\r
-  } else {\r
-    AcpiBoardInfo->PcieBaseAddress = 0;\r
-    AcpiBoardInfo->PcieBaseSize = 0;\r
-  }\r
-  DEBUG ((DEBUG_INFO, "PmCtrl  Reg 0x%lx\n",  AcpiBoardInfo->PmCtrlRegBase));\r
-  DEBUG ((DEBUG_INFO, "PmTimer Reg 0x%lx\n",  AcpiBoardInfo->PmTimerRegBase));\r
-  DEBUG ((DEBUG_INFO, "Reset   Reg 0x%lx\n",  AcpiBoardInfo->ResetRegAddress));\r
-  DEBUG ((DEBUG_INFO, "Reset   Value 0x%x\n", AcpiBoardInfo->ResetValue));\r
-  DEBUG ((DEBUG_INFO, "PmEvt   Reg 0x%lx\n",  AcpiBoardInfo->PmEvtBase));\r
-  DEBUG ((DEBUG_INFO, "PmGpeEn Reg 0x%lx\n",  AcpiBoardInfo->PmGpeEnBase));\r
-  DEBUG ((DEBUG_INFO, "PcieBaseAddr 0x%lx\n", AcpiBoardInfo->PcieBaseAddress));\r
-  DEBUG ((DEBUG_INFO, "PcieBaseSize 0x%lx\n", AcpiBoardInfo->PcieBaseSize));\r
-\r
-  //\r
-  // Verify values for proper operation\r
-  //\r
-  ASSERT(Fadt->Pm1aCntBlk != 0);\r
-  ASSERT(Fadt->PmTmrBlk != 0);\r
-  ASSERT(Fadt->ResetReg.Address != 0);\r
-  ASSERT(Fadt->Pm1aEvtBlk != 0);\r
-  ASSERT(Fadt->Gpe0Blk != 0);\r
-\r
-  DEBUG_CODE_BEGIN ();\r
-    BOOLEAN    SciEnabled;\r
-\r
-    //\r
-    // Check the consistency of SCI enabling\r
-    //\r
-\r
-    //\r
-    // Get SCI_EN value\r
-    //\r
-   if (Fadt->Pm1CntLen == 4) {\r
-      SciEnabled = (IoRead32 (Fadt->Pm1aCntBlk) & BIT0)? TRUE : FALSE;\r
-    } else {\r
-      //\r
-      // if (Pm1CntLen == 2), use 16 bit IO read;\r
-      // if (Pm1CntLen != 2 && Pm1CntLen != 4), use 16 bit IO read as a fallback\r
-      //\r
-      SciEnabled = (IoRead16 (Fadt->Pm1aCntBlk) & BIT0)? TRUE : FALSE;\r
-    }\r
-\r
-    if (!(Fadt->Flags & EFI_ACPI_5_0_HW_REDUCED_ACPI) &&\r
-        (Fadt->SmiCmd == 0) &&\r
-       !SciEnabled) {\r
-      //\r
-      // The ACPI enabling status is inconsistent: SCI is not enabled but ACPI\r
-      // table does not provide a means to enable it through FADT->SmiCmd\r
-      //\r
-      DEBUG ((DEBUG_ERROR, "ERROR: The ACPI enabling status is inconsistent: SCI is not"\r
-        " enabled but the ACPI table does not provide a means to enable it through FADT->SmiCmd."\r
-        " This may cause issues in OS.\n"));\r
-    }\r
-  DEBUG_CODE_END ();\r
-\r
-  return RETURN_SUCCESS;\r
-}\r
-\r
-\r
 /**\r
   It will build HOBs based on information from bootloaders.\r
 \r
@@ -387,8 +226,7 @@ BuildHobFromBl (
   EFI_STATUS                       Status;\r
   SYSTEM_TABLE_INFO                SysTableInfo;\r
   SYSTEM_TABLE_INFO                *NewSysTableInfo;\r
-  ACPI_BOARD_INFO                  AcpiBoardInfo;\r
-  ACPI_BOARD_INFO                  *NewAcpiBoardInfo;\r
+  ACPI_BOARD_INFO                  *AcpiBoardInfo;\r
   EFI_PEI_GRAPHICS_INFO_HOB        GfxInfo;\r
   EFI_PEI_GRAPHICS_INFO_HOB        *NewGfxInfo;\r
   EFI_PEI_GRAPHICS_DEVICE_INFO_HOB GfxDeviceInfo;\r
@@ -471,20 +309,14 @@ BuildHobFromBl (
   //\r
   // Create guid hob for acpi board information\r
   //\r
-  Status = ParseAcpiInfo (SysTableInfo.AcpiTableBase, &AcpiBoardInfo);\r
-  ASSERT_EFI_ERROR (Status);\r
-  if (!EFI_ERROR (Status)) {\r
-    NewAcpiBoardInfo = BuildGuidHob (&gUefiAcpiBoardInfoGuid, sizeof (ACPI_BOARD_INFO));\r
-    ASSERT (NewAcpiBoardInfo != NULL);\r
-    CopyMem (NewAcpiBoardInfo, &AcpiBoardInfo, sizeof (ACPI_BOARD_INFO));\r
-    DEBUG ((DEBUG_INFO, "Create acpi board info guid hob\n"));\r
-  }\r
+  AcpiBoardInfo = BuildHobFromAcpi (SysTableInfo.AcpiTableBase);\r
+  ASSERT (AcpiBoardInfo != NULL);\r
 \r
   //\r
   // Parse memory info and build memory HOBs for reserved DRAM and MMIO\r
   //\r
   DEBUG ((DEBUG_INFO , "Building ResourceDescriptorHobs for reserved memory:\n"));\r
-  Status = ParseMemoryInfo (MemInfoCallbackMmio, &AcpiBoardInfo);\r
+  Status = ParseMemoryInfo (MemInfoCallbackMmio, AcpiBoardInfo);\r
   if (EFI_ERROR(Status)) {\r
     return Status;\r
   }\r
index 331724c6874058d254930f46b93da7c34e83760e..9922b56b39918e9c774fe5d789070e520022252a 100644 (file)
@@ -204,4 +204,17 @@ FvFindFileByTypeGuid (
   IN  EFI_GUID                    *Guid           OPTIONAL,\r
   OUT EFI_FFS_FILE_HEADER         **FileHeader\r
   );\r
+\r
+/**\r
+  Build ACPI board info HOB using infomation from ACPI table\r
+\r
+  @param  AcpiTableBase      ACPI table start address in memory\r
+\r
+  @retval  A pointer to ACPI board HOB ACPI_BOARD_INFO. Null if build HOB failure.\r
+**/\r
+ACPI_BOARD_INFO *\r
+BuildHobFromAcpi (\r
+  IN   UINT64                           AcpiTableBase\r
+  );\r
+\r
 #endif\r
index 8d42925fcd2913071759463dba507fd79afae9fa..4c5170d9cc17a7d997b6e10e7a587a2fb3de540f 100644 (file)
@@ -25,6 +25,7 @@
   UefiPayloadEntry.c\r
   LoadDxeCore.c\r
   MemoryAllocation.c\r
+  AcpiTable.c\r
 \r
 [Sources.Ia32]\r
   X64/VirtualMemory.h\r
index 03ad9c457bc725ae0c74cac311d0f1a5b3ee77c6..7e67cf0f040d32aee18d8c843b5bf1ba127c87eb 100644 (file)
@@ -260,6 +260,8 @@ BuildHobs (
   UNIVERSAL_PAYLOAD_EXTRA_DATA     *ExtraData;\r
   UINT8                            *GuidHob;\r
   EFI_HOB_FIRMWARE_VOLUME          *FvHob;\r
+  UNIVERSAL_PAYLOAD_ACPI_TABLE     *AcpiTable;\r
+  ACPI_BOARD_INFO                  *AcpiBoardInfo;\r
 \r
   Hob.Raw = (UINT8 *) BootloaderParameter;\r
   MinimalNeededSize = FixedPcdGet32 (PcdSystemMemoryUefiRegionSize);\r
@@ -351,6 +353,16 @@ BuildHobs (
   *DxeFv = (EFI_FIRMWARE_VOLUME_HEADER *) (UINTN) ExtraData->Entry[0].Base;\r
   ASSERT ((*DxeFv)->FvLength == ExtraData->Entry[0].Size);\r
 \r
+  //\r
+  // Create guid hob for acpi board information\r
+  //\r
+  GuidHob = GetFirstGuidHob(&gUniversalPayloadAcpiTableGuid);\r
+  if (GuidHob != NULL) {\r
+    AcpiTable = (UNIVERSAL_PAYLOAD_ACPI_TABLE *) GET_GUID_HOB_DATA (GuidHob);\r
+    AcpiBoardInfo = BuildHobFromAcpi ((UINT64)AcpiTable->Rsdp);\r
+    ASSERT (AcpiBoardInfo != NULL);\r
+  }\r
+\r
   //\r
   // Update DXE FV information to first fv hob in the hob list, which\r
   // is the empty FvHob created before.\r
index 3ee449219dd713b738433e85b134e18a3cb14bc6..e7e05b744a8dad66e1c4b11a8a60b25632e12107 100644 (file)
@@ -25,6 +25,7 @@
   LoadDxeCore.c\r
   MemoryAllocation.c\r
   PrintHob.c\r
+  AcpiTable.c\r
 \r
 [Sources.Ia32]\r
   X64/VirtualMemory.h\r
@@ -61,7 +62,6 @@
   gEfiGraphicsDeviceInfoHobGuid\r
   gUefiAcpiBoardInfoGuid\r
   gEfiSmbiosTableGuid\r
-  gEfiAcpiTableGuid\r
   gUefiSerialPortInfoGuid\r
   gUniversalPayloadExtraDataGuid\r
   gPcdDataBaseHobGuid\r