[edk2-devel] [PATCH v7 4/5] MdeModulePkg: Add TraceHubDebugSysTLib library

Guo, Gua posted 5 patches 2 years, 9 months ago
There is a newer version of this series
[edk2-devel] [PATCH v7 4/5] MdeModulePkg: Add TraceHubDebugSysTLib library
Posted by Guo, Gua 2 years, 9 months ago
From: Gua Guo <gua.guo@intel.com>

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=4144

This Library provides API to dump Trace Hub message.

Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Guo Gua <gua.guo@intel.com>
Cc: Chan Laura <laura.chan@intel.com>
Cc: Prakashan Krishnadas Veliyathuparambil <krishnadas.veliyathuparambil.prakashan@intel.com>
Cc: K N Karthik <karthik.k.n@intel.com>
Signed-off-by: Guo Gua <gua.guo@intel.com>
Reviewed-by: Michael D Kinney <michael.d.kinney@intel.com>
Reviewed-by: K N Karthik <karthik.k.n@intel.com>
Reviewed-by: Chan Laura <laura.chan@intel.com>
---
 .../Include/Guid/TraceHubDebugInfoHob.h       |  24 ++
 .../BaseTraceHubDebugSysTLib.c                | 245 +++++++++++++++
 .../BaseTraceHubDebugSysTLib.inf              |  44 +++
 .../DxeSmmTraceHubDebugSysTLib.c              | 263 ++++++++++++++++
 .../DxeSmmTraceHubDebugSysTLib.inf            |  51 ++++
 .../InternalTraceHubApi.c                     |  74 +++++
 .../InternalTraceHubApi.h                     |  37 +++
 .../InternalTraceHubApiCommon.c               | 200 +++++++++++++
 .../InternalTraceHubApiCommon.h               | 119 ++++++++
 .../PeiTraceHubDebugSysTLib.c                 | 282 ++++++++++++++++++
 .../PeiTraceHubDebugSysTLib.inf               |  50 ++++
 .../Library/TraceHubDebugSysTLib/Readme.md    |  26 ++
 MdeModulePkg/MdeModulePkg.dec                 |  21 ++
 MdeModulePkg/MdeModulePkg.dsc                 |   3 +
 MdeModulePkg/MdeModulePkg.uni                 |  18 ++
 15 files changed, 1457 insertions(+)
 create mode 100644 MdeModulePkg/Include/Guid/TraceHubDebugInfoHob.h
 create mode 100644 MdeModulePkg/Library/TraceHubDebugSysTLib/BaseTraceHubDebugSysTLib.c
 create mode 100644 MdeModulePkg/Library/TraceHubDebugSysTLib/BaseTraceHubDebugSysTLib.inf
 create mode 100644 MdeModulePkg/Library/TraceHubDebugSysTLib/DxeSmmTraceHubDebugSysTLib.c
 create mode 100644 MdeModulePkg/Library/TraceHubDebugSysTLib/DxeSmmTraceHubDebugSysTLib.inf
 create mode 100644 MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApi.c
 create mode 100644 MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApi.h
 create mode 100644 MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApiCommon.c
 create mode 100644 MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApiCommon.h
 create mode 100644 MdeModulePkg/Library/TraceHubDebugSysTLib/PeiTraceHubDebugSysTLib.c
 create mode 100644 MdeModulePkg/Library/TraceHubDebugSysTLib/PeiTraceHubDebugSysTLib.inf
 create mode 100644 MdeModulePkg/Library/TraceHubDebugSysTLib/Readme.md

diff --git a/MdeModulePkg/Include/Guid/TraceHubDebugInfoHob.h b/MdeModulePkg/Include/Guid/TraceHubDebugInfoHob.h
new file mode 100644
index 0000000000..367f97dc90
--- /dev/null
+++ b/MdeModulePkg/Include/Guid/TraceHubDebugInfoHob.h
@@ -0,0 +1,24 @@
+/** @file
+This header file declares Trace Hub related structure.
+
+Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>
+
+SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#ifndef TRACE_HUB_DEBUG_INFO_HOB_H_
+#define TRACE_HUB_DEBUG_INFO_HOB_H_
+
+#define TRACEHUB_DEBUG_INFO_HOB_REVISION  1
+
+typedef struct {
+  UINT16     Revision;            // Structure revision
+  BOOLEAN    Flag;                // Flag to enable or disable Trace Hub debug message.
+  UINT8      DebugLevel;          // Debug level for Trace Hub.
+  UINT8      Rvsd[4];             // Reserved for future use
+  UINT64     TraceHubMmioAddress; // MMIO address where Trace Hub debug message output to.
+} TRACEHUB_DEBUG_INFO_HOB;
+
+extern GUID  gTraceHubDebugInfoHobGuid;
+
+#endif // TRACE_HUB_DEBUG_INFO_HOB_H_
diff --git a/MdeModulePkg/Library/TraceHubDebugSysTLib/BaseTraceHubDebugSysTLib.c b/MdeModulePkg/Library/TraceHubDebugSysTLib/BaseTraceHubDebugSysTLib.c
new file mode 100644
index 0000000000..45dfd3127a
--- /dev/null
+++ b/MdeModulePkg/Library/TraceHubDebugSysTLib/BaseTraceHubDebugSysTLib.c
@@ -0,0 +1,245 @@
+/** @file
+System prints Trace Hub message in SEC/PEI/DXE/SMM based on fixed PCDs.
+Only support single Trace Hub debug instance.
+
+Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>
+
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <Base.h>
+#include <Library/BaseLib.h>
+#include <Library/PcdLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/TraceHubDebugSysTLib.h>
+#include <Library/MipiSysTLib.h>
+#include <Library/MipiSysTLib/mipi_syst.h>
+#include <Guid/TraceHubDebugInfoHob.h>
+#include "InternalTraceHubApiCommon.h"
+#include "InternalTraceHubApi.h"
+
+/**
+  Write debug string to specified Trace Hub MMIO address.
+
+  @param[in]  SeverityType     Severity type of input message.
+  @param[in]  Buffer           A pointer to the data buffer.
+  @param[in]  NumberOfBytes    The size of data buffer.
+
+  @retval RETURN_SUCCESS      Data was written to Trace Hub.
+  @retval Other               Failed to output Trace Hub message.
+**/
+RETURN_STATUS
+EFIAPI
+TraceHubSysTDebugWrite (
+  IN TRACE_HUB_SEVERITY_TYPE  SeverityType,
+  IN UINT8                    *Buffer,
+  IN UINTN                    NumberOfBytes
+  )
+{
+  MIPI_SYST_HANDLE  MipiSystHandle;
+  MIPI_SYST_HEADER  MipiSystHeader;
+  RETURN_STATUS     Status;
+  UINT32            DbgInstCount;
+  UINT16            Index;
+
+  if (NumberOfBytes == 0) {
+    //
+    // No data need to be written to Trace Hub
+    //
+    return RETURN_SUCCESS;
+  }
+
+  if (Buffer == NULL) {
+    return RETURN_INVALID_PARAMETER;
+  }
+
+  DbgInstCount = CountThDebugInstance ();
+
+  ZeroMem (&MipiSystHandle, sizeof (MIPI_SYST_HANDLE));
+  MipiSystHandle.systh_header = &MipiSystHeader;
+
+  Status = InitMipiSystHandle (&MipiSystHandle);
+  if (RETURN_ERROR (Status)) {
+    return Status;
+  }
+
+  for (Index = 0; Index < DbgInstCount; Index++) {
+    Status = CheckWhetherToOutputMsg (
+               &MipiSystHandle,
+               NULL,
+               SeverityType,
+               TraceHubDebugType
+               );
+    if (!RETURN_ERROR (Status)) {
+      Status = MipiSystWriteDebug (
+                 &MipiSystHandle,
+                 SeverityType,
+                 (UINT16)NumberOfBytes,
+                 (CHAR8 *)Buffer
+                 );
+      if (RETURN_ERROR (Status)) {
+        break;
+      }
+    }
+  }
+
+  return Status;
+}
+
+/**
+  Write catalog status code message to specified Trace Hub MMIO address.
+
+  @param[in]  SeverityType     Severity type of input message.
+  @param[in]  Id               Catalog ID.
+  @param[in]  Guid             Driver Guid.
+
+  @retval RETURN_SUCCESS      Data was written to Trace Hub.
+  @retval Other               Failed to output Trace Hub message.
+**/
+RETURN_STATUS
+EFIAPI
+TraceHubSysTWriteCataLog64StatusCode (
+  IN TRACE_HUB_SEVERITY_TYPE  SeverityType,
+  IN UINT64                   Id,
+  IN GUID                     *Guid
+  )
+{
+  MIPI_SYST_HANDLE  MipiSystHandle;
+  MIPI_SYST_HEADER  MipiSystHeader;
+  RETURN_STATUS     Status;
+  UINT32            DbgInstCount;
+  UINT16            Index;
+
+  if (Guid == NULL) {
+    return RETURN_INVALID_PARAMETER;
+  }
+
+  DbgInstCount = CountThDebugInstance ();
+
+  ZeroMem (&MipiSystHandle, sizeof (MIPI_SYST_HANDLE));
+  MipiSystHandle.systh_header = &MipiSystHeader;
+
+  Status = InitMipiSystHandle (&MipiSystHandle);
+  if (RETURN_ERROR (Status)) {
+    return Status;
+  }
+
+  SwapBytesGuid (Guid, (GUID *)(VOID *)&MipiSystHandle.systh_guid);
+  MipiSystHandle.systh_tag.et_guid = 1;
+
+  for (Index = 0; Index < DbgInstCount; Index++) {
+    Status = CheckWhetherToOutputMsg (
+               &MipiSystHandle,
+               NULL,
+               SeverityType,
+               TraceHubCatalogType
+               );
+    if (!RETURN_ERROR (Status)) {
+      Status = MipiSystWriteCatalog (
+                 &MipiSystHandle,
+                 SeverityType,
+                 Id
+                 );
+      if (RETURN_ERROR (Status)) {
+        break;
+      }
+    }
+  }
+
+  return Status;
+}
+
+/**
+  Write catalog message to specified Trace Hub MMIO address.
+
+  @param[in]  SeverityType   Severity type of input message.
+  @param[in]  Id             Catalog ID.
+  @param[in]  NumberOfParams Number of entries in argument list.
+  @param[in]  ...            Catalog message parameters.
+
+  @retval RETURN_SUCCESS      Data was written to Trace Hub.
+  @retval Other               Failed to output Trace Hub message.
+**/
+RETURN_STATUS
+EFIAPI
+TraceHubSysTWriteCataLog64 (
+  IN TRACE_HUB_SEVERITY_TYPE  SeverityType,
+  IN UINT64                   Id,
+  IN UINTN                    NumberOfParams,
+  ...
+  )
+{
+  MIPI_SYST_HANDLE  MipiSystHandle;
+  MIPI_SYST_HEADER  MipiSystHeader;
+  VA_LIST           Args;
+  UINTN             Index;
+  RETURN_STATUS     Status;
+  UINT32            DbgInstCount;
+
+  DbgInstCount = 0;
+
+  if (NumberOfParams > sizeof (MipiSystHandle.systh_param) / sizeof (UINT32)) {
+    return RETURN_INVALID_PARAMETER;
+  }
+
+  DbgInstCount = CountThDebugInstance ();
+
+  ZeroMem (&MipiSystHandle, sizeof (MIPI_SYST_HANDLE));
+  MipiSystHandle.systh_header = &MipiSystHeader;
+
+  Status = InitMipiSystHandle (&MipiSystHandle);
+  if (RETURN_ERROR (Status)) {
+    return Status;
+  }
+
+  MipiSystHandle.systh_param_count = (UINT32)NumberOfParams;
+  VA_START (Args, NumberOfParams);
+  for (Index = 0; Index < NumberOfParams; Index++) {
+    MipiSystHandle.systh_param[Index] = VA_ARG (Args, UINT32);
+  }
+
+  VA_END (Args);
+
+  for (Index = 0; Index < DbgInstCount; Index++) {
+    Status = CheckWhetherToOutputMsg (
+               &MipiSystHandle,
+               NULL,
+               SeverityType,
+               TraceHubCatalogType
+               );
+    if (!RETURN_ERROR (Status)) {
+      Status = MipiSystWriteCatalog (
+                 &MipiSystHandle,
+                 SeverityType,
+                 Id
+                 );
+      if (RETURN_ERROR (Status)) {
+        break;
+      }
+    }
+  }
+
+  return Status;
+}
+
+/**
+  Collect the total number of Trace Hub debug instance in the system.
+
+  @retval UINT32      The total number of Trace Hub debug instance in the system.
+**/
+UINT32
+EFIAPI
+CountThDebugInstance (
+  VOID
+  )
+{
+  UINT32  DbgInstCount;
+
+  //
+  // 1 from PCD.
+  //
+  DbgInstCount = 1;
+
+  return DbgInstCount;
+}
diff --git a/MdeModulePkg/Library/TraceHubDebugSysTLib/BaseTraceHubDebugSysTLib.inf b/MdeModulePkg/Library/TraceHubDebugSysTLib/BaseTraceHubDebugSysTLib.inf
new file mode 100644
index 0000000000..3edc4e8fd8
--- /dev/null
+++ b/MdeModulePkg/Library/TraceHubDebugSysTLib/BaseTraceHubDebugSysTLib.inf
@@ -0,0 +1,44 @@
+## @file
+#  Debug library to output Trace Hub message.
+#  Support SEC/PEI/DXE/SMM phase TraceHub debug message based on fixed settings.
+#
+#  Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>
+#
+#  SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+##
+
+[Defines]
+  INF_VERSION                    = 0x00010005
+  BASE_NAME                      = BaseTraceHubDebugSysTLib
+  FILE_GUID                      = 336DA571-AD65-423C-9A43-E0056E5B2D8D
+  MODULE_TYPE                    = BASE
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = TraceHubDebugSysTLib
+
+#
+# The following information is for reference only and not required by the build tools.
+#
+# VALID_ARCHITECTURES = IA32 X64
+#
+
+[LibraryClasses]
+  BaseLib
+  PcdLib
+  BaseMemoryLib
+  MipiSysTLib
+
+[Packages]
+  MdePkg/MdePkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+
+[Sources]
+  BaseTraceHubDebugSysTLib.c
+  InternalTraceHubApiCommon.c
+  InternalTraceHubApiCommon.h
+  InternalTraceHubApi.h
+
+[Pcd]
+  gEfiMdeModulePkgTokenSpaceGuid.PcdTraceHubDebugLevel
+  gEfiMdeModulePkgTokenSpaceGuid.PcdEnableTraceHubDebugMsg
+  gEfiMdeModulePkgTokenSpaceGuid.PcdTraceHubDebugMmioAddress
diff --git a/MdeModulePkg/Library/TraceHubDebugSysTLib/DxeSmmTraceHubDebugSysTLib.c b/MdeModulePkg/Library/TraceHubDebugSysTLib/DxeSmmTraceHubDebugSysTLib.c
new file mode 100644
index 0000000000..35c239b5fe
--- /dev/null
+++ b/MdeModulePkg/Library/TraceHubDebugSysTLib/DxeSmmTraceHubDebugSysTLib.c
@@ -0,0 +1,263 @@
+/** @file
+System prints Trace Hub message in DXE/SMM based on fixed PCDs and HOB.
+Trace Hub PCDs will be applied if no HOB exist.
+
+Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>
+
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <Base.h>
+#include <Library/BaseLib.h>
+#include <Library/PcdLib.h>
+#include <Library/HobLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/TraceHubDebugSysTLib.h>
+#include <Library/MipiSysTLib.h>
+#include <Library/MipiSysTLib/mipi_syst.h>
+#include <Guid/TraceHubDebugInfoHob.h>
+#include "InternalTraceHubApiCommon.h"
+#include "InternalTraceHubApi.h"
+
+GLOBAL_REMOVE_IF_UNREFERENCED TRACEHUB_DEBUG_INFO_HOB  *mThDebugInstArray = NULL;
+GLOBAL_REMOVE_IF_UNREFERENCED UINT32                   mDbgInstCount      = 0;
+
+/**
+  Write debug string to specified Trace Hub MMIO address.
+
+  @param[in]  SeverityType     Severity type of input message.
+  @param[in]  Buffer           A pointer to the data buffer.
+  @param[in]  NumberOfBytes    The size of data buffer.
+
+  @retval RETURN_SUCCESS      Data was written to Trace Hub.
+  @retval Other               Failed to output Trace Hub message.
+**/
+RETURN_STATUS
+EFIAPI
+TraceHubSysTDebugWrite (
+  IN TRACE_HUB_SEVERITY_TYPE  SeverityType,
+  IN UINT8                    *Buffer,
+  IN UINTN                    NumberOfBytes
+  )
+{
+  MIPI_SYST_HANDLE  MipiSystHandle;
+  MIPI_SYST_HEADER  MipiSystHeader;
+  RETURN_STATUS     Status;
+  UINT16            Index;
+
+  if ((mDbgInstCount == 0) || (mThDebugInstArray == NULL)) {
+    return RETURN_ABORTED;
+  }
+
+  if (NumberOfBytes == 0) {
+    //
+    // No data need to be written to Trace Hub
+    //
+    return RETURN_SUCCESS;
+  }
+
+  if (Buffer == NULL) {
+    return RETURN_INVALID_PARAMETER;
+  }
+
+  ZeroMem (&MipiSystHandle, sizeof (MIPI_SYST_HANDLE));
+  MipiSystHandle.systh_header = &MipiSystHeader;
+
+  Status = InitMipiSystHandle (&MipiSystHandle);
+  if (RETURN_ERROR (Status)) {
+    return Status;
+  }
+
+  for (Index = 0; Index < mDbgInstCount; Index++) {
+    Status = CheckWhetherToOutputMsg (
+               &MipiSystHandle,
+               (UINT8 *)&mThDebugInstArray[Index],
+               SeverityType,
+               TraceHubDebugType
+               );
+    if (!RETURN_ERROR (Status)) {
+      Status = MipiSystWriteDebug (
+                 &MipiSystHandle,
+                 SeverityType,
+                 (UINT16)NumberOfBytes,
+                 (CHAR8 *)Buffer
+                 );
+      if (RETURN_ERROR (Status)) {
+        break;
+      }
+    }
+  }
+
+  return Status;
+}
+
+/**
+  Write catalog status code message to specified Trace Hub MMIO address.
+
+  @param[in]  SeverityType     Severity type of input message.
+  @param[in]  Id               Catalog ID.
+  @param[in]  Guid             Driver Guid.
+
+  @retval RETURN_SUCCESS      Data was written to Trace Hub.
+  @retval Other               Failed to output Trace Hub message.
+**/
+RETURN_STATUS
+EFIAPI
+TraceHubSysTWriteCataLog64StatusCode (
+  IN TRACE_HUB_SEVERITY_TYPE  SeverityType,
+  IN UINT64                   Id,
+  IN GUID                     *Guid
+  )
+{
+  MIPI_SYST_HANDLE  MipiSystHandle;
+  MIPI_SYST_HEADER  MipiSystHeader;
+  UINTN             Index;
+  RETURN_STATUS     Status;
+
+  if ((mDbgInstCount == 0) || (mThDebugInstArray == NULL)) {
+    return RETURN_ABORTED;
+  }
+
+  ZeroMem (&MipiSystHandle, sizeof (MIPI_SYST_HANDLE));
+  MipiSystHandle.systh_header = &MipiSystHeader;
+
+  Status = InitMipiSystHandle (&MipiSystHandle);
+  if (RETURN_ERROR (Status)) {
+    return Status;
+  }
+
+  if (Guid != NULL) {
+    SwapBytesGuid (Guid, (GUID *)(VOID *)&MipiSystHandle.systh_guid);
+    MipiSystHandle.systh_tag.et_guid = 1;
+  } else {
+    MipiSystHandle.systh_tag.et_modunit = 2;
+    MipiSystHandle.systh_tag.et_guid    = 0;
+  }
+
+  for (Index = 0; Index < mDbgInstCount; Index++) {
+    Status = CheckWhetherToOutputMsg (
+               &MipiSystHandle,
+               (UINT8 *)&mThDebugInstArray[Index],
+               SeverityType,
+               TraceHubCatalogType
+               );
+    if (!RETURN_ERROR (Status)) {
+      Status = MipiSystWriteCatalog (
+                 &MipiSystHandle,
+                 SeverityType,
+                 Id
+                 );
+      if (RETURN_ERROR (Status)) {
+        break;
+      }
+    }
+  }
+
+  return Status;
+}
+
+/**
+  Write catalog message to specified Trace Hub MMIO address.
+
+  @param[in]  SeverityType   Severity type of input message.
+  @param[in]  Id             Catalog ID.
+  @param[in]  NumberOfParams Number of entries in argument list.
+  @param[in]  ...            Catalog message parameters.
+
+  @retval RETURN_SUCCESS      Data was written to Trace Hub.
+  @retval Other               Failed to output Trace Hub message.
+**/
+RETURN_STATUS
+EFIAPI
+TraceHubSysTWriteCataLog64 (
+  IN TRACE_HUB_SEVERITY_TYPE  SeverityType,
+  IN UINT64                   Id,
+  IN UINTN                    NumberOfParams,
+  ...
+  )
+{
+  MIPI_SYST_HANDLE  MipiSystHandle;
+  MIPI_SYST_HEADER  MipiSystHeader;
+  VA_LIST           Args;
+  UINTN             Index;
+  RETURN_STATUS     Status;
+
+  if (NumberOfParams > sizeof (MipiSystHandle.systh_param) / sizeof (UINT32)) {
+    return RETURN_INVALID_PARAMETER;
+  }
+
+  if ((mDbgInstCount == 0) || (mThDebugInstArray == NULL)) {
+    return RETURN_ABORTED;
+  }
+
+  ZeroMem (&MipiSystHandle, sizeof (MIPI_SYST_HANDLE));
+  MipiSystHandle.systh_header = &MipiSystHeader;
+
+  Status = InitMipiSystHandle (&MipiSystHandle);
+  if (RETURN_ERROR (Status)) {
+    return Status;
+  }
+
+  MipiSystHandle.systh_param_count = (UINT32)NumberOfParams;
+  VA_START (Args, NumberOfParams);
+  for (Index = 0; Index < NumberOfParams; Index++) {
+    MipiSystHandle.systh_param[Index] = VA_ARG (Args, UINT32);
+  }
+
+  VA_END (Args);
+
+  for (Index = 0; Index < mDbgInstCount; Index++) {
+    Status = CheckWhetherToOutputMsg (
+               &MipiSystHandle,
+               (UINT8 *)&mThDebugInstArray[Index],
+               SeverityType,
+               TraceHubCatalogType
+               );
+    if (!RETURN_ERROR (Status)) {
+      Status = MipiSystWriteCatalog (
+                 &MipiSystHandle,
+                 SeverityType,
+                 Id
+                 );
+      if (RETURN_ERROR (Status)) {
+        break;
+      }
+    }
+  }
+
+  return Status;
+}
+
+/**
+  Constructor to get TraceHob configuration data
+
+  @param  ImageHandle   The firmware allocated handle for the EFI image.
+  @param  SystemTable   A pointer to the EFI System Table.
+
+  @retval RETURN_SUCCESS           The constructor always returns EFI_SUCCESS.
+  @retval RETURN_OUT_OF_RESOURCES  There are not enough resources available to retrieve the matching FFS section.
+
+**/
+RETURN_STATUS
+EFIAPI
+DxeSmmTraceHubDebugSysTLibConstructor (
+  IN EFI_HANDLE        ImageHandle,
+  IN EFI_SYSTEM_TABLE  *SystemTable
+  )
+{
+  if (mDbgInstCount == 0) {
+    mDbgInstCount = CountThDebugInstance ();
+  }
+
+  mThDebugInstArray = AllocateZeroPool (mDbgInstCount * sizeof (TRACEHUB_DEBUG_INFO_HOB));
+
+  if (mThDebugInstArray != NULL) {
+    PackThDebugInstance (mThDebugInstArray, mDbgInstCount);
+  } else {
+    return RETURN_OUT_OF_RESOURCES;
+  }
+
+  return RETURN_SUCCESS;
+}
diff --git a/MdeModulePkg/Library/TraceHubDebugSysTLib/DxeSmmTraceHubDebugSysTLib.inf b/MdeModulePkg/Library/TraceHubDebugSysTLib/DxeSmmTraceHubDebugSysTLib.inf
new file mode 100644
index 0000000000..90213beee1
--- /dev/null
+++ b/MdeModulePkg/Library/TraceHubDebugSysTLib/DxeSmmTraceHubDebugSysTLib.inf
@@ -0,0 +1,51 @@
+## @file
+#  Debug library to output Trace Hub message.
+#  Support DXE/SMM phase TraceHub debug message based on fixed or dynamic settings.
+#
+#  Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>
+#
+#  SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+##
+
+[Defines]
+  INF_VERSION                    = 0x00010005
+  BASE_NAME                      = DxeSmmTraceHubDebugSysTLib
+  FILE_GUID                      = A9B7B825-7902-4616-8556-085DA4DFEC72
+  MODULE_TYPE                    = DXE_DRIVER
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = TraceHubDebugSysTLib|DXE_CORE DXE_DRIVER SMM_CORE DXE_SMM_DRIVER UEFI_DRIVER UEFI_APPLICATION
+  CONSTRUCTOR                    = DxeSmmTraceHubDebugSysTLibConstructor
+
+#
+# The following information is for reference only and not required by the build tools.
+#
+# VALID_ARCHITECTURES = IA32 X64
+#
+
+[LibraryClasses]
+  BaseLib
+  PcdLib
+  HobLib
+  BaseMemoryLib
+  MemoryAllocationLib
+  MipiSysTLib
+
+[Packages]
+  MdePkg/MdePkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+
+[Sources]
+  DxeSmmTraceHubDebugSysTLib.c
+  InternalTraceHubApiCommon.c
+  InternalTraceHubApiCommon.h
+  InternalTraceHubApi.h
+  InternalTraceHubApi.c
+
+[Guids]
+  gTraceHubDebugInfoHobGuid
+
+[Pcd]
+  gEfiMdeModulePkgTokenSpaceGuid.PcdTraceHubDebugLevel
+  gEfiMdeModulePkgTokenSpaceGuid.PcdEnableTraceHubDebugMsg
+  gEfiMdeModulePkgTokenSpaceGuid.PcdTraceHubDebugMmioAddress
diff --git a/MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApi.c b/MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApi.c
new file mode 100644
index 0000000000..fe946fe60c
--- /dev/null
+++ b/MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApi.c
@@ -0,0 +1,74 @@
+/** @file
+Functions implementation in this file are not common for all type of TraceHubDebugSysTLib.
+
+Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>
+
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <Base.h>
+#include <Guid/TraceHubDebugInfoHob.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/HobLib.h>
+#include "InternalTraceHubApi.h"
+
+/**
+  Count the total number of Trace Hub debug instance in the system.
+
+  @retval UINT32      The total number of Trace Hub debug instance in the system.
+**/
+UINT32
+EFIAPI
+CountThDebugInstance (
+  VOID
+  )
+{
+  UINT8   *DbgContext;
+  UINT32  DbgInstCount;
+
+  DbgInstCount = 0;
+
+  DbgContext = (UINT8 *)GetFirstGuidHob (&gTraceHubDebugInfoHobGuid);
+  if (DbgContext != NULL) {
+    while (DbgContext != NULL) {
+      DbgInstCount++;
+      DbgContext = (UINT8 *)GetNextGuidHob (&gTraceHubDebugInfoHobGuid, GET_NEXT_HOB (DbgContext));
+    }
+  } else {
+    DbgInstCount++;
+  }
+
+  return DbgInstCount;
+}
+
+/**
+  Pack Trace Hub debug instances in the system.
+
+  @param[in, out]  ThPtr     A pointer to TRACEHUB_DEBUG_INFO_HOB structure.
+  @param[in]       Count     Number of Trace Hub HOBs.
+**/
+VOID
+EFIAPI
+PackThDebugInstance (
+  IN OUT TRACEHUB_DEBUG_INFO_HOB  *ThPtr,
+  IN     UINT32                   Count
+  )
+{
+  UINT8   *DbgContext;
+  UINT16  Index;
+
+  DbgContext = GetFirstGuidHob (&gTraceHubDebugInfoHobGuid);
+  if (DbgContext != NULL) {
+    for (Index = 0; Index < Count; Index++) {
+      CopyMem (&ThPtr[Index], GET_GUID_HOB_DATA (DbgContext), sizeof (TRACEHUB_DEBUG_INFO_HOB));
+      DbgContext = GetNextGuidHob (&gTraceHubDebugInfoHobGuid, GET_NEXT_HOB (DbgContext));
+    }
+  } else {
+    for (Index = 0; Index < Count; Index++) {
+      ThPtr[Index].TraceHubMmioAddress = FixedPcdGet64 (PcdTraceHubDebugMmioAddress);
+      ThPtr[Index].Flag                = FixedPcdGetBool (PcdEnableTraceHubDebugMsg);
+      ThPtr[Index].DebugLevel          = FixedPcdGet8 (PcdTraceHubDebugLevel);
+    }
+  }
+}
diff --git a/MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApi.h b/MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApi.h
new file mode 100644
index 0000000000..f624f73768
--- /dev/null
+++ b/MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApi.h
@@ -0,0 +1,37 @@
+/** @file
+This header file declares functions that are not for common use.
+
+Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>
+
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef INTERNAL_TRACE_HUB_API_H_
+#define INTERNAL_TRACE_HUB_API_H_
+
+/**
+  Count the total number of Trace Hub debug instance in the system.
+
+  @retval UINT32      The total number of Trace Hub debug instance in the system.
+**/
+UINT32
+EFIAPI
+CountThDebugInstance (
+  VOID
+  );
+
+/**
+  Pack Trace Hub debug instances in the system.
+
+  @param[in, out]  ThPtr     A pointer to TRACEHUB_DEBUG_INFO_HOB structure.
+  @param[in]       Count     Number of Trace Hub HOBs.
+**/
+VOID
+EFIAPI
+PackThDebugInstance (
+  IN OUT TRACEHUB_DEBUG_INFO_HOB  *ThPtr,
+  IN     UINT32                   Count
+  );
+
+#endif // INTERNAL_TRACE_HUB_API_H_
diff --git a/MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApiCommon.c b/MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApiCommon.c
new file mode 100644
index 0000000000..fe77f486f4
--- /dev/null
+++ b/MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApiCommon.c
@@ -0,0 +1,200 @@
+/** @file
+Functions implementation defined in this file are common for all type of TraceHubDebugSysTLib
+
+Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>
+
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <Base.h>
+#include <Library/BaseLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/TraceHubDebugSysTLib.h>
+#include <Library/MipiSysTLib/mipi_syst.h>
+#include <Guid/TraceHubDebugInfoHob.h>
+#include "InternalTraceHubApiCommon.h"
+#include "InternalTraceHubApi.h"
+
+/**
+  Conditionally determine whether to enable Trace Hub message.
+
+  @param[in]  Flag            Flag to enable or disable Trace Hub message.
+  @param[in]  DbgLevel        Debug Level of Trace Hub.
+  @param[in]  SeverityType    Severity type of input message.
+
+  @retval TRUE            Enable trace hub message.
+  @retval FALSE           Disable trace hub message.
+**/
+BOOLEAN
+EFIAPI
+TraceHubDataEnabled (
+  IN BOOLEAN                  Flag,
+  IN UINT8                    DbgLevel,
+  IN TRACE_HUB_SEVERITY_TYPE  SeverityType
+  )
+{
+  if (Flag == TraceHubRoutingDisable) {
+    return FALSE;
+  }
+
+  if (DbgLevel == TraceHubDebugLevelError) {
+    if (((SeverityType == SeverityFatal) || (SeverityType == SeverityError))) {
+      return TRUE;
+    }
+  } else if (DbgLevel == TraceHubDebugLevelErrorWarning) {
+    if (((SeverityType == SeverityFatal) || (SeverityType == SeverityError) || (SeverityType == SeverityWarning))) {
+      return TRUE;
+    }
+  } else if (DbgLevel == TraceHubDebugLevelErrorWarningInfo) {
+    if (((SeverityType == SeverityFatal) || (SeverityType == SeverityError) || (SeverityType == SeverityWarning) || (SeverityType == SeverityNormal))) {
+      return TRUE;
+    }
+  } else if (DbgLevel == TraceHubDebugLevelErrorWarningInfoVerbose) {
+    return TRUE;
+  }
+
+  return FALSE;
+}
+
+/**
+  Convert GUID from LE to BE or BE to LE.
+
+  @param[in]  Guid           GUID that need to be converted.
+  @param[out] ConvertedGuid  GUID that is converted.
+**/
+VOID
+EFIAPI
+SwapBytesGuid (
+  IN  GUID  *Guid,
+  OUT GUID  *ConvertedGuid
+  )
+{
+  CopyGuid (ConvertedGuid, Guid);
+  ConvertedGuid->Data1 = SwapBytes32 (ConvertedGuid->Data1);
+  ConvertedGuid->Data2 = SwapBytes16 (ConvertedGuid->Data2);
+  ConvertedGuid->Data3 = SwapBytes16 (ConvertedGuid->Data3);
+}
+
+/**
+  Check whether to output Trace Hub message according to some conditions.
+  Trace Hub message will be disabled if TraceHubDataEnabled() return FALSE
+  or Trace Hub MMIO address is 0.
+
+  @param[in, out]  MipiSystHandle   A pointer to MIPI_SYST_HANDLE structure.
+  @param[in]       DbgContext       A pointer to Trace Hub debug instance.
+  @param[in]       SeverityType     Severity type of input message.
+  @param[in]       PrintType        Either catalog print or debug print.
+
+  @retval RETURN_SUCCESS      Current Trace Hub message need to be output.
+  @retval Other               Current Trace Hub message will be disabled.
+**/
+RETURN_STATUS
+EFIAPI
+CheckWhetherToOutputMsg (
+  IN OUT MIPI_SYST_HANDLE         *MipiSystHandle,
+  IN     UINT8                    *DbgContext,
+  IN     TRACE_HUB_SEVERITY_TYPE  SeverityType,
+  IN     TRACEHUB_PRINTTYPE       PrintType
+  )
+{
+  UINT8          DbgLevel;
+  BOOLEAN        Flag;
+  UINT64         Addr;
+  RETURN_STATUS  Status;
+
+  if (MipiSystHandle == NULL) {
+    return RETURN_INVALID_PARAMETER;
+  }
+
+  if (PrintType == TraceHubDebugType) {
+    Status = GetTraceHubMsgVisibility (DbgContext, &Flag, &DbgLevel);
+    if (RETURN_ERROR (Status)) {
+      return Status;
+    }
+
+    if (!TraceHubDataEnabled (Flag, DbgLevel, SeverityType)) {
+      return RETURN_ABORTED;
+    }
+  }
+
+  Status = GetTraceHubMmioAddress (DbgContext, &Addr);
+  if (RETURN_ERROR (Status)) {
+    return Status;
+  }
+
+  MipiSystHandle->systh_platform.TraceHubPlatformData.MmioAddr = Addr;
+  if (MipiSystHandle->systh_platform.TraceHubPlatformData.MmioAddr == 0) {
+    return RETURN_ABORTED;
+  }
+
+  return RETURN_SUCCESS;
+}
+
+/**
+  Get Trace Hub MMIO Address.
+
+  @param[in]      DbgContext        A pointer to Trace Hub debug instance.
+  @param[in, out] TraceAddress      Trace Hub MMIO Address.
+
+  @retval RETURN_SUCCESS      Operation is successfully.
+  @retval Other               Operation is failed.
+**/
+RETURN_STATUS
+EFIAPI
+GetTraceHubMmioAddress (
+  IN     UINT8   *DbgContext,
+  IN OUT UINT64  *TraceAddress
+  )
+{
+  TRACEHUB_DEBUG_INFO_HOB  *ThDbgContext;
+
+  if (TraceAddress == NULL) {
+    return RETURN_INVALID_PARAMETER;
+  }
+
+  if (DbgContext != NULL) {
+    ThDbgContext  = (TRACEHUB_DEBUG_INFO_HOB *)DbgContext;
+    *TraceAddress = ThDbgContext->TraceHubMmioAddress;
+  } else {
+    *TraceAddress = FixedPcdGet64 (PcdTraceHubDebugMmioAddress);
+  }
+
+  return RETURN_SUCCESS;
+}
+
+/**
+  Get visibility of Trace Hub Msg.
+
+  @param[in]      DbgContext      A pointer to Trace Hub debug instance.
+  @param[in, out] Flag            Flag to enable or disable Trace Hub message.
+  @param[in, out] DbgLevel        Debug Level of Trace Hub.
+
+  @retval RETURN_SUCCESS      Operation is successfully.
+  @retval Other               Operation is failed.
+**/
+RETURN_STATUS
+EFIAPI
+GetTraceHubMsgVisibility (
+  IN     UINT8    *DbgContext,
+  IN OUT BOOLEAN  *Flag,
+  IN OUT UINT8    *DbgLevel
+  )
+{
+  TRACEHUB_DEBUG_INFO_HOB  *ThDbgContext;
+
+  if ((Flag == NULL) || (DbgLevel == NULL)) {
+    return RETURN_INVALID_PARAMETER;
+  }
+
+  if (DbgContext != NULL) {
+    ThDbgContext = (TRACEHUB_DEBUG_INFO_HOB *)DbgContext;
+    *Flag        = ThDbgContext->Flag;
+    *DbgLevel    = ThDbgContext->DebugLevel;
+  } else {
+    *DbgLevel = FixedPcdGet8 (PcdTraceHubDebugLevel);
+    *Flag     = FixedPcdGetBool (PcdEnableTraceHubDebugMsg);
+  }
+
+  return RETURN_SUCCESS;
+}
diff --git a/MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApiCommon.h b/MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApiCommon.h
new file mode 100644
index 0000000000..b8be48a8bb
--- /dev/null
+++ b/MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApiCommon.h
@@ -0,0 +1,119 @@
+/** @file
+This header file declares functions and type for common use.
+
+Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>
+
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef INTERNAL_TRACE_HUB_API_COMMON_H_
+#define INTERNAL_TRACE_HUB_API_COMMON_H_
+
+typedef enum {
+  TraceHubDebugType = 0,
+  TraceHubCatalogType
+} TRACEHUB_PRINTTYPE;
+
+typedef enum {
+  TraceHubRoutingDisable = 0,
+  TraceHubRoutingEnable,
+  TraceHubRoutingMax
+} TRACE_HUB_ROUTING;
+
+typedef enum {
+  TraceHubDebugLevelError = 0,
+  TraceHubDebugLevelErrorWarning,
+  TraceHubDebugLevelErrorWarningInfo,
+  TraceHubDebugLevelErrorWarningInfoVerbose,
+  TraceHubDebugLevelMax
+} TRACE_HUB_DEBUG_LEVEL;
+
+/**
+  Conditionally determine whether to enable Trace Hub message.
+
+  @param[in]  Flag            Flag to enable or disable Trace Hub message.
+  @param[in]  DbgLevel        Debug Level of Trace Hub.
+  @param[in]  SeverityType    Severity type of input message.
+
+  @retval TRUE            Enable trace hub message.
+  @retval FALSE           Disable trace hub message.
+**/
+BOOLEAN
+EFIAPI
+TraceHubDataEnabled (
+  IN BOOLEAN                  Flag,
+  IN UINT8                    DbgLevel,
+  IN TRACE_HUB_SEVERITY_TYPE  SeverityType
+  );
+
+/**
+  Convert GUID from LE to BE or BE to LE.
+
+  @param[in]  Guid           GUID that need to be converted.
+  @param[out] ConvertedGuid  GUID that is converted.
+**/
+VOID
+EFIAPI
+SwapBytesGuid (
+  IN  GUID  *Guid,
+  OUT GUID  *ConvertedGuid
+  );
+
+/**
+  Check whether to output Trace Hub message according to some conditions.
+  Trace Hub message will be disabled if TraceHubDataEnabled() return FALSE
+  or Trace Hub MMIO address is 0.
+
+  @param[in, out]  MipiSystHandle   A pointer to MIPI_SYST_HANDLE structure.
+  @param[in]       DbgContext       A pointer to Trace Hub debug instance.
+  @param[in]       SeverityType     Severity type of input message.
+  @param[in]       PrintType        Either catalog print or debug print.
+
+  @retval RETURN_SUCCESS      Current Trace Hub message need to be output.
+  @retval Other               Current Trace Hub message will be disabled.
+**/
+RETURN_STATUS
+EFIAPI
+CheckWhetherToOutputMsg (
+  IN OUT MIPI_SYST_HANDLE         *MipiSystHandle,
+  IN     UINT8                    *DbgContext,
+  IN     TRACE_HUB_SEVERITY_TYPE  SeverityType,
+  IN     TRACEHUB_PRINTTYPE       PrintType
+  );
+
+/**
+  Get Trace Hub MMIO Address.
+
+  @param[in]      DbgContext        A pointer to Trace Hub debug instance.
+  @param[in, out] TraceAddress      Trace Hub MMIO Address.
+
+  @retval RETURN_SUCCESS      Operation is successfully.
+  @retval Other               Operation is failed.
+**/
+RETURN_STATUS
+EFIAPI
+GetTraceHubMmioAddress (
+  IN     UINT8   *DbgContext,
+  IN OUT UINT64  *TraceAddress
+  );
+
+/**
+  Get visibility of Trace Hub Msg.
+
+  @param[in]      DbgContext      A pointer to Trace Hub debug instance.
+  @param[in, out] Flag            Flag to enable or disable Trace Hub message.
+  @param[in, out] DbgLevel        Debug Level of Trace Hub.
+
+  @retval RETURN_SUCCESS      Operation is successfully.
+  @retval Other               Operation is failed.
+**/
+RETURN_STATUS
+EFIAPI
+GetTraceHubMsgVisibility (
+  IN     UINT8    *DbgContext,
+  IN OUT BOOLEAN  *Flag,
+  IN OUT UINT8    *DbgLevel
+  );
+
+#endif // INTERNAL_TRACE_HUB_API_COMMON_H_
diff --git a/MdeModulePkg/Library/TraceHubDebugSysTLib/PeiTraceHubDebugSysTLib.c b/MdeModulePkg/Library/TraceHubDebugSysTLib/PeiTraceHubDebugSysTLib.c
new file mode 100644
index 0000000000..e68fb8b242
--- /dev/null
+++ b/MdeModulePkg/Library/TraceHubDebugSysTLib/PeiTraceHubDebugSysTLib.c
@@ -0,0 +1,282 @@
+/** @file
+System prints Trace Hub message in PEI based on fixed PCDs and HOB.
+System applies Trace Hub HOB once it detect gTraceHubDebugInfoHobGuid HOB.
+Trace Hub PCDs will be applied if no HOB exist.
+
+Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>
+
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <Base.h>
+#include <Library/BaseLib.h>
+#include <Library/PcdLib.h>
+#include <Library/HobLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/TraceHubDebugSysTLib.h>
+#include <Library/MipiSysTLib.h>
+#include <Library/MipiSysTLib/mipi_syst.h>
+#include <Guid/TraceHubDebugInfoHob.h>
+#include "InternalTraceHubApiCommon.h"
+#include "InternalTraceHubApi.h"
+
+/**
+  Write debug string to specified Trace Hub MMIO address.
+
+  @param[in]  SeverityType     Severity type of input message.
+  @param[in]  Buffer           A pointer to the data buffer.
+  @param[in]  NumberOfBytes    The size of data buffer.
+
+  @retval RETURN_SUCCESS      Data was written to Trace Hub.
+  @retval Other               Failed to output Trace Hub message.
+**/
+RETURN_STATUS
+EFIAPI
+TraceHubSysTDebugWrite (
+  IN TRACE_HUB_SEVERITY_TYPE  SeverityType,
+  IN UINT8                    *Buffer,
+  IN UINTN                    NumberOfBytes
+  )
+{
+  MIPI_SYST_HANDLE  MipiSystHandle;
+  MIPI_SYST_HEADER  MipiSystHeader;
+  RETURN_STATUS     Status;
+  UINT8             *DbgContext;
+  UINTN             Index;
+  UINT32            DbgInstCount;
+  UINT8             *ThDebugInfo;
+
+  if (NumberOfBytes == 0) {
+    //
+    // No data need to be written to Trace Hub
+    //
+    return RETURN_SUCCESS;
+  }
+
+  if (Buffer == NULL) {
+    return RETURN_INVALID_PARAMETER;
+  }
+
+  DbgInstCount = CountThDebugInstance ();
+
+  ZeroMem (&MipiSystHandle, sizeof (MIPI_SYST_HANDLE));
+  MipiSystHandle.systh_header = &MipiSystHeader;
+
+  Status = InitMipiSystHandle (&MipiSystHandle);
+  if (RETURN_ERROR (Status)) {
+    return Status;
+  }
+
+  DbgContext = (UINT8 *)GetFirstGuidHob (&gTraceHubDebugInfoHobGuid);
+  if (DbgContext != NULL) {
+    ThDebugInfo = GET_GUID_HOB_DATA (DbgContext);
+  } else {
+    ThDebugInfo = NULL;
+  }
+
+  for (Index = 0; Index < DbgInstCount; Index++) {
+    Status = CheckWhetherToOutputMsg (
+               &MipiSystHandle,
+               ThDebugInfo,
+               SeverityType,
+               TraceHubDebugType
+               );
+    if (!RETURN_ERROR (Status)) {
+      Status = MipiSystWriteDebug (
+                 &MipiSystHandle,
+                 SeverityType,
+                 (UINT16)NumberOfBytes,
+                 (CHAR8 *)Buffer
+                 );
+      if (RETURN_ERROR (Status)) {
+        break;
+      }
+    }
+
+    if (DbgContext != NULL) {
+      DbgContext = (UINT8 *)GetNextGuidHob (&gTraceHubDebugInfoHobGuid, GET_NEXT_HOB (DbgContext));
+      if (DbgContext == NULL) {
+        break;
+      }
+
+      ThDebugInfo = GET_GUID_HOB_DATA (DbgContext);
+    }
+  }
+
+  return Status;
+}
+
+/**
+  Write catalog status code message to specified Trace Hub MMIO address.
+
+  @param[in]  SeverityType     Severity type of input message.
+  @param[in]  Id               Catalog ID.
+  @param[in]  Guid             Driver Guid.
+
+  @retval RETURN_SUCCESS      Data was written to Trace Hub.
+  @retval Other               Failed to output Trace Hub message.
+**/
+RETURN_STATUS
+EFIAPI
+TraceHubSysTWriteCataLog64StatusCode (
+  IN TRACE_HUB_SEVERITY_TYPE  SeverityType,
+  IN UINT64                   Id,
+  IN GUID                     *Guid
+  )
+{
+  MIPI_SYST_HANDLE  MipiSystHandle;
+  MIPI_SYST_HEADER  MipiSystHeader;
+  UINT32            DbgInstCount;
+  UINT8             *DbgContext;
+  RETURN_STATUS     Status;
+  UINTN             Index;
+  UINT8             *ThDebugInfo;
+
+  DbgInstCount = CountThDebugInstance ();
+
+  ZeroMem (&MipiSystHandle, sizeof (MIPI_SYST_HANDLE));
+  MipiSystHandle.systh_header = &MipiSystHeader;
+
+  Status = InitMipiSystHandle (&MipiSystHandle);
+  if (RETURN_ERROR (Status)) {
+    return Status;
+  }
+
+  if (Guid != NULL) {
+    SwapBytesGuid (Guid, (GUID *)(VOID *)&MipiSystHandle.systh_guid);
+    MipiSystHandle.systh_tag.et_guid = 1;
+  } else {
+    MipiSystHandle.systh_tag.et_modunit = 2;
+    MipiSystHandle.systh_tag.et_guid    = 0;
+  }
+
+  DbgContext = (UINT8 *)GetFirstGuidHob (&gTraceHubDebugInfoHobGuid);
+  if (DbgContext != NULL) {
+    ThDebugInfo = GET_GUID_HOB_DATA (DbgContext);
+  } else {
+    ThDebugInfo = NULL;
+  }
+
+  for (Index = 0; Index < DbgInstCount; Index++) {
+    Status = CheckWhetherToOutputMsg (
+               &MipiSystHandle,
+               ThDebugInfo,
+               SeverityType,
+               TraceHubCatalogType
+               );
+    if (!RETURN_ERROR (Status)) {
+      Status = MipiSystWriteCatalog (
+                 &MipiSystHandle,
+                 SeverityType,
+                 Id
+                 );
+      if (RETURN_ERROR (Status)) {
+        break;
+      }
+    }
+
+    if (DbgContext != NULL) {
+      DbgContext = (UINT8 *)GetNextGuidHob (&gTraceHubDebugInfoHobGuid, GET_NEXT_HOB (DbgContext));
+      if (DbgContext == NULL) {
+        break;
+      }
+
+      ThDebugInfo = GET_GUID_HOB_DATA (DbgContext);
+    }
+  }
+
+  return Status;
+}
+
+/**
+  Write catalog message to specified Trace Hub MMIO address.
+
+  @param[in]  SeverityType   Severity type of input message.
+  @param[in]  Id             Catalog ID.
+  @param[in]  NumberOfParams Number of entries in argument list.
+  @param[in]  ...            Catalog message parameters.
+
+  @retval RETURN_SUCCESS      Data was written to Trace Hub.
+  @retval Other               Failed to output Trace Hub message.
+**/
+RETURN_STATUS
+EFIAPI
+TraceHubSysTWriteCataLog64 (
+  IN TRACE_HUB_SEVERITY_TYPE  SeverityType,
+  IN UINT64                   Id,
+  IN UINTN                    NumberOfParams,
+  ...
+  )
+{
+  MIPI_SYST_HANDLE  MipiSystHandle;
+  MIPI_SYST_HEADER  MipiSystHeader;
+  VA_LIST           Args;
+  UINTN             Index;
+  UINT32            DbgInstCount;
+  UINT8             *DbgContext;
+  RETURN_STATUS     Status;
+  UINT8             *ThDebugInfo;
+
+  DbgInstCount = 0;
+
+  if (NumberOfParams > sizeof (MipiSystHandle.systh_param) / sizeof (UINT32)) {
+    return RETURN_INVALID_PARAMETER;
+  }
+
+  DbgInstCount = CountThDebugInstance ();
+
+  ZeroMem (&MipiSystHandle, sizeof (MIPI_SYST_HANDLE));
+  MipiSystHandle.systh_header = &MipiSystHeader;
+
+  Status = InitMipiSystHandle (&MipiSystHandle);
+  if (RETURN_ERROR (Status)) {
+    return Status;
+  }
+
+  MipiSystHandle.systh_param_count = (UINT32)NumberOfParams;
+  VA_START (Args, NumberOfParams);
+  for (Index = 0; Index < NumberOfParams; Index++) {
+    MipiSystHandle.systh_param[Index] = VA_ARG (Args, UINT32);
+  }
+
+  VA_END (Args);
+
+  DbgContext = (UINT8 *)GetFirstGuidHob (&gTraceHubDebugInfoHobGuid);
+  if (DbgContext != NULL) {
+    ThDebugInfo = GET_GUID_HOB_DATA (DbgContext);
+  } else {
+    ThDebugInfo = NULL;
+  }
+
+  for (Index = 0; Index < DbgInstCount; Index++) {
+    Status = CheckWhetherToOutputMsg (
+               &MipiSystHandle,
+               ThDebugInfo,
+               SeverityType,
+               TraceHubCatalogType
+               );
+    if (!RETURN_ERROR (Status)) {
+      Status = MipiSystWriteCatalog (
+                 &MipiSystHandle,
+                 SeverityType,
+                 Id
+                 );
+      if (RETURN_ERROR (Status)) {
+        break;
+      }
+    }
+
+    if (DbgContext != NULL) {
+      DbgContext = (UINT8 *)GetNextGuidHob (&gTraceHubDebugInfoHobGuid, GET_NEXT_HOB (DbgContext));
+      if (DbgContext == NULL) {
+        break;
+      }
+
+      ThDebugInfo = GET_GUID_HOB_DATA (DbgContext);
+    }
+  }
+
+  return Status;
+}
diff --git a/MdeModulePkg/Library/TraceHubDebugSysTLib/PeiTraceHubDebugSysTLib.inf b/MdeModulePkg/Library/TraceHubDebugSysTLib/PeiTraceHubDebugSysTLib.inf
new file mode 100644
index 0000000000..2a8184d927
--- /dev/null
+++ b/MdeModulePkg/Library/TraceHubDebugSysTLib/PeiTraceHubDebugSysTLib.inf
@@ -0,0 +1,50 @@
+## @file
+#  Debug library to output Trace Hub message.
+#  Support PEI phase TraceHub debug message based on fixed or dynamic settings.
+#
+#  Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>
+#
+#  SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+##
+
+[Defines]
+  INF_VERSION                    = 0x00010005
+  BASE_NAME                      = PeiTraceHubDebugSysTLib
+  FILE_GUID                      = C61E8C2E-0935-4E3D-BCBB-5ED84AFD9FD1
+  MODULE_TYPE                    = PEIM
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = TraceHubDebugSysTLib|PEI_CORE PEIM
+
+#
+# The following information is for reference only and not required by the build tools.
+#
+# VALID_ARCHITECTURES = IA32 X64
+#
+
+[LibraryClasses]
+  BaseLib
+  PcdLib
+  HobLib
+  BaseMemoryLib
+  MemoryAllocationLib
+  MipiSysTLib
+
+[Packages]
+  MdePkg/MdePkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+
+[Sources]
+  PeiTraceHubDebugSysTLib.c
+  InternalTraceHubApiCommon.c
+  InternalTraceHubApiCommon.h
+  InternalTraceHubApi.h
+  InternalTraceHubApi.c
+
+[Guids]
+  gTraceHubDebugInfoHobGuid
+
+[Pcd]
+  gEfiMdeModulePkgTokenSpaceGuid.PcdTraceHubDebugLevel
+  gEfiMdeModulePkgTokenSpaceGuid.PcdEnableTraceHubDebugMsg
+  gEfiMdeModulePkgTokenSpaceGuid.PcdTraceHubDebugMmioAddress
diff --git a/MdeModulePkg/Library/TraceHubDebugSysTLib/Readme.md b/MdeModulePkg/Library/TraceHubDebugSysTLib/Readme.md
new file mode 100644
index 0000000000..9e798a41bf
--- /dev/null
+++ b/MdeModulePkg/Library/TraceHubDebugSysTLib/Readme.md
@@ -0,0 +1,26 @@
+## Introduction of TrcaceHubDebugSysTLib ##
+TrcaceHubDebugSysTLib library is a top level library for dumping Trace Hub messages.
+It provides Trace Hub related APIs to dump Trace Hub message via MIPI SYS-T submodule.
+User need to properly configure following Trace Hub related PCDs and HOB.
+  (See MdeModulePkg.dec to get detailed definition for PCDs below)
+  - PcdTraceHubDebugLevel
+  - PcdEnableTraceHubDebugMsg
+  - PcdTraceHubDebugMmioAddress
+  (See TraceHubDebugInfoHob.h to get detailed definition for HOB below)
+  - gTraceHubDebugInfoHobGuid
+
+## BaseTraceHubDebugSysTLib.inf ##
+System prints Trace Hub message in SEC/PEI/DXE/SMM based on fixed PCDs.
+Only support single Trace Hub debug instance.
+
+## PeiTraceHubDebugSysTLib.inf ##
+System prints Trace Hub message in PEI based on fixed PCDs and HOB.
+System applies Trace Hub HOB once it detect gTraceHubDebugInfoHobGuid HOB.
+Trace Hub PCDs will be applied if no HOB exist.
+
+## DxeSmmTraceHubDebugSysTLib.inf ##
+System prints Trace Hub message in DXE/SMM based on fixed PCDs and HOB.
+Trace Hub PCDs will be applied if no HOB exist.
+
+## Note ##
+Trace Hub debug library not support DXE_RUNTIME_DRIVER type of module currently.
diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec
index 9bb0d3ba2d..95dd077e19 100644
--- a/MdeModulePkg/MdeModulePkg.dec
+++ b/MdeModulePkg/MdeModulePkg.dec
@@ -439,6 +439,9 @@
   ## Include/UniversalPayload/SerialPortInfo.h
   gUniversalPayloadSerialPortInfoGuid = { 0xaa7e190d, 0xbe21, 0x4409, { 0x8e, 0x67, 0xa2, 0xcd, 0xf, 0x61, 0xe1, 0x70 } }
 
+  ## Include/Guid/TraceHubDebugInfoHob.h
+  gTraceHubDebugInfoHobGuid = { 0xf88c9c23, 0x646c, 0x4f6c, { 0x8e, 0x3d, 0x36, 0xa9, 0x43, 0xc1, 0x08, 0x35 } }
+
   ## GUID used for Boot Discovery Policy FormSet guid and related variables.
   gBootDiscoveryPolicyMgrFormsetGuid = { 0x5b6f7107, 0xbb3c, 0x4660, { 0x92, 0xcd, 0x54, 0x26, 0x90, 0x28, 0x0b, 0xbd } }
 
@@ -1095,6 +1098,24 @@
   # @Prompt Enable UEFI Stack Guard.
   gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard|FALSE|BOOLEAN|0x30001055
 
+  ## Indicate debug level of Trace Hub.
+  #   0x0 - TraceHubDebugLevelError.<BR>
+  #   0x1 - TraceHubDebugLevelErrorWarning.<BR>
+  #   0x2 - TraceHubDebugLevelErrorWarningInfo.<BR>
+  #   0x3 - TraceHubDebugLevelErrorWarningInfoVerbose.<BR>
+  # @Prompt Debug level of Trace Hub.
+  gEfiMdeModulePkgTokenSpaceGuid.PcdTraceHubDebugLevel|0|UINT8|0x30001056
+
+  ## Flag to enable or disable Trace Hub message.
+  #   FALSE - Disable Trace Hub debug message.<BR>
+  #   TRUE  - Enable Trace Hub debug message.<BR>
+  # @Prompt Enable or Disable Trace Hub message.
+  gEfiMdeModulePkgTokenSpaceGuid.PcdEnableTraceHubDebugMsg|0|BOOLEAN|0x30001057
+
+  ## Indicate MMIO address where Trace Hub message output to.
+  # @Prompt Output MMIO address of Trace Hub message.
+  gEfiMdeModulePkgTokenSpaceGuid.PcdTraceHubDebugMmioAddress|0|UINT64|0x30001058
+
 [PcdsFixedAtBuild, PcdsPatchableInModule]
   ## Dynamic type PCD can be registered callback function for Pcd setting action.
   #  PcdMaxPeiPcdCallBackNumberPerPcdEntry indicates the maximum number of callback function
diff --git a/MdeModulePkg/MdeModulePkg.dsc b/MdeModulePkg/MdeModulePkg.dsc
index 1014598f31..5b1f50e9c0 100644
--- a/MdeModulePkg/MdeModulePkg.dsc
+++ b/MdeModulePkg/MdeModulePkg.dsc
@@ -515,6 +515,9 @@
   MdeModulePkg/Universal/RegularExpressionDxe/RegularExpressionDxe.inf
   MdeModulePkg/Universal/SmmCommunicationBufferDxe/SmmCommunicationBufferDxe.inf
   MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskDxe.inf
+  MdeModulePkg/Library/TraceHubDebugSysTLib/BaseTraceHubDebugSysTLib.inf
+  MdeModulePkg/Library/TraceHubDebugSysTLib/PeiTraceHubDebugSysTLib.inf
+  MdeModulePkg/Library/TraceHubDebugSysTLib/DxeSmmTraceHubDebugSysTLib.inf
 
 [Components.X64]
   MdeModulePkg/Universal/CapsulePei/CapsuleX64.inf
diff --git a/MdeModulePkg/MdeModulePkg.uni b/MdeModulePkg/MdeModulePkg.uni
index 33ce9f6198..a17d34d60b 100644
--- a/MdeModulePkg/MdeModulePkg.uni
+++ b/MdeModulePkg/MdeModulePkg.uni
@@ -1290,6 +1290,24 @@
                                                                                     "   TRUE  - UEFI Stack Guard will be enabled.<BR>\n"
                                                                                     "   FALSE - UEFI Stack Guard will be disabled.<BR>"
 
+#string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdTraceHubDebugLevel_PROMPT  #language en-US "Debug level of Trace Hub."
+
+#string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdTraceHubDebugLevel_HELP    #language en-US "Indicate debug level of Trace Hub"
+                                                                                         "  0x0 - TraceHubDebugLevelError.<BR>"
+                                                                                         "  0x1 - TraceHubDebugLevelErrorWarning.<BR>"
+                                                                                         "  0x2 - TraceHubDebugLevelErrorWarningInfo.<BR>"
+                                                                                         "  0x3 - TraceHubDebugLevelErrorWarningInfoVerbose.<BR>"
+
+#string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdEnableTraceHubDebugMsg_PROMPT  #language en-US "Flag to enable or disable Trace Hub message"
+
+#string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdEnableTraceHubDebugMsg_HELP    #language en-US "Enable or Disable Trace Hub message"
+                                                                                             "  FALSE - Disable Trace Hub debug message.<BR>"
+                                                                                             "  TRUE  - Enable Trace Hub debug message.<BR>"
+
+#string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdTraceHubDebugMmioAddress_PROMPT  #language en-US "Output MMIO address of Trace Hub message"
+
+#string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdTraceHubDebugMmioAddress_HELP    #language en-US "Indicate MMIO address where Trace Hub message output to."
+
 #string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdSetNvStoreDefaultId_PROMPT  #language en-US "NV Storage DefaultId"
 
 #string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdSetNvStoreDefaultId_HELP    #language en-US "This dynamic PCD enables the default variable setting.\n"
-- 
2.39.2.windows.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#104614): https://edk2.groups.io/g/devel/message/104614
Mute This Topic: https://groups.io/mt/98815651/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH v7 4/5] MdeModulePkg: Add TraceHubDebugSysTLib library
Posted by Michael D Kinney 2 years, 9 months ago
The MdeModulePkg maintainers were never Cc, so they did not know to review

Cc: Jian J Wang <jian.j.wang@intel.com> 
Cc: Liming Gao <gaoliming@byosoft.com.cn> 

Will have to wait for review from Jian or Liming and add Rb.

Mike

> -----Original Message-----
> From: Guo, Gua <gua.guo@intel.com>
> Sent: Wednesday, May 10, 2023 2:32 PM
> To: devel@edk2.groups.io
> Cc: Guo, Gua <gua.guo@intel.com>; Kinney, Michael D
> <michael.d.kinney@intel.com>; Chan, Laura <laura.chan@intel.com>;
> Prakashan, Krishnadas Veliyathuparambil
> <krishnadas.veliyathuparambil.prakashan@intel.com>; K N, Karthik
> <karthik.k.n@intel.com>
> Subject: [PATCH v7 4/5] MdeModulePkg: Add TraceHubDebugSysTLib library
> 
> From: Gua Guo <gua.guo@intel.com>
> 
> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=4144
> 
> This Library provides API to dump Trace Hub message.
> 
> Cc: Michael D Kinney <michael.d.kinney@intel.com>
> Cc: Guo Gua <gua.guo@intel.com>
> Cc: Chan Laura <laura.chan@intel.com>
> Cc: Prakashan Krishnadas Veliyathuparambil
> <krishnadas.veliyathuparambil.prakashan@intel.com>
> Cc: K N Karthik <karthik.k.n@intel.com>
> Signed-off-by: Guo Gua <gua.guo@intel.com>
> Reviewed-by: Michael D Kinney <michael.d.kinney@intel.com>
> Reviewed-by: K N Karthik <karthik.k.n@intel.com>
> Reviewed-by: Chan Laura <laura.chan@intel.com>
> ---
>  .../Include/Guid/TraceHubDebugInfoHob.h       |  24 ++
>  .../BaseTraceHubDebugSysTLib.c                | 245 +++++++++++++++
>  .../BaseTraceHubDebugSysTLib.inf              |  44 +++
>  .../DxeSmmTraceHubDebugSysTLib.c              | 263 ++++++++++++++++
>  .../DxeSmmTraceHubDebugSysTLib.inf            |  51 ++++
>  .../InternalTraceHubApi.c                     |  74 +++++
>  .../InternalTraceHubApi.h                     |  37 +++
>  .../InternalTraceHubApiCommon.c               | 200 +++++++++++++
>  .../InternalTraceHubApiCommon.h               | 119 ++++++++
>  .../PeiTraceHubDebugSysTLib.c                 | 282 ++++++++++++++++++
>  .../PeiTraceHubDebugSysTLib.inf               |  50 ++++
>  .../Library/TraceHubDebugSysTLib/Readme.md    |  26 ++
>  MdeModulePkg/MdeModulePkg.dec                 |  21 ++
>  MdeModulePkg/MdeModulePkg.dsc                 |   3 +
>  MdeModulePkg/MdeModulePkg.uni                 |  18 ++
>  15 files changed, 1457 insertions(+)
>  create mode 100644 MdeModulePkg/Include/Guid/TraceHubDebugInfoHob.h
>  create mode 100644
> MdeModulePkg/Library/TraceHubDebugSysTLib/BaseTraceHubDebugSysTLib.c
>  create mode 100644
> MdeModulePkg/Library/TraceHubDebugSysTLib/BaseTraceHubDebugSysTLib.i
> nf
>  create mode 100644
> MdeModulePkg/Library/TraceHubDebugSysTLib/DxeSmmTraceHubDebugSysTL
> ib.c
>  create mode 100644
> MdeModulePkg/Library/TraceHubDebugSysTLib/DxeSmmTraceHubDebugSysTL
> ib.inf
>  create mode 100644
> MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApi.c
>  create mode 100644
> MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApi.h
>  create mode 100644
> MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApiCommon
> .c
>  create mode 100644
> MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApiCommon
> .h
>  create mode 100644
> MdeModulePkg/Library/TraceHubDebugSysTLib/PeiTraceHubDebugSysTLib.c
>  create mode 100644
> MdeModulePkg/Library/TraceHubDebugSysTLib/PeiTraceHubDebugSysTLib.inf
>  create mode 100644
> MdeModulePkg/Library/TraceHubDebugSysTLib/Readme.md
> 
> diff --git a/MdeModulePkg/Include/Guid/TraceHubDebugInfoHob.h
> b/MdeModulePkg/Include/Guid/TraceHubDebugInfoHob.h
> new file mode 100644
> index 0000000000..367f97dc90
> --- /dev/null
> +++ b/MdeModulePkg/Include/Guid/TraceHubDebugInfoHob.h
> @@ -0,0 +1,24 @@
> +/** @file
> 
> +This header file declares Trace Hub related structure.
> 
> +
> 
> +Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>
> 
> +
> 
> +SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> +**/
> 
> +
> 
> +#ifndef TRACE_HUB_DEBUG_INFO_HOB_H_
> 
> +#define TRACE_HUB_DEBUG_INFO_HOB_H_
> 
> +
> 
> +#define TRACEHUB_DEBUG_INFO_HOB_REVISION  1
> 
> +
> 
> +typedef struct {
> 
> +  UINT16     Revision;            // Structure revision
> 
> +  BOOLEAN    Flag;                // Flag to enable or disable Trace Hub debug
> message.
> 
> +  UINT8      DebugLevel;          // Debug level for Trace Hub.
> 
> +  UINT8      Rvsd[4];             // Reserved for future use
> 
> +  UINT64     TraceHubMmioAddress; // MMIO address where Trace Hub
> debug message output to.
> 
> +} TRACEHUB_DEBUG_INFO_HOB;
> 
> +
> 
> +extern GUID  gTraceHubDebugInfoHobGuid;
> 
> +
> 
> +#endif // TRACE_HUB_DEBUG_INFO_HOB_H_
> 
> diff --git
> a/MdeModulePkg/Library/TraceHubDebugSysTLib/BaseTraceHubDebugSysTLib
> .c
> b/MdeModulePkg/Library/TraceHubDebugSysTLib/BaseTraceHubDebugSysTLib
> .c
> new file mode 100644
> index 0000000000..45dfd3127a
> --- /dev/null
> +++
> b/MdeModulePkg/Library/TraceHubDebugSysTLib/BaseTraceHubDebugSysTLib
> .c
> @@ -0,0 +1,245 @@
> +/** @file
> 
> +System prints Trace Hub message in SEC/PEI/DXE/SMM based on fixed PCDs.
> 
> +Only support single Trace Hub debug instance.
> 
> +
> 
> +Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>
> 
> +
> 
> +SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> +
> 
> +**/
> 
> +
> 
> +#include <Base.h>
> 
> +#include <Library/BaseLib.h>
> 
> +#include <Library/PcdLib.h>
> 
> +#include <Library/BaseMemoryLib.h>
> 
> +#include <Library/TraceHubDebugSysTLib.h>
> 
> +#include <Library/MipiSysTLib.h>
> 
> +#include <Library/MipiSysTLib/mipi_syst.h>
> 
> +#include <Guid/TraceHubDebugInfoHob.h>
> 
> +#include "InternalTraceHubApiCommon.h"
> 
> +#include "InternalTraceHubApi.h"
> 
> +
> 
> +/**
> 
> +  Write debug string to specified Trace Hub MMIO address.
> 
> +
> 
> +  @param[in]  SeverityType     Severity type of input message.
> 
> +  @param[in]  Buffer           A pointer to the data buffer.
> 
> +  @param[in]  NumberOfBytes    The size of data buffer.
> 
> +
> 
> +  @retval RETURN_SUCCESS      Data was written to Trace Hub.
> 
> +  @retval Other               Failed to output Trace Hub message.
> 
> +**/
> 
> +RETURN_STATUS
> 
> +EFIAPI
> 
> +TraceHubSysTDebugWrite (
> 
> +  IN TRACE_HUB_SEVERITY_TYPE  SeverityType,
> 
> +  IN UINT8                    *Buffer,
> 
> +  IN UINTN                    NumberOfBytes
> 
> +  )
> 
> +{
> 
> +  MIPI_SYST_HANDLE  MipiSystHandle;
> 
> +  MIPI_SYST_HEADER  MipiSystHeader;
> 
> +  RETURN_STATUS     Status;
> 
> +  UINT32            DbgInstCount;
> 
> +  UINT16            Index;
> 
> +
> 
> +  if (NumberOfBytes == 0) {
> 
> +    //
> 
> +    // No data need to be written to Trace Hub
> 
> +    //
> 
> +    return RETURN_SUCCESS;
> 
> +  }
> 
> +
> 
> +  if (Buffer == NULL) {
> 
> +    return RETURN_INVALID_PARAMETER;
> 
> +  }
> 
> +
> 
> +  DbgInstCount = CountThDebugInstance ();
> 
> +
> 
> +  ZeroMem (&MipiSystHandle, sizeof (MIPI_SYST_HANDLE));
> 
> +  MipiSystHandle.systh_header = &MipiSystHeader;
> 
> +
> 
> +  Status = InitMipiSystHandle (&MipiSystHandle);
> 
> +  if (RETURN_ERROR (Status)) {
> 
> +    return Status;
> 
> +  }
> 
> +
> 
> +  for (Index = 0; Index < DbgInstCount; Index++) {
> 
> +    Status = CheckWhetherToOutputMsg (
> 
> +               &MipiSystHandle,
> 
> +               NULL,
> 
> +               SeverityType,
> 
> +               TraceHubDebugType
> 
> +               );
> 
> +    if (!RETURN_ERROR (Status)) {
> 
> +      Status = MipiSystWriteDebug (
> 
> +                 &MipiSystHandle,
> 
> +                 SeverityType,
> 
> +                 (UINT16)NumberOfBytes,
> 
> +                 (CHAR8 *)Buffer
> 
> +                 );
> 
> +      if (RETURN_ERROR (Status)) {
> 
> +        break;
> 
> +      }
> 
> +    }
> 
> +  }
> 
> +
> 
> +  return Status;
> 
> +}
> 
> +
> 
> +/**
> 
> +  Write catalog status code message to specified Trace Hub MMIO address.
> 
> +
> 
> +  @param[in]  SeverityType     Severity type of input message.
> 
> +  @param[in]  Id               Catalog ID.
> 
> +  @param[in]  Guid             Driver Guid.
> 
> +
> 
> +  @retval RETURN_SUCCESS      Data was written to Trace Hub.
> 
> +  @retval Other               Failed to output Trace Hub message.
> 
> +**/
> 
> +RETURN_STATUS
> 
> +EFIAPI
> 
> +TraceHubSysTWriteCataLog64StatusCode (
> 
> +  IN TRACE_HUB_SEVERITY_TYPE  SeverityType,
> 
> +  IN UINT64                   Id,
> 
> +  IN GUID                     *Guid
> 
> +  )
> 
> +{
> 
> +  MIPI_SYST_HANDLE  MipiSystHandle;
> 
> +  MIPI_SYST_HEADER  MipiSystHeader;
> 
> +  RETURN_STATUS     Status;
> 
> +  UINT32            DbgInstCount;
> 
> +  UINT16            Index;
> 
> +
> 
> +  if (Guid == NULL) {
> 
> +    return RETURN_INVALID_PARAMETER;
> 
> +  }
> 
> +
> 
> +  DbgInstCount = CountThDebugInstance ();
> 
> +
> 
> +  ZeroMem (&MipiSystHandle, sizeof (MIPI_SYST_HANDLE));
> 
> +  MipiSystHandle.systh_header = &MipiSystHeader;
> 
> +
> 
> +  Status = InitMipiSystHandle (&MipiSystHandle);
> 
> +  if (RETURN_ERROR (Status)) {
> 
> +    return Status;
> 
> +  }
> 
> +
> 
> +  SwapBytesGuid (Guid, (GUID *)(VOID *)&MipiSystHandle.systh_guid);
> 
> +  MipiSystHandle.systh_tag.et_guid = 1;
> 
> +
> 
> +  for (Index = 0; Index < DbgInstCount; Index++) {
> 
> +    Status = CheckWhetherToOutputMsg (
> 
> +               &MipiSystHandle,
> 
> +               NULL,
> 
> +               SeverityType,
> 
> +               TraceHubCatalogType
> 
> +               );
> 
> +    if (!RETURN_ERROR (Status)) {
> 
> +      Status = MipiSystWriteCatalog (
> 
> +                 &MipiSystHandle,
> 
> +                 SeverityType,
> 
> +                 Id
> 
> +                 );
> 
> +      if (RETURN_ERROR (Status)) {
> 
> +        break;
> 
> +      }
> 
> +    }
> 
> +  }
> 
> +
> 
> +  return Status;
> 
> +}
> 
> +
> 
> +/**
> 
> +  Write catalog message to specified Trace Hub MMIO address.
> 
> +
> 
> +  @param[in]  SeverityType   Severity type of input message.
> 
> +  @param[in]  Id             Catalog ID.
> 
> +  @param[in]  NumberOfParams Number of entries in argument list.
> 
> +  @param[in]  ...            Catalog message parameters.
> 
> +
> 
> +  @retval RETURN_SUCCESS      Data was written to Trace Hub.
> 
> +  @retval Other               Failed to output Trace Hub message.
> 
> +**/
> 
> +RETURN_STATUS
> 
> +EFIAPI
> 
> +TraceHubSysTWriteCataLog64 (
> 
> +  IN TRACE_HUB_SEVERITY_TYPE  SeverityType,
> 
> +  IN UINT64                   Id,
> 
> +  IN UINTN                    NumberOfParams,
> 
> +  ...
> 
> +  )
> 
> +{
> 
> +  MIPI_SYST_HANDLE  MipiSystHandle;
> 
> +  MIPI_SYST_HEADER  MipiSystHeader;
> 
> +  VA_LIST           Args;
> 
> +  UINTN             Index;
> 
> +  RETURN_STATUS     Status;
> 
> +  UINT32            DbgInstCount;
> 
> +
> 
> +  DbgInstCount = 0;
> 
> +
> 
> +  if (NumberOfParams > sizeof (MipiSystHandle.systh_param) / sizeof
> (UINT32)) {
> 
> +    return RETURN_INVALID_PARAMETER;
> 
> +  }
> 
> +
> 
> +  DbgInstCount = CountThDebugInstance ();
> 
> +
> 
> +  ZeroMem (&MipiSystHandle, sizeof (MIPI_SYST_HANDLE));
> 
> +  MipiSystHandle.systh_header = &MipiSystHeader;
> 
> +
> 
> +  Status = InitMipiSystHandle (&MipiSystHandle);
> 
> +  if (RETURN_ERROR (Status)) {
> 
> +    return Status;
> 
> +  }
> 
> +
> 
> +  MipiSystHandle.systh_param_count = (UINT32)NumberOfParams;
> 
> +  VA_START (Args, NumberOfParams);
> 
> +  for (Index = 0; Index < NumberOfParams; Index++) {
> 
> +    MipiSystHandle.systh_param[Index] = VA_ARG (Args, UINT32);
> 
> +  }
> 
> +
> 
> +  VA_END (Args);
> 
> +
> 
> +  for (Index = 0; Index < DbgInstCount; Index++) {
> 
> +    Status = CheckWhetherToOutputMsg (
> 
> +               &MipiSystHandle,
> 
> +               NULL,
> 
> +               SeverityType,
> 
> +               TraceHubCatalogType
> 
> +               );
> 
> +    if (!RETURN_ERROR (Status)) {
> 
> +      Status = MipiSystWriteCatalog (
> 
> +                 &MipiSystHandle,
> 
> +                 SeverityType,
> 
> +                 Id
> 
> +                 );
> 
> +      if (RETURN_ERROR (Status)) {
> 
> +        break;
> 
> +      }
> 
> +    }
> 
> +  }
> 
> +
> 
> +  return Status;
> 
> +}
> 
> +
> 
> +/**
> 
> +  Collect the total number of Trace Hub debug instance in the system.
> 
> +
> 
> +  @retval UINT32      The total number of Trace Hub debug instance in the
> system.
> 
> +**/
> 
> +UINT32
> 
> +EFIAPI
> 
> +CountThDebugInstance (
> 
> +  VOID
> 
> +  )
> 
> +{
> 
> +  UINT32  DbgInstCount;
> 
> +
> 
> +  //
> 
> +  // 1 from PCD.
> 
> +  //
> 
> +  DbgInstCount = 1;
> 
> +
> 
> +  return DbgInstCount;
> 
> +}
> 
> diff --git
> a/MdeModulePkg/Library/TraceHubDebugSysTLib/BaseTraceHubDebugSysTLib
> .inf
> b/MdeModulePkg/Library/TraceHubDebugSysTLib/BaseTraceHubDebugSysTLib
> .inf
> new file mode 100644
> index 0000000000..3edc4e8fd8
> --- /dev/null
> +++
> b/MdeModulePkg/Library/TraceHubDebugSysTLib/BaseTraceHubDebugSysTLib
> .inf
> @@ -0,0 +1,44 @@
> +## @file
> 
> +#  Debug library to output Trace Hub message.
> 
> +#  Support SEC/PEI/DXE/SMM phase TraceHub debug message based on
> fixed settings.
> 
> +#
> 
> +#  Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>
> 
> +#
> 
> +#  SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> +#
> 
> +##
> 
> +
> 
> +[Defines]
> 
> +  INF_VERSION                    = 0x00010005
> 
> +  BASE_NAME                      = BaseTraceHubDebugSysTLib
> 
> +  FILE_GUID                      = 336DA571-AD65-423C-9A43-E0056E5B2D8D
> 
> +  MODULE_TYPE                    = BASE
> 
> +  VERSION_STRING                 = 1.0
> 
> +  LIBRARY_CLASS                  = TraceHubDebugSysTLib
> 
> +
> 
> +#
> 
> +# The following information is for reference only and not required by the
> build tools.
> 
> +#
> 
> +# VALID_ARCHITECTURES = IA32 X64
> 
> +#
> 
> +
> 
> +[LibraryClasses]
> 
> +  BaseLib
> 
> +  PcdLib
> 
> +  BaseMemoryLib
> 
> +  MipiSysTLib
> 
> +
> 
> +[Packages]
> 
> +  MdePkg/MdePkg.dec
> 
> +  MdeModulePkg/MdeModulePkg.dec
> 
> +
> 
> +[Sources]
> 
> +  BaseTraceHubDebugSysTLib.c
> 
> +  InternalTraceHubApiCommon.c
> 
> +  InternalTraceHubApiCommon.h
> 
> +  InternalTraceHubApi.h
> 
> +
> 
> +[Pcd]
> 
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdTraceHubDebugLevel
> 
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdEnableTraceHubDebugMsg
> 
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdTraceHubDebugMmioAddress
> 
> diff --git
> a/MdeModulePkg/Library/TraceHubDebugSysTLib/DxeSmmTraceHubDebugSys
> TLib.c
> b/MdeModulePkg/Library/TraceHubDebugSysTLib/DxeSmmTraceHubDebugSys
> TLib.c
> new file mode 100644
> index 0000000000..35c239b5fe
> --- /dev/null
> +++
> b/MdeModulePkg/Library/TraceHubDebugSysTLib/DxeSmmTraceHubDebugSys
> TLib.c
> @@ -0,0 +1,263 @@
> +/** @file
> 
> +System prints Trace Hub message in DXE/SMM based on fixed PCDs and HOB.
> 
> +Trace Hub PCDs will be applied if no HOB exist.
> 
> +
> 
> +Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>
> 
> +
> 
> +SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> +
> 
> +**/
> 
> +
> 
> +#include <Base.h>
> 
> +#include <Library/BaseLib.h>
> 
> +#include <Library/PcdLib.h>
> 
> +#include <Library/HobLib.h>
> 
> +#include <Library/BaseMemoryLib.h>
> 
> +#include <Library/MemoryAllocationLib.h>
> 
> +#include <Library/TraceHubDebugSysTLib.h>
> 
> +#include <Library/MipiSysTLib.h>
> 
> +#include <Library/MipiSysTLib/mipi_syst.h>
> 
> +#include <Guid/TraceHubDebugInfoHob.h>
> 
> +#include "InternalTraceHubApiCommon.h"
> 
> +#include "InternalTraceHubApi.h"
> 
> +
> 
> +GLOBAL_REMOVE_IF_UNREFERENCED TRACEHUB_DEBUG_INFO_HOB
> *mThDebugInstArray = NULL;
> 
> +GLOBAL_REMOVE_IF_UNREFERENCED UINT32                   mDbgInstCount      =
> 0;
> 
> +
> 
> +/**
> 
> +  Write debug string to specified Trace Hub MMIO address.
> 
> +
> 
> +  @param[in]  SeverityType     Severity type of input message.
> 
> +  @param[in]  Buffer           A pointer to the data buffer.
> 
> +  @param[in]  NumberOfBytes    The size of data buffer.
> 
> +
> 
> +  @retval RETURN_SUCCESS      Data was written to Trace Hub.
> 
> +  @retval Other               Failed to output Trace Hub message.
> 
> +**/
> 
> +RETURN_STATUS
> 
> +EFIAPI
> 
> +TraceHubSysTDebugWrite (
> 
> +  IN TRACE_HUB_SEVERITY_TYPE  SeverityType,
> 
> +  IN UINT8                    *Buffer,
> 
> +  IN UINTN                    NumberOfBytes
> 
> +  )
> 
> +{
> 
> +  MIPI_SYST_HANDLE  MipiSystHandle;
> 
> +  MIPI_SYST_HEADER  MipiSystHeader;
> 
> +  RETURN_STATUS     Status;
> 
> +  UINT16            Index;
> 
> +
> 
> +  if ((mDbgInstCount == 0) || (mThDebugInstArray == NULL)) {
> 
> +    return RETURN_ABORTED;
> 
> +  }
> 
> +
> 
> +  if (NumberOfBytes == 0) {
> 
> +    //
> 
> +    // No data need to be written to Trace Hub
> 
> +    //
> 
> +    return RETURN_SUCCESS;
> 
> +  }
> 
> +
> 
> +  if (Buffer == NULL) {
> 
> +    return RETURN_INVALID_PARAMETER;
> 
> +  }
> 
> +
> 
> +  ZeroMem (&MipiSystHandle, sizeof (MIPI_SYST_HANDLE));
> 
> +  MipiSystHandle.systh_header = &MipiSystHeader;
> 
> +
> 
> +  Status = InitMipiSystHandle (&MipiSystHandle);
> 
> +  if (RETURN_ERROR (Status)) {
> 
> +    return Status;
> 
> +  }
> 
> +
> 
> +  for (Index = 0; Index < mDbgInstCount; Index++) {
> 
> +    Status = CheckWhetherToOutputMsg (
> 
> +               &MipiSystHandle,
> 
> +               (UINT8 *)&mThDebugInstArray[Index],
> 
> +               SeverityType,
> 
> +               TraceHubDebugType
> 
> +               );
> 
> +    if (!RETURN_ERROR (Status)) {
> 
> +      Status = MipiSystWriteDebug (
> 
> +                 &MipiSystHandle,
> 
> +                 SeverityType,
> 
> +                 (UINT16)NumberOfBytes,
> 
> +                 (CHAR8 *)Buffer
> 
> +                 );
> 
> +      if (RETURN_ERROR (Status)) {
> 
> +        break;
> 
> +      }
> 
> +    }
> 
> +  }
> 
> +
> 
> +  return Status;
> 
> +}
> 
> +
> 
> +/**
> 
> +  Write catalog status code message to specified Trace Hub MMIO address.
> 
> +
> 
> +  @param[in]  SeverityType     Severity type of input message.
> 
> +  @param[in]  Id               Catalog ID.
> 
> +  @param[in]  Guid             Driver Guid.
> 
> +
> 
> +  @retval RETURN_SUCCESS      Data was written to Trace Hub.
> 
> +  @retval Other               Failed to output Trace Hub message.
> 
> +**/
> 
> +RETURN_STATUS
> 
> +EFIAPI
> 
> +TraceHubSysTWriteCataLog64StatusCode (
> 
> +  IN TRACE_HUB_SEVERITY_TYPE  SeverityType,
> 
> +  IN UINT64                   Id,
> 
> +  IN GUID                     *Guid
> 
> +  )
> 
> +{
> 
> +  MIPI_SYST_HANDLE  MipiSystHandle;
> 
> +  MIPI_SYST_HEADER  MipiSystHeader;
> 
> +  UINTN             Index;
> 
> +  RETURN_STATUS     Status;
> 
> +
> 
> +  if ((mDbgInstCount == 0) || (mThDebugInstArray == NULL)) {
> 
> +    return RETURN_ABORTED;
> 
> +  }
> 
> +
> 
> +  ZeroMem (&MipiSystHandle, sizeof (MIPI_SYST_HANDLE));
> 
> +  MipiSystHandle.systh_header = &MipiSystHeader;
> 
> +
> 
> +  Status = InitMipiSystHandle (&MipiSystHandle);
> 
> +  if (RETURN_ERROR (Status)) {
> 
> +    return Status;
> 
> +  }
> 
> +
> 
> +  if (Guid != NULL) {
> 
> +    SwapBytesGuid (Guid, (GUID *)(VOID *)&MipiSystHandle.systh_guid);
> 
> +    MipiSystHandle.systh_tag.et_guid = 1;
> 
> +  } else {
> 
> +    MipiSystHandle.systh_tag.et_modunit = 2;
> 
> +    MipiSystHandle.systh_tag.et_guid    = 0;
> 
> +  }
> 
> +
> 
> +  for (Index = 0; Index < mDbgInstCount; Index++) {
> 
> +    Status = CheckWhetherToOutputMsg (
> 
> +               &MipiSystHandle,
> 
> +               (UINT8 *)&mThDebugInstArray[Index],
> 
> +               SeverityType,
> 
> +               TraceHubCatalogType
> 
> +               );
> 
> +    if (!RETURN_ERROR (Status)) {
> 
> +      Status = MipiSystWriteCatalog (
> 
> +                 &MipiSystHandle,
> 
> +                 SeverityType,
> 
> +                 Id
> 
> +                 );
> 
> +      if (RETURN_ERROR (Status)) {
> 
> +        break;
> 
> +      }
> 
> +    }
> 
> +  }
> 
> +
> 
> +  return Status;
> 
> +}
> 
> +
> 
> +/**
> 
> +  Write catalog message to specified Trace Hub MMIO address.
> 
> +
> 
> +  @param[in]  SeverityType   Severity type of input message.
> 
> +  @param[in]  Id             Catalog ID.
> 
> +  @param[in]  NumberOfParams Number of entries in argument list.
> 
> +  @param[in]  ...            Catalog message parameters.
> 
> +
> 
> +  @retval RETURN_SUCCESS      Data was written to Trace Hub.
> 
> +  @retval Other               Failed to output Trace Hub message.
> 
> +**/
> 
> +RETURN_STATUS
> 
> +EFIAPI
> 
> +TraceHubSysTWriteCataLog64 (
> 
> +  IN TRACE_HUB_SEVERITY_TYPE  SeverityType,
> 
> +  IN UINT64                   Id,
> 
> +  IN UINTN                    NumberOfParams,
> 
> +  ...
> 
> +  )
> 
> +{
> 
> +  MIPI_SYST_HANDLE  MipiSystHandle;
> 
> +  MIPI_SYST_HEADER  MipiSystHeader;
> 
> +  VA_LIST           Args;
> 
> +  UINTN             Index;
> 
> +  RETURN_STATUS     Status;
> 
> +
> 
> +  if (NumberOfParams > sizeof (MipiSystHandle.systh_param) / sizeof
> (UINT32)) {
> 
> +    return RETURN_INVALID_PARAMETER;
> 
> +  }
> 
> +
> 
> +  if ((mDbgInstCount == 0) || (mThDebugInstArray == NULL)) {
> 
> +    return RETURN_ABORTED;
> 
> +  }
> 
> +
> 
> +  ZeroMem (&MipiSystHandle, sizeof (MIPI_SYST_HANDLE));
> 
> +  MipiSystHandle.systh_header = &MipiSystHeader;
> 
> +
> 
> +  Status = InitMipiSystHandle (&MipiSystHandle);
> 
> +  if (RETURN_ERROR (Status)) {
> 
> +    return Status;
> 
> +  }
> 
> +
> 
> +  MipiSystHandle.systh_param_count = (UINT32)NumberOfParams;
> 
> +  VA_START (Args, NumberOfParams);
> 
> +  for (Index = 0; Index < NumberOfParams; Index++) {
> 
> +    MipiSystHandle.systh_param[Index] = VA_ARG (Args, UINT32);
> 
> +  }
> 
> +
> 
> +  VA_END (Args);
> 
> +
> 
> +  for (Index = 0; Index < mDbgInstCount; Index++) {
> 
> +    Status = CheckWhetherToOutputMsg (
> 
> +               &MipiSystHandle,
> 
> +               (UINT8 *)&mThDebugInstArray[Index],
> 
> +               SeverityType,
> 
> +               TraceHubCatalogType
> 
> +               );
> 
> +    if (!RETURN_ERROR (Status)) {
> 
> +      Status = MipiSystWriteCatalog (
> 
> +                 &MipiSystHandle,
> 
> +                 SeverityType,
> 
> +                 Id
> 
> +                 );
> 
> +      if (RETURN_ERROR (Status)) {
> 
> +        break;
> 
> +      }
> 
> +    }
> 
> +  }
> 
> +
> 
> +  return Status;
> 
> +}
> 
> +
> 
> +/**
> 
> +  Constructor to get TraceHob configuration data
> 
> +
> 
> +  @param  ImageHandle   The firmware allocated handle for the EFI image.
> 
> +  @param  SystemTable   A pointer to the EFI System Table.
> 
> +
> 
> +  @retval RETURN_SUCCESS           The constructor always returns
> EFI_SUCCESS.
> 
> +  @retval RETURN_OUT_OF_RESOURCES  There are not enough resources
> available to retrieve the matching FFS section.
> 
> +
> 
> +**/
> 
> +RETURN_STATUS
> 
> +EFIAPI
> 
> +DxeSmmTraceHubDebugSysTLibConstructor (
> 
> +  IN EFI_HANDLE        ImageHandle,
> 
> +  IN EFI_SYSTEM_TABLE  *SystemTable
> 
> +  )
> 
> +{
> 
> +  if (mDbgInstCount == 0) {
> 
> +    mDbgInstCount = CountThDebugInstance ();
> 
> +  }
> 
> +
> 
> +  mThDebugInstArray = AllocateZeroPool (mDbgInstCount * sizeof
> (TRACEHUB_DEBUG_INFO_HOB));
> 
> +
> 
> +  if (mThDebugInstArray != NULL) {
> 
> +    PackThDebugInstance (mThDebugInstArray, mDbgInstCount);
> 
> +  } else {
> 
> +    return RETURN_OUT_OF_RESOURCES;
> 
> +  }
> 
> +
> 
> +  return RETURN_SUCCESS;
> 
> +}
> 
> diff --git
> a/MdeModulePkg/Library/TraceHubDebugSysTLib/DxeSmmTraceHubDebugSys
> TLib.inf
> b/MdeModulePkg/Library/TraceHubDebugSysTLib/DxeSmmTraceHubDebugSys
> TLib.inf
> new file mode 100644
> index 0000000000..90213beee1
> --- /dev/null
> +++
> b/MdeModulePkg/Library/TraceHubDebugSysTLib/DxeSmmTraceHubDebugSys
> TLib.inf
> @@ -0,0 +1,51 @@
> +## @file
> 
> +#  Debug library to output Trace Hub message.
> 
> +#  Support DXE/SMM phase TraceHub debug message based on fixed or
> dynamic settings.
> 
> +#
> 
> +#  Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>
> 
> +#
> 
> +#  SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> +#
> 
> +##
> 
> +
> 
> +[Defines]
> 
> +  INF_VERSION                    = 0x00010005
> 
> +  BASE_NAME                      = DxeSmmTraceHubDebugSysTLib
> 
> +  FILE_GUID                      = A9B7B825-7902-4616-8556-085DA4DFEC72
> 
> +  MODULE_TYPE                    = DXE_DRIVER
> 
> +  VERSION_STRING                 = 1.0
> 
> +  LIBRARY_CLASS                  = TraceHubDebugSysTLib|DXE_CORE DXE_DRIVER
> SMM_CORE DXE_SMM_DRIVER UEFI_DRIVER UEFI_APPLICATION
> 
> +  CONSTRUCTOR                    = DxeSmmTraceHubDebugSysTLibConstructor
> 
> +
> 
> +#
> 
> +# The following information is for reference only and not required by the
> build tools.
> 
> +#
> 
> +# VALID_ARCHITECTURES = IA32 X64
> 
> +#
> 
> +
> 
> +[LibraryClasses]
> 
> +  BaseLib
> 
> +  PcdLib
> 
> +  HobLib
> 
> +  BaseMemoryLib
> 
> +  MemoryAllocationLib
> 
> +  MipiSysTLib
> 
> +
> 
> +[Packages]
> 
> +  MdePkg/MdePkg.dec
> 
> +  MdeModulePkg/MdeModulePkg.dec
> 
> +
> 
> +[Sources]
> 
> +  DxeSmmTraceHubDebugSysTLib.c
> 
> +  InternalTraceHubApiCommon.c
> 
> +  InternalTraceHubApiCommon.h
> 
> +  InternalTraceHubApi.h
> 
> +  InternalTraceHubApi.c
> 
> +
> 
> +[Guids]
> 
> +  gTraceHubDebugInfoHobGuid
> 
> +
> 
> +[Pcd]
> 
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdTraceHubDebugLevel
> 
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdEnableTraceHubDebugMsg
> 
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdTraceHubDebugMmioAddress
> 
> diff --git
> a/MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApi.c
> b/MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApi.c
> new file mode 100644
> index 0000000000..fe946fe60c
> --- /dev/null
> +++ b/MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApi.c
> @@ -0,0 +1,74 @@
> +/** @file
> 
> +Functions implementation in this file are not common for all type of
> TraceHubDebugSysTLib.
> 
> +
> 
> +Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>
> 
> +
> 
> +SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> +
> 
> +**/
> 
> +
> 
> +#include <Base.h>
> 
> +#include <Guid/TraceHubDebugInfoHob.h>
> 
> +#include <Library/BaseMemoryLib.h>
> 
> +#include <Library/HobLib.h>
> 
> +#include "InternalTraceHubApi.h"
> 
> +
> 
> +/**
> 
> +  Count the total number of Trace Hub debug instance in the system.
> 
> +
> 
> +  @retval UINT32      The total number of Trace Hub debug instance in the
> system.
> 
> +**/
> 
> +UINT32
> 
> +EFIAPI
> 
> +CountThDebugInstance (
> 
> +  VOID
> 
> +  )
> 
> +{
> 
> +  UINT8   *DbgContext;
> 
> +  UINT32  DbgInstCount;
> 
> +
> 
> +  DbgInstCount = 0;
> 
> +
> 
> +  DbgContext = (UINT8 *)GetFirstGuidHob (&gTraceHubDebugInfoHobGuid);
> 
> +  if (DbgContext != NULL) {
> 
> +    while (DbgContext != NULL) {
> 
> +      DbgInstCount++;
> 
> +      DbgContext = (UINT8 *)GetNextGuidHob
> (&gTraceHubDebugInfoHobGuid, GET_NEXT_HOB (DbgContext));
> 
> +    }
> 
> +  } else {
> 
> +    DbgInstCount++;
> 
> +  }
> 
> +
> 
> +  return DbgInstCount;
> 
> +}
> 
> +
> 
> +/**
> 
> +  Pack Trace Hub debug instances in the system.
> 
> +
> 
> +  @param[in, out]  ThPtr     A pointer to TRACEHUB_DEBUG_INFO_HOB
> structure.
> 
> +  @param[in]       Count     Number of Trace Hub HOBs.
> 
> +**/
> 
> +VOID
> 
> +EFIAPI
> 
> +PackThDebugInstance (
> 
> +  IN OUT TRACEHUB_DEBUG_INFO_HOB  *ThPtr,
> 
> +  IN     UINT32                   Count
> 
> +  )
> 
> +{
> 
> +  UINT8   *DbgContext;
> 
> +  UINT16  Index;
> 
> +
> 
> +  DbgContext = GetFirstGuidHob (&gTraceHubDebugInfoHobGuid);
> 
> +  if (DbgContext != NULL) {
> 
> +    for (Index = 0; Index < Count; Index++) {
> 
> +      CopyMem (&ThPtr[Index], GET_GUID_HOB_DATA (DbgContext), sizeof
> (TRACEHUB_DEBUG_INFO_HOB));
> 
> +      DbgContext = GetNextGuidHob (&gTraceHubDebugInfoHobGuid,
> GET_NEXT_HOB (DbgContext));
> 
> +    }
> 
> +  } else {
> 
> +    for (Index = 0; Index < Count; Index++) {
> 
> +      ThPtr[Index].TraceHubMmioAddress = FixedPcdGet64
> (PcdTraceHubDebugMmioAddress);
> 
> +      ThPtr[Index].Flag                = FixedPcdGetBool
> (PcdEnableTraceHubDebugMsg);
> 
> +      ThPtr[Index].DebugLevel          = FixedPcdGet8 (PcdTraceHubDebugLevel);
> 
> +    }
> 
> +  }
> 
> +}
> 
> diff --git
> a/MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApi.h
> b/MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApi.h
> new file mode 100644
> index 0000000000..f624f73768
> --- /dev/null
> +++ b/MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApi.h
> @@ -0,0 +1,37 @@
> +/** @file
> 
> +This header file declares functions that are not for common use.
> 
> +
> 
> +Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>
> 
> +
> 
> +SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> +
> 
> +**/
> 
> +
> 
> +#ifndef INTERNAL_TRACE_HUB_API_H_
> 
> +#define INTERNAL_TRACE_HUB_API_H_
> 
> +
> 
> +/**
> 
> +  Count the total number of Trace Hub debug instance in the system.
> 
> +
> 
> +  @retval UINT32      The total number of Trace Hub debug instance in the
> system.
> 
> +**/
> 
> +UINT32
> 
> +EFIAPI
> 
> +CountThDebugInstance (
> 
> +  VOID
> 
> +  );
> 
> +
> 
> +/**
> 
> +  Pack Trace Hub debug instances in the system.
> 
> +
> 
> +  @param[in, out]  ThPtr     A pointer to TRACEHUB_DEBUG_INFO_HOB
> structure.
> 
> +  @param[in]       Count     Number of Trace Hub HOBs.
> 
> +**/
> 
> +VOID
> 
> +EFIAPI
> 
> +PackThDebugInstance (
> 
> +  IN OUT TRACEHUB_DEBUG_INFO_HOB  *ThPtr,
> 
> +  IN     UINT32                   Count
> 
> +  );
> 
> +
> 
> +#endif // INTERNAL_TRACE_HUB_API_H_
> 
> diff --git
> a/MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApiComm
> on.c
> b/MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApiComm
> on.c
> new file mode 100644
> index 0000000000..fe77f486f4
> --- /dev/null
> +++
> b/MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApiComm
> on.c
> @@ -0,0 +1,200 @@
> +/** @file
> 
> +Functions implementation defined in this file are common for all type of
> TraceHubDebugSysTLib
> 
> +
> 
> +Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>
> 
> +
> 
> +SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> +
> 
> +**/
> 
> +
> 
> +#include <Base.h>
> 
> +#include <Library/BaseLib.h>
> 
> +#include <Library/BaseMemoryLib.h>
> 
> +#include <Library/TraceHubDebugSysTLib.h>
> 
> +#include <Library/MipiSysTLib/mipi_syst.h>
> 
> +#include <Guid/TraceHubDebugInfoHob.h>
> 
> +#include "InternalTraceHubApiCommon.h"
> 
> +#include "InternalTraceHubApi.h"
> 
> +
> 
> +/**
> 
> +  Conditionally determine whether to enable Trace Hub message.
> 
> +
> 
> +  @param[in]  Flag            Flag to enable or disable Trace Hub message.
> 
> +  @param[in]  DbgLevel        Debug Level of Trace Hub.
> 
> +  @param[in]  SeverityType    Severity type of input message.
> 
> +
> 
> +  @retval TRUE            Enable trace hub message.
> 
> +  @retval FALSE           Disable trace hub message.
> 
> +**/
> 
> +BOOLEAN
> 
> +EFIAPI
> 
> +TraceHubDataEnabled (
> 
> +  IN BOOLEAN                  Flag,
> 
> +  IN UINT8                    DbgLevel,
> 
> +  IN TRACE_HUB_SEVERITY_TYPE  SeverityType
> 
> +  )
> 
> +{
> 
> +  if (Flag == TraceHubRoutingDisable) {
> 
> +    return FALSE;
> 
> +  }
> 
> +
> 
> +  if (DbgLevel == TraceHubDebugLevelError) {
> 
> +    if (((SeverityType == SeverityFatal) || (SeverityType == SeverityError))) {
> 
> +      return TRUE;
> 
> +    }
> 
> +  } else if (DbgLevel == TraceHubDebugLevelErrorWarning) {
> 
> +    if (((SeverityType == SeverityFatal) || (SeverityType == SeverityError) ||
> (SeverityType == SeverityWarning))) {
> 
> +      return TRUE;
> 
> +    }
> 
> +  } else if (DbgLevel == TraceHubDebugLevelErrorWarningInfo) {
> 
> +    if (((SeverityType == SeverityFatal) || (SeverityType == SeverityError) ||
> (SeverityType == SeverityWarning) || (SeverityType == SeverityNormal))) {
> 
> +      return TRUE;
> 
> +    }
> 
> +  } else if (DbgLevel == TraceHubDebugLevelErrorWarningInfoVerbose) {
> 
> +    return TRUE;
> 
> +  }
> 
> +
> 
> +  return FALSE;
> 
> +}
> 
> +
> 
> +/**
> 
> +  Convert GUID from LE to BE or BE to LE.
> 
> +
> 
> +  @param[in]  Guid           GUID that need to be converted.
> 
> +  @param[out] ConvertedGuid  GUID that is converted.
> 
> +**/
> 
> +VOID
> 
> +EFIAPI
> 
> +SwapBytesGuid (
> 
> +  IN  GUID  *Guid,
> 
> +  OUT GUID  *ConvertedGuid
> 
> +  )
> 
> +{
> 
> +  CopyGuid (ConvertedGuid, Guid);
> 
> +  ConvertedGuid->Data1 = SwapBytes32 (ConvertedGuid->Data1);
> 
> +  ConvertedGuid->Data2 = SwapBytes16 (ConvertedGuid->Data2);
> 
> +  ConvertedGuid->Data3 = SwapBytes16 (ConvertedGuid->Data3);
> 
> +}
> 
> +
> 
> +/**
> 
> +  Check whether to output Trace Hub message according to some conditions.
> 
> +  Trace Hub message will be disabled if TraceHubDataEnabled() return FALSE
> 
> +  or Trace Hub MMIO address is 0.
> 
> +
> 
> +  @param[in, out]  MipiSystHandle   A pointer to MIPI_SYST_HANDLE
> structure.
> 
> +  @param[in]       DbgContext       A pointer to Trace Hub debug instance.
> 
> +  @param[in]       SeverityType     Severity type of input message.
> 
> +  @param[in]       PrintType        Either catalog print or debug print.
> 
> +
> 
> +  @retval RETURN_SUCCESS      Current Trace Hub message need to be
> output.
> 
> +  @retval Other               Current Trace Hub message will be disabled.
> 
> +**/
> 
> +RETURN_STATUS
> 
> +EFIAPI
> 
> +CheckWhetherToOutputMsg (
> 
> +  IN OUT MIPI_SYST_HANDLE         *MipiSystHandle,
> 
> +  IN     UINT8                    *DbgContext,
> 
> +  IN     TRACE_HUB_SEVERITY_TYPE  SeverityType,
> 
> +  IN     TRACEHUB_PRINTTYPE       PrintType
> 
> +  )
> 
> +{
> 
> +  UINT8          DbgLevel;
> 
> +  BOOLEAN        Flag;
> 
> +  UINT64         Addr;
> 
> +  RETURN_STATUS  Status;
> 
> +
> 
> +  if (MipiSystHandle == NULL) {
> 
> +    return RETURN_INVALID_PARAMETER;
> 
> +  }
> 
> +
> 
> +  if (PrintType == TraceHubDebugType) {
> 
> +    Status = GetTraceHubMsgVisibility (DbgContext, &Flag, &DbgLevel);
> 
> +    if (RETURN_ERROR (Status)) {
> 
> +      return Status;
> 
> +    }
> 
> +
> 
> +    if (!TraceHubDataEnabled (Flag, DbgLevel, SeverityType)) {
> 
> +      return RETURN_ABORTED;
> 
> +    }
> 
> +  }
> 
> +
> 
> +  Status = GetTraceHubMmioAddress (DbgContext, &Addr);
> 
> +  if (RETURN_ERROR (Status)) {
> 
> +    return Status;
> 
> +  }
> 
> +
> 
> +  MipiSystHandle->systh_platform.TraceHubPlatformData.MmioAddr = Addr;
> 
> +  if (MipiSystHandle->systh_platform.TraceHubPlatformData.MmioAddr == 0)
> {
> 
> +    return RETURN_ABORTED;
> 
> +  }
> 
> +
> 
> +  return RETURN_SUCCESS;
> 
> +}
> 
> +
> 
> +/**
> 
> +  Get Trace Hub MMIO Address.
> 
> +
> 
> +  @param[in]      DbgContext        A pointer to Trace Hub debug instance.
> 
> +  @param[in, out] TraceAddress      Trace Hub MMIO Address.
> 
> +
> 
> +  @retval RETURN_SUCCESS      Operation is successfully.
> 
> +  @retval Other               Operation is failed.
> 
> +**/
> 
> +RETURN_STATUS
> 
> +EFIAPI
> 
> +GetTraceHubMmioAddress (
> 
> +  IN     UINT8   *DbgContext,
> 
> +  IN OUT UINT64  *TraceAddress
> 
> +  )
> 
> +{
> 
> +  TRACEHUB_DEBUG_INFO_HOB  *ThDbgContext;
> 
> +
> 
> +  if (TraceAddress == NULL) {
> 
> +    return RETURN_INVALID_PARAMETER;
> 
> +  }
> 
> +
> 
> +  if (DbgContext != NULL) {
> 
> +    ThDbgContext  = (TRACEHUB_DEBUG_INFO_HOB *)DbgContext;
> 
> +    *TraceAddress = ThDbgContext->TraceHubMmioAddress;
> 
> +  } else {
> 
> +    *TraceAddress = FixedPcdGet64 (PcdTraceHubDebugMmioAddress);
> 
> +  }
> 
> +
> 
> +  return RETURN_SUCCESS;
> 
> +}
> 
> +
> 
> +/**
> 
> +  Get visibility of Trace Hub Msg.
> 
> +
> 
> +  @param[in]      DbgContext      A pointer to Trace Hub debug instance.
> 
> +  @param[in, out] Flag            Flag to enable or disable Trace Hub message.
> 
> +  @param[in, out] DbgLevel        Debug Level of Trace Hub.
> 
> +
> 
> +  @retval RETURN_SUCCESS      Operation is successfully.
> 
> +  @retval Other               Operation is failed.
> 
> +**/
> 
> +RETURN_STATUS
> 
> +EFIAPI
> 
> +GetTraceHubMsgVisibility (
> 
> +  IN     UINT8    *DbgContext,
> 
> +  IN OUT BOOLEAN  *Flag,
> 
> +  IN OUT UINT8    *DbgLevel
> 
> +  )
> 
> +{
> 
> +  TRACEHUB_DEBUG_INFO_HOB  *ThDbgContext;
> 
> +
> 
> +  if ((Flag == NULL) || (DbgLevel == NULL)) {
> 
> +    return RETURN_INVALID_PARAMETER;
> 
> +  }
> 
> +
> 
> +  if (DbgContext != NULL) {
> 
> +    ThDbgContext = (TRACEHUB_DEBUG_INFO_HOB *)DbgContext;
> 
> +    *Flag        = ThDbgContext->Flag;
> 
> +    *DbgLevel    = ThDbgContext->DebugLevel;
> 
> +  } else {
> 
> +    *DbgLevel = FixedPcdGet8 (PcdTraceHubDebugLevel);
> 
> +    *Flag     = FixedPcdGetBool (PcdEnableTraceHubDebugMsg);
> 
> +  }
> 
> +
> 
> +  return RETURN_SUCCESS;
> 
> +}
> 
> diff --git
> a/MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApiComm
> on.h
> b/MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApiComm
> on.h
> new file mode 100644
> index 0000000000..b8be48a8bb
> --- /dev/null
> +++
> b/MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApiComm
> on.h
> @@ -0,0 +1,119 @@
> +/** @file
> 
> +This header file declares functions and type for common use.
> 
> +
> 
> +Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>
> 
> +
> 
> +SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> +
> 
> +**/
> 
> +
> 
> +#ifndef INTERNAL_TRACE_HUB_API_COMMON_H_
> 
> +#define INTERNAL_TRACE_HUB_API_COMMON_H_
> 
> +
> 
> +typedef enum {
> 
> +  TraceHubDebugType = 0,
> 
> +  TraceHubCatalogType
> 
> +} TRACEHUB_PRINTTYPE;
> 
> +
> 
> +typedef enum {
> 
> +  TraceHubRoutingDisable = 0,
> 
> +  TraceHubRoutingEnable,
> 
> +  TraceHubRoutingMax
> 
> +} TRACE_HUB_ROUTING;
> 
> +
> 
> +typedef enum {
> 
> +  TraceHubDebugLevelError = 0,
> 
> +  TraceHubDebugLevelErrorWarning,
> 
> +  TraceHubDebugLevelErrorWarningInfo,
> 
> +  TraceHubDebugLevelErrorWarningInfoVerbose,
> 
> +  TraceHubDebugLevelMax
> 
> +} TRACE_HUB_DEBUG_LEVEL;
> 
> +
> 
> +/**
> 
> +  Conditionally determine whether to enable Trace Hub message.
> 
> +
> 
> +  @param[in]  Flag            Flag to enable or disable Trace Hub message.
> 
> +  @param[in]  DbgLevel        Debug Level of Trace Hub.
> 
> +  @param[in]  SeverityType    Severity type of input message.
> 
> +
> 
> +  @retval TRUE            Enable trace hub message.
> 
> +  @retval FALSE           Disable trace hub message.
> 
> +**/
> 
> +BOOLEAN
> 
> +EFIAPI
> 
> +TraceHubDataEnabled (
> 
> +  IN BOOLEAN                  Flag,
> 
> +  IN UINT8                    DbgLevel,
> 
> +  IN TRACE_HUB_SEVERITY_TYPE  SeverityType
> 
> +  );
> 
> +
> 
> +/**
> 
> +  Convert GUID from LE to BE or BE to LE.
> 
> +
> 
> +  @param[in]  Guid           GUID that need to be converted.
> 
> +  @param[out] ConvertedGuid  GUID that is converted.
> 
> +**/
> 
> +VOID
> 
> +EFIAPI
> 
> +SwapBytesGuid (
> 
> +  IN  GUID  *Guid,
> 
> +  OUT GUID  *ConvertedGuid
> 
> +  );
> 
> +
> 
> +/**
> 
> +  Check whether to output Trace Hub message according to some conditions.
> 
> +  Trace Hub message will be disabled if TraceHubDataEnabled() return FALSE
> 
> +  or Trace Hub MMIO address is 0.
> 
> +
> 
> +  @param[in, out]  MipiSystHandle   A pointer to MIPI_SYST_HANDLE
> structure.
> 
> +  @param[in]       DbgContext       A pointer to Trace Hub debug instance.
> 
> +  @param[in]       SeverityType     Severity type of input message.
> 
> +  @param[in]       PrintType        Either catalog print or debug print.
> 
> +
> 
> +  @retval RETURN_SUCCESS      Current Trace Hub message need to be
> output.
> 
> +  @retval Other               Current Trace Hub message will be disabled.
> 
> +**/
> 
> +RETURN_STATUS
> 
> +EFIAPI
> 
> +CheckWhetherToOutputMsg (
> 
> +  IN OUT MIPI_SYST_HANDLE         *MipiSystHandle,
> 
> +  IN     UINT8                    *DbgContext,
> 
> +  IN     TRACE_HUB_SEVERITY_TYPE  SeverityType,
> 
> +  IN     TRACEHUB_PRINTTYPE       PrintType
> 
> +  );
> 
> +
> 
> +/**
> 
> +  Get Trace Hub MMIO Address.
> 
> +
> 
> +  @param[in]      DbgContext        A pointer to Trace Hub debug instance.
> 
> +  @param[in, out] TraceAddress      Trace Hub MMIO Address.
> 
> +
> 
> +  @retval RETURN_SUCCESS      Operation is successfully.
> 
> +  @retval Other               Operation is failed.
> 
> +**/
> 
> +RETURN_STATUS
> 
> +EFIAPI
> 
> +GetTraceHubMmioAddress (
> 
> +  IN     UINT8   *DbgContext,
> 
> +  IN OUT UINT64  *TraceAddress
> 
> +  );
> 
> +
> 
> +/**
> 
> +  Get visibility of Trace Hub Msg.
> 
> +
> 
> +  @param[in]      DbgContext      A pointer to Trace Hub debug instance.
> 
> +  @param[in, out] Flag            Flag to enable or disable Trace Hub message.
> 
> +  @param[in, out] DbgLevel        Debug Level of Trace Hub.
> 
> +
> 
> +  @retval RETURN_SUCCESS      Operation is successfully.
> 
> +  @retval Other               Operation is failed.
> 
> +**/
> 
> +RETURN_STATUS
> 
> +EFIAPI
> 
> +GetTraceHubMsgVisibility (
> 
> +  IN     UINT8    *DbgContext,
> 
> +  IN OUT BOOLEAN  *Flag,
> 
> +  IN OUT UINT8    *DbgLevel
> 
> +  );
> 
> +
> 
> +#endif // INTERNAL_TRACE_HUB_API_COMMON_H_
> 
> diff --git
> a/MdeModulePkg/Library/TraceHubDebugSysTLib/PeiTraceHubDebugSysTLib.c
> b/MdeModulePkg/Library/TraceHubDebugSysTLib/PeiTraceHubDebugSysTLib.c
> new file mode 100644
> index 0000000000..e68fb8b242
> --- /dev/null
> +++
> b/MdeModulePkg/Library/TraceHubDebugSysTLib/PeiTraceHubDebugSysTLib.c
> @@ -0,0 +1,282 @@
> +/** @file
> 
> +System prints Trace Hub message in PEI based on fixed PCDs and HOB.
> 
> +System applies Trace Hub HOB once it detect gTraceHubDebugInfoHobGuid
> HOB.
> 
> +Trace Hub PCDs will be applied if no HOB exist.
> 
> +
> 
> +Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>
> 
> +
> 
> +SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> +
> 
> +**/
> 
> +
> 
> +#include <Base.h>
> 
> +#include <Library/BaseLib.h>
> 
> +#include <Library/PcdLib.h>
> 
> +#include <Library/HobLib.h>
> 
> +#include <Library/BaseMemoryLib.h>
> 
> +#include <Library/MemoryAllocationLib.h>
> 
> +#include <Library/TraceHubDebugSysTLib.h>
> 
> +#include <Library/MipiSysTLib.h>
> 
> +#include <Library/MipiSysTLib/mipi_syst.h>
> 
> +#include <Guid/TraceHubDebugInfoHob.h>
> 
> +#include "InternalTraceHubApiCommon.h"
> 
> +#include "InternalTraceHubApi.h"
> 
> +
> 
> +/**
> 
> +  Write debug string to specified Trace Hub MMIO address.
> 
> +
> 
> +  @param[in]  SeverityType     Severity type of input message.
> 
> +  @param[in]  Buffer           A pointer to the data buffer.
> 
> +  @param[in]  NumberOfBytes    The size of data buffer.
> 
> +
> 
> +  @retval RETURN_SUCCESS      Data was written to Trace Hub.
> 
> +  @retval Other               Failed to output Trace Hub message.
> 
> +**/
> 
> +RETURN_STATUS
> 
> +EFIAPI
> 
> +TraceHubSysTDebugWrite (
> 
> +  IN TRACE_HUB_SEVERITY_TYPE  SeverityType,
> 
> +  IN UINT8                    *Buffer,
> 
> +  IN UINTN                    NumberOfBytes
> 
> +  )
> 
> +{
> 
> +  MIPI_SYST_HANDLE  MipiSystHandle;
> 
> +  MIPI_SYST_HEADER  MipiSystHeader;
> 
> +  RETURN_STATUS     Status;
> 
> +  UINT8             *DbgContext;
> 
> +  UINTN             Index;
> 
> +  UINT32            DbgInstCount;
> 
> +  UINT8             *ThDebugInfo;
> 
> +
> 
> +  if (NumberOfBytes == 0) {
> 
> +    //
> 
> +    // No data need to be written to Trace Hub
> 
> +    //
> 
> +    return RETURN_SUCCESS;
> 
> +  }
> 
> +
> 
> +  if (Buffer == NULL) {
> 
> +    return RETURN_INVALID_PARAMETER;
> 
> +  }
> 
> +
> 
> +  DbgInstCount = CountThDebugInstance ();
> 
> +
> 
> +  ZeroMem (&MipiSystHandle, sizeof (MIPI_SYST_HANDLE));
> 
> +  MipiSystHandle.systh_header = &MipiSystHeader;
> 
> +
> 
> +  Status = InitMipiSystHandle (&MipiSystHandle);
> 
> +  if (RETURN_ERROR (Status)) {
> 
> +    return Status;
> 
> +  }
> 
> +
> 
> +  DbgContext = (UINT8 *)GetFirstGuidHob (&gTraceHubDebugInfoHobGuid);
> 
> +  if (DbgContext != NULL) {
> 
> +    ThDebugInfo = GET_GUID_HOB_DATA (DbgContext);
> 
> +  } else {
> 
> +    ThDebugInfo = NULL;
> 
> +  }
> 
> +
> 
> +  for (Index = 0; Index < DbgInstCount; Index++) {
> 
> +    Status = CheckWhetherToOutputMsg (
> 
> +               &MipiSystHandle,
> 
> +               ThDebugInfo,
> 
> +               SeverityType,
> 
> +               TraceHubDebugType
> 
> +               );
> 
> +    if (!RETURN_ERROR (Status)) {
> 
> +      Status = MipiSystWriteDebug (
> 
> +                 &MipiSystHandle,
> 
> +                 SeverityType,
> 
> +                 (UINT16)NumberOfBytes,
> 
> +                 (CHAR8 *)Buffer
> 
> +                 );
> 
> +      if (RETURN_ERROR (Status)) {
> 
> +        break;
> 
> +      }
> 
> +    }
> 
> +
> 
> +    if (DbgContext != NULL) {
> 
> +      DbgContext = (UINT8 *)GetNextGuidHob
> (&gTraceHubDebugInfoHobGuid, GET_NEXT_HOB (DbgContext));
> 
> +      if (DbgContext == NULL) {
> 
> +        break;
> 
> +      }
> 
> +
> 
> +      ThDebugInfo = GET_GUID_HOB_DATA (DbgContext);
> 
> +    }
> 
> +  }
> 
> +
> 
> +  return Status;
> 
> +}
> 
> +
> 
> +/**
> 
> +  Write catalog status code message to specified Trace Hub MMIO address.
> 
> +
> 
> +  @param[in]  SeverityType     Severity type of input message.
> 
> +  @param[in]  Id               Catalog ID.
> 
> +  @param[in]  Guid             Driver Guid.
> 
> +
> 
> +  @retval RETURN_SUCCESS      Data was written to Trace Hub.
> 
> +  @retval Other               Failed to output Trace Hub message.
> 
> +**/
> 
> +RETURN_STATUS
> 
> +EFIAPI
> 
> +TraceHubSysTWriteCataLog64StatusCode (
> 
> +  IN TRACE_HUB_SEVERITY_TYPE  SeverityType,
> 
> +  IN UINT64                   Id,
> 
> +  IN GUID                     *Guid
> 
> +  )
> 
> +{
> 
> +  MIPI_SYST_HANDLE  MipiSystHandle;
> 
> +  MIPI_SYST_HEADER  MipiSystHeader;
> 
> +  UINT32            DbgInstCount;
> 
> +  UINT8             *DbgContext;
> 
> +  RETURN_STATUS     Status;
> 
> +  UINTN             Index;
> 
> +  UINT8             *ThDebugInfo;
> 
> +
> 
> +  DbgInstCount = CountThDebugInstance ();
> 
> +
> 
> +  ZeroMem (&MipiSystHandle, sizeof (MIPI_SYST_HANDLE));
> 
> +  MipiSystHandle.systh_header = &MipiSystHeader;
> 
> +
> 
> +  Status = InitMipiSystHandle (&MipiSystHandle);
> 
> +  if (RETURN_ERROR (Status)) {
> 
> +    return Status;
> 
> +  }
> 
> +
> 
> +  if (Guid != NULL) {
> 
> +    SwapBytesGuid (Guid, (GUID *)(VOID *)&MipiSystHandle.systh_guid);
> 
> +    MipiSystHandle.systh_tag.et_guid = 1;
> 
> +  } else {
> 
> +    MipiSystHandle.systh_tag.et_modunit = 2;
> 
> +    MipiSystHandle.systh_tag.et_guid    = 0;
> 
> +  }
> 
> +
> 
> +  DbgContext = (UINT8 *)GetFirstGuidHob (&gTraceHubDebugInfoHobGuid);
> 
> +  if (DbgContext != NULL) {
> 
> +    ThDebugInfo = GET_GUID_HOB_DATA (DbgContext);
> 
> +  } else {
> 
> +    ThDebugInfo = NULL;
> 
> +  }
> 
> +
> 
> +  for (Index = 0; Index < DbgInstCount; Index++) {
> 
> +    Status = CheckWhetherToOutputMsg (
> 
> +               &MipiSystHandle,
> 
> +               ThDebugInfo,
> 
> +               SeverityType,
> 
> +               TraceHubCatalogType
> 
> +               );
> 
> +    if (!RETURN_ERROR (Status)) {
> 
> +      Status = MipiSystWriteCatalog (
> 
> +                 &MipiSystHandle,
> 
> +                 SeverityType,
> 
> +                 Id
> 
> +                 );
> 
> +      if (RETURN_ERROR (Status)) {
> 
> +        break;
> 
> +      }
> 
> +    }
> 
> +
> 
> +    if (DbgContext != NULL) {
> 
> +      DbgContext = (UINT8 *)GetNextGuidHob
> (&gTraceHubDebugInfoHobGuid, GET_NEXT_HOB (DbgContext));
> 
> +      if (DbgContext == NULL) {
> 
> +        break;
> 
> +      }
> 
> +
> 
> +      ThDebugInfo = GET_GUID_HOB_DATA (DbgContext);
> 
> +    }
> 
> +  }
> 
> +
> 
> +  return Status;
> 
> +}
> 
> +
> 
> +/**
> 
> +  Write catalog message to specified Trace Hub MMIO address.
> 
> +
> 
> +  @param[in]  SeverityType   Severity type of input message.
> 
> +  @param[in]  Id             Catalog ID.
> 
> +  @param[in]  NumberOfParams Number of entries in argument list.
> 
> +  @param[in]  ...            Catalog message parameters.
> 
> +
> 
> +  @retval RETURN_SUCCESS      Data was written to Trace Hub.
> 
> +  @retval Other               Failed to output Trace Hub message.
> 
> +**/
> 
> +RETURN_STATUS
> 
> +EFIAPI
> 
> +TraceHubSysTWriteCataLog64 (
> 
> +  IN TRACE_HUB_SEVERITY_TYPE  SeverityType,
> 
> +  IN UINT64                   Id,
> 
> +  IN UINTN                    NumberOfParams,
> 
> +  ...
> 
> +  )
> 
> +{
> 
> +  MIPI_SYST_HANDLE  MipiSystHandle;
> 
> +  MIPI_SYST_HEADER  MipiSystHeader;
> 
> +  VA_LIST           Args;
> 
> +  UINTN             Index;
> 
> +  UINT32            DbgInstCount;
> 
> +  UINT8             *DbgContext;
> 
> +  RETURN_STATUS     Status;
> 
> +  UINT8             *ThDebugInfo;
> 
> +
> 
> +  DbgInstCount = 0;
> 
> +
> 
> +  if (NumberOfParams > sizeof (MipiSystHandle.systh_param) / sizeof
> (UINT32)) {
> 
> +    return RETURN_INVALID_PARAMETER;
> 
> +  }
> 
> +
> 
> +  DbgInstCount = CountThDebugInstance ();
> 
> +
> 
> +  ZeroMem (&MipiSystHandle, sizeof (MIPI_SYST_HANDLE));
> 
> +  MipiSystHandle.systh_header = &MipiSystHeader;
> 
> +
> 
> +  Status = InitMipiSystHandle (&MipiSystHandle);
> 
> +  if (RETURN_ERROR (Status)) {
> 
> +    return Status;
> 
> +  }
> 
> +
> 
> +  MipiSystHandle.systh_param_count = (UINT32)NumberOfParams;
> 
> +  VA_START (Args, NumberOfParams);
> 
> +  for (Index = 0; Index < NumberOfParams; Index++) {
> 
> +    MipiSystHandle.systh_param[Index] = VA_ARG (Args, UINT32);
> 
> +  }
> 
> +
> 
> +  VA_END (Args);
> 
> +
> 
> +  DbgContext = (UINT8 *)GetFirstGuidHob (&gTraceHubDebugInfoHobGuid);
> 
> +  if (DbgContext != NULL) {
> 
> +    ThDebugInfo = GET_GUID_HOB_DATA (DbgContext);
> 
> +  } else {
> 
> +    ThDebugInfo = NULL;
> 
> +  }
> 
> +
> 
> +  for (Index = 0; Index < DbgInstCount; Index++) {
> 
> +    Status = CheckWhetherToOutputMsg (
> 
> +               &MipiSystHandle,
> 
> +               ThDebugInfo,
> 
> +               SeverityType,
> 
> +               TraceHubCatalogType
> 
> +               );
> 
> +    if (!RETURN_ERROR (Status)) {
> 
> +      Status = MipiSystWriteCatalog (
> 
> +                 &MipiSystHandle,
> 
> +                 SeverityType,
> 
> +                 Id
> 
> +                 );
> 
> +      if (RETURN_ERROR (Status)) {
> 
> +        break;
> 
> +      }
> 
> +    }
> 
> +
> 
> +    if (DbgContext != NULL) {
> 
> +      DbgContext = (UINT8 *)GetNextGuidHob
> (&gTraceHubDebugInfoHobGuid, GET_NEXT_HOB (DbgContext));
> 
> +      if (DbgContext == NULL) {
> 
> +        break;
> 
> +      }
> 
> +
> 
> +      ThDebugInfo = GET_GUID_HOB_DATA (DbgContext);
> 
> +    }
> 
> +  }
> 
> +
> 
> +  return Status;
> 
> +}
> 
> diff --git
> a/MdeModulePkg/Library/TraceHubDebugSysTLib/PeiTraceHubDebugSysTLib.i
> nf
> b/MdeModulePkg/Library/TraceHubDebugSysTLib/PeiTraceHubDebugSysTLib.i
> nf
> new file mode 100644
> index 0000000000..2a8184d927
> --- /dev/null
> +++
> b/MdeModulePkg/Library/TraceHubDebugSysTLib/PeiTraceHubDebugSysTLib.i
> nf
> @@ -0,0 +1,50 @@
> +## @file
> 
> +#  Debug library to output Trace Hub message.
> 
> +#  Support PEI phase TraceHub debug message based on fixed or dynamic
> settings.
> 
> +#
> 
> +#  Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>
> 
> +#
> 
> +#  SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> +#
> 
> +##
> 
> +
> 
> +[Defines]
> 
> +  INF_VERSION                    = 0x00010005
> 
> +  BASE_NAME                      = PeiTraceHubDebugSysTLib
> 
> +  FILE_GUID                      = C61E8C2E-0935-4E3D-BCBB-5ED84AFD9FD1
> 
> +  MODULE_TYPE                    = PEIM
> 
> +  VERSION_STRING                 = 1.0
> 
> +  LIBRARY_CLASS                  = TraceHubDebugSysTLib|PEI_CORE PEIM
> 
> +
> 
> +#
> 
> +# The following information is for reference only and not required by the
> build tools.
> 
> +#
> 
> +# VALID_ARCHITECTURES = IA32 X64
> 
> +#
> 
> +
> 
> +[LibraryClasses]
> 
> +  BaseLib
> 
> +  PcdLib
> 
> +  HobLib
> 
> +  BaseMemoryLib
> 
> +  MemoryAllocationLib
> 
> +  MipiSysTLib
> 
> +
> 
> +[Packages]
> 
> +  MdePkg/MdePkg.dec
> 
> +  MdeModulePkg/MdeModulePkg.dec
> 
> +
> 
> +[Sources]
> 
> +  PeiTraceHubDebugSysTLib.c
> 
> +  InternalTraceHubApiCommon.c
> 
> +  InternalTraceHubApiCommon.h
> 
> +  InternalTraceHubApi.h
> 
> +  InternalTraceHubApi.c
> 
> +
> 
> +[Guids]
> 
> +  gTraceHubDebugInfoHobGuid
> 
> +
> 
> +[Pcd]
> 
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdTraceHubDebugLevel
> 
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdEnableTraceHubDebugMsg
> 
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdTraceHubDebugMmioAddress
> 
> diff --git a/MdeModulePkg/Library/TraceHubDebugSysTLib/Readme.md
> b/MdeModulePkg/Library/TraceHubDebugSysTLib/Readme.md
> new file mode 100644
> index 0000000000..9e798a41bf
> --- /dev/null
> +++ b/MdeModulePkg/Library/TraceHubDebugSysTLib/Readme.md
> @@ -0,0 +1,26 @@
> +## Introduction of TrcaceHubDebugSysTLib ##
> 
> +TrcaceHubDebugSysTLib library is a top level library for dumping Trace Hub
> messages.
> 
> +It provides Trace Hub related APIs to dump Trace Hub message via MIPI SYS-
> T submodule.
> 
> +User need to properly configure following Trace Hub related PCDs and HOB.
> 
> +  (See MdeModulePkg.dec to get detailed definition for PCDs below)
> 
> +  - PcdTraceHubDebugLevel
> 
> +  - PcdEnableTraceHubDebugMsg
> 
> +  - PcdTraceHubDebugMmioAddress
> 
> +  (See TraceHubDebugInfoHob.h to get detailed definition for HOB below)
> 
> +  - gTraceHubDebugInfoHobGuid
> 
> +
> 
> +## BaseTraceHubDebugSysTLib.inf ##
> 
> +System prints Trace Hub message in SEC/PEI/DXE/SMM based on fixed PCDs.
> 
> +Only support single Trace Hub debug instance.
> 
> +
> 
> +## PeiTraceHubDebugSysTLib.inf ##
> 
> +System prints Trace Hub message in PEI based on fixed PCDs and HOB.
> 
> +System applies Trace Hub HOB once it detect gTraceHubDebugInfoHobGuid
> HOB.
> 
> +Trace Hub PCDs will be applied if no HOB exist.
> 
> +
> 
> +## DxeSmmTraceHubDebugSysTLib.inf ##
> 
> +System prints Trace Hub message in DXE/SMM based on fixed PCDs and HOB.
> 
> +Trace Hub PCDs will be applied if no HOB exist.
> 
> +
> 
> +## Note ##
> 
> +Trace Hub debug library not support DXE_RUNTIME_DRIVER type of module
> currently.
> 
> diff --git a/MdeModulePkg/MdeModulePkg.dec
> b/MdeModulePkg/MdeModulePkg.dec
> index 9bb0d3ba2d..95dd077e19 100644
> --- a/MdeModulePkg/MdeModulePkg.dec
> +++ b/MdeModulePkg/MdeModulePkg.dec
> @@ -439,6 +439,9 @@
>    ## Include/UniversalPayload/SerialPortInfo.h
> 
>    gUniversalPayloadSerialPortInfoGuid = { 0xaa7e190d, 0xbe21, 0x4409, {
> 0x8e, 0x67, 0xa2, 0xcd, 0xf, 0x61, 0xe1, 0x70 } }
> 
> 
> 
> +  ## Include/Guid/TraceHubDebugInfoHob.h
> 
> +  gTraceHubDebugInfoHobGuid = { 0xf88c9c23, 0x646c, 0x4f6c, { 0x8e, 0x3d,
> 0x36, 0xa9, 0x43, 0xc1, 0x08, 0x35 } }
> 
> +
> 
>    ## GUID used for Boot Discovery Policy FormSet guid and related variables.
> 
>    gBootDiscoveryPolicyMgrFormsetGuid = { 0x5b6f7107, 0xbb3c, 0x4660, {
> 0x92, 0xcd, 0x54, 0x26, 0x90, 0x28, 0x0b, 0xbd } }
> 
> 
> 
> @@ -1095,6 +1098,24 @@
>    # @Prompt Enable UEFI Stack Guard.
> 
> 
> gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard|FALSE|BOOLEAN|0x30
> 001055
> 
> 
> 
> +  ## Indicate debug level of Trace Hub.
> 
> +  #   0x0 - TraceHubDebugLevelError.<BR>
> 
> +  #   0x1 - TraceHubDebugLevelErrorWarning.<BR>
> 
> +  #   0x2 - TraceHubDebugLevelErrorWarningInfo.<BR>
> 
> +  #   0x3 - TraceHubDebugLevelErrorWarningInfoVerbose.<BR>
> 
> +  # @Prompt Debug level of Trace Hub.
> 
> +
> gEfiMdeModulePkgTokenSpaceGuid.PcdTraceHubDebugLevel|0|UINT8|0x3000
> 1056
> 
> +
> 
> +  ## Flag to enable or disable Trace Hub message.
> 
> +  #   FALSE - Disable Trace Hub debug message.<BR>
> 
> +  #   TRUE  - Enable Trace Hub debug message.<BR>
> 
> +  # @Prompt Enable or Disable Trace Hub message.
> 
> +
> gEfiMdeModulePkgTokenSpaceGuid.PcdEnableTraceHubDebugMsg|0|BOOLEA
> N|0x30001057
> 
> +
> 
> +  ## Indicate MMIO address where Trace Hub message output to.
> 
> +  # @Prompt Output MMIO address of Trace Hub message.
> 
> +
> gEfiMdeModulePkgTokenSpaceGuid.PcdTraceHubDebugMmioAddress|0|UINT
> 64|0x30001058
> 
> +
> 
>  [PcdsFixedAtBuild, PcdsPatchableInModule]
> 
>    ## Dynamic type PCD can be registered callback function for Pcd setting
> action.
> 
>    #  PcdMaxPeiPcdCallBackNumberPerPcdEntry indicates the maximum
> number of callback function
> 
> diff --git a/MdeModulePkg/MdeModulePkg.dsc
> b/MdeModulePkg/MdeModulePkg.dsc
> index 1014598f31..5b1f50e9c0 100644
> --- a/MdeModulePkg/MdeModulePkg.dsc
> +++ b/MdeModulePkg/MdeModulePkg.dsc
> @@ -515,6 +515,9 @@
>    MdeModulePkg/Universal/RegularExpressionDxe/RegularExpressionDxe.inf
> 
> 
> MdeModulePkg/Universal/SmmCommunicationBufferDxe/SmmCommunicatio
> nBufferDxe.inf
> 
>    MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskDxe.inf
> 
> +
> MdeModulePkg/Library/TraceHubDebugSysTLib/BaseTraceHubDebugSysTLib.i
> nf
> 
> +
> MdeModulePkg/Library/TraceHubDebugSysTLib/PeiTraceHubDebugSysTLib.inf
> 
> +
> MdeModulePkg/Library/TraceHubDebugSysTLib/DxeSmmTraceHubDebugSysTL
> ib.inf
> 
> 
> 
>  [Components.X64]
> 
>    MdeModulePkg/Universal/CapsulePei/CapsuleX64.inf
> 
> diff --git a/MdeModulePkg/MdeModulePkg.uni
> b/MdeModulePkg/MdeModulePkg.uni
> index 33ce9f6198..a17d34d60b 100644
> --- a/MdeModulePkg/MdeModulePkg.uni
> +++ b/MdeModulePkg/MdeModulePkg.uni
> @@ -1290,6 +1290,24 @@
>                                                                                      "   TRUE  - UEFI Stack Guard
> will be enabled.<BR>\n"
> 
>                                                                                      "   FALSE - UEFI Stack Guard
> will be disabled.<BR>"
> 
> 
> 
> +#string
> STR_gEfiMdeModulePkgTokenSpaceGuid_PcdTraceHubDebugLevel_PROMPT
> #language en-US "Debug level of Trace Hub."
> 
> +
> 
> +#string
> STR_gEfiMdeModulePkgTokenSpaceGuid_PcdTraceHubDebugLevel_HELP
> #language en-US "Indicate debug level of Trace Hub"
> 
> +                                                                                         "  0x0 -
> TraceHubDebugLevelError.<BR>"
> 
> +                                                                                         "  0x1 -
> TraceHubDebugLevelErrorWarning.<BR>"
> 
> +                                                                                         "  0x2 -
> TraceHubDebugLevelErrorWarningInfo.<BR>"
> 
> +                                                                                         "  0x3 -
> TraceHubDebugLevelErrorWarningInfoVerbose.<BR>"
> 
> +
> 
> +#string
> STR_gEfiMdeModulePkgTokenSpaceGuid_PcdEnableTraceHubDebugMsg_PRO
> MPT  #language en-US "Flag to enable or disable Trace Hub message"
> 
> +
> 
> +#string
> STR_gEfiMdeModulePkgTokenSpaceGuid_PcdEnableTraceHubDebugMsg_HELP
> #language en-US "Enable or Disable Trace Hub message"
> 
> +                                                                                             "  FALSE - Disable
> Trace Hub debug message.<BR>"
> 
> +                                                                                             "  TRUE  - Enable
> Trace Hub debug message.<BR>"
> 
> +
> 
> +#string
> STR_gEfiMdeModulePkgTokenSpaceGuid_PcdTraceHubDebugMmioAddress_P
> ROMPT  #language en-US "Output MMIO address of Trace Hub message"
> 
> +
> 
> +#string
> STR_gEfiMdeModulePkgTokenSpaceGuid_PcdTraceHubDebugMmioAddress_H
> ELP    #language en-US "Indicate MMIO address where Trace Hub message
> output to."
> 
> +
> 
>  #string
> STR_gEfiMdeModulePkgTokenSpaceGuid_PcdSetNvStoreDefaultId_PROMPT
> #language en-US "NV Storage DefaultId"
> 
> 
> 
>  #string
> STR_gEfiMdeModulePkgTokenSpaceGuid_PcdSetNvStoreDefaultId_HELP
> #language en-US "This dynamic PCD enables the default variable setting.\n"
> 
> --
> 2.39.2.windows.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#104617): https://edk2.groups.io/g/devel/message/104617
Mute This Topic: https://groups.io/mt/98815651/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/leave/3901457/1787277/102458076/xyzzy [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-