]> xenbits.xensource.com Git - ovmf.git/commitdiff
MdeModulePkg: Add TraceHubDebugSysTLib library
authorGua Guo <gua.guo@intel.com>
Wed, 10 May 2023 02:15:35 +0000 (10:15 +0800)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Thu, 11 May 2023 07:26:38 +0000 (07:26 +0000)
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>
Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
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>
Acked-by: Liming Gao <gaoliming@byosoft.com.cn>
15 files changed:
MdeModulePkg/Include/Guid/TraceHubDebugInfoHob.h [new file with mode: 0644]
MdeModulePkg/Library/TraceHubDebugSysTLib/BaseTraceHubDebugSysTLib.c [new file with mode: 0644]
MdeModulePkg/Library/TraceHubDebugSysTLib/BaseTraceHubDebugSysTLib.inf [new file with mode: 0644]
MdeModulePkg/Library/TraceHubDebugSysTLib/DxeSmmTraceHubDebugSysTLib.c [new file with mode: 0644]
MdeModulePkg/Library/TraceHubDebugSysTLib/DxeSmmTraceHubDebugSysTLib.inf [new file with mode: 0644]
MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApi.c [new file with mode: 0644]
MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApi.h [new file with mode: 0644]
MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApiCommon.c [new file with mode: 0644]
MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApiCommon.h [new file with mode: 0644]
MdeModulePkg/Library/TraceHubDebugSysTLib/PeiTraceHubDebugSysTLib.c [new file with mode: 0644]
MdeModulePkg/Library/TraceHubDebugSysTLib/PeiTraceHubDebugSysTLib.inf [new file with mode: 0644]
MdeModulePkg/Library/TraceHubDebugSysTLib/Readme.md [new file with mode: 0644]
MdeModulePkg/MdeModulePkg.dec
MdeModulePkg/MdeModulePkg.dsc
MdeModulePkg/MdeModulePkg.uni

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