/** @file
This file is PeiCpuPolicy library.
Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include "PeiCpuPolicyLibrary.h"
#include
#include
#include
#include
#include
#include
/**
Load Config block default
@param[in] ConfigBlockPointer Pointer to config block
**/
VOID
LoadCpuConfigDefault (
IN VOID *ConfigBlockPointer
)
{
CPU_CONFIG *CpuConfig;
CpuConfig = ConfigBlockPointer;
DEBUG ((DEBUG_INFO, "CpuConfig->Header.GuidHob.Name = %g\n", &CpuConfig->Header.GuidHob.Name));
DEBUG ((DEBUG_INFO, "CpuConfig->Header.GuidHob.Header.HobLength = 0x%x\n", CpuConfig->Header.GuidHob.Header.HobLength));
/********************************
CPU configuration
********************************/
CpuConfig->AesEnable = CPU_FEATURE_ENABLE;
CpuConfig->EnableRsr = CPU_FEATURE_ENABLE;
CpuConfig->SmmbaseSwSmiNumber = (UINTN) PcdGet8 (PcdSmmbaseSwSmi);
//
// This function is shared by both non-FSP and FSP scenarios and always executed unconditionally.
// Since FSP/silicon code should not unconditionally access any hardcoding flash regions (that region might not be accessible
// in unknown platforms), the microcode location searching code should be moved to outside silicon code scope.
//
CpuConfig->MicrocodePatchAddress = 0;
}
/**
Load Config block default
@param[in] ConfigBlockPointer Pointer to config block
**/
VOID
LoadCpuPowerMgmtBasicConfigDefault (
IN VOID *ConfigBlockPointer
)
{
CPU_POWER_MGMT_BASIC_CONFIG *CpuPowerMgmtBasicConfig;
CPU_SKU CpuSku;
MSR_REGISTER TempMsr;
CpuPowerMgmtBasicConfig = ConfigBlockPointer;
CpuSku = GetCpuSku();
DEBUG ((DEBUG_INFO, "CpuPowerMgmtBasicConfig->Header.GuidHob.Name = %g\n", &CpuPowerMgmtBasicConfig->Header.GuidHob.Name));
DEBUG ((DEBUG_INFO, "CpuPowerMgmtBasicConfig->Header.GuidHob.Header.HobLength = 0x%x\n", CpuPowerMgmtBasicConfig->Header.GuidHob.Header.HobLength));
/********************************
CPU Power Management Basic configuration
********************************/
CpuPowerMgmtBasicConfig->Hwp = TRUE;
CpuPowerMgmtBasicConfig->HdcControl = TRUE;
CpuPowerMgmtBasicConfig->PowerLimit2 = TRUE;
CpuPowerMgmtBasicConfig->PowerLimit3Lock = TRUE;
///
/// Initialize RATL (Runtime Average Temperature Limit) Config for SKL Y series.
///
if (CpuSku == EnumCpuUlx) {
CpuPowerMgmtBasicConfig->TccActivationOffset = 10;
CpuPowerMgmtBasicConfig->TccOffsetTimeWindowForRatl = 5000; // 5 sec
CpuPowerMgmtBasicConfig->TccOffsetClamp = CPU_FEATURE_ENABLE;
}
CpuPowerMgmtBasicConfig->TurboMode = TRUE;
TempMsr.Qword = AsmReadMsr64 (MSR_TURBO_RATIO_LIMIT);
CpuPowerMgmtBasicConfig->OneCoreRatioLimit = TempMsr.Bytes.FirstByte;
CpuPowerMgmtBasicConfig->TwoCoreRatioLimit = TempMsr.Bytes.SecondByte;
CpuPowerMgmtBasicConfig->ThreeCoreRatioLimit = TempMsr.Bytes.ThirdByte;
CpuPowerMgmtBasicConfig->FourCoreRatioLimit = TempMsr.Bytes.FouthByte;
CpuPowerMgmtBasicConfig->FiveCoreRatioLimit = TempMsr.Bytes.FifthByte;
CpuPowerMgmtBasicConfig->SixCoreRatioLimit = TempMsr.Bytes.SixthByte;
CpuPowerMgmtBasicConfig->SevenCoreRatioLimit = TempMsr.Bytes.SeventhByte;
CpuPowerMgmtBasicConfig->EightCoreRatioLimit = TempMsr.Bytes.EighthByte;
}
/**
Load Config block default
@param[in] ConfigBlockPointer Pointer to config block
**/
VOID
LoadCpuPowerMgmtCustomConfigDefault (
IN VOID *ConfigBlockPointer
)
{
CPU_POWER_MGMT_CUSTOM_CONFIG *CpuPowerMgmtCustomConfig;
CpuPowerMgmtCustomConfig = ConfigBlockPointer;
DEBUG ((DEBUG_INFO, "CpuPowerMgmtCustomConfig->Header.GuidHob.Name = %g\n", &CpuPowerMgmtCustomConfig->Header.GuidHob.Name));
DEBUG ((DEBUG_INFO, "CpuPowerMgmtCustomConfig->Header.GuidHob.Header.HobLength = 0x%x\n", CpuPowerMgmtCustomConfig->Header.GuidHob.Header.HobLength));
/********************************
CPU Power Management Custom configuration
********************************/
CpuPowerMgmtCustomConfig->CustomRatioTable.Cpuid = (UINT16) ((GetCpuFamily() | GetCpuStepping()) & (0x0FFF));
}
/**
Load Config block default
@param[in] ConfigBlockPointer Pointer to config block
**/
VOID
LoadCpuTestConfigDefault (
IN VOID *ConfigBlockPointer
)
{
CPU_TEST_CONFIG *CpuTestConfig;
CPU_SKU CpuSku;
CpuTestConfig = ConfigBlockPointer;
DEBUG ((DEBUG_INFO, "CpuTestConfig->Header.GuidHob.Name = %g\n", &CpuTestConfig->Header.GuidHob.Name));
DEBUG ((DEBUG_INFO, "CpuTestConfig->Header.GuidHob.Header.HobLength = 0x%x\n", CpuTestConfig->Header.GuidHob.Header.HobLength));
CpuSku = GetCpuSku();
/********************************
CPU Test configuration
********************************/
CpuTestConfig->MlcStreamerPrefetcher = CPU_FEATURE_ENABLE;
CpuTestConfig->MlcSpatialPrefetcher = CPU_FEATURE_ENABLE;
CpuTestConfig->MonitorMwaitEnable = CPU_FEATURE_ENABLE;
CpuTestConfig->MachineCheckEnable = CPU_FEATURE_ENABLE;
CpuTestConfig->DebugInterfaceLockEnable = CPU_FEATURE_ENABLE;
CpuTestConfig->ApIdleManner = 2; // AP Idle Manner default as Mwait Loop
CpuTestConfig->ApHandoffManner = 2; // AP Handoff to OS default as Mwait Loop
///
/// Processor Trace
///
CpuTestConfig->ProcTraceMemSize = EnumProcTraceMemDisable;
/**
This policy should be used to enable or disable Voltage Optimization feature.
Recommended defaults:
Enable - For Mobile SKUs(U/Y)
Disable - Rest of all SKUs other than Mobile.
**/
if ((CpuSku == EnumCpuUlx) || (CpuSku == EnumCpuUlt)){
CpuTestConfig->VoltageOptimization = CPU_FEATURE_ENABLE;
} else {
CpuTestConfig->VoltageOptimization = CPU_FEATURE_DISABLE;
}
}
/**
Load Config block default
@param[in] ConfigBlockPointer Pointer to config block
**/
VOID
LoadCpuPidTestConfigDefault (
IN VOID *ConfigBlockPointer
)
{
CPU_PID_TEST_CONFIG *CpuPidTestConfig;
CpuPidTestConfig = ConfigBlockPointer;
DEBUG ((DEBUG_INFO, "CpuPidTestConfig->Header.GuidHob.Name = %g\n", &CpuPidTestConfig->Header.GuidHob.Name));
DEBUG ((DEBUG_INFO, "CpuPidTestConfig->Header.GuidHob.Header.HobLength = 0x%x\n", CpuPidTestConfig->Header.GuidHob.Header.HobLength));
/********************************
CPU PID Test configuration
********************************/
}
/**
Load Config block default
@param[in] ConfigBlockPointer Pointer to config block
**/
VOID
LoadCpuPowerMgmtTestConfigDefault (
IN VOID *ConfigBlockPointer
)
{
CPU_POWER_MGMT_TEST_CONFIG *CpuPowerMgmtTestConfig;
CPU_FAMILY CpuFamily;
CpuPowerMgmtTestConfig = ConfigBlockPointer;
DEBUG ((DEBUG_INFO, "CpuPowerMgmtTestConfig->Header.GuidHob.Name = %g\n", &CpuPowerMgmtTestConfig->Header.GuidHob.Name));
DEBUG ((DEBUG_INFO, "CpuPowerMgmtTestConfig->Header.GuidHob.Header.HobLength = 0x%x\n", CpuPowerMgmtTestConfig->Header.GuidHob.Header.HobLength));
/********************************
CPU Power Management Test configuration
********************************/
CpuPowerMgmtTestConfig->Eist = TRUE;
CpuPowerMgmtTestConfig->EnergyEfficientPState = TRUE;
CpuPowerMgmtTestConfig->EnergyEfficientTurbo = TRUE;
CpuPowerMgmtTestConfig->BiProcHot = TRUE;
CpuPowerMgmtTestConfig->DisableProcHotOut = TRUE;
CpuPowerMgmtTestConfig->AutoThermalReporting = TRUE;
CpuPowerMgmtTestConfig->ThermalMonitor = TRUE;
CpuPowerMgmtTestConfig->Cx = TRUE;
CpuPowerMgmtTestConfig->PmgCstCfgCtrlLock = TRUE;
CpuPowerMgmtTestConfig->C1e = TRUE;
CpuPowerMgmtTestConfig->C1AutoDemotion = TRUE;
CpuPowerMgmtTestConfig->C1UnDemotion = TRUE;
CpuPowerMgmtTestConfig->C3AutoDemotion = TRUE;
CpuPowerMgmtTestConfig->C3UnDemotion = TRUE;
CpuPowerMgmtTestConfig->PkgCStateDemotion = TRUE;
CpuPowerMgmtTestConfig->PkgCStateUnDemotion = TRUE;
CpuPowerMgmtTestConfig->CStatePreWake = TRUE;
CpuPowerMgmtTestConfig->RaceToHalt = TRUE;
CpuPowerMgmtTestConfig->CstateLatencyControl0Irtl = C3_LATENCY;
CpuPowerMgmtTestConfig->CstateLatencyControl1Irtl = C6_C7_SHORT_LATENCY;
CpuPowerMgmtTestConfig->CstateLatencyControl2Irtl = C6_C7_LONG_LATENCY;
CpuPowerMgmtTestConfig->CstateLatencyControl3Irtl = C8_LATENCY;
CpuPowerMgmtTestConfig->CstateLatencyControl4Irtl = C9_LATENCY;
//
// If PS4 is disabled, program 2750us to MSR_C_STATE_LATENCY_CONTROL_5
//
CpuPowerMgmtTestConfig->CstateLatencyControl5Irtl = C10_LATENCY;
CpuPowerMgmtTestConfig->PkgCStateLimit = PkgAuto;
CpuPowerMgmtTestConfig->CstateLatencyControl0TimeUnit = TimeUnit1024ns;
CpuPowerMgmtTestConfig->CstateLatencyControl1TimeUnit = TimeUnit1024ns;
CpuPowerMgmtTestConfig->CstateLatencyControl2TimeUnit = TimeUnit1024ns;
CpuPowerMgmtTestConfig->CstateLatencyControl3TimeUnit = TimeUnit1024ns;
CpuPowerMgmtTestConfig->CstateLatencyControl4TimeUnit = TimeUnit1024ns;
CpuPowerMgmtTestConfig->CstateLatencyControl5TimeUnit = TimeUnit1024ns;
CpuPowerMgmtTestConfig->CustomPowerUnit = PowerUnit125MilliWatts;
CpuPowerMgmtTestConfig->PpmIrmSetting = PpmIrmPairFixedPriority;
//
// Pkg C-state Demotion/Un Demotion
//
CpuFamily = GetCpuFamily();
if((CpuFamily == EnumCpuSklUltUlx) || (CpuFamily == EnumCpuSklDtHalo)){
CpuPowerMgmtTestConfig->PkgCStateDemotion = TRUE;
} else if((CpuFamily == EnumCpuKblUltUlx) || (CpuFamily == EnumCpuKblDtHalo)) {
CpuPowerMgmtTestConfig->PkgCStateDemotion = FALSE;
}
if((CpuFamily == EnumCpuSklUltUlx) || (CpuFamily == EnumCpuSklDtHalo)){
CpuPowerMgmtTestConfig->PkgCStateDemotion = TRUE;
} else if((CpuFamily == EnumCpuKblUltUlx) || (CpuFamily == EnumCpuKblDtHalo)) {
CpuPowerMgmtTestConfig->PkgCStateDemotion = FALSE;
}
}
static COMPONENT_BLOCK_ENTRY mCpuIpBlocks [] = {
{&gCpuConfigGuid, sizeof (CPU_CONFIG), CPU_CONFIG_REVISION, LoadCpuConfigDefault},
{&gCpuPowerMgmtBasicConfigGuid, sizeof (CPU_POWER_MGMT_BASIC_CONFIG), CPU_POWER_MGMT_BASIC_CONFIG_REVISION, LoadCpuPowerMgmtBasicConfigDefault},
{&gCpuPowerMgmtCustomConfigGuid, sizeof (CPU_POWER_MGMT_CUSTOM_CONFIG), CPU_POWER_MGMT_CUSTOM_CONFIG_REVISION, LoadCpuPowerMgmtCustomConfigDefault},
{&gCpuTestConfigGuid, sizeof (CPU_TEST_CONFIG), CPU_TEST_CONFIG_REVISION, LoadCpuTestConfigDefault},
{&gCpuPidTestConfigGuid, sizeof (CPU_PID_TEST_CONFIG), CPU_PID_TEST_CONFIG_REVISION, LoadCpuPidTestConfigDefault},
{&gCpuPowerMgmtTestConfigGuid, sizeof (CPU_POWER_MGMT_TEST_CONFIG), CPU_POWER_MGMT_TEST_CONFIG_REVISION, LoadCpuPowerMgmtTestConfigDefault},
};
/**
Get CPU config block table total size.
@retval Size of CPU config block table
**/
UINT16
EFIAPI
CpuGetConfigBlockTotalSize (
VOID
)
{
return GetComponentConfigBlockTotalSize (&mCpuIpBlocks[0], sizeof (mCpuIpBlocks) / sizeof (COMPONENT_BLOCK_ENTRY));
}
/**
CpuAddConfigBlocks add all Cpu config blocks.
@param[in] ConfigBlockTableAddress The pointer to add CPU config blocks
@retval EFI_SUCCESS The policy default is initialized.
@retval EFI_OUT_OF_RESOURCES Insufficient resources to create buffer
**/
EFI_STATUS
EFIAPI
CpuAddConfigBlocks (
IN VOID *ConfigBlockTableAddress
)
{
EFI_STATUS Status;
DEBUG((DEBUG_INFO, "CPU Post-Mem Entry \n"));
PostCode (0xC00);
Status = AddComponentConfigBlocks (ConfigBlockTableAddress, &mCpuIpBlocks[0], sizeof (mCpuIpBlocks) / sizeof (COMPONENT_BLOCK_ENTRY));
DEBUG ((DEBUG_INFO, "CpuAddConfigBlocks Done \n"));
PostCode (0xC09);
return Status;
}