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