diff options
author | raywu <raywu0301@gmail.com> | 2018-06-15 00:00:50 +0800 |
---|---|---|
committer | raywu <raywu0301@gmail.com> | 2018-06-15 00:00:50 +0800 |
commit | b7c51c9cf4864df6aabb99a1ae843becd577237c (patch) | |
tree | eebe9b0d0ca03062955223097e57da84dd618b9a /Board/CPU/CpuRcPolicyWrap/CpuRcPolicyDxe.c | |
download | zprj-b7c51c9cf4864df6aabb99a1ae843becd577237c.tar.xz |
Diffstat (limited to 'Board/CPU/CpuRcPolicyWrap/CpuRcPolicyDxe.c')
-rw-r--r-- | Board/CPU/CpuRcPolicyWrap/CpuRcPolicyDxe.c | 742 |
1 files changed, 742 insertions, 0 deletions
diff --git a/Board/CPU/CpuRcPolicyWrap/CpuRcPolicyDxe.c b/Board/CPU/CpuRcPolicyWrap/CpuRcPolicyDxe.c new file mode 100644 index 0000000..033ed88 --- /dev/null +++ b/Board/CPU/CpuRcPolicyWrap/CpuRcPolicyDxe.c @@ -0,0 +1,742 @@ +//********************************************************************** +//********************************************************************** +//** ** +//** (C)Copyright 1987-2013, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//********************************************************************** +//********************************************************************** + +//********************************************************************** +// $Header: /Alaska/SOURCE/Modules/SharkBayRefCodes/Haswell/AMI Cpu PKG/CPU Board/CpuRcPolicyWrap/CpuRcPolicyDxe.c 26 4/10/15 4:08a Crystallee $ +// +// $Revision: 26 $ +// +// $Date: 4/10/15 4:08a $ +//********************************************************************** +// Revision History +// ---------------- +// $Log: /Alaska/SOURCE/Modules/SharkBayRefCodes/Haswell/AMI Cpu PKG/CPU Board/CpuRcPolicyWrap/CpuRcPolicyDxe.c $ +// +// 26 4/10/15 4:08a Crystallee +// +// 25 1/22/15 4:34a Crystallee +// +// 24 12/19/13 3:38a Crystallee +// +// 23 12/18/13 10:23p Crystallee +// [TAG] EIP145605 +// [Category] Improvement +// [Description] Intel Workaround - custom TDP table implementation. Add +// a workaround for prevent Windows displays 2 different frequencies brand +// string within the My Computer -> Properties. +// +// 22 8/28/13 5:45a Crystallee +// +// 21 8/14/13 4:56a Davidhsieh +// [TAG] EIP131295 +// [Category] Improvement +// [Description] Add token to force turbo mode is not supported for i3 +// Cpu +// +// 20 6/03/13 2:38a Hsingyingchung +// [TAG] EIP123835 +// [Category] Spec Update +// [Severity] Important +// [Description] SBY Performance Tuning Guid rev. 1.1 update. +// +// 19 4/07/13 11:52p Hsingyingchung +// [TAG] EIPNone +// [Category] Improvement +// [Description] Modify CustomPowerUnit of Haswell RC if add XTU +// +// 18 4/03/13 4:58a Crystallee +// [TAG] EIP119880 +// [Category] Improvement +// [Description] Provide setup items which is related to PowerLimit3. +// +// 17 3/28/13 4:01a Davidhsieh +// [TAG] None +// [Category] Bug Fix +// [Severity] Important +// [Symptom] ACPI T state table is not reported +// [RootCause] T state function enable policy in Haswell RC is not +// correct. +// [Solution] Correct the T state function policy +// +// 16 3/05/13 6:55a Davidhsieh +// [TAG] None +// [Category] Improvement +// [Description] Token RC_POLICY_POWER_UNIT create for Haswell RC +// CustomPowerUnit +// +// 15 2/22/13 1:54a Crystallee +// [TAG] EIP112238 +// [Category] Improvement +// [Description] Refer Intel BIOS and provide setup items for Intel +// Haswell RC policy. +// +// 14 2/07/13 3:54a Hsingyingchung +// [TAG] EIP112631 +// [Category] Improvement +// [Description] update for 4.6.5.0_XtuHswSetup_004 +// +// 13 1/24/13 5:18a Crystallee +// [TAG] None +// [Category] Bug Fix +// [Severity] Important +// [Symptom] Change C state limit to C10, the system will hang. +// [RootCause] BIOS doesn't limit the C state to CPU support. +// [Solution] According to the CPU C state support, add C state limit to +// prevent system hanging and limit the setup item choice. +// +// 12 1/15/13 1:56a Crystallee +// [TAG] EIP103130 +// [Category] Bug Fix +// [Severity] Important +// [Symptom] SHB MB: Passive Trip Point is not Active +// [RootCause] BIOS doesn't correct to disable "AutoThermalReporting" +// variable in the CPU DXE Platform Policy. +// [Solution] Correct the "AutoThermalReporting" variable in +// ThermalFuncEnables in POWER_MGMT_CONFIG +// +// 11 12/03/12 9:50p Davidhsieh +// [TAG] EIP108401 +// [Category] Improvement +// [Description] Create setup items for VrMiscIoutOffset, +// VrMiscIoutSlope and LakeTiny +// +// 10 11/23/12 2:04a Hsingyingchung +// +// 9 11/18/12 9:36p Davidhsieh +// [TAG] EIP105980 +// [Category] Improvement +// [Description] Setup items for Package C State Limit and Energy +// Performance +// +// 8 10/28/12 11:37p Davidhsieh +// [TAG] EIP105017 +// [Category] Improvement +// [Description] Implement Setup Options for Debug Interface Enable/Lock +// +// 7 10/17/12 2:21a Davidhsieh +// [TAG] None +// [Category] Improvement +// [Description] Setup items CTDP BIOS, C8, C9 and C10 created +// +// 6 9/13/12 3:33a Davidhsieh +// [TAG] None +// [Category] Improvement +// [Description] Add DTS setup item +// +// 5 8/06/12 10:48p Davidhsieh +// [TAG] EIP95485 +// [Category] Improvement +// [Description] Configure TXT Feature via setup option +// +// 4 7/19/12 2:22a Davidhsieh +// [TAG] EIP95485 +// [Category] Improvement +// [Description] Enable VT when TXT is enabled +// +// 3 5/22/12 3:00a Davidhsieh +// Setup page layout change +// +// 2 3/16/12 3:45a Davidhsieh +// Setup items create for CPU RC policy +// +// 1 2/07/12 3:57a Davidhsieh +// +// +//********************************************************************** +//<AMI_FHDR_START> +// +// Name: CpuRcPolicyDxe.c +// +// Description: DxeCpuPolicyInitList eLink interface & its default child procedure +// for setting up DXE_CPU_PLATFORM_POLICY_PROTOCOL. +// +//<AMI_FHDR_END> +//********************************************************************** + +#include "token.h" + +#include "EdkIIGlueDxe.h" +//#include EFI_PROTOCOL_DEFINITION (CpuInfo) +#include "CpuPolicyInitDxe.h" + +#define VFRCOMPILE +#include "Include\Setup.h" +#undef VFRCOMPILE + +#if PERF_TUNE_SUPPORT == 1 +#define AMI_PERF_TUNE_DATA_HOB_GUID \ + {0x4d6c0496, 0x8de4, 0x4af2, 0x9a, 0x2e, 0x9b, 0xe5, 0xb9, 0x15, 0x6a, 0xc5} +#include <PerfTuneSetup.h> +typedef struct _PERF_TUNE_DATA_HOB2{ + EFI_HOB_GUID_TYPE EfiHobGuidType; + OC_SETUP_DATA PerfTuneDataHob; + BOOLEAN IsRunDefault; + BOOLEAN IsCpuChanged; + BOOLEAN IsWdtTimeOut; +}PERF_TUNE_DATA_HOB2; +#endif + +#define AMI_INTERNAL_UCODE_HOB_GUID \ + {0x94567c6f, 0xf7a9, 0x4229, 0x13, 0x30, 0xfe, 0x11, 0xcc, 0xab, 0x3a, 0x11} + +typedef struct { + EFI_HOB_GUID_TYPE EfiHobGuidType; + UINT32 uCodeAddr; +} AMI_INTERNAL_UCODE_HOB; + +// Type Definition(s) +typedef VOID (CPU_POLICY_INIT_FUNC) ( + IN EFI_SYSTEM_TABLE *SystemTable, + IN SETUP_DATA *SetupData, + IN OUT DXE_CPU_PLATFORM_POLICY_PROTOCOL *mCpuPolicyDataPtr); + +VOID DxeCpuPolicyInit ( + IN EFI_SYSTEM_TABLE *SystemTable, + IN SETUP_DATA *SetupData, + IN OUT DXE_CPU_PLATFORM_POLICY_PROTOCOL *mCpuPolicyDataPtr); + +VOID CallDxeCpuPolicyInitList( + IN EFI_SYSTEM_TABLE *SystemTable, + IN OUT DXE_CPU_PLATFORM_POLICY_PROTOCOL *mCpuPolicyDataPtr); + +// External Declaration(s) +extern CPU_POLICY_INIT_FUNC DXE_CPU_POLICY_INIT_LIST EndOfList; + +CPU_POLICY_INIT_FUNC* DxeCpuPolicyInitListTable[] = \ + {DXE_CPU_POLICY_INIT_LIST NULL}; + +EFI_GUID gAmiInternaluCodeHobGuid = AMI_INTERNAL_UCODE_HOB_GUID; +UINT32 gMicrocodeStart = 0; + +//Cstate +#define C3_SUB_STATES_MASK 0x00000f00 +#define C6_SUB_STATES_MASK 0x0000f000 +#define C7_SUB_STATES_MASK 0x000f0000 +#define C8_SUB_STATES_MASK 0x00f00000 +#define C9_SUB_STATES_MASK 0x0f000000 +#define C10_SUB_STATES_MASK 0xf0000000 + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: CallDxeCpuPolicyInitList +// +// Description: Get the microcode patch. +// +// +// Input: +// IN DXE_CPU_PLATFORM_POLICY_PROTOCOL *This +// IN UINT8 **MicrocodeData +// +// Output: +// EFI_STATUS +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS +AmiPlatformCpuRetrieveMicrocode ( + IN DXE_CPU_PLATFORM_POLICY_PROTOCOL *This, + OUT UINT8 **MicrocodeData + ) +/*++ + +Routine Description: + + Get the microcode patch. + +Arguments: + + This - Driver context. + MicrocodeData - Retrieved image of the microcode. + +Returns: + + EFI_SUCCESS - Image found. + +--*/ + +// +// GC_TODO: EFI_NOT_FOUND - add return value to function comment +// GC_TODO: EFI_NOT_FOUND - add return value to function comment +// +{ + + if (*MicrocodeData == NULL && gMicrocodeStart != 0) { + *MicrocodeData = (UINT8 *) (UINTN) gMicrocodeStart; + } else{ + return EFI_NOT_FOUND; + } + + return EFI_SUCCESS; +} +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: CallDxeCpuPolicyInitList +// +// Description: This function orderly calls functions in DxeCpuPolicyOemInitList +// for OEM or Custom to override PEI_CPU_PLATFORM_POLICY_PPI. +// +// +// Input: +// IN EFI_SYSTEM_TABLE *SystemTable +// IN OUT DXE_CPU_PLATFORM_POLICY_PROTOCOL *mCpuPolicyDataPtr +// +// Output: +// None + +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> + +VOID CallDxeCpuPolicyInitList ( + IN EFI_SYSTEM_TABLE *SystemTable, + IN OUT DXE_CPU_PLATFORM_POLICY_PROTOCOL *mCpuPolicyDataPtr) +{ + + EFI_STATUS Status; + + EFI_GUID guidSetup = SETUP_GUID; + SETUP_DATA SetupData; + SETUP_DATA *SetupDataPtr = NULL; + UINTN Size = sizeof(SETUP_DATA); + UINTN i; + + Status = gRT->GetVariable(L"Setup",&guidSetup, NULL, &Size, &SetupData); + +//SetupData variable is always exist in Aptio BIOS even it's the 1st time boot. +// ASSERT_EFI_ERROR (Status); + if(!EFI_ERROR(Status)) SetupDataPtr = &SetupData; + +// Call DxeCpuPolicyInitListTable(eLink:DxeCpuPolicyInitList) + for (i = 0; DxeCpuPolicyInitListTable[i] != NULL; i++) + DxeCpuPolicyInitListTable[i](SystemTable, SetupDataPtr, mCpuPolicyDataPtr); + +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: CallDxeCpuPolicyInitList +// +// Description: This function overrides DXE_CPU_PLATFORM_POLICY_PROTOCOL. +// +// +// Input: +// IN EFI_SYSTEM_TABLE *SystemTable +// IN SETUP_DATA *SetupData +// IN OUT DXE_CPU_PLATFORM_POLICY_PROTOCOL *mCpuPolicyDataPtr +// +// Output: +// None + +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID DxeCpuPolicyInit ( + IN EFI_SYSTEM_TABLE *SystemTable, + IN SETUP_DATA *SetupData, + IN OUT DXE_CPU_PLATFORM_POLICY_PROTOCOL *mCpuPolicyData) +{ + + EFI_STATUS Status; + CPU_CONFIG *CpuConfig = mCpuPolicyData->CpuConfig; + POWER_MGMT_CONFIG *CpuPmConfig = mCpuPolicyData->PowerMgmtConfig; + + UINT32 RegEax, RegEbx, RegEcx, RegEdx; + UINT8 CStateSupport = 0; + VOID *HobList; + AMI_INTERNAL_UCODE_HOB *uCodeHob = NULL; + +#if BRAND_STRING_WORKAROUND == 1 + PPM_CUSTOM_CTDP_TABLE *CustomConfigTdpTable; + UINT16 CustomPowerLimit1; + UINT8 mPowerUnitPowerOfTwo; + UINT8 mPowerUnit; + UINT16 mCustomPowerUnit; + UINT16 mPackageTdp; + UINTN PackageTdp; + UINTN NoOfOverrides = 0; + UINTN Index; + UINT64 PakagePowerLimitMsr = 0; + UINTN mHswUltPpmCtdpOverideTable[] = { + /// TDP Icc MSR PL1 MSR PL2 TdpUp TdpUp TdpNominal TdpNominal TdpDown TdpDown + /// Max PL1 PL2 PL1 PL2 PL1 PL2 + 5700, 0, 6700, 8375, 0, 8375, 0, 8375, 0, 8375 , /// 57W Sku Overrides + 1500, 0, 2500, 2500, 0, 2500, 0, 2500, 0, 2500 , /// 15W Sku Overrides + 1150, 0, 0, 2500, 0, 2500, 0, 2500, 0, 2500 , /// 11.5W Sku Overrides + 2800, 40, 0, 3500, 0, 3500, 0, 3500, 0, 3500 /// 28W 40A Sku Overrides + }; +#endif + +#if PERF_TUNE_SUPPORT == 1 + EFI_GUID gAmiPerfTuneDataHobGuid = AMI_PERF_TUNE_DATA_HOB_GUID; + PERF_TUNE_DATA_HOB2 *XtuPerfTuneDataHob; + OC_SETUP_DATA *SettingData; +#endif + +#if defined(I3_CPU_NON_TURBO) && (I3_CPU_NON_TURBO == 1) + + BOOLEAN IsI3Cpu = FALSE; +{ + CHAR8 BrandStrBuff[49]; + CHAR8 *BrandString = BrandStrBuff; + + AsmCpuid(0x80000002, &RegEax, &RegEbx, &RegEcx, &RegEdx); + *(UINT32*)BrandString = RegEax; BrandString +=4; + *(UINT32*)BrandString = RegEbx; BrandString +=4; + *(UINT32*)BrandString = RegEcx; BrandString +=4; + *(UINT32*)BrandString = RegEdx; BrandString +=4; + + AsmCpuid(0x80000003, &RegEax, &RegEbx, &RegEcx, &RegEdx); + *(UINT32*)BrandString = RegEax; BrandString +=4; + *(UINT32*)BrandString = RegEbx; BrandString +=4; + *(UINT32*)BrandString = RegEcx; BrandString +=4; + *(UINT32*)BrandString = RegEdx; BrandString +=4; + + AsmCpuid(0x80000004, &RegEax, &RegEbx, &RegEcx, &RegEdx); + *(UINT32*)BrandString = RegEax; BrandString +=4; + *(UINT32*)BrandString = RegEbx; BrandString +=4; + *(UINT32*)BrandString = RegEcx; BrandString +=4; + *(UINT32*)BrandString = RegEdx; BrandString +=4; + *BrandString = '\0';\ + + BrandString = BrandStrBuff; + + while(*BrandString) { + if ( *((CHAR16*)BrandString) == '3i') { + IsI3Cpu = TRUE; + break; + } + ++BrandString; + } + + +} +#endif + + // + // Get the start of the HOBs. + // + Status = EfiGetSystemConfigurationTable (&gEfiHobListGuid, &HobList); + // + // Get the Compatible BIOS structure BDAT from the HOB. + // + if (!EFI_ERROR(Status)){ + uCodeHob = GetNextGuidHob (&gAmiInternaluCodeHobGuid, HobList); + if (uCodeHob != NULL) { + gMicrocodeStart = uCodeHob->uCodeAddr; + DEBUG ((EFI_D_ERROR, "CPU ID in uCode = %x\n", ((EFI_CPU_MICROCODE_HEADER *)gMicrocodeStart)->ProcessorId)); + // uCode in memory is already found, change the RetriveveMicrocode funciton + mCpuPolicyData->CpuConfig->RetrieveMicrocode = AmiPlatformCpuRetrieveMicrocode; + } + } + + CpuConfig->RetrieveMicrocode = AmiPlatformCpuRetrieveMicrocode; + + CpuPmConfig->CustomPowerUnit = RC_POLICY_POWER_UNIT; + if(SetupData != NULL){ + // + //CPU config overwrite + // + CpuConfig->LimitCpuidMaximumValue = SetupData->LimitCpuid; + CpuConfig->HtState = SetupData->HTD; + CpuConfig->ExecuteDisableBit = SetupData->XDBit; + CpuConfig->VmxEnable = SetupData->VT; + + if (SetupData->TxtSupport) { + CpuConfig->VmxEnable = CPU_FEATURE_ENABLE; //Enable VMX when TXT enable + CpuConfig->SmxEnable = CPU_FEATURE_ENABLE; + } else { + CpuConfig->SmxEnable = CPU_FEATURE_DISABLE; + } + //CpuConfig->SmxEnable = CPU_FEATURE_ENABLE; + + CpuConfig->MlcStreamerPrefetcher = SetupData->MlcStreamerPrefetcher; + CpuConfig->MlcSpatialPrefetcher = SetupData->MlcSpatialPrefetcher; + CpuConfig->AesEnable = SetupData->AesEnable; + //CpuConfig->MachineCheckEnable = CPU_FEATURE_ENABLE; + CpuConfig->EnableDts = SetupData->DtsEnable; + CpuConfig->DebugInterfaceEnable = SetupData->DebugInterfaceEnable; + CpuConfig->DebugInterfaceLockEnable = SetupData->DebugInterfaceLock; + + // + //Power management config overwrite + // + CpuPmConfig->pFunctionEnables->Eist = SetupData->EIST; + CpuPmConfig->pFunctionEnables->TurboMode = SetupData->TurboMode; +#if defined(I3_CPU_NON_TURBO) && (I3_CPU_NON_TURBO == 1) + if (IsI3Cpu) + CpuPmConfig->pFunctionEnables->TurboMode = PPM_DISABLE; +#endif + //CpuPmConfig->pFunctionEnables->Cx = PPM_ENABLE; + if (SetupData->CxEnable){ + CpuPmConfig->pFunctionEnables->C1e = SetupData->C1E; + CpuPmConfig->pFunctionEnables->C3 = SetupData->C3Enable; + CpuPmConfig->pFunctionEnables->C6 = SetupData->C6Enable; + CpuPmConfig->pFunctionEnables->DeepCState = SetupData->C7Enable; + CpuPmConfig->pFunctionEnables->C1AutoDemotion = SetupData->C1AutoDemotion; + CpuPmConfig->pFunctionEnables->C3AutoDemotion = SetupData->C3AutoDemotion; + CpuPmConfig->pFunctionEnables->PkgCStateDemotion = SetupData->PkgCStateDemotion; + CpuPmConfig->pFunctionEnables->C1UnDemotion = SetupData->C1UnDemotion; + CpuPmConfig->pFunctionEnables->C3UnDemotion = SetupData->C3UnDemotion; + CpuPmConfig->pFunctionEnables->PkgCStateUnDemotion = SetupData->PkgCStateUnDemotion; + CpuPmConfig->pFunctionEnables->CStatePreWake = SetupData->CxPreWake; + CpuPmConfig->pFunctionEnables->LongLatencyC6 = SetupData->C6Latency; + CpuPmConfig->pFunctionEnables->LongLatencyC7 = SetupData->C7Latency; + CpuPmConfig->pFunctionEnables->LakeTiny = SetupData->LakeTiny; +#if ULT_SUPPORT + CpuPmConfig->pFunctionEnables->C8 = SetupData->C8Enable; + CpuPmConfig->pFunctionEnables->C9 = SetupData->C9Enable; + CpuPmConfig->pFunctionEnables->C10 = SetupData->C10Enable; +#endif + } else { + CpuPmConfig->pFunctionEnables->Cx = PPM_DISABLE; + CpuPmConfig->pFunctionEnables->C3 = PPM_DISABLE; + CpuPmConfig->pFunctionEnables->C6 = PPM_DISABLE; + CpuPmConfig->pFunctionEnables->DeepCState = PPM_DISABLE; +#if ULT_SUPPORT + CpuPmConfig->pFunctionEnables->C8 = PPM_DISABLE; + CpuPmConfig->pFunctionEnables->C9 = PPM_DISABLE; + CpuPmConfig->pFunctionEnables->C10 = PPM_DISABLE; +#endif + } + CpuPmConfig->ThermalFuncEnables->TStates = SetupData->CpuTstate; + //CpuPmConfig->pFunctionEnables->CStatePreWake = PPM_ENABLE; + //CpuPmConfig->pFunctionEnables->EnergyEfficientPState = PPM_ENABLE; + //CpuPmConfig->pFunctionEnables->CStatePreWake = PPM_ENABLE; +#if SB_SETUP_SUPPORT + CpuPmConfig->ThermalFuncEnables->AutoThermalReporting = SetupData->AutoThermalReport; +#endif + //CpuPmConfig->pFunctionEnables->LongLatencyC6 = PPM_DISABLE; + //CpuPmConfig->pFunctionEnables->LongLatencyC7 = PPM_ENABLE; + //CpuPmConfig->pFunctionEnables->ThermalMonitor = PPM_ENABLE; + //CpuPmConfig->pFunctionEnables->LakeTiny = PPM_DISABLE; + + if (SetupData->PowerLimit1) + CpuPmConfig->pTurboSettings->PowerLimit1 = SetupData->PowerLimit1; + if (SetupData->PowerLimit2) + CpuPmConfig->pTurboSettings->PowerLimit2 = SetupData->PowerLimit2; + if (SetupData->PowerLimit1Time) + CpuPmConfig->pTurboSettings->PowerLimit1Time = SetupData->PowerLimit1Time; + + CpuPmConfig->pTurboSettings->PowerLimit3Lock = SetupData->PowerLimit3Lock; + if (SetupData->PowerLimit3) + CpuPmConfig->pTurboSettings->PowerLimit3 = SetupData->PowerLimit3; + if (SetupData->PowerLimit3Time) + CpuPmConfig->pTurboSettings->PowerLimit3Time = SetupData->PowerLimit3Time; + if (SetupData->PowerLimit3DutyCycle) + CpuPmConfig->pTurboSettings->PowerLimit3DutyCycle = SetupData->PowerLimit3DutyCycle; + + if (SetupData->DdrPowerLimit1) + CpuPmConfig->pTurboSettings->DdrPowerLimit1 = SetupData->DdrPowerLimit1; + if (SetupData->DdrPowerLimit2) + CpuPmConfig->pTurboSettings->DdrPowerLimit2 = SetupData->DdrPowerLimit2; + if (SetupData->DdrPowerLimit1Time) + CpuPmConfig->pTurboSettings->DdrPowerLimit1Time = SetupData->DdrPowerLimit1Time; + + CpuPmConfig->pTurboSettings->ConfigTdpBios = SetupData->CtdpBios; + CpuPmConfig->pTurboSettings->ConfigTdpLevel = SetupData->cTDPLevel; + CpuPmConfig->pTurboSettings->ConfigTdpLock = SetupData->cTDPLock; + CpuPmConfig->pTurboSettings->EnergyPolicy = SetupData->CpuEngPerfBias; + + CpuPmConfig->pTurboSettings->TurboPowerLimitLock = SetupData->TurboPowerLimitLock; + +#if BRAND_STRING_WORKAROUND == 1 + //Configure custom cTdp table + CpuPmConfig->pCustomCtdpSettings->ConfigTdpCustom = PPM_ENABLE; + CpuPmConfig->pCustomCtdpSettings->CustomTdpCount = 2; + CpuPmConfig->pCustomCtdpSettings->CustomBootModeIndex = 0; + + CustomConfigTdpTable = CpuPmConfig->pCustomCtdpSettings->CustomConfigTdpTable; + mPowerUnitPowerOfTwo = (UINT8)(AsmReadMsr64 (MSR_PACKAGE_POWER_SKU_UNIT) & 0xf); + mPowerUnit = (UINT8) 1 << mPowerUnitPowerOfTwo; +#if RC_POLICY_POWER_UNIT == 0 + mCustomPowerUnit = 1; +#else + mCustomPowerUnit = (UINT8) 1 << mPowerUnitPowerOfTwo; +#endif + mPackageTdp = (UINT16)(AsmReadMsr64(MSR_PACKAGE_POWER_SKU) & 0x7fff); + +#if RC_POLICY_POWER_UNIT == 0 + CustomConfigTdpTable[0].CustomPowerLimit1 = mPackageTdp / mPowerUnit; + CustomConfigTdpTable[0].CustomPowerLimit2 = mPackageTdp * 125 / 100 / mPowerUnit; +#else + CustomConfigTdpTable[0].CustomPowerLimit1 = mPackageTdp; + CustomConfigTdpTable[0].CustomPowerLimit2 = mPackageTdp * 125 / 100; +#endif + CustomConfigTdpTable[0].CustomPowerLimit1Time = 0x1c; //MB_POWER_LIMIT1_TIME_DEFAULT + CustomConfigTdpTable[0].CustomTurboActivationRatio = (UINT8)(AsmReadMsr64 (MSR_CONFIG_TDP_NOMINAL) & 0xff) - 1; + CustomConfigTdpTable[0].CustomConfigTdpControl = 1; + + CustomPowerLimit1 = (UINT16)(AsmReadMsr64(MSR_CONFIG_TDP_LVL1) & 0x7fff); +#if RC_POLICY_POWER_UNIT == 0 + CustomConfigTdpTable[1].CustomPowerLimit1 = CustomPowerLimit1 / mPowerUnit; + CustomConfigTdpTable[1].CustomPowerLimit2 = CustomPowerLimit1 * 125 / 100 / mPowerUnit; +#else + CustomConfigTdpTable[1].CustomPowerLimit1 = CustomPowerLimit1; + CustomConfigTdpTable[1].CustomPowerLimit2 = CustomPowerLimit1 * 125 / 100; +#endif + CustomConfigTdpTable[1].CustomPowerLimit1Time = CustomConfigTdpTable[0].CustomPowerLimit1Time; + CustomConfigTdpTable[1].CustomTurboActivationRatio = (UINT8)((AsmReadMsr64(MSR_CONFIG_TDP_LVL1) >> 16) & 0xff) - 1; + CustomConfigTdpTable[1].CustomConfigTdpControl = 0; + + AsmCpuid(0x1, &RegEax, &RegEbx, &RegEcx, &RegEdx); + RegEax = RegEax & CPUID_FULL_FAMILY_MODEL; + if(RegEax == EnumCpuHswUlt) NoOfOverrides = 1; + PackageTdp = ((mPackageTdp / mPowerUnit) * 100); + if((mPackageTdp % mPowerUnit) !=0) + PackageTdp += ((mPackageTdp % mPowerUnit)* 100) / mPowerUnit; + + Index = 0; + while(NoOfOverrides != 0 && Index < sizeof(mHswUltPpmCtdpOverideTable)) { + if(mHswUltPpmCtdpOverideTable[0 + Index] == PackageTdp) { + PakagePowerLimitMsr = AsmReadMsr64(MSR_PACKAGE_POWER_LIMIT); + + if(mHswUltPpmCtdpOverideTable[2 + Index]) { + PakagePowerLimitMsr &= ~POWER_LIMIT_MASK; + PakagePowerLimitMsr |= ((mHswUltPpmCtdpOverideTable[2 + Index] * mPowerUnit)/100) & POWER_LIMIT_MASK; + } + + if(mHswUltPpmCtdpOverideTable[3 + Index]) { + PakagePowerLimitMsr &= ~(0x7FFF00000000); //MSR_PACKAGE_POWER_LIMIT[46:32] + PakagePowerLimitMsr |=((mHswUltPpmCtdpOverideTable[3 + Index] * mPowerUnit)/100) & 0x7FFF00000000; + } + AsmWriteMsr64 (MSR_PACKAGE_POWER_LIMIT, PakagePowerLimitMsr); + + if(mHswUltPpmCtdpOverideTable[6 + Index]) //CtdpNominalPowerLimit1 + CustomConfigTdpTable[0].CustomPowerLimit1 = \ + ((UINT16)(mHswUltPpmCtdpOverideTable[6 + Index]) / 100) * mCustomPowerUnit; + + if(mHswUltPpmCtdpOverideTable[7 + Index]) //CtdpNominalPowerLimit2 + CustomConfigTdpTable[0].CustomPowerLimit2 = \ + ((UINT16)(mHswUltPpmCtdpOverideTable[7 + Index]) / 100) * mCustomPowerUnit; + + if(mHswUltPpmCtdpOverideTable[8 + Index]) //CtdpDownPowerLimit1 + CustomConfigTdpTable[1].CustomPowerLimit1 = \ + ((UINT16)(mHswUltPpmCtdpOverideTable[8 + Index]) / 100) * mCustomPowerUnit; + + if(mHswUltPpmCtdpOverideTable[9 + Index]) //CtdpDownPowerLimit2 + CustomConfigTdpTable[1].CustomPowerLimit2 = \ + ((UINT16)(mHswUltPpmCtdpOverideTable[9 + Index]) / 100) * mCustomPowerUnit; + + break; + } + Index += 10; + } +#endif + + //if (RShiftU64(AsmReadMsr64(0xce), 33) & 0x03) + // CpuPmConfig->pTurboSettings->TurboPowerLimitLock = PPM_DISABLE; + //else + // CpuPmConfig->pTurboSettings->TurboPowerLimitLock = PPM_ENABLE; + //CpuPmConfig->pTurboSettings->DdrPowerLimitLock = PPM_DISABLE; + //CpuPmConfig->pTurboSettings->EnergyPolicy = 0; + // + CpuPmConfig->pPpmLockEnables->PmgCstCfgCtrlLock = SetupData->PmgCstCfgCtrlLock; + CpuPmConfig->pPpmLockEnables->OverclockingLock = SetupData->OverclockingLock; + //CpuPmConfig->pPpmLockEnables->ProcHotLock = PPM_DISABLE; + CpuPmConfig->S3RestoreMsrSwSmiNumber = SW_SMI_S3_RESTORE_MSR_FROM_SDL; + + AsmCpuid(5, &RegEax, &RegEbx, &RegEcx, &RegEdx); + if (!!(RegEdx & C10_SUB_STATES_MASK)) CStateSupport = 8; //C10 support + if (!!(RegEdx & C9_SUB_STATES_MASK) && (!CStateSupport)) CStateSupport = 7; //C9 support + if (!!(RegEdx & C8_SUB_STATES_MASK) && (!CStateSupport)) CStateSupport = 6; //C8 support + if (!!(RegEdx & C7_SUB_STATES_MASK) && (!CStateSupport)) CStateSupport = 5; //C7 support + if (!!(RegEdx & C6_SUB_STATES_MASK) && (!CStateSupport)) CStateSupport = 3; //C6 support + if (!!(RegEdx & C3_SUB_STATES_MASK) && (!CStateSupport)) CStateSupport = 2; //C3 support + + if (SetupData->PackageCState != 0xFF && SetupData->PackageCState > CStateSupport) + CpuPmConfig->PkgCStateLimit = CStateSupport; + else + CpuPmConfig->PkgCStateLimit = SetupData->PackageCState; + + //CpuPmConfig->PkgCStateLimit = PkgAuto; + // +#if CPU_SETUP_SET_LATENCY_CONTROL + CpuPmConfig->CstateLatencyControl0TimeUnit = SetupData->CstateLatencyControl0TimeUnit; + CpuPmConfig->CstateLatencyControl1TimeUnit = SetupData->CstateLatencyControl1TimeUnit; + CpuPmConfig->CstateLatencyControl2TimeUnit = SetupData->CstateLatencyControl2TimeUnit; + CpuPmConfig->CstateLatencyControl0Irtl = SetupData->CstateLatencyControl0Irtl; + CpuPmConfig->CstateLatencyControl1Irtl = SetupData->CstateLatencyControl1Irtl; + CpuPmConfig->CstateLatencyControl2Irtl = SetupData->CstateLatencyControl2Irtl; +#endif + //CpuPmConfig->RfiFreqTunningOffsetIsNegative = 0; + //CpuPmConfig->RfiFreqTunningOffset = 0; + +#if PERF_TUNE_SUPPORT == 1 + Status = EfiGetSystemConfigurationTable (&gEfiHobListGuid, &HobList); + if (!EFI_ERROR(Status)){ + XtuPerfTuneDataHob = GetNextGuidHob (&gAmiPerfTuneDataHobGuid, HobList); + if (XtuPerfTuneDataHob != NULL) { + SettingData = &XtuPerfTuneDataHob->PerfTuneDataHob; + } + } + SettingData = &XtuPerfTuneDataHob->PerfTuneDataHob; + + if (!(EFI_ERROR(Status) /*|| XtuPerfTuneDataHob->IsWdtTimeOut*/ || (XtuPerfTuneDataHob->IsCpuChanged && XtuPerfTuneDataHob->IsRunDefault))) + { + if (SettingData->EIST) + { + CpuPmConfig->pFunctionEnables->Eist = PPM_ENABLE; + + if (SettingData->TurboMode){ + CpuPmConfig->pFunctionEnables->TurboMode = PPM_ENABLE; + } + else + CpuPmConfig->pFunctionEnables->TurboMode = PPM_DISABLE; + + } + else{ + CpuPmConfig->pFunctionEnables->Eist = PPM_DISABLE; + CpuPmConfig->pFunctionEnables->TurboMode = PPM_DISABLE; + } + + if(!(SettingData->OverclockingEnable)) + CpuPmConfig->pPpmLockEnables->OverclockingLock = PPM_ENABLE; // 1, disable overclocking lock; 0, enable overclocking lock + + // Skus that support Config TDP are not able to change power limit(MSR 0x610) in real time, + // and don't lock cTDP CTC(MSR 0x64B) and cTDP TAR(MSR 0x64C). + if ((AsmReadMsr64(MSR_PLATFORM_INFO) & (BIT33 | BIT34))){ + CpuPmConfig->pTurboSettings->PowerLimit2 = AUTO; + CpuPmConfig->pTurboSettings->PowerLimit1 = AUTO; + CpuPmConfig->pTurboSettings->PowerLimit1Time = AUTO; + CpuPmConfig->pTurboSettings->TurboPowerLimitLock = PPM_DISABLE; + CpuPmConfig->pFunctionEnables->PowerLimit2 = PPM_ENABLE; + CpuPmConfig->pTurboSettings->ConfigTdpLock = PPM_DISABLE; + + }else{ + CpuPmConfig->pTurboSettings->PowerLimit2 = SettingData->ShortPowerLimit; + CpuPmConfig->pTurboSettings->PowerLimit1 = SettingData->ExtendedPowerLimit; + CpuPmConfig->pTurboSettings->PowerLimit1Time = SettingData->ExtendedTimeWindow; + CpuPmConfig->pTurboSettings->TurboPowerLimitLock = (UINT8)SettingData->PowerLockSwitch; + CpuPmConfig->pFunctionEnables->PowerLimit2 = (UINT8)SettingData->ShortPowerLockSwitch; + } + CpuPmConfig->CustomPowerUnit = PowerUnitWatts; + } +#endif + } +} + +//********************************************************************** +//********************************************************************** +//** ** +//** (C)Copyright 1987-2013, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//********************************************************************** +//********************************************************************** |