/** @file | |
System prints Trace Hub message in SEC/PEI/DXE/SMM based on fixed PCDs. | |
Only support single Trace Hub debug instance. | |
Copyright (c) 2023, Intel Corporation. All rights reserved.<BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#include <Base.h> | |
#include <Library/BaseLib.h> | |
#include <Library/PcdLib.h> | |
#include <Library/BaseMemoryLib.h> | |
#include <Library/TraceHubDebugSysTLib.h> | |
#include <Library/MipiSysTLib.h> | |
#include <Library/MipiSysTLib/mipi_syst.h> | |
#include <Guid/TraceHubDebugInfoHob.h> | |
#include "InternalTraceHubApiCommon.h" | |
#include "InternalTraceHubApi.h" | |
/** | |
Write debug string to specified Trace Hub MMIO address. | |
@param[in] SeverityType Severity type of input message. | |
@param[in] Buffer A pointer to the data buffer. | |
@param[in] NumberOfBytes The size of data buffer. | |
@retval RETURN_SUCCESS Data was written to Trace Hub. | |
@retval Other Failed to output Trace Hub message. | |
**/ | |
RETURN_STATUS | |
EFIAPI | |
TraceHubSysTDebugWrite ( | |
IN TRACE_HUB_SEVERITY_TYPE SeverityType, | |
IN UINT8 *Buffer, | |
IN UINTN NumberOfBytes | |
) | |
{ | |
MIPI_SYST_HANDLE MipiSystHandle; | |
MIPI_SYST_HEADER MipiSystHeader; | |
RETURN_STATUS Status; | |
UINT32 DbgInstCount; | |
UINT16 Index; | |
if (NumberOfBytes == 0) { | |
// | |
// No data need to be written to Trace Hub | |
// | |
return RETURN_SUCCESS; | |
} | |
if (Buffer == NULL) { | |
return RETURN_INVALID_PARAMETER; | |
} | |
DbgInstCount = CountThDebugInstance (); | |
ZeroMem (&MipiSystHandle, sizeof (MIPI_SYST_HANDLE)); | |
MipiSystHandle.systh_header = &MipiSystHeader; | |
Status = InitMipiSystHandle (&MipiSystHandle); | |
if (RETURN_ERROR (Status)) { | |
return Status; | |
} | |
for (Index = 0; Index < DbgInstCount; Index++) { | |
Status = CheckWhetherToOutputMsg ( | |
&MipiSystHandle, | |
NULL, | |
SeverityType, | |
TraceHubDebugType | |
); | |
if (!RETURN_ERROR (Status)) { | |
Status = MipiSystWriteDebug ( | |
&MipiSystHandle, | |
SeverityType, | |
(UINT16)NumberOfBytes, | |
(CHAR8 *)Buffer | |
); | |
if (RETURN_ERROR (Status)) { | |
break; | |
} | |
} | |
} | |
return Status; | |
} | |
/** | |
Write catalog status code message to specified Trace Hub MMIO address. | |
@param[in] SeverityType Severity type of input message. | |
@param[in] Id Catalog ID. | |
@param[in] Guid Driver Guid. | |
@retval RETURN_SUCCESS Data was written to Trace Hub. | |
@retval Other Failed to output Trace Hub message. | |
**/ | |
RETURN_STATUS | |
EFIAPI | |
TraceHubSysTWriteCataLog64StatusCode ( | |
IN TRACE_HUB_SEVERITY_TYPE SeverityType, | |
IN UINT64 Id, | |
IN GUID *Guid | |
) | |
{ | |
MIPI_SYST_HANDLE MipiSystHandle; | |
MIPI_SYST_HEADER MipiSystHeader; | |
RETURN_STATUS Status; | |
UINT32 DbgInstCount; | |
UINT16 Index; | |
if (Guid == NULL) { | |
return RETURN_INVALID_PARAMETER; | |
} | |
DbgInstCount = CountThDebugInstance (); | |
ZeroMem (&MipiSystHandle, sizeof (MIPI_SYST_HANDLE)); | |
MipiSystHandle.systh_header = &MipiSystHeader; | |
Status = InitMipiSystHandle (&MipiSystHandle); | |
if (RETURN_ERROR (Status)) { | |
return Status; | |
} | |
SwapBytesGuid (Guid, (GUID *)(VOID *)&MipiSystHandle.systh_guid); | |
MipiSystHandle.systh_tag.et_guid = 1; | |
for (Index = 0; Index < DbgInstCount; Index++) { | |
Status = CheckWhetherToOutputMsg ( | |
&MipiSystHandle, | |
NULL, | |
SeverityType, | |
TraceHubCatalogType | |
); | |
if (!RETURN_ERROR (Status)) { | |
Status = MipiSystWriteCatalog ( | |
&MipiSystHandle, | |
SeverityType, | |
Id | |
); | |
if (RETURN_ERROR (Status)) { | |
break; | |
} | |
} | |
} | |
return Status; | |
} | |
/** | |
Write catalog message to specified Trace Hub MMIO address. | |
@param[in] SeverityType Severity type of input message. | |
@param[in] Id Catalog ID. | |
@param[in] NumberOfParams Number of entries in argument list. | |
@param[in] ... Catalog message parameters. | |
@retval RETURN_SUCCESS Data was written to Trace Hub. | |
@retval Other Failed to output Trace Hub message. | |
**/ | |
RETURN_STATUS | |
EFIAPI | |
TraceHubSysTWriteCataLog64 ( | |
IN TRACE_HUB_SEVERITY_TYPE SeverityType, | |
IN UINT64 Id, | |
IN UINTN NumberOfParams, | |
... | |
) | |
{ | |
MIPI_SYST_HANDLE MipiSystHandle; | |
MIPI_SYST_HEADER MipiSystHeader; | |
VA_LIST Args; | |
UINTN Index; | |
RETURN_STATUS Status; | |
UINT32 DbgInstCount; | |
DbgInstCount = 0; | |
if (NumberOfParams > sizeof (MipiSystHandle.systh_param) / sizeof (UINT32)) { | |
return RETURN_INVALID_PARAMETER; | |
} | |
DbgInstCount = CountThDebugInstance (); | |
ZeroMem (&MipiSystHandle, sizeof (MIPI_SYST_HANDLE)); | |
MipiSystHandle.systh_header = &MipiSystHeader; | |
Status = InitMipiSystHandle (&MipiSystHandle); | |
if (RETURN_ERROR (Status)) { | |
return Status; | |
} | |
MipiSystHandle.systh_param_count = (UINT32)NumberOfParams; | |
VA_START (Args, NumberOfParams); | |
for (Index = 0; Index < NumberOfParams; Index++) { | |
MipiSystHandle.systh_param[Index] = VA_ARG (Args, UINT32); | |
} | |
VA_END (Args); | |
for (Index = 0; Index < DbgInstCount; Index++) { | |
Status = CheckWhetherToOutputMsg ( | |
&MipiSystHandle, | |
NULL, | |
SeverityType, | |
TraceHubCatalogType | |
); | |
if (!RETURN_ERROR (Status)) { | |
Status = MipiSystWriteCatalog ( | |
&MipiSystHandle, | |
SeverityType, | |
Id | |
); | |
if (RETURN_ERROR (Status)) { | |
break; | |
} | |
} | |
} | |
return Status; | |
} | |
/** | |
Collect the total number of Trace Hub debug instance in the system. | |
@retval UINT32 The total number of Trace Hub debug instance in the system. | |
**/ | |
UINT32 | |
EFIAPI | |
CountThDebugInstance ( | |
VOID | |
) | |
{ | |
UINT32 DbgInstCount; | |
// | |
// 1 from PCD. | |
// | |
DbgInstCount = 1; | |
return DbgInstCount; | |
} |