From: VictorX Hsu <victorx....@intel.com> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=4144
This Library provides API to dump Trace Hub message. Cc: Michael D Kinney <michael.d.kin...@intel.com> Cc: Guo Gua <gua....@intel.com> Cc: Chan Laura <laura.c...@intel.com> Cc: Prakashan Krishnadas Veliyathuparambil <krishnadas.veliyathuparambil.prakas...@intel.com> Cc: K N Karthik <karthik....@intel.com> Signed-off-by: VictorX Hsu <victorx....@intel.com> --- .../Include/Guid/TraceHubDebugInfoHob.h | 25 ++ .../BaseTraceHubDebugSysTLib.c | 251 +++++++++++++++ .../BaseTraceHubDebugSysTLib.inf | 44 +++ .../DxeSmmTraceHubDebugSysTLib.c | 247 +++++++++++++++ .../DxeSmmTraceHubDebugSysTLib.inf | 50 +++ .../InternalTraceHubApi.c | 82 +++++ .../InternalTraceHubApi.h | 46 +++ .../InternalTraceHubApiCommon.c | 208 +++++++++++++ .../InternalTraceHubApiCommon.h | 119 +++++++ .../PeiTraceHubDebugSysTLib.c | 290 ++++++++++++++++++ .../PeiTraceHubDebugSysTLib.inf | 50 +++ .../Library/TraceHubDebugSysTLib/Readme.md | 30 ++ MdeModulePkg/MdeModulePkg.dec | 21 ++ MdeModulePkg/MdeModulePkg.dsc | 3 + MdeModulePkg/MdeModulePkg.uni | 18 ++ MdePkg/Include/Library/TraceHubDebugSysTLib.h | 81 +++++ MdePkg/MdePkg.dec | 4 + 17 files changed, 1569 insertions(+) create mode 100644 MdeModulePkg/Include/Guid/TraceHubDebugInfoHob.h create mode 100644 MdeModulePkg/Library/TraceHubDebugSysTLib/BaseTraceHubDebugSysTLib.c create mode 100644 MdeModulePkg/Library/TraceHubDebugSysTLib/BaseTraceHubDebugSysTLib.inf create mode 100644 MdeModulePkg/Library/TraceHubDebugSysTLib/DxeSmmTraceHubDebugSysTLib.c create mode 100644 MdeModulePkg/Library/TraceHubDebugSysTLib/DxeSmmTraceHubDebugSysTLib.inf create mode 100644 MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApi.c create mode 100644 MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApi.h create mode 100644 MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApiCommon.c create mode 100644 MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApiCommon.h create mode 100644 MdeModulePkg/Library/TraceHubDebugSysTLib/PeiTraceHubDebugSysTLib.c create mode 100644 MdeModulePkg/Library/TraceHubDebugSysTLib/PeiTraceHubDebugSysTLib.inf create mode 100644 MdeModulePkg/Library/TraceHubDebugSysTLib/Readme.md create mode 100644 MdePkg/Include/Library/TraceHubDebugSysTLib.h diff --git a/MdeModulePkg/Include/Guid/TraceHubDebugInfoHob.h b/MdeModulePkg/Include/Guid/TraceHubDebugInfoHob.h new file mode 100644 index 0000000000..3a8fcc3d21 --- /dev/null +++ b/MdeModulePkg/Include/Guid/TraceHubDebugInfoHob.h @@ -0,0 +1,25 @@ +/** @file +This header file declares Trace Hub related structure. + +Copyright (c) 2023, Intel Corporation. All rights reserved.<BR> + +SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef TRACE_HUB_DEBUG_INFO_HOB_H_ +#define TRACE_HUB_DEBUG_INFO_HOB_H_ + +#define TRACEHUB_DEBUG_INFO_HOB_REVISION 1 +#define MAX_TRACE_HUB_DEBUG_INSTANCE 5 + +typedef struct { + UINT16 Revision; // Structure revision + BOOLEAN Flag; // Flag to enable or disable Trace Hub debug message. + UINT8 DebugLevel; // Debug level for Trace Hub. + UINT8 Rvsd[4]; // Reserved for future use + UINT64 TraceHubMmioAddress; // MMIO address where Trace Hub debug message output to. +} TRACEHUB_DEBUG_INFO_HOB; + +extern GUID gTraceHubDebugInfoHobGuid; + +#endif // TRACE_HUB_DEBUG_INFO_HOB_H_ diff --git a/MdeModulePkg/Library/TraceHubDebugSysTLib/BaseTraceHubDebugSysTLib.c b/MdeModulePkg/Library/TraceHubDebugSysTLib/BaseTraceHubDebugSysTLib.c new file mode 100644 index 0000000000..fbf1cc2a9e --- /dev/null +++ b/MdeModulePkg/Library/TraceHubDebugSysTLib/BaseTraceHubDebugSysTLib.c @@ -0,0 +1,251 @@ +/** @file +System prints Trace Hub message in SEC/PEI/DXE/SMM based on fixed PCDs. +Only support single Trace Hub debug instance. + +Copyright (c) 2023, Intel Corporation. All rights reserved.<BR> + +SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Base.h> +#include <Library/BaseLib.h> +#include <Library/PcdLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/TraceHubDebugSysTLib.h> +#include <Library/MipiSysTLib.h> +#include <Library/MipiSysTLib/mipi_syst.h> +#include <Guid/TraceHubDebugInfoHob.h> +#include "InternalTraceHubApiCommon.h" +#include "InternalTraceHubApi.h" + +/** + Write debug string to specified Trace Hub MMIO address. + + @param[in] SeverityType Severity type of input message. + @param[in] Buffer A pointer to the data buffer. + @param[in] NumberOfBytes The size of data buffer. + + @retval RETURN_SUCCESS Data was written to Trace Hub. + @retval Other Failed to output Trace Hub message. +**/ +RETURN_STATUS +EFIAPI +TraceHubSysTDebugWrite ( + IN TRACE_HUB_SEVERITY_TYPE SeverityType, + IN UINT8 *Buffer, + IN UINTN NumberOfBytes + ) +{ + MIPI_SYST_HANDLE MipiSystHandle; + MIPI_SYST_HEADER MipiSystHeader; + RETURN_STATUS Status; + UINT32 DbgInstCount; + UINT16 Index; + + DbgInstCount = 0; + + if (NumberOfBytes == 0) { + // + // No data need to be written to Trace Hub + // + return RETURN_ABORTED; + } + + if (Buffer == NULL) { + return RETURN_INVALID_PARAMETER; + } + + DbgInstCount = CountThDebugInstance (); + + ZeroMem (&MipiSystHandle, sizeof (MIPI_SYST_HANDLE)); + MipiSystHandle.systh_header = &MipiSystHeader; + + Status = InitMipiSystHandle (&MipiSystHandle); + if (RETURN_ERROR (Status)) { + return Status; + } + + for (Index = 0; Index < DbgInstCount; Index++) { + Status = CheckWhetherToOutputMsg ( + &MipiSystHandle, + NULL, + (MIPI_SYST_SEVERITY)SeverityType, + TraceHubDebugType + ); + if (!RETURN_ERROR (Status)) { + Status = MipiSystWriteDebug ( + &MipiSystHandle, + (MIPI_SYST_SEVERITY)SeverityType, + (UINT16)NumberOfBytes, + (CHAR8 *)Buffer + ); + if (RETURN_ERROR (Status)) { + break; + } + } + } + + return Status; +} + +/** + Write catalog status code message to specified Trace Hub MMIO address. + + @param[in] SeverityType Severity type of input message. + @param[in] Id Catalog ID. + @param[in] Guid Driver Guid. + + @retval RETURN_SUCCESS Data was written to Trace Hub. + @retval Other Failed to output Trace Hub message. +**/ +RETURN_STATUS +EFIAPI +TraceHubSysTWriteCataLog64StatusCode ( + IN TRACE_HUB_SEVERITY_TYPE SeverityType, + IN UINT64 Id, + IN GUID *Guid + ) +{ + MIPI_SYST_HANDLE MipiSystHandle; + MIPI_SYST_HEADER MipiSystHeader; + RETURN_STATUS Status; + UINT32 DbgInstCount; + UINT16 Index; + GUID ConvertedGuid; + + DbgInstCount = 0; + + if (Guid == NULL) { + return RETURN_INVALID_PARAMETER; + } + + DbgInstCount = CountThDebugInstance (); + + MipiSystHandle.systh_header = &MipiSystHeader; + + ZeroMem (&MipiSystHandle, sizeof (MIPI_SYST_HANDLE)); + Status = InitMipiSystHandle (&MipiSystHandle); + if (RETURN_ERROR (Status)) { + return Status; + } + + ConvertedGuid = SwapBytesGuid (Guid); + CopyMem (&MipiSystHandle.systh_guid, &ConvertedGuid, sizeof (GUID)); + MipiSystHandle.systh_tag.et_guid = 1; + + for (Index = 0; Index < DbgInstCount; Index++) { + Status = CheckWhetherToOutputMsg ( + &MipiSystHandle, + NULL, + (MIPI_SYST_SEVERITY)SeverityType, + TraceHubCatalogType + ); + if (!RETURN_ERROR (Status)) { + Status = MipiSystWriteCatalog ( + &MipiSystHandle, + (MIPI_SYST_SEVERITY)SeverityType, + Id + ); + if (RETURN_ERROR (Status)) { + break; + } + } + } + + return Status; +} + +/** + Write catalog message to specified Trace Hub MMIO address. + + @param[in] SeverityType Severity type of input message. + @param[in] Id Catalog ID. + @param[in] NumberOfParams Number of entries in argument list. + @param[in] ... Catalog message parameters. + + @retval RETURN_SUCCESS Data was written to Trace Hub. + @retval Other Failed to output Trace Hub message. +**/ +RETURN_STATUS +EFIAPI +TraceHubSysTWriteCataLog64 ( + IN TRACE_HUB_SEVERITY_TYPE SeverityType, + IN UINT64 Id, + IN UINTN NumberOfParams, + ... + ) +{ + MIPI_SYST_HANDLE MipiSystHandle; + MIPI_SYST_HEADER MipiSystHeader; + VA_LIST Args; + UINTN Index; + RETURN_STATUS Status; + UINT32 DbgInstCount; + + DbgInstCount = 0; + + if (NumberOfParams > sizeof (MipiSystHandle.systh_param) / sizeof (UINT32)) { + return RETURN_INVALID_PARAMETER; + } + + DbgInstCount = CountThDebugInstance (); + + MipiSystHandle.systh_header = &MipiSystHeader; + + ZeroMem (&MipiSystHandle, sizeof (MIPI_SYST_HANDLE)); + Status = InitMipiSystHandle (&MipiSystHandle); + if (RETURN_ERROR (Status)) { + return Status; + } + + MipiSystHandle.systh_param_count = (UINT32)NumberOfParams; + VA_START (Args, NumberOfParams); + for (Index = 0; Index < NumberOfParams; Index++) { + MipiSystHandle.systh_param[Index] = VA_ARG (Args, UINT32); + } + + VA_END (Args); + + for (Index = 0; Index < DbgInstCount; Index++) { + Status = CheckWhetherToOutputMsg ( + &MipiSystHandle, + NULL, + (MIPI_SYST_SEVERITY)SeverityType, + TraceHubCatalogType + ); + if (!RETURN_ERROR (Status)) { + Status = MipiSystWriteCatalog ( + &MipiSystHandle, + (MIPI_SYST_SEVERITY)SeverityType, + Id + ); + if (RETURN_ERROR (Status)) { + break; + } + } + } + + return Status; +} + +/** + Collect the total number of Trace Hub debug instance in the system. + + @retval UINT32 The total number of Trace Hub debug instance in the system. +**/ +UINT32 +EFIAPI +CountThDebugInstance ( + VOID + ) +{ + UINT32 DbgInstCount; + + // + // 1 from PCD. + // + DbgInstCount = 1; + + return DbgInstCount; +} diff --git a/MdeModulePkg/Library/TraceHubDebugSysTLib/BaseTraceHubDebugSysTLib.inf b/MdeModulePkg/Library/TraceHubDebugSysTLib/BaseTraceHubDebugSysTLib.inf new file mode 100644 index 0000000000..3edc4e8fd8 --- /dev/null +++ b/MdeModulePkg/Library/TraceHubDebugSysTLib/BaseTraceHubDebugSysTLib.inf @@ -0,0 +1,44 @@ +## @file +# Debug library to output Trace Hub message. +# Support SEC/PEI/DXE/SMM phase TraceHub debug message based on fixed settings. +# +# Copyright (c) 2023, Intel Corporation. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = BaseTraceHubDebugSysTLib + FILE_GUID = 336DA571-AD65-423C-9A43-E0056E5B2D8D + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = TraceHubDebugSysTLib + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[LibraryClasses] + BaseLib + PcdLib + BaseMemoryLib + MipiSysTLib + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + +[Sources] + BaseTraceHubDebugSysTLib.c + InternalTraceHubApiCommon.c + InternalTraceHubApiCommon.h + InternalTraceHubApi.h + +[Pcd] + gEfiMdeModulePkgTokenSpaceGuid.PcdTraceHubDebugLevel + gEfiMdeModulePkgTokenSpaceGuid.PcdEnableTraceHubDebugMsg + gEfiMdeModulePkgTokenSpaceGuid.PcdTraceHubDebugMmioAddress diff --git a/MdeModulePkg/Library/TraceHubDebugSysTLib/DxeSmmTraceHubDebugSysTLib.c b/MdeModulePkg/Library/TraceHubDebugSysTLib/DxeSmmTraceHubDebugSysTLib.c new file mode 100644 index 0000000000..626e86c880 --- /dev/null +++ b/MdeModulePkg/Library/TraceHubDebugSysTLib/DxeSmmTraceHubDebugSysTLib.c @@ -0,0 +1,247 @@ +/** @file +System prints Trace Hub message in DXE/SMM based on fixed PCDs and HOB. +Support at most MAX_TRACE_HUB_DEBUG_INSTANCE of Trace Hub debug instances +in the system. +Trace Hub PCDs will be applied if no HOB exist. + +Copyright (c) 2023, Intel Corporation. All rights reserved.<BR> + +SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Base.h> +#include <Library/BaseLib.h> +#include <Library/PcdLib.h> +#include <Library/HobLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/MemoryAllocationLib.h> +#include <Library/TraceHubDebugSysTLib.h> +#include <Library/MipiSysTLib.h> +#include <Library/MipiSysTLib/mipi_syst.h> +#include <Guid/TraceHubDebugInfoHob.h> +#include "InternalTraceHubApiCommon.h" +#include "InternalTraceHubApi.h" + +GLOBAL_REMOVE_IF_UNREFERENCED TRACEHUB_DEBUG_INFO_HOB mThDebugInstArray[MAX_TRACE_HUB_DEBUG_INSTANCE]; +GLOBAL_REMOVE_IF_UNREFERENCED UINT32 mDbgInstCount = 0; + +/** + Write debug string to specified Trace Hub MMIO address. + + @param[in] SeverityType Severity type of input message. + @param[in] Buffer A pointer to the data buffer. + @param[in] NumberOfBytes The size of data buffer. + + @retval RETURN_SUCCESS Data was written to Trace Hub. + @retval Other Failed to output Trace Hub message. +**/ +RETURN_STATUS +EFIAPI +TraceHubSysTDebugWrite ( + IN TRACE_HUB_SEVERITY_TYPE SeverityType, + IN UINT8 *Buffer, + IN UINTN NumberOfBytes + ) +{ + MIPI_SYST_HANDLE MipiSystHandle; + MIPI_SYST_HEADER MipiSystHeader; + RETURN_STATUS Status; + UINT16 Index; + + if (NumberOfBytes == 0) { + // + // No data need to be written to Trace Hub + // + return RETURN_ABORTED; + } + + if (Buffer == NULL) { + return RETURN_INVALID_PARAMETER; + } + + if (mDbgInstCount == 0) { + mDbgInstCount = CountThDebugInstance (); + } + + if (mThDebugInstArray[0].TraceHubMmioAddress == 0) { + PackThDebugInstance (&mThDebugInstArray[0], mDbgInstCount); + } + + ZeroMem (&MipiSystHandle, sizeof (MIPI_SYST_HANDLE)); + MipiSystHandle.systh_header = &MipiSystHeader; + + Status = InitMipiSystHandle (&MipiSystHandle); + if (RETURN_ERROR (Status)) { + return Status; + } + + for (Index = 0; Index < mDbgInstCount; Index++) { + Status = CheckWhetherToOutputMsg ( + &MipiSystHandle, + (UINT8 *)&mThDebugInstArray[Index], + (MIPI_SYST_SEVERITY)SeverityType, + TraceHubDebugType + ); + if (!RETURN_ERROR (Status)) { + Status = MipiSystWriteDebug ( + &MipiSystHandle, + (MIPI_SYST_SEVERITY)SeverityType, + (UINT16)NumberOfBytes, + (CHAR8 *)Buffer + ); + if (RETURN_ERROR (Status)) { + break; + } + } + } + + return Status; +} + +/** + Write catalog status code message to specified Trace Hub MMIO address. + + @param[in] SeverityType Severity type of input message. + @param[in] Id Catalog ID. + @param[in] Guid Driver Guid. + + @retval RETURN_SUCCESS Data was written to Trace Hub. + @retval Other Failed to output Trace Hub message. +**/ +RETURN_STATUS +EFIAPI +TraceHubSysTWriteCataLog64StatusCode ( + IN TRACE_HUB_SEVERITY_TYPE SeverityType, + IN UINT64 Id, + IN GUID *Guid + ) +{ + MIPI_SYST_HANDLE MipiSystHandle; + MIPI_SYST_HEADER MipiSystHeader; + UINTN Index; + RETURN_STATUS Status; + GUID ConvertedGuid; + + if (mDbgInstCount == 0) { + mDbgInstCount = CountThDebugInstance (); + } + + if (mThDebugInstArray[0].TraceHubMmioAddress == 0) { + PackThDebugInstance (&mThDebugInstArray[0], mDbgInstCount); + } + + MipiSystHandle.systh_header = &MipiSystHeader; + + ZeroMem (&MipiSystHandle, sizeof (MIPI_SYST_HANDLE)); + Status = InitMipiSystHandle (&MipiSystHandle); + if (RETURN_ERROR (Status)) { + return Status; + } + + if (Guid != NULL) { + ConvertedGuid = SwapBytesGuid (Guid); + CopyMem (&MipiSystHandle.systh_guid, &ConvertedGuid, sizeof (GUID)); + MipiSystHandle.systh_tag.et_guid = 1; + } else { + MipiSystHandle.systh_tag.et_modunit = 2; + MipiSystHandle.systh_tag.et_guid = 0; + } + + for (Index = 0; Index < mDbgInstCount; Index++) { + Status = CheckWhetherToOutputMsg ( + &MipiSystHandle, + (UINT8 *)&mThDebugInstArray[Index], + (MIPI_SYST_SEVERITY)SeverityType, + TraceHubCatalogType + ); + if (!RETURN_ERROR (Status)) { + Status = MipiSystWriteCatalog ( + &MipiSystHandle, + (MIPI_SYST_SEVERITY)SeverityType, + Id + ); + if (RETURN_ERROR (Status)) { + break; + } + } + } + + return Status; +} + +/** + Write catalog message to specified Trace Hub MMIO address. + + @param[in] SeverityType Severity type of input message. + @param[in] Id Catalog ID. + @param[in] NumberOfParams Number of entries in argument list. + @param[in] ... Catalog message parameters. + + @retval RETURN_SUCCESS Data was written to Trace Hub. + @retval Other Failed to output Trace Hub message. +**/ +RETURN_STATUS +EFIAPI +TraceHubSysTWriteCataLog64 ( + IN TRACE_HUB_SEVERITY_TYPE SeverityType, + IN UINT64 Id, + IN UINTN NumberOfParams, + ... + ) +{ + MIPI_SYST_HANDLE MipiSystHandle; + MIPI_SYST_HEADER MipiSystHeader; + VA_LIST Args; + UINTN Index; + RETURN_STATUS Status; + + if (NumberOfParams > sizeof (MipiSystHandle.systh_param) / sizeof (UINT32)) { + return RETURN_INVALID_PARAMETER; + } + + if (mDbgInstCount == 0) { + mDbgInstCount = CountThDebugInstance (); + } + + if (mThDebugInstArray[0].TraceHubMmioAddress == 0) { + PackThDebugInstance (&mThDebugInstArray[0], mDbgInstCount); + } + + MipiSystHandle.systh_header = &MipiSystHeader; + + ZeroMem (&MipiSystHandle, sizeof (MIPI_SYST_HANDLE)); + Status = InitMipiSystHandle (&MipiSystHandle); + if (RETURN_ERROR (Status)) { + return Status; + } + + MipiSystHandle.systh_param_count = (UINT32)NumberOfParams; + VA_START (Args, NumberOfParams); + for (Index = 0; Index < NumberOfParams; Index++) { + MipiSystHandle.systh_param[Index] = VA_ARG (Args, UINT32); + } + + VA_END (Args); + + for (Index = 0; Index < mDbgInstCount; Index++) { + Status = CheckWhetherToOutputMsg ( + &MipiSystHandle, + (UINT8 *)&mThDebugInstArray[Index], + (MIPI_SYST_SEVERITY)SeverityType, + TraceHubCatalogType + ); + if (!RETURN_ERROR (Status)) { + Status = MipiSystWriteCatalog ( + &MipiSystHandle, + (MIPI_SYST_SEVERITY)SeverityType, + Id + ); + if (RETURN_ERROR (Status)) { + break; + } + } + } + + return Status; +} diff --git a/MdeModulePkg/Library/TraceHubDebugSysTLib/DxeSmmTraceHubDebugSysTLib.inf b/MdeModulePkg/Library/TraceHubDebugSysTLib/DxeSmmTraceHubDebugSysTLib.inf new file mode 100644 index 0000000000..9ba1b9c42f --- /dev/null +++ b/MdeModulePkg/Library/TraceHubDebugSysTLib/DxeSmmTraceHubDebugSysTLib.inf @@ -0,0 +1,50 @@ +## @file +# Debug library to output Trace Hub message. +# Support DXE/SMM phase TraceHub debug message based on fixed or dynamic settings. +# +# Copyright (c) 2023, Intel Corporation. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = DxeSmmTraceHubDebugSysTLib + FILE_GUID = A9B7B825-7902-4616-8556-085DA4DFEC72 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = TraceHubDebugSysTLib|DXE_CORE DXE_DRIVER SMM_CORE DXE_SMM_DRIVER UEFI_DRIVER UEFI_APPLICATION + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[LibraryClasses] + BaseLib + PcdLib + HobLib + BaseMemoryLib + MemoryAllocationLib + MipiSysTLib + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + +[Sources] + DxeSmmTraceHubDebugSysTLib.c + InternalTraceHubApiCommon.c + InternalTraceHubApiCommon.h + InternalTraceHubApi.h + InternalTraceHubApi.c + +[Guids] + gTraceHubDebugInfoHobGuid + +[Pcd] + gEfiMdeModulePkgTokenSpaceGuid.PcdTraceHubDebugLevel + gEfiMdeModulePkgTokenSpaceGuid.PcdEnableTraceHubDebugMsg + gEfiMdeModulePkgTokenSpaceGuid.PcdTraceHubDebugMmioAddress diff --git a/MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApi.c b/MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApi.c new file mode 100644 index 0000000000..4f2dd0f2e5 --- /dev/null +++ b/MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApi.c @@ -0,0 +1,82 @@ +/** @file +Functions implementation in this file are not common for all type of TraceHubDebugSysTLib. + +Copyright (c) 2023, Intel Corporation. All rights reserved.<BR> + +SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Base.h> +#include <Guid/TraceHubDebugInfoHob.h> +#include <Library/BaseMemoryLib.h> +#include <Library/HobLib.h> +#include "InternalTraceHubApi.h" + +/** + Count the total number of Trace Hub debug instance in the system. + + @retval UINT32 The total number of Trace Hub debug instance in the system. +**/ +UINT32 +EFIAPI +CountThDebugInstance ( + VOID + ) +{ + UINT8 *DgbContext; + UINT32 DbgInstCount; + + DbgInstCount = 0; + + DgbContext = (UINT8 *)GetFirstGuidHob (&gTraceHubDebugInfoHobGuid); + if (DgbContext != NULL) { + while (DgbContext != NULL) { + DbgInstCount++; + DgbContext = (UINT8 *)GetNextGuidHob (&gTraceHubDebugInfoHobGuid, GET_NEXT_HOB (DgbContext)); + } + } else { + DbgInstCount++; + } + + // + // Trace Hub HOB larger than MAX_TRACE_HUB_DEBUG_INSTANCE won't be processed. + // + if (DbgInstCount > MAX_TRACE_HUB_DEBUG_INSTANCE) { + DbgInstCount = MAX_TRACE_HUB_DEBUG_INSTANCE; + } + + return DbgInstCount; +} + +/** + Pack Trace Hub debug instances in the system. + + @param[in, out] ThPtr A pointer to TRACEHUB_DEBUG_INFO_HOB structure. + @param[in] Count Number of Trace Hub HOBs. +**/ +VOID +EFIAPI +PackThDebugInstance ( + IN OUT TRACEHUB_DEBUG_INFO_HOB *ThPtr, + IN UINT32 Count + ) +{ + UINT8 *DgbContext; + UINT16 Index; + + ZeroMem (ThPtr, sizeof (TRACEHUB_DEBUG_INFO_HOB) * MAX_TRACE_HUB_DEBUG_INSTANCE); + DgbContext = GetFirstGuidHob (&gTraceHubDebugInfoHobGuid); + if (DgbContext != NULL) { + for (Index = 0; Index < Count; Index++) { + CopyMem (&ThPtr[Index], GET_GUID_HOB_DATA (DgbContext), sizeof (TRACEHUB_DEBUG_INFO_HOB)); + DgbContext = GetNextGuidHob (&gTraceHubDebugInfoHobGuid, GET_NEXT_HOB (DgbContext)); + } + } else { + for (Index = 0; Index < Count; Index++) { + ThPtr[Index].TraceHubMmioAddress = FixedPcdGet64 (PcdTraceHubDebugMmioAddress); + ThPtr[Index].Flag = FixedPcdGetBool (PcdEnableTraceHubDebugMsg); + ThPtr[Index].DebugLevel = FixedPcdGet8 (PcdTraceHubDebugLevel); + } + } +} diff --git a/MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApi.h b/MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApi.h new file mode 100644 index 0000000000..a185c17d8c --- /dev/null +++ b/MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApi.h @@ -0,0 +1,46 @@ +/** @file +This header file declares functions that are not for common use. + +Copyright (c) 2023, Intel Corporation. All rights reserved.<BR> + +SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef INTERNAL_TRACE_HUB_API_H_ +#define INTERNAL_TRACE_HUB_API_H_ + +/** + Count the total number of Trace Hub debug instance in the system. + + @retval UINT32 The total number of Trace Hub debug instance in the system. +**/ +UINT32 +EFIAPI +CountThDebugInstance ( + VOID + ); + +/** + Pack Trace Hub debug instances in the system. + + @param[in, out] ThPtr A pointer to TRACEHUB_DEBUG_INFO_HOB structure. + @param[in] Count Number of Trace Hub HOBs. +**/ +VOID +EFIAPI +PackThDebugInstance ( + IN OUT TRACEHUB_DEBUG_INFO_HOB *ThPtr, + IN UINT32 Count + ); + +/** + Convert physical address to virtual address for the pointer to TRACEHUB_DEBUG_INFO_HOB structure. +**/ +VOID +EFIAPI +InternalCreateThExitBootSvcEvent ( + VOID + ); + +#endif // INTERNAL_TRACE_HUB_API_H_ diff --git a/MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApiCommon.c b/MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApiCommon.c new file mode 100644 index 0000000000..f32eb43192 --- /dev/null +++ b/MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApiCommon.c @@ -0,0 +1,208 @@ +/** @file +Functions implementation defined in this file are common for all type of TraceHubDebugSysTLib + +Copyright (c) 2023, Intel Corporation. All rights reserved.<BR> + +SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Base.h> +#include <Library/BaseLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/TraceHubDebugSysTLib.h> +#include <Library/MipiSysTLib/mipi_syst.h> +#include <Guid/TraceHubDebugInfoHob.h> +#include "InternalTraceHubApiCommon.h" +#include "InternalTraceHubApi.h" + +/** + Conditionally determine whether to enable Trace Hub message. + + @param[in] Flag Flag to enable or disable Trace Hub message. + @param[in] DbgLevel Debug Level of Trace Hub. + @param[in] SeverityType Severity type of input message. + + @retval TRUE Enable trace hub message. + @retval FALSE Disable trace hub message. +**/ +BOOLEAN +EFIAPI +TraceHubDataEnabled ( + IN BOOLEAN Flag, + IN UINT8 DbgLevel, + IN TRACE_HUB_SEVERITY_TYPE SeverityType + ) +{ + if (Flag == TraceHubRoutingDisable) { + return FALSE; + } + + if (DbgLevel == TraceHubDebugLevelError) { + if (((SeverityType == SeverityFatal) || (SeverityType == SeverityError))) { + return TRUE; + } + } else if (DbgLevel == TraceHubDebugLevelErrorWarning) { + if (((SeverityType == SeverityFatal) || (SeverityType == SeverityError) || (SeverityType == SeverityWarning))) { + return TRUE; + } + } else if (DbgLevel == TraceHubDebugLevelErrorWarningInfo) { + if (((SeverityType == SeverityFatal) || (SeverityType == SeverityError) || (SeverityType == SeverityWarning) || (SeverityType == SeverityNormal))) { + return TRUE; + } + } else if (DbgLevel == TraceHubDebugLevelErrorWarningInfoVerbose) { + return TRUE; + } + + return FALSE; +} + +/** + Convert GUID from LE to BE or BE to LE. + + @param[in] Guid GUID to be converted. + + @retval RETURN_SUCCESS Operation is successful. +**/ +GUID +EFIAPI +SwapBytesGuid ( + IN GUID *Guid + ) +{ + GUID ConvertedGuid; + UINT64 GuidData4; + + ZeroMem (&ConvertedGuid, sizeof (GUID)); + ConvertedGuid.Data1 = SwapBytes32 (Guid->Data1); + ConvertedGuid.Data2 = SwapBytes16 (Guid->Data2); + ConvertedGuid.Data3 = SwapBytes16 (Guid->Data3); + CopyMem (&GuidData4, Guid->Data4, sizeof (Guid->Data4)); + GuidData4 = SwapBytes64 (GuidData4); + CopyMem (ConvertedGuid.Data4, &GuidData4, sizeof (GuidData4)); + + return ConvertedGuid; +} + +/** + Check whether to output Trace Hub message according to some conditions. + Trace Hub message will be disabled if TraceHubDataEnabled() return FALSE + or Trace Hub MMIO address is 0. + + @param[in, out] MipiSystHandle A pointer to MIPI_SYST_HANDLE structure. + @param[in] DgbContext A pointer to Trace Hub debug instance. + @param[in] SeverityType Severity type of input message. + @param[in] PrintType Either catalog print or debug print. + + @retval RETURN_SUCCESS Current Trace Hub message need to be output. + @retval Other Current Trace Hub message will be disabled. +**/ +RETURN_STATUS +EFIAPI +CheckWhetherToOutputMsg ( + IN OUT MIPI_SYST_HANDLE *MipiSystHandle, + IN UINT8 *DgbContext, + IN TRACE_HUB_SEVERITY_TYPE SeverityType, + IN TRACEHUB_PRINTTYPE PrintType + ) +{ + UINT8 DbgLevel; + BOOLEAN Flag; + UINT64 Addr; + RETURN_STATUS Status; + + if (MipiSystHandle == NULL) { + return RETURN_INVALID_PARAMETER; + } + + if (PrintType == TraceHubDebugType) { + Status = GetTraceHubMsgVisibility (DgbContext, &Flag, &DbgLevel); + if (RETURN_ERROR (Status)) { + return Status; + } + + if (!TraceHubDataEnabled (Flag, DbgLevel, SeverityType)) { + return RETURN_ABORTED; + } + } + + Status = GetTraceHubMmioAddress (DgbContext, &Addr); + if (RETURN_ERROR (Status)) { + return Status; + } + + MipiSystHandle->systh_platform.TraceHubPlatformData.MmioAddr = Addr; + if (MipiSystHandle->systh_platform.TraceHubPlatformData.MmioAddr == 0) { + return RETURN_ABORTED; + } + + return RETURN_SUCCESS; +} + +/** + Get Trace Hub MMIO Address. + + @param[in] DgbContext A pointer to Trace Hub debug instance. + @param[in, out] TraceAddress Trace Hub MMIO Address. + + @retval RETURN_SUCCESS Operation is successfully. + @retval Other Operation is failed. +**/ +RETURN_STATUS +EFIAPI +GetTraceHubMmioAddress ( + IN UINT8 *DgbContext, + IN OUT UINT64 *TraceAddress + ) +{ + TRACEHUB_DEBUG_INFO_HOB *ThDbgContext; + + if (TraceAddress == NULL) { + return RETURN_INVALID_PARAMETER; + } + + if (DgbContext != NULL) { + ThDbgContext = (TRACEHUB_DEBUG_INFO_HOB *)DgbContext; + *TraceAddress = ThDbgContext->TraceHubMmioAddress; + } else { + *TraceAddress = FixedPcdGet64 (PcdTraceHubDebugMmioAddress); + } + + return RETURN_SUCCESS; +} + +/** + Get visibility of Trace Hub Msg. + + @param[in] DgbContext A pointer to Trace Hub debug instance. + @param[in, out] Flag Flag to enable or disable Trace Hub message. + @param[in, out] DbgLevel Debug Level of Trace Hub. + + @retval RETURN_SUCCESS Operation is successfully. + @retval Other Operation is failed. +**/ +RETURN_STATUS +EFIAPI +GetTraceHubMsgVisibility ( + IN UINT8 *DgbContext, + IN OUT BOOLEAN *Flag, + IN OUT UINT8 *DbgLevel + ) +{ + TRACEHUB_DEBUG_INFO_HOB *ThDbgContext; + + if ((Flag == NULL) || (DbgLevel == NULL)) { + return RETURN_INVALID_PARAMETER; + } + + if (DgbContext != NULL) { + ThDbgContext = (TRACEHUB_DEBUG_INFO_HOB *)DgbContext; + *Flag = ThDbgContext->Flag; + *DbgLevel = ThDbgContext->DebugLevel; + } else { + *DbgLevel = FixedPcdGet8 (PcdTraceHubDebugLevel); + *Flag = FixedPcdGetBool (PcdEnableTraceHubDebugMsg); + } + + return RETURN_SUCCESS; +} diff --git a/MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApiCommon.h b/MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApiCommon.h new file mode 100644 index 0000000000..771c4400af --- /dev/null +++ b/MdeModulePkg/Library/TraceHubDebugSysTLib/InternalTraceHubApiCommon.h @@ -0,0 +1,119 @@ +/** @file +This header file declares functions and type for common use. + +Copyright (c) 2023, Intel Corporation. All rights reserved.<BR> + +SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef INTERNAL_TRACE_HUB_API_COMMON_H_ +#define INTERNAL_TRACE_HUB_API_COMMON_H_ + +typedef enum { + TraceHubDebugType = 0, + TraceHubCatalogType +} TRACEHUB_PRINTTYPE; + +typedef enum { + TraceHubRoutingDisable = 0, + TraceHubRoutingEnable, + TraceHubRoutingMax +} TRACE_HUB_ROUTING; + +typedef enum { + TraceHubDebugLevelError = 0, + TraceHubDebugLevelErrorWarning, + TraceHubDebugLevelErrorWarningInfo, + TraceHubDebugLevelErrorWarningInfoVerbose, + TraceHubDebugLevelMax +} TRACE_HUB_DEBUG_LEVEL; + +/** + Conditionally determine whether to enable Trace Hub message. + + @param[in] Flag Flag to enable or disable Trace Hub message. + @param[in] DbgLevel Debug Level of Trace Hub. + @param[in] SeverityType Severity type of input message. + + @retval TRUE Enable trace hub message. + @retval FALSE Disable trace hub message. +**/ +BOOLEAN +EFIAPI +TraceHubDataEnabled ( + IN BOOLEAN Flag, + IN UINT8 DbgLevel, + IN TRACE_HUB_SEVERITY_TYPE SeverityType + ); + +/** + Convert GUID from LE to BE or BE to LE. + + @param[in] Guid GUID to be converted. + + @retval RETURN_SUCCESS Operation is successful. +**/ +GUID +EFIAPI +SwapBytesGuid ( + IN OUT GUID *Guid + ); + +/** + Check whether to output Trace Hub message according to some conditions. + Trace Hub message will be disabled if TraceHubDataEnabled() return FALSE + or Trace Hub MMIO address is 0. + + @param[in, out] MipiSystHandle A pointer to MIPI_SYST_HANDLE structure. + @param[in] DgbContext A pointer to Trace Hub debug instance. + @param[in] SeverityType Severity type of input message. + @param[in] PrintType Either catalog print or debug print. + + @retval RETURN_SUCCESS Current Trace Hub message need to be output. + @retval Other Current Trace Hub message will be disabled. +**/ +RETURN_STATUS +EFIAPI +CheckWhetherToOutputMsg ( + IN OUT MIPI_SYST_HANDLE *MipiSystHandle, + IN UINT8 *DgbContext, + IN TRACE_HUB_SEVERITY_TYPE SeverityType, + IN TRACEHUB_PRINTTYPE PrintType + ); + +/** + Get Trace Hub MMIO Address. + + @param[in] DgbContext A pointer to Trace Hub debug instance. + @param[in, out] TraceAddress Trace Hub MMIO Address. + + @retval RETURN_SUCCESS Operation is successfully. + @retval Other Operation is failed. +**/ +RETURN_STATUS +EFIAPI +GetTraceHubMmioAddress ( + IN UINT8 *DgbContext, + IN OUT UINT64 *TraceAddress + ); + +/** + Get visibility of Trace Hub Msg. + + @param[in] DgbContext A pointer to Trace Hub debug instance. + @param[in, out] Flag Flag to enable or disable Trace Hub message. + @param[in, out] DbgLevel Debug Level of Trace Hub. + + @retval RETURN_SUCCESS Operation is successfully. + @retval Other Operation is failed. +**/ +RETURN_STATUS +EFIAPI +GetTraceHubMsgVisibility ( + IN UINT8 *DgbContext, + IN OUT BOOLEAN *Flag, + IN OUT UINT8 *DbgLevel + ); + +#endif // INTERNAL_TRACE_HUB_API_COMMON_H_ diff --git a/MdeModulePkg/Library/TraceHubDebugSysTLib/PeiTraceHubDebugSysTLib.c b/MdeModulePkg/Library/TraceHubDebugSysTLib/PeiTraceHubDebugSysTLib.c new file mode 100644 index 0000000000..fafd651499 --- /dev/null +++ b/MdeModulePkg/Library/TraceHubDebugSysTLib/PeiTraceHubDebugSysTLib.c @@ -0,0 +1,290 @@ +/** @file +System prints Trace Hub message in PEI based on fixed PCDs and HOB. +System applies Trace Hub HOB once it detect gTraceHubDebugInfoHobGuid HOB. +Support at most MAX_TRACE_HUB_DEBUG_INSTANCE of Trace Hub debug instances +in the system. +Trace Hub PCDs will be applied if no HOB exist. + +Copyright (c) 2023, Intel Corporation. All rights reserved.<BR> + +SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Base.h> +#include <Library/BaseLib.h> +#include <Library/PcdLib.h> +#include <Library/HobLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/MemoryAllocationLib.h> +#include <Library/TraceHubDebugSysTLib.h> +#include <Library/MipiSysTLib.h> +#include <Library/MipiSysTLib/mipi_syst.h> +#include <Guid/TraceHubDebugInfoHob.h> +#include "InternalTraceHubApiCommon.h" +#include "InternalTraceHubApi.h" + +/** + Write debug string to specified Trace Hub MMIO address. + + @param[in] SeverityType Severity type of input message. + @param[in] Buffer A pointer to the data buffer. + @param[in] NumberOfBytes The size of data buffer. + + @retval RETURN_SUCCESS Data was written to Trace Hub. + @retval Other Failed to output Trace Hub message. +**/ +RETURN_STATUS +EFIAPI +TraceHubSysTDebugWrite ( + IN TRACE_HUB_SEVERITY_TYPE SeverityType, + IN UINT8 *Buffer, + IN UINTN NumberOfBytes + ) +{ + MIPI_SYST_HANDLE MipiSystHandle; + MIPI_SYST_HEADER MipiSystHeader; + RETURN_STATUS Status; + UINT8 *DgbContext; + UINTN Index; + UINT32 DbgInstCount; + UINT8 *ThDebugInfo; + + DbgInstCount = 0; + + if (NumberOfBytes == 0) { + // + // No data need to be written to Trace Hub + // + return RETURN_ABORTED; + } + + if (Buffer == NULL) { + return RETURN_INVALID_PARAMETER; + } + + DbgInstCount = CountThDebugInstance (); + + ZeroMem (&MipiSystHandle, sizeof (MIPI_SYST_HANDLE)); + MipiSystHandle.systh_header = &MipiSystHeader; + + Status = InitMipiSystHandle (&MipiSystHandle); + if (RETURN_ERROR (Status)) { + return Status; + } + + DgbContext = (UINT8 *)GetFirstGuidHob (&gTraceHubDebugInfoHobGuid); + if (DgbContext != NULL) { + ThDebugInfo = GET_GUID_HOB_DATA (DgbContext); + } else { + ThDebugInfo = NULL; + } + + for (Index = 0; Index < DbgInstCount; Index++) { + Status = CheckWhetherToOutputMsg ( + &MipiSystHandle, + ThDebugInfo, + (MIPI_SYST_SEVERITY)SeverityType, + TraceHubDebugType + ); + if (!RETURN_ERROR (Status)) { + Status = MipiSystWriteDebug ( + &MipiSystHandle, + (MIPI_SYST_SEVERITY)SeverityType, + (UINT16)NumberOfBytes, + (CHAR8 *)Buffer + ); + if (RETURN_ERROR (Status)) { + break; + } + } + + if (DgbContext != NULL) { + DgbContext = (UINT8 *)GetNextGuidHob (&gTraceHubDebugInfoHobGuid, GET_NEXT_HOB (DgbContext)); + if (DgbContext == NULL) { + break; + } + + ThDebugInfo = GET_GUID_HOB_DATA (DgbContext); + } + } + + return Status; +} + +/** + Write catalog status code message to specified Trace Hub MMIO address. + + @param[in] SeverityType Severity type of input message. + @param[in] Id Catalog ID. + @param[in] Guid Driver Guid. + + @retval RETURN_SUCCESS Data was written to Trace Hub. + @retval Other Failed to output Trace Hub message. +**/ +RETURN_STATUS +EFIAPI +TraceHubSysTWriteCataLog64StatusCode ( + IN TRACE_HUB_SEVERITY_TYPE SeverityType, + IN UINT64 Id, + IN GUID *Guid + ) +{ + MIPI_SYST_HANDLE MipiSystHandle; + MIPI_SYST_HEADER MipiSystHeader; + UINT32 DbgInstCount; + UINT8 *DgbContext; + RETURN_STATUS Status; + UINTN Index; + UINT8 *ThDebugInfo; + GUID ConvertedGuid; + + DbgInstCount = 0; + + DbgInstCount = CountThDebugInstance (); + + MipiSystHandle.systh_header = &MipiSystHeader; + + ZeroMem (&MipiSystHandle, sizeof (MIPI_SYST_HANDLE)); + Status = InitMipiSystHandle (&MipiSystHandle); + if (RETURN_ERROR (Status)) { + return Status; + } + + if (Guid != NULL) { + ConvertedGuid = SwapBytesGuid (Guid); + CopyMem (&MipiSystHandle.systh_guid, &ConvertedGuid, sizeof (GUID)); + MipiSystHandle.systh_tag.et_guid = 1; + } else { + MipiSystHandle.systh_tag.et_modunit = 2; + MipiSystHandle.systh_tag.et_guid = 0; + } + + DgbContext = (UINT8 *)GetFirstGuidHob (&gTraceHubDebugInfoHobGuid); + if (DgbContext != NULL) { + ThDebugInfo = GET_GUID_HOB_DATA (DgbContext); + } else { + ThDebugInfo = NULL; + } + + for (Index = 0; Index < DbgInstCount; Index++) { + Status = CheckWhetherToOutputMsg ( + &MipiSystHandle, + ThDebugInfo, + (MIPI_SYST_SEVERITY)SeverityType, + TraceHubCatalogType + ); + if (!RETURN_ERROR (Status)) { + Status = MipiSystWriteCatalog ( + &MipiSystHandle, + (MIPI_SYST_SEVERITY)SeverityType, + Id + ); + if (RETURN_ERROR (Status)) { + break; + } + } + + if (DgbContext != NULL) { + DgbContext = (UINT8 *)GetNextGuidHob (&gTraceHubDebugInfoHobGuid, GET_NEXT_HOB (DgbContext)); + if (DgbContext == NULL) { + break; + } + + ThDebugInfo = GET_GUID_HOB_DATA (DgbContext); + } + } + + return Status; +} + +/** + Write catalog message to specified Trace Hub MMIO address. + + @param[in] SeverityType Severity type of input message. + @param[in] Id Catalog ID. + @param[in] NumberOfParams Number of entries in argument list. + @param[in] ... Catalog message parameters. + + @retval RETURN_SUCCESS Data was written to Trace Hub. + @retval Other Failed to output Trace Hub message. +**/ +RETURN_STATUS +EFIAPI +TraceHubSysTWriteCataLog64 ( + IN TRACE_HUB_SEVERITY_TYPE SeverityType, + IN UINT64 Id, + IN UINTN NumberOfParams, + ... + ) +{ + MIPI_SYST_HANDLE MipiSystHandle; + MIPI_SYST_HEADER MipiSystHeader; + VA_LIST Args; + UINTN Index; + UINT32 DbgInstCount; + UINT8 *DgbContext; + RETURN_STATUS Status; + UINT8 *ThDebugInfo; + + DbgInstCount = 0; + + if (NumberOfParams > sizeof (MipiSystHandle.systh_param) / sizeof (UINT32)) { + return RETURN_INVALID_PARAMETER; + } + + DbgInstCount = CountThDebugInstance (); + + MipiSystHandle.systh_header = &MipiSystHeader; + + ZeroMem (&MipiSystHandle, sizeof (MIPI_SYST_HANDLE)); + Status = InitMipiSystHandle (&MipiSystHandle); + if (RETURN_ERROR (Status)) { + return Status; + } + + MipiSystHandle.systh_param_count = (UINT32)NumberOfParams; + VA_START (Args, NumberOfParams); + for (Index = 0; Index < NumberOfParams; Index++) { + MipiSystHandle.systh_param[Index] = VA_ARG (Args, UINT32); + } + + VA_END (Args); + + DgbContext = (UINT8 *)GetFirstGuidHob (&gTraceHubDebugInfoHobGuid); + if (DgbContext != NULL) { + ThDebugInfo = GET_GUID_HOB_DATA (DgbContext); + } else { + ThDebugInfo = NULL; + } + + for (Index = 0; Index < DbgInstCount; Index++) { + Status = CheckWhetherToOutputMsg ( + &MipiSystHandle, + ThDebugInfo, + (MIPI_SYST_SEVERITY)SeverityType, + TraceHubCatalogType + ); + if (!RETURN_ERROR (Status)) { + Status = MipiSystWriteCatalog ( + &MipiSystHandle, + (MIPI_SYST_SEVERITY)SeverityType, + Id + ); + if (RETURN_ERROR (Status)) { + break; + } + } + + if (DgbContext != NULL) { + DgbContext = (UINT8 *)GetNextGuidHob (&gTraceHubDebugInfoHobGuid, GET_NEXT_HOB (DgbContext)); + if (DgbContext == NULL) { + break; + } + + ThDebugInfo = GET_GUID_HOB_DATA (DgbContext); + } + } + + return Status; +} diff --git a/MdeModulePkg/Library/TraceHubDebugSysTLib/PeiTraceHubDebugSysTLib.inf b/MdeModulePkg/Library/TraceHubDebugSysTLib/PeiTraceHubDebugSysTLib.inf new file mode 100644 index 0000000000..2a8184d927 --- /dev/null +++ b/MdeModulePkg/Library/TraceHubDebugSysTLib/PeiTraceHubDebugSysTLib.inf @@ -0,0 +1,50 @@ +## @file +# Debug library to output Trace Hub message. +# Support PEI phase TraceHub debug message based on fixed or dynamic settings. +# +# Copyright (c) 2023, Intel Corporation. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = PeiTraceHubDebugSysTLib + FILE_GUID = C61E8C2E-0935-4E3D-BCBB-5ED84AFD9FD1 + MODULE_TYPE = PEIM + VERSION_STRING = 1.0 + LIBRARY_CLASS = TraceHubDebugSysTLib|PEI_CORE PEIM + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[LibraryClasses] + BaseLib + PcdLib + HobLib + BaseMemoryLib + MemoryAllocationLib + MipiSysTLib + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + +[Sources] + PeiTraceHubDebugSysTLib.c + InternalTraceHubApiCommon.c + InternalTraceHubApiCommon.h + InternalTraceHubApi.h + InternalTraceHubApi.c + +[Guids] + gTraceHubDebugInfoHobGuid + +[Pcd] + gEfiMdeModulePkgTokenSpaceGuid.PcdTraceHubDebugLevel + gEfiMdeModulePkgTokenSpaceGuid.PcdEnableTraceHubDebugMsg + gEfiMdeModulePkgTokenSpaceGuid.PcdTraceHubDebugMmioAddress diff --git a/MdeModulePkg/Library/TraceHubDebugSysTLib/Readme.md b/MdeModulePkg/Library/TraceHubDebugSysTLib/Readme.md new file mode 100644 index 0000000000..24253eb223 --- /dev/null +++ b/MdeModulePkg/Library/TraceHubDebugSysTLib/Readme.md @@ -0,0 +1,30 @@ +## Introduction of TrcaceHubDebugSysTLib ## +TrcaceHubDebugSysTLib library is a top level library for dumping Trace Hub messages. +It provides Trace Hub related APIs to dump Trace Hub message via MIPI SYS-T submodule. +User need to properly configure following Trace Hub related PCDs and HOB. + (See MdeModulePkg.dec to get detailed definition for PCDs below) + - PcdTraceHubDebugLevel + - PcdEnableTraceHubDebugMsg + - PcdTraceHubDebugMmioAddress + (See TraceHubDebugInfoHob.h to get detailed definition for HOB below) + - gTraceHubDebugInfoHobGuid + +## BaseTraceHubDebugSysTLib.inf ## +System prints Trace Hub message in SEC/PEI/DXE/SMM based on fixed PCDs. +Only support single Trace Hub debug instance. + +## PeiTraceHubDebugSysTLib.inf ## +System prints Trace Hub message in PEI based on fixed PCDs and HOB. +System applies Trace Hub HOB once it detect gTraceHubDebugInfoHobGuid HOB. +Support at most MAX_TRACE_HUB_DEBUG_INSTANCE of Trace Hub debug instances +in the system. +Trace Hub PCDs will be applied if no HOB exist. + +## DxeSmmTraceHubDebugSysTLib.inf ## +System prints Trace Hub message in DXE/SMM based on fixed PCDs and HOB. +Support at most MAX_TRACE_HUB_DEBUG_INSTANCE of Trace Hub debug instances +in the system. +Trace Hub PCDs will be applied if no HOB exist. + +## Note ## +Trace Hub debug library not support DXE_RUNTIME_DRIVER type of module currently. diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec index 3eb4a79bf7..42a1a8e338 100644 --- a/MdeModulePkg/MdeModulePkg.dec +++ b/MdeModulePkg/MdeModulePkg.dec @@ -438,6 +438,9 @@ ## Include/UniversalPayload/SerialPortInfo.h gUniversalPayloadSerialPortInfoGuid = { 0xaa7e190d, 0xbe21, 0x4409, { 0x8e, 0x67, 0xa2, 0xcd, 0xf, 0x61, 0xe1, 0x70 } } + ## Include/Guid/TraceHubDebugInfoHob.h + gTraceHubDebugInfoHobGuid = { 0xf88c9c23, 0x646c, 0x4f6c, { 0x8e, 0x3d, 0x36, 0xa9, 0x43, 0xc1, 0x08, 0x35 } } + ## GUID used for Boot Discovery Policy FormSet guid and related variables. gBootDiscoveryPolicyMgrFormsetGuid = { 0x5b6f7107, 0xbb3c, 0x4660, { 0x92, 0xcd, 0x54, 0x26, 0x90, 0x28, 0x0b, 0xbd } } @@ -1094,6 +1097,24 @@ # @Prompt Enable UEFI Stack Guard. gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard|FALSE|BOOLEAN|0x30001055 + ## Indicate debug level of Trace Hub. + # 0x0 - TraceHubDebugLevelError.<BR> + # 0x1 - TraceHubDebugLevelErrorWarning.<BR> + # 0x2 - TraceHubDebugLevelErrorWarningInfo.<BR> + # 0x3 - TraceHubDebugLevelErrorWarningInfoVerbose.<BR> + # @Prompt Debug level of Trace Hub. + gEfiMdeModulePkgTokenSpaceGuid.PcdTraceHubDebugLevel|0|UINT8|0x30001056 + + ## Flag to enable or disable Trace Hub message. + # FALSE - Disable Trace Hub debug message.<BR> + # TRUE - Enable Trace Hub debug message.<BR> + # @Prompt Enable or Disable Trace Hub message. + gEfiMdeModulePkgTokenSpaceGuid.PcdEnableTraceHubDebugMsg|0|BOOLEAN|0x30001057 + + ## Indicate MMIO address where Trace Hub message output to. + # @Prompt Output MMIO address of Trace Hub message. + gEfiMdeModulePkgTokenSpaceGuid.PcdTraceHubDebugMmioAddress|0|UINT64|0x30001058 + [PcdsFixedAtBuild, PcdsPatchableInModule] ## Dynamic type PCD can be registered callback function for Pcd setting action. # PcdMaxPeiPcdCallBackNumberPerPcdEntry indicates the maximum number of callback function diff --git a/MdeModulePkg/MdeModulePkg.dsc b/MdeModulePkg/MdeModulePkg.dsc index 1014598f31..5b1f50e9c0 100644 --- a/MdeModulePkg/MdeModulePkg.dsc +++ b/MdeModulePkg/MdeModulePkg.dsc @@ -515,6 +515,9 @@ MdeModulePkg/Universal/RegularExpressionDxe/RegularExpressionDxe.inf MdeModulePkg/Universal/SmmCommunicationBufferDxe/SmmCommunicationBufferDxe.inf MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskDxe.inf + MdeModulePkg/Library/TraceHubDebugSysTLib/BaseTraceHubDebugSysTLib.inf + MdeModulePkg/Library/TraceHubDebugSysTLib/PeiTraceHubDebugSysTLib.inf + MdeModulePkg/Library/TraceHubDebugSysTLib/DxeSmmTraceHubDebugSysTLib.inf [Components.X64] MdeModulePkg/Universal/CapsulePei/CapsuleX64.inf diff --git a/MdeModulePkg/MdeModulePkg.uni b/MdeModulePkg/MdeModulePkg.uni index 33ce9f6198..a17d34d60b 100644 --- a/MdeModulePkg/MdeModulePkg.uni +++ b/MdeModulePkg/MdeModulePkg.uni @@ -1290,6 +1290,24 @@ " TRUE - UEFI Stack Guard will be enabled.<BR>\n" " FALSE - UEFI Stack Guard will be disabled.<BR>" +#string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdTraceHubDebugLevel_PROMPT #language en-US "Debug level of Trace Hub." + +#string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdTraceHubDebugLevel_HELP #language en-US "Indicate debug level of Trace Hub" + " 0x0 - TraceHubDebugLevelError.<BR>" + " 0x1 - TraceHubDebugLevelErrorWarning.<BR>" + " 0x2 - TraceHubDebugLevelErrorWarningInfo.<BR>" + " 0x3 - TraceHubDebugLevelErrorWarningInfoVerbose.<BR>" + +#string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdEnableTraceHubDebugMsg_PROMPT #language en-US "Flag to enable or disable Trace Hub message" + +#string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdEnableTraceHubDebugMsg_HELP #language en-US "Enable or Disable Trace Hub message" + " FALSE - Disable Trace Hub debug message.<BR>" + " TRUE - Enable Trace Hub debug message.<BR>" + +#string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdTraceHubDebugMmioAddress_PROMPT #language en-US "Output MMIO address of Trace Hub message" + +#string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdTraceHubDebugMmioAddress_HELP #language en-US "Indicate MMIO address where Trace Hub message output to." + #string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdSetNvStoreDefaultId_PROMPT #language en-US "NV Storage DefaultId" #string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdSetNvStoreDefaultId_HELP #language en-US "This dynamic PCD enables the default variable setting.\n" diff --git a/MdePkg/Include/Library/TraceHubDebugSysTLib.h b/MdePkg/Include/Library/TraceHubDebugSysTLib.h new file mode 100644 index 0000000000..7df20e67d6 --- /dev/null +++ b/MdePkg/Include/Library/TraceHubDebugSysTLib.h @@ -0,0 +1,81 @@ +/** @file +This header file declares Trace Hub related top level APIs. + +Copyright (c) 2023, Intel Corporation. All rights reserved.<BR> + +SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef TRACE_HUB_DEBUG_SYST_LIB_H_ +#define TRACE_HUB_DEBUG_SYST_LIB_H_ + +typedef enum { + SeverityNone = 0, + SeverityFatal = 1, + SeverityError = 2, + SeverityWarning = 3, + SeverityNormal = 4, + SeverityUser1 = 5, + SeverityUser2 = 6, + SeverityUser3 = 7, + SeverityMax +} TRACE_HUB_SEVERITY_TYPE; + +/** + Write debug string to specified Trace Hub MMIO address. + + @param[in] SeverityType Severity type of input message. + @param[in] Buffer A pointer to the data buffer. + @param[in] NumberOfBytes The size of data buffer. + + @retval RETURN_SUCCESS Data was written to Trace Hub. + @retval Other Failed to output Trace Hub message. +**/ +RETURN_STATUS +EFIAPI +TraceHubSysTDebugWrite ( + IN TRACE_HUB_SEVERITY_TYPE SeverityType, + IN UINT8 *Buffer, + IN UINTN NumberOfBytes + ); + +/** + Write catalog status code message to specified Trace Hub MMIO address. + + @param[in] SeverityType Severity type of input message. + @param[in] Id Catalog ID. + @param[in] Guid Driver Guid. + + @retval RETURN_SUCCESS Data was written to Trace Hub. + @retval Other Failed to output Trace Hub message. +**/ +RETURN_STATUS +EFIAPI +TraceHubSysTWriteCataLog64StatusCode ( + IN TRACE_HUB_SEVERITY_TYPE SeverityType, + IN UINT64 Id, + IN GUID *Guid + ); + +/** + Write catalog message to specified Trace Hub MMIO address. + + @param[in] SeverityType Severity type of input message. + @param[in] Id Catalog ID. + @param[in] NumberOfParams Number of entries in argument list. + @param[in] ... Catalog message parameters. + + @retval RETURN_SUCCESS Data was written to Trace Hub. + @retval Other Failed to output Trace Hub message. +**/ +RETURN_STATUS +EFIAPI +TraceHubSysTWriteCataLog64 ( + IN TRACE_HUB_SEVERITY_TYPE SeverityType, + IN UINT64 Id, + IN UINTN NumberOfParams, + ... + ); + +#endif // TRACE_HUB_DEBUG_SYST_LIB_H_ diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec index 9fcaacbcd8..0c27d671a6 100644 --- a/MdePkg/MdePkg.dec +++ b/MdePkg/MdePkg.dec @@ -294,6 +294,10 @@ # MipiSysTLib|Include/Library/MipiSysTLib.h + ## @libraryclass Provides API to output Trace Hub debug message. + # + TraceHubDebugSysTLib|Include/Library/TraceHubDebugSysTLib.h + [LibraryClasses.IA32, LibraryClasses.X64, LibraryClasses.AARCH64] ## @libraryclass Provides services to generate random number. # -- 2.40.0.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#103182): https://edk2.groups.io/g/devel/message/103182 Mute This Topic: https://groups.io/mt/98351449/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-