mirror of https://github.com/acidanthera/audk.git
246 lines
6.2 KiB
C
246 lines
6.2 KiB
C
/** @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;
|
|
}
|