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;
 | 
						|
}
 |