/** @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.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #include #include #include #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; UINT32 Index; if (NumberOfBytes == 0) { // // No data need to be written to Trace Hub // return RETURN_SUCCESS; } if (Buffer == NULL) { return RETURN_INVALID_PARAMETER; } DbgInstCount = CountThDebugInstance (); ZeroMem (&MipiSystHandle, sizeof (MIPI_SYST_HANDLE)); MipiSystHandle.systh_header = &MipiSystHeader; Status = InitMipiSystHandle (&MipiSystHandle); if (RETURN_ERROR (Status)) { return Status; } for (Index = 0; Index < DbgInstCount; Index++) { Status = CheckWhetherToOutputMsg ( &MipiSystHandle, NULL, SeverityType, TraceHubDebugType ); if (!RETURN_ERROR (Status)) { Status = MipiSystWriteDebug ( &MipiSystHandle, SeverityType, (UINT16)NumberOfBytes, (CHAR8 *)Buffer ); if (RETURN_ERROR (Status)) { break; } } } return Status; } /** Write catalog status code message to specified Trace Hub MMIO address. @param[in] SeverityType Severity type of input message. @param[in] Id Catalog ID. @param[in] Guid Driver Guid. @retval RETURN_SUCCESS Data was written to Trace Hub. @retval Other Failed to output Trace Hub message. **/ RETURN_STATUS EFIAPI TraceHubSysTWriteCataLog64StatusCode ( IN TRACE_HUB_SEVERITY_TYPE SeverityType, IN UINT64 Id, IN GUID *Guid ) { MIPI_SYST_HANDLE MipiSystHandle; MIPI_SYST_HEADER MipiSystHeader; RETURN_STATUS Status; UINT32 DbgInstCount; UINT32 Index; if (Guid == NULL) { return RETURN_INVALID_PARAMETER; } DbgInstCount = CountThDebugInstance (); ZeroMem (&MipiSystHandle, sizeof (MIPI_SYST_HANDLE)); MipiSystHandle.systh_header = &MipiSystHeader; Status = InitMipiSystHandle (&MipiSystHandle); if (RETURN_ERROR (Status)) { return Status; } SwapBytesGuid (Guid, (GUID *)(VOID *)&MipiSystHandle.systh_guid); MipiSystHandle.systh_tag.et_guid = 1; for (Index = 0; Index < DbgInstCount; Index++) { Status = CheckWhetherToOutputMsg ( &MipiSystHandle, NULL, SeverityType, TraceHubCatalogType ); if (!RETURN_ERROR (Status)) { Status = MipiSystWriteCatalog ( &MipiSystHandle, SeverityType, Id ); if (RETURN_ERROR (Status)) { break; } } } return Status; } /** Write catalog message to specified Trace Hub MMIO address. @param[in] SeverityType Severity type of input message. @param[in] Id Catalog ID. @param[in] NumberOfParams Number of entries in argument list. @param[in] ... Catalog message parameters. @retval RETURN_SUCCESS Data was written to Trace Hub. @retval Other Failed to output Trace Hub message. **/ RETURN_STATUS EFIAPI TraceHubSysTWriteCataLog64 ( IN TRACE_HUB_SEVERITY_TYPE SeverityType, IN UINT64 Id, IN UINTN NumberOfParams, ... ) { MIPI_SYST_HANDLE MipiSystHandle; MIPI_SYST_HEADER MipiSystHeader; VA_LIST Args; UINTN Index; RETURN_STATUS Status; UINT32 DbgInstCount; DbgInstCount = 0; if (NumberOfParams > sizeof (MipiSystHandle.systh_param) / sizeof (UINT32)) { return RETURN_INVALID_PARAMETER; } DbgInstCount = CountThDebugInstance (); ZeroMem (&MipiSystHandle, sizeof (MIPI_SYST_HANDLE)); MipiSystHandle.systh_header = &MipiSystHeader; Status = InitMipiSystHandle (&MipiSystHandle); if (RETURN_ERROR (Status)) { return Status; } MipiSystHandle.systh_param_count = (UINT32)NumberOfParams; VA_START (Args, NumberOfParams); for (Index = 0; Index < NumberOfParams; Index++) { MipiSystHandle.systh_param[Index] = VA_ARG (Args, UINT32); } VA_END (Args); for (Index = 0; Index < DbgInstCount; Index++) { Status = CheckWhetherToOutputMsg ( &MipiSystHandle, NULL, SeverityType, TraceHubCatalogType ); if (!RETURN_ERROR (Status)) { Status = MipiSystWriteCatalog ( &MipiSystHandle, SeverityType, Id ); if (RETURN_ERROR (Status)) { break; } } } return Status; } /** Collect the total number of Trace Hub debug instance in the system. @retval UINT32 The total number of Trace Hub debug instance in the system. **/ UINT32 EFIAPI CountThDebugInstance ( VOID ) { UINT32 DbgInstCount; // // 1 from PCD. // DbgInstCount = 1; return DbgInstCount; }