REF: https://bugzilla.tianocore.org/show_bug.cgi?id=4144 This Library provides API to dump Trace Hub message. Cc: Michael D Kinney <michael.d.kinney@intel.com> Cc: Guo Gua <gua.guo@intel.com> Cc: Chan Laura <laura.chan@intel.com> Cc: Prakashan Krishnadas Veliyathuparambil <krishnadas.veliyathuparambil.prakashan@intel.com> Cc: K N Karthik <karthik.k.n@intel.com> Cc: Jian J Wang <jian.j.wang@intel.com> Cc: Liming Gao <gaoliming@byosoft.com.cn> Signed-off-by: Guo Gua <gua.guo@intel.com> Reviewed-by: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: K N Karthik <karthik.k.n@intel.com> Reviewed-by: Chan Laura <laura.chan@intel.com> Acked-by: Liming Gao <gaoliming@byosoft.com.cn>
		
			
				
	
	
		
			283 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			283 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @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;
 | |
| }
 |