mirror of https://github.com/acidanthera/audk.git
264 lines
7.2 KiB
C
264 lines
7.2 KiB
C
/** @file
|
|
System prints Trace Hub message in DXE/SMM based on fixed PCDs and 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"
|
|
|
|
GLOBAL_REMOVE_IF_UNREFERENCED TRACEHUB_DEBUG_INFO_HOB *mThDebugInstArray = NULL;
|
|
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 ((mDbgInstCount == 0) || (mThDebugInstArray == NULL)) {
|
|
return RETURN_ABORTED;
|
|
}
|
|
|
|
if (NumberOfBytes == 0) {
|
|
//
|
|
// No data need to be written to Trace Hub
|
|
//
|
|
return RETURN_SUCCESS;
|
|
}
|
|
|
|
if (Buffer == NULL) {
|
|
return RETURN_INVALID_PARAMETER;
|
|
}
|
|
|
|
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],
|
|
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;
|
|
UINTN Index;
|
|
RETURN_STATUS Status;
|
|
|
|
if ((mDbgInstCount == 0) || (mThDebugInstArray == NULL)) {
|
|
return RETURN_ABORTED;
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
for (Index = 0; Index < mDbgInstCount; Index++) {
|
|
Status = CheckWhetherToOutputMsg (
|
|
&MipiSystHandle,
|
|
(UINT8 *)&mThDebugInstArray[Index],
|
|
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;
|
|
|
|
if (NumberOfParams > sizeof (MipiSystHandle.systh_param) / sizeof (UINT32)) {
|
|
return RETURN_INVALID_PARAMETER;
|
|
}
|
|
|
|
if ((mDbgInstCount == 0) || (mThDebugInstArray == NULL)) {
|
|
return RETURN_ABORTED;
|
|
}
|
|
|
|
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 < mDbgInstCount; Index++) {
|
|
Status = CheckWhetherToOutputMsg (
|
|
&MipiSystHandle,
|
|
(UINT8 *)&mThDebugInstArray[Index],
|
|
SeverityType,
|
|
TraceHubCatalogType
|
|
);
|
|
if (!RETURN_ERROR (Status)) {
|
|
Status = MipiSystWriteCatalog (
|
|
&MipiSystHandle,
|
|
SeverityType,
|
|
Id
|
|
);
|
|
if (RETURN_ERROR (Status)) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return Status;
|
|
}
|
|
|
|
/**
|
|
Constructor to get TraceHob configuration data
|
|
|
|
@param ImageHandle The firmware allocated handle for the EFI image.
|
|
@param SystemTable A pointer to the EFI System Table.
|
|
|
|
@retval RETURN_SUCCESS The constructor always returns EFI_SUCCESS.
|
|
@retval RETURN_OUT_OF_RESOURCES There are not enough resources available to retrieve the matching FFS section.
|
|
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
DxeSmmTraceHubDebugSysTLibConstructor (
|
|
IN EFI_HANDLE ImageHandle,
|
|
IN EFI_SYSTEM_TABLE *SystemTable
|
|
)
|
|
{
|
|
if (mDbgInstCount == 0) {
|
|
mDbgInstCount = CountThDebugInstance ();
|
|
}
|
|
|
|
mThDebugInstArray = AllocateZeroPool (mDbgInstCount * sizeof (TRACEHUB_DEBUG_INFO_HOB));
|
|
|
|
if (mThDebugInstArray != NULL) {
|
|
PackThDebugInstance (mThDebugInstArray, mDbgInstCount);
|
|
} else {
|
|
return RETURN_OUT_OF_RESOURCES;
|
|
}
|
|
|
|
return RETURN_SUCCESS;
|
|
}
|