REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3105 This new library uses a platform agnostic algorithm to get CPU cache information. It provides user with an API(GetCpuCacheInfo) to get detailed CPU cache information by each package, each core type included in this package, and each cache level & type. This library can be used by code that produces SMBIOS_TABLE_TYPE7 SMBIOS table. Signed-off-by: Jason Lou <yun.lou@intel.com> Reviewed-by: Ray Ni <ray.ni@intel.com> Cc: Eric Dong <eric.dong@intel.com> Cc: Laszlo Ersek <lersek@redhat.com> Cc: Rahul Kumar <rahul1.kumar@intel.com>
		
			
				
	
	
		
			120 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  Provides cache info for each package, core type, cache level and cache type.
 | 
						|
 | 
						|
  Copyright (c) 2020 Intel Corporation. All rights reserved.<BR>
 | 
						|
  SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#include <PiPei.h>
 | 
						|
#include <Library/BaseLib.h>
 | 
						|
#include <Library/DebugLib.h>
 | 
						|
#include <Library/PeiServicesLib.h>
 | 
						|
#include <Library/PeiServicesTablePointerLib.h>
 | 
						|
#include <Library/CpuCacheInfoLib.h>
 | 
						|
#include <InternalCpuCacheInfoLib.h>
 | 
						|
 | 
						|
/**
 | 
						|
  Get EDKII_PEI_MP_SERVICES2_PPI pointer.
 | 
						|
 | 
						|
  @param[out] MpServices    A pointer to the buffer where EDKII_PEI_MP_SERVICES2_PPI is stored
 | 
						|
 | 
						|
  @retval EFI_SUCCESS       EDKII_PEI_MP_SERVICES2_PPI interface is returned
 | 
						|
  @retval EFI_NOT_FOUND     EDKII_PEI_MP_SERVICES2_PPI interface is not found
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
CpuCacheInfoGetMpServices (
 | 
						|
  OUT MP_SERVICES           *MpServices
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS                Status;
 | 
						|
 | 
						|
  Status = PeiServicesLocatePpi (&gEdkiiPeiMpServices2PpiGuid, 0, NULL, (VOID **)&MpServices->Ppi);
 | 
						|
  ASSERT_EFI_ERROR (Status);
 | 
						|
 | 
						|
  return Status;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Activate all of the logical processors.
 | 
						|
 | 
						|
  @param[in]  MpServices          MP_SERVICES structure.
 | 
						|
  @param[in]  Procedure           A pointer to the function to be run on enabled logical processors.
 | 
						|
  @param[in]  ProcedureArgument   The parameter passed into Procedure for all enabled logical processors.
 | 
						|
**/
 | 
						|
VOID
 | 
						|
CpuCacheInfoStartupAllCPUs (
 | 
						|
  IN MP_SERVICES            MpServices,
 | 
						|
  IN EFI_AP_PROCEDURE       Procedure,
 | 
						|
  IN VOID                   *ProcedureArgument
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS                Status;
 | 
						|
 | 
						|
  Status = MpServices.Ppi->StartupAllCPUs (MpServices.Ppi, Procedure, 0, ProcedureArgument);
 | 
						|
  ASSERT_EFI_ERROR (Status);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Get detailed information of the requested logical processor.
 | 
						|
 | 
						|
  @param[in]  MpServices          MP_SERVICES structure.
 | 
						|
  @param[in]  ProcessorNum        The requested logical processor number.
 | 
						|
  @param[out] ProcessorInfo       A pointer to the buffer where the processor information is stored
 | 
						|
**/
 | 
						|
VOID
 | 
						|
CpuCacheInfoGetProcessorInfo (
 | 
						|
  IN MP_SERVICES                MpServices,
 | 
						|
  IN UINTN                      ProcessorNum,
 | 
						|
  OUT EFI_PROCESSOR_INFORMATION *ProcessorInfo
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS                Status;
 | 
						|
 | 
						|
  Status = MpServices.Ppi->GetProcessorInfo (MpServices.Ppi, ProcessorNum, ProcessorInfo);
 | 
						|
  ASSERT_EFI_ERROR (Status);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Get the logical processor number.
 | 
						|
 | 
						|
  @param[in]  MpServices          MP_SERVICES structure.
 | 
						|
 | 
						|
  @retval  Return the logical processor number.
 | 
						|
**/
 | 
						|
UINT32
 | 
						|
CpuCacheInfoWhoAmI (
 | 
						|
  IN MP_SERVICES            MpServices
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS                Status;
 | 
						|
  UINTN                     ProcessorNum;
 | 
						|
 | 
						|
  Status = MpServices.Ppi->WhoAmI (MpServices.Ppi, &ProcessorNum);
 | 
						|
  ASSERT_EFI_ERROR (Status);
 | 
						|
 | 
						|
  return (UINT32)ProcessorNum;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Get the total number of logical processors in the platform.
 | 
						|
 | 
						|
  @param[in]  MpServices          MP_SERVICES structure.
 | 
						|
 | 
						|
  @retval  Return the total number of logical processors.
 | 
						|
**/
 | 
						|
UINT32
 | 
						|
CpuCacheInfoGetNumberOfProcessors (
 | 
						|
  IN MP_SERVICES            MpServices
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS                Status;
 | 
						|
  UINTN                     NumberOfProcessor;
 | 
						|
  UINTN                     NumberOfEnabledProcessor;
 | 
						|
 | 
						|
  Status = MpServices.Ppi->GetNumberOfProcessors (MpServices.Ppi, &NumberOfProcessor, &NumberOfEnabledProcessor);
 | 
						|
  ASSERT_EFI_ERROR (Status);
 | 
						|
 | 
						|
  return (UINT32)NumberOfProcessor;
 | 
						|
}
 |