| /** @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; | |
| } |