--- /dev/null
+/** @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
--- /dev/null
+/** @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
--- /dev/null
+## @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
--- /dev/null
+/** @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
--- /dev/null
+## @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
--- /dev/null
+/** @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
--- /dev/null
+/** @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
--- /dev/null
+/** @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
--- /dev/null
+/** @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
--- /dev/null
+/** @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
--- /dev/null
+## @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
--- /dev/null
+## 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
## 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
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
" 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