blob: 6d5d2b2d632e85a7c9db7ee3efe6df547800da9f [file] [log] [blame]
/** @file
SMM MP perf-logging implementation
Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include "PiSmmCpuDxeSmm.h"
#define SMM_MP_PERF_PROCEDURE_NAME(procedure) # procedure
GLOBAL_REMOVE_IF_UNREFERENCED
CHAR8 *gSmmMpPerfProcedureName[] = {
SMM_MP_PERF_PROCEDURE_LIST (SMM_MP_PERF_PROCEDURE_NAME)
};
//
// Each element holds the performance data for one processor.
//
GLOBAL_REMOVE_IF_UNREFERENCED
SMM_PERF_AP_PROCEDURE_PERFORMANCE *mSmmMpProcedurePerformance = NULL;
/**
Initialize the perf-logging feature for APs.
@param NumberofCpus Number of processors in the platform.
**/
VOID
InitializeMpPerf (
UINTN NumberofCpus
)
{
mSmmMpProcedurePerformance = AllocateZeroPool (NumberofCpus * sizeof (*mSmmMpProcedurePerformance));
ASSERT (mSmmMpProcedurePerformance != NULL);
}
/**
Migrate MP performance data to standardized performance database.
@param NumberofCpus Number of processors in the platform.
@param BspIndex The index of the BSP.
**/
VOID
MigrateMpPerf (
UINTN NumberofCpus,
UINTN BspIndex
)
{
UINTN CpuIndex;
UINTN MpProcecureId;
for (CpuIndex = 0; CpuIndex < NumberofCpus; CpuIndex++) {
if ((CpuIndex != BspIndex) && !FeaturePcdGet (PcdSmmApPerfLogEnable)) {
//
// Skip migrating AP performance data if AP perf-logging is disabled.
//
continue;
}
for (MpProcecureId = 0; MpProcecureId < SMM_MP_PERF_PROCEDURE_ID (SmmMpProcedureMax); MpProcecureId++) {
if (mSmmMpProcedurePerformance[CpuIndex].Begin[MpProcecureId] != 0) {
PERF_START (NULL, gSmmMpPerfProcedureName[MpProcecureId], NULL, mSmmMpProcedurePerformance[CpuIndex].Begin[MpProcecureId]);
PERF_END (NULL, gSmmMpPerfProcedureName[MpProcecureId], NULL, mSmmMpProcedurePerformance[CpuIndex].End[MpProcecureId]);
}
}
}
ZeroMem (mSmmMpProcedurePerformance, NumberofCpus * sizeof (*mSmmMpProcedurePerformance));
}
/**
Save the performance counter value before running the MP procedure.
@param CpuIndex The index of the CPU.
@param MpProcedureId The ID of the MP procedure.
**/
VOID
MpPerfBegin (
IN UINTN CpuIndex,
IN UINTN MpProcedureId
)
{
mSmmMpProcedurePerformance[CpuIndex].Begin[MpProcedureId] = GetPerformanceCounter ();
}
/**
Save the performance counter value after running the MP procedure.
@param CpuIndex The index of the CPU.
@param MpProcedureId The ID of the MP procedure.
**/
VOID
MpPerfEnd (
IN UINTN CpuIndex,
IN UINTN MpProcedureId
)
{
mSmmMpProcedurePerformance[CpuIndex].End[MpProcedureId] = GetPerformanceCounter ();
}