From 389aa504dfe8b99d85f98a05edcabc6ad6cafe9d Mon Sep 17 00:00:00 2001
From: Himanshu Chauhan <hchauhan@ventanamicro.com>
Date: Mon, 17 Jun 2024 13:41:37 +0530
Subject: [PATCH] MdeModulePkg: Add support for generation of HEST table

Add support for generation of HEST table with the help of a remote
RAS agent. The HEST table is generated but the error descriptors (in GHESv2 or
other platform specific format) are fetched from the RAS agent.

Reference: https://github.com/ventanamicro/edk2/commit/389aa504dfe8b99d85f98a05edcabc6ad6cafe9d

Signed-off-by: Himanshu Chauhan <hchauhan@ventanamicro.com>
Signed-off-by: hu.yuye<hu.yuye@zte.com.cn>
Signed-off-by: liuqingtao <liu.qingtao2@zte.com.cn>
---
 .../HardwareErrorSourceTableDxe.c             | 243 ++++++++++++++++++
 .../HardwareErrorSourceTableDxe.inf           |  59 +++++
 .../HardwareErrorSourceTableDxe.uni           |  14 +
 .../HardwareErrorSourceTableDxeExtra.uni      |  14 +
 4 files changed, 330 insertions(+)
 create mode 100644 MdeModulePkg/Universal/Acpi/AcpiHardwareErrorTableDxe/HardwareErrorSourceTableDxe.c
 create mode 100644 MdeModulePkg/Universal/Acpi/AcpiHardwareErrorTableDxe/HardwareErrorSourceTableDxe.inf
 create mode 100644 MdeModulePkg/Universal/Acpi/AcpiHardwareErrorTableDxe/HardwareErrorSourceTableDxe.uni
 create mode 100644 MdeModulePkg/Universal/Acpi/AcpiHardwareErrorTableDxe/HardwareErrorSourceTableDxeExtra.uni

diff --git a/MdeModulePkg/Universal/Acpi/AcpiHardwareErrorTableDxe/HardwareErrorSourceTableDxe.c b/MdeModulePkg/Universal/Acpi/AcpiHardwareErrorTableDxe/HardwareErrorSourceTableDxe.c
new file mode 100644
index 000000000000..ee42cfc62211
--- /dev/null
+++ b/MdeModulePkg/Universal/Acpi/AcpiHardwareErrorTableDxe/HardwareErrorSourceTableDxe.c
@@ -0,0 +1,243 @@
+/** @file

+  This module installs ACPI Hardware Error Source Table (HEST)

+

+  Copyright (c) 2024, Ventana Micro Systems, Inc.

+  SPDX-License-Identifier: BSD-2-Clause-Patent

+**/

+

+#include <Base.h>

+#include <Uefi.h>

+

+#include <IndustryStandard/Acpi.h>

+

+#include <Protocol/AcpiTable.h>

+

+#include <Guid/EventGroup.h>

+

+#include <Library/BaseLib.h>

+#include <Library/BaseMemoryLib.h>

+#include <Library/MemoryAllocationLib.h>

+#include <Library/UefiBootServicesTableLib.h>

+#include <Library/DebugLib.h>

+#include <Library/PcdLib.h>

+#include <Library/SafeIntLib.h>

+#include <Library/BaseRiscVSbiLib.h>

+

+#include <Library/DxeRiscvMpxy.h>

+#include <Library/DxeRiscvRasAgentClient.h>

+

+EFI_EVENT                      mHestReadyToBootEvent;

+UINTN                          mHestTableKey = 0;

+BOOLEAN                        mAcpiHestInstalled            = FALSE;

+BOOLEAN                        mAcpiHestStatusChanged        = FALSE;

+BOOLEAN                        mAcpiHestBufferChanged        = FALSE;

+

+#define STATUS_BLOCK_SIZE      1024

+#define MPXY_SHMEM_SIZE        4096

+

+//

+// ACPI Hardware Error Source Table template

+//

+EFI_ACPI_6_5_HARDWARE_ERROR_SOURCE_TABLE_HEADER  mHestTemplate = {

+  {

+    EFI_ACPI_6_5_HARDWARE_ERROR_SOURCE_TABLE_SIGNATURE,

+    sizeof (EFI_ACPI_6_5_HARDWARE_ERROR_SOURCE_TABLE_HEADER),

+    EFI_ACPI_6_5_HARDWARE_ERROR_SOURCE_TABLE_REVISION, // Revision

+    0x00,                               // Checksum will be updated at runtime

+    //

+    // It is expected that these values will be updated at EntryPoint.

+    //

+    { 0x00 },   // OEM ID is a 6 bytes long field

+    0x00,       // OEM Table ID(8 bytes long)

+    0x00,       // OEM Revision

+    0x00,       // Creator ID

+    0x00,       // Creator Revision

+  },

+  0             // Number of error source

+};

+

+/**

+  Notify function for event group EFI_EVENT_GROUP_READY_TO_BOOT. This is used to

+  install the Hardware Error Source Table.

+

+  @param[in]  Event   The Event that is being processed.

+  @param[in]  Context The Event Context.

+

+**/

+VOID

+EFIAPI

+HestReadyToBootEventNotify (

+  IN EFI_EVENT  Event,

+  IN VOID       *Context

+  )

+{

+  EFI_STATUS               Status;

+  EFI_ACPI_TABLE_PROTOCOL  *AcpiTableProtocol;

+  EFI_ACPI_DESCRIPTION_HEADER  *Header;

+  VOID *ErrDesc;

+  UINT32 NumSources, *ErrSources, ErrDescSize;

+  INTN i;

+  VOID *HestTable;

+  UINT32 HestPages, HestTableSize;

+  UINTN DescriptorType;

+  EFI_ACPI_6_5_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE *BaseErrSrcStructure, *tESS;

+#define HEST_TO_BASE_ERROR_STRUCTURE(_table)                            \

+  (EFI_ACPI_6_5_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE *)    \

+    ((UINT8 *)_table +                                                  \

+     sizeof(typeof(EFI_ACPI_6_5_HARDWARE_ERROR_SOURCE_TABLE_HEADER)));

+

+  Header = &mHestTemplate.Header;

+

+  //

+  // Get ACPI Table protocol.

+  //

+  Status = gBS->LocateProtocol (

+                  &gEfiAcpiTableProtocolGuid,

+                  NULL,

+                  (VOID **)&AcpiTableProtocol

+                  );

+  if (EFI_ERROR (Status)) {

+    return;

+  }

+

+  //

+  // Check if HEST is already installed.

+  //

+  if (mAcpiHestInstalled) {

+    Status = AcpiTableProtocol->UninstallAcpiTable (

+                                  AcpiTableProtocol,

+                                  mHestTableKey

+                                  );

+      if (EFI_ERROR (Status)) {

+        return;

+      }

+  }

+

+  // Initialize the RAS agent client library.

+  Status = RacInit ();

+  if (EFI_ERROR (Status)) {

+    return;

+  }

+

+  // Fetch the number of hardware error sources available

+  Status = RacGetNumberErrorSources(&NumSources);

+  if (EFI_ERROR (Status)) {

+    return;

+  }

+

+  // Fetch the unique source ID for each error source.

+  Status = RacGetErrorSourceIDList(&ErrSources, &NumSources);

+  if (EFI_ERROR (Status)) {

+    return;

+  }

+

+  mHestTemplate.ErrorSourceCount = NumSources;

+

+  // Allocate memory for all the error source descriptors

+  HestTableSize = sizeof(mHestTemplate) +

+    sizeof(EFI_ACPI_6_5_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE)

+    * NumSources;

+  HestPages = EFI_SIZE_TO_PAGES(HestTableSize);

+  HestTable = AllocateAlignedPages(HestPages, 4096);

+

+  if (HestTable == NULL) {

+    return;

+  }

+

+  CopyMem (HestTable, &mHestTemplate, sizeof(mHestTemplate));

+

+  tESS = BaseErrSrcStructure = HEST_TO_BASE_ERROR_STRUCTURE(HestTable);

+

+  for (i = 0; i < NumSources; i++) {

+    Status = RacGetErrorSourceDescriptor (ErrSources[i],

+               &DescriptorType, &ErrDesc, &ErrDescSize

+               );

+    if (EFI_ERROR(Status)) {

+      return;

+    }

+

+    ASSERT (DescriptorType == DT_GHESV2);

+

+    CopyMem (tESS, ErrDesc, ErrDescSize);

+    tESS++;

+  }

+

+  Header = &((typeof(mHestTemplate) *)HestTable)->Header;

+  Header->Length = HestTableSize;

+  //

+  // Update Checksum in Hest Table

+  //

+  Header->Checksum = 0;

+  Header->Checksum =

+    CalculateCheckSum8 (

+      (UINT8 *)&HestTable,

+      HestTableSize

+      );

+

+  //

+  // Publish Boot Graphics Resource Table.

+  //

+  Status = AcpiTableProtocol->InstallAcpiTable (

+                                AcpiTableProtocol,

+                                HestTable,

+                                HestTableSize,

+                                &mHestTableKey

+                                );

+  if (EFI_ERROR (Status)) {

+    return;

+  }

+

+  mAcpiHestInstalled     = TRUE;

+}

+

+/**

+  The module Entry Point of the Boot Graphics Resource Table DXE driver.

+

+  @param[in]  ImageHandle    The firmware allocated handle for the EFI image.

+  @param[in]  SystemTable    A pointer to the EFI System Table.

+

+  @retval EFI_SUCCESS    The entry point is executed successfully.

+  @retval Other          Some error occurs when executing this entry point.

+

+**/

+EFI_STATUS

+EFIAPI

+HardwareErrorSourceDxeEntryPoint (

+  IN EFI_HANDLE        ImageHandle,

+  IN EFI_SYSTEM_TABLE  *SystemTable

+  )

+{

+  EFI_STATUS                   Status;

+  EFI_ACPI_DESCRIPTION_HEADER  *Header;

+

+  //

+  // Update Header fields of HEST

+  //

+  Header = &mHestTemplate.Header;

+  ZeroMem (Header->OemId, sizeof (Header->OemId));

+  CopyMem (

+    Header->OemId,

+    PcdGetPtr (PcdAcpiDefaultOemId),

+    MIN (PcdGetSize (PcdAcpiDefaultOemId), sizeof (Header->OemId))

+    );

+

+  WriteUnaligned64 (&Header->OemTableId, PcdGet64 (PcdAcpiDefaultOemTableId));

+  Header->OemRevision     = PcdGet32 (PcdAcpiDefaultOemRevision);

+  Header->CreatorId       = PcdGet32 (PcdAcpiDefaultCreatorId);

+  Header->CreatorRevision = PcdGet32 (PcdAcpiDefaultCreatorRevision);

+

+  //

+  // Register notify function to install HEST on ReadyToBoot Event.

+  //

+  Status = gBS->CreateEventEx (

+                  EVT_NOTIFY_SIGNAL,

+                  TPL_CALLBACK,

+                  HestReadyToBootEventNotify,

+                  NULL,

+                  &gEfiEventReadyToBootGuid,

+                  &mHestReadyToBootEvent

+                  );

+  ASSERT_EFI_ERROR (Status);

+

+  return Status;

+}

diff --git a/MdeModulePkg/Universal/Acpi/AcpiHardwareErrorTableDxe/HardwareErrorSourceTableDxe.inf b/MdeModulePkg/Universal/Acpi/AcpiHardwareErrorTableDxe/HardwareErrorSourceTableDxe.inf
new file mode 100644
index 000000000000..b3fc6e95d057
--- /dev/null
+++ b/MdeModulePkg/Universal/Acpi/AcpiHardwareErrorTableDxe/HardwareErrorSourceTableDxe.inf
@@ -0,0 +1,59 @@
+## @file

+#  This module install ACPI Hardware Error Source Table (HEST)

+#

+#  Copyright (c) 2024, Ventana Micro Systems, Inc.

+#  SPDX-License-Identifier: BSD-2-Clause-Patent

+#

+##

+

+[Defines]

+  INF_VERSION                    = 0x00010005

+  BASE_NAME                      = HardwareErrorSourceTableDxe

+  MODULE_UNI_FILE                = HardwareErrorSourceTableDxe.uni

+  FILE_GUID                      = 79ecd602-f3b0-4780-9eed-d744229428e3

+  MODULE_TYPE                    = UEFI_DRIVER

+  VERSION_STRING                 = 1.0

+  ENTRY_POINT                    = HardwareErrorSourceDxeEntryPoint

+

+#

+# The following information is for reference only and not required by the build tools.

+#

+#  VALID_ARCHITECTURES           = RISCV64

+#

+

+[Sources]

+  HardwareErrorSourceTableDxe.c

+

+[Packages]

+  MdePkg/MdePkg.dec

+  MdeModulePkg/MdeModulePkg.dec

+

+[LibraryClasses]

+  UefiDriverEntryPoint

+  BaseLib

+  BaseMemoryLib

+  MemoryAllocationLib

+  UefiLib

+  UefiBootServicesTableLib

+  DebugLib

+  PcdLib

+  SafeIntLib

+  RiscVSbiLib

+  DxeRiscvMpxyLib

+  DxeRiscvRasAgentClientLib

+

+[Protocols]

+  gEfiAcpiTableProtocolGuid                     ## CONSUMES

+

+[Pcd]

+  gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultOemId            ## CONSUMES

+  gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultOemTableId       ## CONSUMES

+  gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultOemRevision      ## CONSUMES

+  gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultCreatorId        ## CONSUMES

+  gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultCreatorRevision  ## CONSUMES

+

+[Guids]

+  gEfiEventReadyToBootGuid                      ## CONSUMES ## Event

+

+[UserExtensions.TianoCore."ExtraFiles"]

+  HardwareErrorSourceTableDxeExtra.uni

diff --git a/MdeModulePkg/Universal/Acpi/AcpiHardwareErrorTableDxe/HardwareErrorSourceTableDxe.uni b/MdeModulePkg/Universal/Acpi/AcpiHardwareErrorTableDxe/HardwareErrorSourceTableDxe.uni
new file mode 100644
index 000000000000..e763c5e5582d
--- /dev/null
+++ b/MdeModulePkg/Universal/Acpi/AcpiHardwareErrorTableDxe/HardwareErrorSourceTableDxe.uni
@@ -0,0 +1,14 @@
+// /** @file

+// This module install ACPI Hardware Error Source Table (HEST).

+//

+// Copyright (c) 2024, Ventana Micro Systems, Inc.

+//

+// SPDX-License-Identifier: BSD-2-Clause-Patent

+//

+// **/

+

+

+#string STR_MODULE_ABSTRACT             #language en-US "Installs ACPI Hardware Error Source Table (HEST)"

+

+#string STR_MODULE_DESCRIPTION          #language en-US "This module installs the ACPI Hardware Error Source Table (HEST)"

+

diff --git a/MdeModulePkg/Universal/Acpi/AcpiHardwareErrorTableDxe/HardwareErrorSourceTableDxeExtra.uni b/MdeModulePkg/Universal/Acpi/AcpiHardwareErrorTableDxe/HardwareErrorSourceTableDxeExtra.uni
new file mode 100644
index 000000000000..aec9046294dc
--- /dev/null
+++ b/MdeModulePkg/Universal/Acpi/AcpiHardwareErrorTableDxe/HardwareErrorSourceTableDxeExtra.uni
@@ -0,0 +1,14 @@
+// /** @file

+// HardwareErrorSourceTableDxe Localized Strings and Content

+//

+// Copyright (c) 2024, Ventana Micro Systems, Inc.

+//

+// SPDX-License-Identifier: BSD-2-Clause-Patent

+//

+// **/

+

+#string STR_PROPERTIES_MODULE_NAME

+#language en-US

+"ACPI Hardware Error Source Table DXE Driver"

+

+