blob: e68fb8b2426dc35c2c9fd98bcc498438cb99f2e0 [file] [log] [blame]
/** @file
System prints Trace Hub message in PEI based on fixed PCDs and HOB.
System applies Trace Hub HOB once it detect gTraceHubDebugInfoHobGuid HOB.
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 *DbgContext;
UINTN Index;
UINT32 DbgInstCount;
UINT8 *ThDebugInfo;
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;
}
DbgContext = (UINT8 *)GetFirstGuidHob (&gTraceHubDebugInfoHobGuid);
if (DbgContext != NULL) {
ThDebugInfo = GET_GUID_HOB_DATA (DbgContext);
} else {
ThDebugInfo = NULL;
}
for (Index = 0; Index < DbgInstCount; Index++) {
Status = CheckWhetherToOutputMsg (
&MipiSystHandle,
ThDebugInfo,
SeverityType,
TraceHubDebugType
);
if (!RETURN_ERROR (Status)) {
Status = MipiSystWriteDebug (
&MipiSystHandle,
SeverityType,
(UINT16)NumberOfBytes,
(CHAR8 *)Buffer
);
if (RETURN_ERROR (Status)) {
break;
}
}
if (DbgContext != NULL) {
DbgContext = (UINT8 *)GetNextGuidHob (&gTraceHubDebugInfoHobGuid, GET_NEXT_HOB (DbgContext));
if (DbgContext == NULL) {
break;
}
ThDebugInfo = GET_GUID_HOB_DATA (DbgContext);
}
}
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 *DbgContext;
RETURN_STATUS Status;
UINTN Index;
UINT8 *ThDebugInfo;
DbgInstCount = CountThDebugInstance ();
ZeroMem (&MipiSystHandle, sizeof (MIPI_SYST_HANDLE));
MipiSystHandle.systh_header = &MipiSystHeader;
Status = InitMipiSystHandle (&MipiSystHandle);
if (RETURN_ERROR (Status)) {
return Status;
}
if (Guid != NULL) {
SwapBytesGuid (Guid, (GUID *)(VOID *)&MipiSystHandle.systh_guid);
MipiSystHandle.systh_tag.et_guid = 1;
} else {
MipiSystHandle.systh_tag.et_modunit = 2;
MipiSystHandle.systh_tag.et_guid = 0;
}
DbgContext = (UINT8 *)GetFirstGuidHob (&gTraceHubDebugInfoHobGuid);
if (DbgContext != NULL) {
ThDebugInfo = GET_GUID_HOB_DATA (DbgContext);
} else {
ThDebugInfo = NULL;
}
for (Index = 0; Index < DbgInstCount; Index++) {
Status = CheckWhetherToOutputMsg (
&MipiSystHandle,
ThDebugInfo,
SeverityType,
TraceHubCatalogType
);
if (!RETURN_ERROR (Status)) {
Status = MipiSystWriteCatalog (
&MipiSystHandle,
SeverityType,
Id
);
if (RETURN_ERROR (Status)) {
break;
}
}
if (DbgContext != NULL) {
DbgContext = (UINT8 *)GetNextGuidHob (&gTraceHubDebugInfoHobGuid, GET_NEXT_HOB (DbgContext));
if (DbgContext == NULL) {
break;
}
ThDebugInfo = GET_GUID_HOB_DATA (DbgContext);
}
}
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 *DbgContext;
RETURN_STATUS Status;
UINT8 *ThDebugInfo;
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);
DbgContext = (UINT8 *)GetFirstGuidHob (&gTraceHubDebugInfoHobGuid);
if (DbgContext != NULL) {
ThDebugInfo = GET_GUID_HOB_DATA (DbgContext);
} else {
ThDebugInfo = NULL;
}
for (Index = 0; Index < DbgInstCount; Index++) {
Status = CheckWhetherToOutputMsg (
&MipiSystHandle,
ThDebugInfo,
SeverityType,
TraceHubCatalogType
);
if (!RETURN_ERROR (Status)) {
Status = MipiSystWriteCatalog (
&MipiSystHandle,
SeverityType,
Id
);
if (RETURN_ERROR (Status)) {
break;
}
}
if (DbgContext != NULL) {
DbgContext = (UINT8 *)GetNextGuidHob (&gTraceHubDebugInfoHobGuid, GET_NEXT_HOB (DbgContext));
if (DbgContext == NULL) {
break;
}
ThDebugInfo = GET_GUID_HOB_DATA (DbgContext);
}
}
return Status;
}