PlatformCpuPolicy.c 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704
  1. /** @file
  2. CPU Policy Platform DXE Driver implementation.
  3. @copyright
  4. Copyright 2015 - 2021 Intel Corporation. <BR>
  5. SPDX-License-Identifier: BSD-2-Clause-Patent
  6. **/
  7. #include <PiDxe.h>
  8. #include <Protocol/CpuPolicyProtocol.h>
  9. #include <Protocol/PpmPolicyProtocol.h>
  10. #include <IioUniversalData.h>
  11. #include <Protocol/PlatformType.h>
  12. #include <SetupTable.h>
  13. #include <Library/BaseLib.h>
  14. #include <Library/MemoryAllocationLib.h>
  15. #include <Library/BaseMemoryLib.h>
  16. #include <Library/PcdLib.h>
  17. #include <Library/DebugLib.h>
  18. #include <Library/UefiBootServicesTableLib.h>
  19. #include <Library/UefiRuntimeServicesTableLib.h>
  20. #include <Library/CpuConfigLib.h>
  21. #include <Library/HobLib.h>
  22. #include <Library/UefiLib.h>
  23. #include <Library/IoLib.h>
  24. #include <Library/CpuPpmLib.h>
  25. #include <Platform.h>
  26. #include <Cpu/CpuIds.h>
  27. #include <CpuAndRevisionDefines.h>
  28. #include <ScratchpadList.h>
  29. #include <Register/Cpuid.h>
  30. #include <ProcessorPpmSetup.h>
  31. #include <Protocol/DynamicSiLibraryProtocol.h>
  32. CHAR16 mCpuSocketStr[8][5] = {L"CPU0", L"CPU1", L"CPU2", L"CPU3", L"CPU4", L"CPU5", L"CPU6", L"CPU7"};
  33. CHAR16 mCpuAssetTagStr[] = L"UNKNOWN";
  34. IIO_UDS *mIioUds;
  35. CPU_POLICY_CONFIGURATION mCpuPolicyConfiguration;
  36. PPM_POLICY_CONFIGURATION mPpmPolicyConfiguration;
  37. /**
  38. Set platform CPU data that related to SMBIOS.
  39. **/
  40. VOID
  41. PlatformCpuSmbiosData (
  42. VOID
  43. )
  44. {
  45. UINT32 CpuSocketCount;
  46. UINTN Index;
  47. CHAR16 **CpuSocketNames;
  48. CHAR16 **CpuAssetTags;
  49. EFI_STATUS Status = EFI_SUCCESS;
  50. //
  51. // Set the count of CPU sockets on the board.
  52. //
  53. CpuSocketCount = PcdGet32(PcdOemSkuBoardSocketCount);
  54. Status = PcdSet32S (PcdPlatformCpuSocketCount, CpuSocketCount);
  55. ASSERT_EFI_ERROR (Status);
  56. if (EFI_ERROR(Status)) {
  57. return;
  58. }
  59. CpuSocketNames = AllocatePool (CpuSocketCount * sizeof (UINTN));
  60. if (CpuSocketNames == NULL) {
  61. DEBUG ((EFI_D_ERROR, "\nEFI_OUT_OF_RESOURCES!!! AllocatePool() returned NULL pointer.\n"));
  62. ASSERT_EFI_ERROR (EFI_OUT_OF_RESOURCES);
  63. return;
  64. }
  65. CpuAssetTags = AllocatePool (CpuSocketCount * sizeof (UINTN));
  66. if (CpuAssetTags == NULL) {
  67. DEBUG ((EFI_D_ERROR, "\nEFI_OUT_OF_RESOURCES!!! AllocatePool() returned NULL pointer.\n"));
  68. ASSERT_EFI_ERROR (EFI_OUT_OF_RESOURCES);
  69. gBS->FreePool (CpuSocketNames);
  70. return;
  71. }
  72. for (Index = 0; Index < CpuSocketCount; Index++) {
  73. CpuSocketNames[Index] = mCpuSocketStr[Index];
  74. CpuAssetTags[Index] = mCpuAssetTagStr;
  75. }
  76. mCpuPolicyConfiguration.PlatformCpuSocketNames = (UINT64) (UINTN) CpuSocketNames;
  77. mCpuPolicyConfiguration.PlatformCpuAssetTags = (UINT64) (UINTN) CpuAssetTags;
  78. }
  79. /**
  80. Re-assign socket id when both X2APIC and ForceX2Apic are enabled.
  81. @param None
  82. @retval None
  83. **/
  84. VOID
  85. CheckAndReAssignSocketId(
  86. VOID
  87. )
  88. {
  89. CPU_SOCKET_ID_INFO *pcdSktIdPtr;
  90. UINT32 i, IntraPackageIdBits;
  91. UINTN PcdSize;
  92. EFI_STATUS Status;
  93. UINT32 MaxSocketCount;
  94. MaxSocketCount = FixedPcdGet32(PcdMaxCpuSocketCount);
  95. DEBUG ((DEBUG_INFO, "::SocketCount %08x\n", MaxSocketCount));
  96. pcdSktIdPtr = (CPU_SOCKET_ID_INFO *)PcdGetPtr(PcdCpuSocketId);
  97. PcdSize = LibPcdGetSize (PcdToken (PcdCpuSocketId)); //MAX_SOCKET * sizeof(CPU_SOCKET_ID_INFO);
  98. ASSERT(PcdSize == (MAX_SOCKET * sizeof(CPU_SOCKET_ID_INFO)));
  99. Status = PcdSetPtrS (PcdCpuSocketId, &PcdSize, (VOID *)pcdSktIdPtr);
  100. ASSERT_EFI_ERROR (Status);
  101. if (EFI_ERROR(Status)) {
  102. return;
  103. }
  104. DEBUG ((EFI_D_INFO, "::SockeId Pcd at %08x, size %x\n", PcdGetPtr(PcdCpuSocketId), PcdSize));
  105. for(i = 0; i < MAX_SOCKET; i++) {
  106. if (mIioUds->PlatformData.CpuQpiInfo[i].Valid) {
  107. pcdSktIdPtr[i].DefaultSocketId = mIioUds->PlatformData.CpuQpiInfo[i].SocId;
  108. pcdSktIdPtr[i].NewSocketId = mIioUds->PlatformData.CpuQpiInfo[i].SocId;
  109. } else {
  110. pcdSktIdPtr[i].DefaultSocketId = (UINT32)-1; //make sure Default and New are same
  111. pcdSktIdPtr[i].NewSocketId = (UINT32)-1;
  112. }
  113. }
  114. AsmCpuidEx (CPUID_EXTENDED_TOPOLOGY, 1, &IntraPackageIdBits, NULL, NULL, NULL);
  115. //assign new socketId
  116. for(i = 0; i < MAX_SOCKET; i++) {
  117. if (pcdSktIdPtr[i].DefaultSocketId == (UINT32)-1) {
  118. continue;
  119. }
  120. switch(IntraPackageIdBits) {
  121. case 4: //socket bit starts from bit4 of ApicId
  122. case 5: //socket bit starts from bit5 of ApicId
  123. if (MAX_SOCKET == 4) {
  124. pcdSktIdPtr[i].NewSocketId |= (APICID_MASK_BIT14_8 << (8 - IntraPackageIdBits));
  125. } else {
  126. //3bit in lower 8bit as skt field, to avoid ApicID= FFs, leave bit8 untouched for 8S
  127. pcdSktIdPtr[i].NewSocketId |= (0x7E << (8 - IntraPackageIdBits)); //leave bit8 to 0 so we don't have FFs in ApicId
  128. }
  129. break;
  130. case 6: //socket bit starts from bit6 of ApicId
  131. if (MAX_SOCKET == 4) {
  132. //only 2bit in lower 8bit as skt field, to avoid ApicID= FFs, leave bit8 untouched for 4S
  133. pcdSktIdPtr[i].NewSocketId |= (0x7E << (8 - IntraPackageIdBits));
  134. } else {
  135. //only 2bit in lower 8bit as skt field, to avoid ApicID= FFs, leave bit9 untouched for 8S
  136. pcdSktIdPtr[i].NewSocketId |= (0x7C << (8 - IntraPackageIdBits));
  137. }
  138. break;
  139. default:
  140. DEBUG ((EFI_D_INFO, "::Need more info to make sure we can support!!!\n"));
  141. break;
  142. } //end switch
  143. }
  144. }
  145. /**
  146. This is the EFI driver entry point for the CpuPolicy Driver. This
  147. driver is responsible for getting microcode patches from FV.
  148. @param ImageHandle - Handle for the image of this driver.
  149. @param SystemTable - Pointer to the EFI System Table.
  150. @retval EFI_SUCCESS - Protocol installed sucessfully.
  151. **/
  152. EFI_STATUS
  153. EFIAPI
  154. PlatformCpuPolicyEntryPoint (
  155. IN EFI_HANDLE ImageHandle,
  156. IN EFI_SYSTEM_TABLE *SystemTable
  157. )
  158. {
  159. EFI_STATUS Status;
  160. SETUP_DATA SetupData;
  161. EFI_HANDLE Handle;
  162. UINT8 socket;
  163. TURBO_POWRER_LIMIT *TurboPowerLimit;
  164. EFI_PLATFORM_TYPE_PROTOCOL *PlatformType;
  165. UINT32 CpuFamilyModelStepping;
  166. BIOS_SCRATCHPAD7_STRUCT Sp7;
  167. UINT64 i;
  168. UINT8 PackageCStateSetting = 0;
  169. UINT8 CpuCStateValue = 0;
  170. EFI_GUID UniversalDataGuid = IIO_UNIVERSAL_DATA_GUID;
  171. EFI_HOB_GUID_TYPE *GuidHob;
  172. SYSTEM_MEMORY_MAP_HOB *SystemMemoryMap;
  173. CPU_VAR_DATA *CpuVarDataPtr = NULL;
  174. DYNAMIC_SI_LIBARY_PROTOCOL *DynamicSiLibraryProtocol = NULL;
  175. Status = gBS->LocateProtocol (&gDynamicSiLibraryProtocolGuid, NULL, &DynamicSiLibraryProtocol);
  176. if (EFI_ERROR (Status)) {
  177. ASSERT_EFI_ERROR (Status);
  178. return Status;
  179. }
  180. CpuVarDataPtr = DynamicSiLibraryProtocol->GetCpuVarData ();
  181. GuidHob = GetFirstGuidHob (&UniversalDataGuid);
  182. ASSERT (GuidHob != NULL);
  183. if (GuidHob == NULL) {
  184. return EFI_NOT_FOUND;
  185. }
  186. mIioUds = GET_GUID_HOB_DATA(GuidHob);
  187. SystemMemoryMap = DynamicSiLibraryProtocol->GetSystemMemoryMapData ();
  188. if (SystemMemoryMap == NULL) {
  189. return EFI_NOT_FOUND;
  190. }
  191. SetMem (&mCpuPolicyConfiguration, sizeof (CPU_POLICY_CONFIGURATION), 0x00);
  192. SetMem (&mPpmPolicyConfiguration, sizeof (PPM_POLICY_CONFIGURATION), 0x00);
  193. AsmCpuid (1, &CpuFamilyModelStepping, NULL, NULL, NULL);
  194. PlatformCpuSmbiosData ();
  195. //
  196. // Read the current system configuration variable store.
  197. //
  198. ZeroMem(&SetupData, sizeof(SETUP_DATA));
  199. CopyMem (&SetupData.SocketConfig.IioConfig, PcdGetPtr(PcdSocketIioConfig), sizeof(SOCKET_IIO_CONFIGURATION));
  200. CopyMem (&SetupData.SocketConfig.CommonRcConfig, PcdGetPtr(PcdSocketCommonRcConfig), sizeof(SOCKET_COMMONRC_CONFIGURATION));
  201. CopyMem (&SetupData.SocketConfig.UpiConfig, PcdGetPtr(PcdSocketMpLinkConfig), sizeof(SOCKET_MP_LINK_CONFIGURATION));
  202. CopyMem (&SetupData.SocketConfig.MemoryConfig, PcdGetPtr(PcdSocketMemoryConfig), sizeof(SOCKET_MEMORY_CONFIGURATION));
  203. CopyMem (&SetupData.SocketConfig.PowerManagementConfig, PcdGetPtr(PcdSocketPowerManagementConfig), sizeof(SOCKET_POWERMANAGEMENT_CONFIGURATION));
  204. CopyMem (&SetupData.SocketConfig.SocketProcessorCoreConfiguration, PcdGetPtr(PcdSocketProcessorCoreConfig), sizeof(SOCKET_PROCESSORCORE_CONFIGURATION));
  205. CopyMem (&SetupData.SystemConfig, PcdGetPtr(PcdSetup), sizeof(SYSTEM_CONFIGURATION));
  206. CopyMem (&SetupData.PchSetup, PcdGetPtr(PcdPchSetup), sizeof(PCH_SETUP));
  207. Sp7.Data = DynamicSiLibraryProtocol->ReadScratchpad7 ();
  208. DEBUG ((EFI_D_INFO, "AYP Debug scratchpad7: %x Stepping %x\n", Sp7.Bits.AepDimmPresent, CpuFamilyModelStepping & 0x0f));
  209. if ((Sp7.Bits.AepDimmPresent == 1) && ((CpuFamilyModelStepping & 0x0f) < 0x04) && ((CpuFamilyModelStepping >> 4) == CPU_FAMILY_SKX)) {
  210. SetupData.SocketConfig.PowerManagementConfig.PackageCState = 0;
  211. }
  212. if (SetupData.SocketConfig.PowerManagementConfig.PackageCState == PPM_AUTO) {
  213. PackageCStateSetting = C6_ENABLE; //POR Default = C6
  214. } else {
  215. PackageCStateSetting = SetupData.SocketConfig.PowerManagementConfig.PackageCState;
  216. }
  217. if (SetupData.SocketConfig.PowerManagementConfig.C6Enable == PPM_AUTO) {
  218. CpuCStateValue |= C6_ENABLE; //POR Default = Enabled
  219. } else {
  220. CpuCStateValue |= (SetupData.SocketConfig.PowerManagementConfig.C6Enable * C6_ENABLE);
  221. }
  222. mCpuPolicyConfiguration.Policy.CpuCoreCStateValue = CpuCStateValue;
  223. //
  224. // Update CpuMtoIWa from StructurePcd
  225. //
  226. if (DynamicSiLibraryProtocol->IsCpuAndRevision (CPU_ICXSP, REV_R0) || DynamicSiLibraryProtocol->IsCpuAndRevision (CPU_ICXSP, REV_L0) || DynamicSiLibraryProtocol->IsCpuAndRevision (CPU_ICXSP, REV_C0)) {
  227. mCpuPolicyConfiguration.Policy.CpuMtoIWa = SetupData.SocketConfig.SocketProcessorCoreConfiguration.CpuMtoIWa;
  228. }
  229. //
  230. // Verify that the value being set is within the valid range 0 to MAX_SOCKET - 1
  231. //
  232. if (SetupData.SocketConfig.SocketProcessorCoreConfiguration.BspSelection > MAX_SOCKET) {
  233. SetupData.SocketConfig.SocketProcessorCoreConfiguration.BspSelection= 0xFF;
  234. }
  235. mCpuPolicyConfiguration.SbspSelection = SetupData.SocketConfig.SocketProcessorCoreConfiguration.BspSelection;
  236. //
  237. // Map CPU setup options to mCpuPolicyConfiguration
  238. //
  239. mCpuPolicyConfiguration.Policy.CpuEistEnable = SetupData.SocketConfig.PowerManagementConfig.ProcessorEistEnable ? TRUE : FALSE;
  240. mCpuPolicyConfiguration.Policy.CpuVtEnable = SetupData.SocketConfig.SocketProcessorCoreConfiguration.ProcessorVmxEnable ? TRUE : FALSE;
  241. mCpuPolicyConfiguration.Policy.CpuLtEnable = SetupData.SocketConfig.SocketProcessorCoreConfiguration.ProcessorSmxEnable ? TRUE : FALSE;
  242. mCpuPolicyConfiguration.Policy.CpuFastStringEnable = SetupData.SocketConfig.SocketProcessorCoreConfiguration.FastStringEnable ? TRUE : FALSE;
  243. mCpuPolicyConfiguration.Policy.CpuMaxCpuidValueLimitEnable = SetupData.SocketConfig.SocketProcessorCoreConfiguration.CpuidMaxValue ? TRUE : FALSE;
  244. mCpuPolicyConfiguration.Policy.CpuMachineCheckEnable = SetupData.SocketConfig.SocketProcessorCoreConfiguration.MachineCheckEnable ? TRUE : FALSE;
  245. mCpuPolicyConfiguration.Policy.CpuDcuPrefetcherEnable = SetupData.SocketConfig.SocketProcessorCoreConfiguration.DCUStreamerPrefetcherEnable ? TRUE : FALSE;
  246. mCpuPolicyConfiguration.Policy.CpuIpPrefetcherEnable = SetupData.SocketConfig.SocketProcessorCoreConfiguration.DCUIPPrefetcherEnable ? TRUE : FALSE;
  247. mCpuPolicyConfiguration.Policy.CpuMonitorMwaitEnable = SetupData.SocketConfig.PowerManagementConfig.MonitorMWait ? TRUE : FALSE;
  248. mCpuPolicyConfiguration.Policy.CpuTurboModeEnable = SetupData.SocketConfig.PowerManagementConfig.TurboMode ? TRUE : FALSE;
  249. mCpuPolicyConfiguration.Policy.CpuThermalManagementEnable = SetupData.SocketConfig.PowerManagementConfig.EnableThermalMonitor ? TRUE : FALSE;
  250. mCpuPolicyConfiguration.Policy.CpuTccActivationOffset = SetupData.SocketConfig.PowerManagementConfig.TCCActivationOffset;
  251. mCpuPolicyConfiguration.Policy.CpuL1NextPagePrefetcherDisable = SetupData.SocketConfig.SocketProcessorCoreConfiguration.CpuL1NextPagePrefetcherDisable ? TRUE : FALSE;
  252. if (SetupData.SocketConfig.PowerManagementConfig.TStateEnable && (SetupData.SocketConfig.PowerManagementConfig.OnDieThermalThrottling > 0)) {
  253. mCpuPolicyConfiguration.Policy.CpuTStateEnable = SetupData.SocketConfig.PowerManagementConfig.TStateEnable ? TRUE : FALSE;
  254. }
  255. mCpuPolicyConfiguration.Policy.CpuMlcStreamerPrefetecherEnable = SetupData.SocketConfig.SocketProcessorCoreConfiguration.MlcStreamerPrefetcherEnable ? TRUE : FALSE;
  256. mCpuPolicyConfiguration.Policy.CpuMlcSpatialPrefetcherEnable = SetupData.SocketConfig.SocketProcessorCoreConfiguration.MlcSpatialPrefetcherEnable ? TRUE : FALSE;
  257. mCpuPolicyConfiguration.Policy.CpuThreeStrikeCounterEnable = SetupData.SocketConfig.SocketProcessorCoreConfiguration.ThreeStrikeTimer ? TRUE : FALSE;
  258. mCpuPolicyConfiguration.Policy.CpuEnergyPerformanceBiasEnable = TRUE;
  259. mCpuPolicyConfiguration.Policy.CpuX2ApicEnable = (SetupData.SocketConfig.SocketProcessorCoreConfiguration.ProcessorX2apic || DynamicSiLibraryProtocol->X2ApicIdDetect (NULL)) ? TRUE : FALSE;
  260. mCpuPolicyConfiguration.Policy.CpuAesEnable = SetupData.SocketConfig.SocketProcessorCoreConfiguration.AesEnable ? TRUE : FALSE;
  261. mCpuPolicyConfiguration.Policy.CpuPpinControlEnable = SetupData.SocketConfig.SocketProcessorCoreConfiguration.PpinControl ? TRUE : FALSE;
  262. mCpuPolicyConfiguration.Policy.CpuPeciDownstreamWriteEnable = SetupData.SocketConfig.SocketProcessorCoreConfiguration.PCIeDownStreamPECIWrite ? TRUE : FALSE;
  263. if ((CpuFamilyModelStepping >> 4) == CPU_FAMILY_ICX) {
  264. mCpuPolicyConfiguration.Policy.CpuC1AutoDemotionEnable = SetupData.SocketConfig.PowerManagementConfig.C1AutoDemotion ? TRUE : FALSE;
  265. mCpuPolicyConfiguration.Policy.CpuC1AutoUndemotionEnable = SetupData.SocketConfig.PowerManagementConfig.C1AutoUnDemotion ? TRUE : FALSE;
  266. }
  267. mCpuPolicyConfiguration.Policy.CpuCStateEnable = TRUE;
  268. mPpmPolicyConfiguration.OverclockingLock = SetupData.SocketConfig.PowerManagementConfig.OverclockingLock;
  269. mPpmPolicyConfiguration.AvxSupport = SetupData.SocketConfig.PowerManagementConfig.AvxSupport;
  270. mPpmPolicyConfiguration.AvxIccpLevel = SetupData.SocketConfig.PowerManagementConfig.AvxIccpLevel;
  271. mPpmPolicyConfiguration.GpssTimer = SetupData.SocketConfig.PowerManagementConfig.GpssTimer;
  272. mPpmPolicyConfiguration.FastRaplDutyCycle = SetupData.SocketConfig.PowerManagementConfig.FastRaplDutyCycle;
  273. if (mIioUds->PlatformData.EVMode) {
  274. mCpuPolicyConfiguration.Policy.CpuLtEnable = FALSE;
  275. }
  276. if (SetupData.SocketConfig.PowerManagementConfig.ProcessorEistEnable) {
  277. mCpuPolicyConfiguration.Policy.CpuHwCoordinationEnable = SetupData.SocketConfig.PowerManagementConfig.ProcessorEistPsdFunc ? FALSE : TRUE;
  278. mCpuPolicyConfiguration.Policy.CpuBootPState = SetupData.SocketConfig.PowerManagementConfig.BootPState;
  279. } else {
  280. mCpuPolicyConfiguration.Policy.CpuTurboModeEnable = FALSE;
  281. }
  282. mCpuPolicyConfiguration.Policy.CpuAcpiLvl2Addr = PCH_ACPI_BASE_ADDRESS + R_ACPI_LV2;
  283. mCpuPolicyConfiguration.Policy.CpuPackageCStateLimit = PackageCStateSetting;
  284. if ((SetupData.SocketConfig.PowerManagementConfig.TStateEnable) && (SetupData.SocketConfig.PowerManagementConfig.OnDieThermalThrottling > 0)) {
  285. mCpuPolicyConfiguration.Policy.CpuClockModulationDutyCycle = SetupData.SocketConfig.PowerManagementConfig.OnDieThermalThrottling;
  286. }
  287. Status = PcdSetBoolS (PcdCpuSmmMsrSaveStateEnable, SetupData.SocketConfig.SocketProcessorCoreConfiguration.eSmmSaveState? TRUE : FALSE);
  288. ASSERT_EFI_ERROR (Status);
  289. if (EFI_ERROR(Status)) {
  290. return Status;
  291. }
  292. if (SetupData.SystemConfig.EmcaMsmiEn != 0) {
  293. Status = PcdSetBoolS (PcdCpuSmmProtectedModeEnable, TRUE);
  294. ASSERT_EFI_ERROR (Status);
  295. if (EFI_ERROR(Status)) {
  296. return Status;
  297. }
  298. } else {
  299. Status = PcdSetBoolS (PcdCpuSmmProtectedModeEnable, FALSE);
  300. ASSERT_EFI_ERROR (Status);
  301. if (EFI_ERROR(Status)) {
  302. return Status;
  303. }
  304. }
  305. mCpuPolicyConfiguration.Policy.CpuIioLlcWaysBitMask = SetupData.SocketConfig.SocketProcessorCoreConfiguration.IioLlcWaysMask;
  306. mCpuPolicyConfiguration.Policy.CpuExpandedIioLlcWaysBitMask = SetupData.SocketConfig.SocketProcessorCoreConfiguration.ExpandedIioLlcWaysMask;
  307. mCpuPolicyConfiguration.Policy.CpuRemoteWaysBitMask = SetupData.SocketConfig.SocketProcessorCoreConfiguration.RemoteWaysMask;
  308. mCpuPolicyConfiguration.Policy.CpuRrqCountThreshold = mIioUds->PlatformData.RemoteRequestThreshold;
  309. mCpuPolicyConfiguration.Policy.CpuCrashLogGprs = (SetupData.SocketConfig.SocketProcessorCoreConfiguration.CpuCrashLogGprs > 0) ? TRUE : FALSE;
  310. //CSR SAPM CTL
  311. for( socket = 0; socket < MAX_SOCKET; socket++) {
  312. mPpmPolicyConfiguration.SapmCtl[socket].Iio0PkgcClkGateDis = SetupData.SocketConfig.PowerManagementConfig.Iio0PkgcClkGateDis[socket];
  313. mPpmPolicyConfiguration.SapmCtl[socket].Iio1PkgcClkGateDis = SetupData.SocketConfig.PowerManagementConfig.Iio1PkgcClkGateDis[socket];
  314. mPpmPolicyConfiguration.SapmCtl[socket].Iio2PkgcClkGateDis = SetupData.SocketConfig.PowerManagementConfig.Iio2PkgcClkGateDis[socket];
  315. mPpmPolicyConfiguration.SapmCtl[socket].Kti01PkgcClkGateDis = SetupData.SocketConfig.PowerManagementConfig.Kti01PkgcClkGateDis[socket];
  316. mPpmPolicyConfiguration.SapmCtl[socket].Kti23PkgcClkGateDis = SetupData.SocketConfig.PowerManagementConfig.Kti23PkgcClkGateDis[socket];
  317. mPpmPolicyConfiguration.SapmCtl[socket].Mc0PkgcClkGateDis = SetupData.SocketConfig.PowerManagementConfig.Mc0PkgcClkGateDis[socket];
  318. mPpmPolicyConfiguration.SapmCtl[socket].Mc1PkgcClkGateDis = SetupData.SocketConfig.PowerManagementConfig.Mc1PkgcClkGateDis[socket];
  319. mPpmPolicyConfiguration.SapmCtl[socket].P0pllOffEna = SetupData.SocketConfig.PowerManagementConfig.P0pllOffEna[socket];
  320. mPpmPolicyConfiguration.SapmCtl[socket].P1pllOffEna = SetupData.SocketConfig.PowerManagementConfig.P1pllOffEna[socket];
  321. mPpmPolicyConfiguration.SapmCtl[socket].P2pllOffEna = SetupData.SocketConfig.PowerManagementConfig.P2pllOffEna[socket];
  322. mPpmPolicyConfiguration.SapmCtl[socket].Kti01pllOffEna = SetupData.SocketConfig.PowerManagementConfig.Kti01pllOffEna[socket];
  323. mPpmPolicyConfiguration.SapmCtl[socket].Kti23pllOffEna = SetupData.SocketConfig.PowerManagementConfig.Kti23pllOffEna[socket];
  324. mPpmPolicyConfiguration.SapmCtl[socket].Mc0pllOffEna = SetupData.SocketConfig.PowerManagementConfig.Mc0pllOffEna[socket];
  325. mPpmPolicyConfiguration.SapmCtl[socket].Mc1pllOffEna = SetupData.SocketConfig.PowerManagementConfig.Mc1pllOffEna[socket];
  326. mPpmPolicyConfiguration.SapmCtl[socket].SetvidDecayDisable = SetupData.SocketConfig.PowerManagementConfig.SetvidDecayDisable[socket];
  327. mPpmPolicyConfiguration.SapmCtl[socket].SapmCtlLock = SetupData.SocketConfig.PowerManagementConfig.SapmCtlLock[socket];
  328. if (SetupData.SocketConfig.MemoryConfig.OppSrefEn == 1) {
  329. mPpmPolicyConfiguration.SapmCtl[socket].Mc0PkgcIoVolRedDis = 1;
  330. mPpmPolicyConfiguration.SapmCtl[socket].Mc1PkgcIoVolRedDis = 1;
  331. mPpmPolicyConfiguration.SapmCtl[socket].Mc0PkgcDigVolRedDis = 1;
  332. mPpmPolicyConfiguration.SapmCtl[socket].Mc1PkgcDigVolRedDis = 1;
  333. }
  334. if (Sp7.Bits.AepDimmPresent == 1) {
  335. mPpmPolicyConfiguration.SapmCtl[socket].Mc0pllOffEna = 0;
  336. mPpmPolicyConfiguration.SapmCtl[socket].Mc1pllOffEna = 0;
  337. mPpmPolicyConfiguration.SapmCtl[socket].Mc0PkgcClkGateDis = 1;
  338. mPpmPolicyConfiguration.SapmCtl[socket].Mc1PkgcClkGateDis = 1;
  339. }
  340. }
  341. //
  342. // PMAX Detector Config
  343. //
  344. mPpmPolicyConfiguration.PmaxConfig.PmaxDetector = SetupData.SocketConfig.PowerManagementConfig.PmaxDetector;
  345. mPpmPolicyConfiguration.PmaxConfig.PmaxAutoAdjustment = SetupData.SocketConfig.PowerManagementConfig.PmaxAutoAdjustment;
  346. mPpmPolicyConfiguration.PmaxConfig.PmaxLoadLine = SetupData.SocketConfig.PowerManagementConfig.PmaxLoadLine;
  347. mPpmPolicyConfiguration.PmaxConfig.PmaxSign = SetupData.SocketConfig.PowerManagementConfig.PmaxSign;
  348. mPpmPolicyConfiguration.PmaxConfig.PmaxOffset = SetupData.SocketConfig.PowerManagementConfig.PmaxOffset;
  349. mPpmPolicyConfiguration.PmaxConfig.PmaxTriggerSetup = SetupData.SocketConfig.PowerManagementConfig.PmaxTriggerSetup;
  350. //
  351. // PERF_P_LIMIT_CONTROL (CSR 1:30:2:0xE4)
  352. //
  353. mPpmPolicyConfiguration.PerPLimitCtl.PerfPLmtThshld = SetupData.SocketConfig.PowerManagementConfig.PerfPLmtThshld;
  354. mPpmPolicyConfiguration.PerPLimitCtl.PerfPLimitClipC = SetupData.SocketConfig.PowerManagementConfig.PerfPLimitClipC;
  355. mPpmPolicyConfiguration.PerPLimitCtl.PerfPlimitDifferential = SetupData.SocketConfig.PowerManagementConfig.PerfPlimitDifferential;
  356. mPpmPolicyConfiguration.PerPLimitCtl.PerfPLimitEn = SetupData.SocketConfig.PowerManagementConfig.PerfPLimitEn;
  357. mPpmPolicyConfiguration.DynamicIss = SetupData.SocketConfig.PowerManagementConfig.DynamicIss;
  358. mPpmPolicyConfiguration.IssCapableSystem = CpuVarDataPtr->IssCapableSystem;
  359. mPpmPolicyConfiguration.ConfigTDPLevel = CpuVarDataPtr->IssConfigTdpCurrentLevel;
  360. mPpmPolicyConfiguration.ConfigTDPLock = SetupData.SocketConfig.PowerManagementConfig.ConfigTdpLock;
  361. for (socket = 0; socket < MAX_SOCKET; socket++) {
  362. mPpmPolicyConfiguration.PmaxConfig.BasePackageTdp[socket] = CpuVarDataPtr->IssConfigTdpPower[socket][0];
  363. mPpmPolicyConfiguration.CurrentPackageTdp[socket] = CpuVarDataPtr->IssConfigTdpPower[socket][mPpmPolicyConfiguration.ConfigTDPLevel];
  364. if ((CpuFamilyModelStepping >> 4) != CPU_FAMILY_SKX) {
  365. mPpmPolicyConfiguration.PkgcCriteria.EnablePkgCCriteriaKti[socket] = SetupData.SocketConfig.PowerManagementConfig.EnablePkgCCriteriaKti[socket];
  366. mPpmPolicyConfiguration.PkgcCriteria.EnablePkgCCriteriaRlink[socket] = SetupData.SocketConfig.PowerManagementConfig.EnablePkgCCriteriaRlink[socket];
  367. mPpmPolicyConfiguration.PkgcCriteria.EnablePkgCCriteriaFxr[socket] = SetupData.SocketConfig.PowerManagementConfig.EnablePkgCCriteriaFxr[socket];
  368. mPpmPolicyConfiguration.PkgcCriteria.EnablePkgCCriteriaMcddr[socket] = SetupData.SocketConfig.PowerManagementConfig.EnablePkgCCriteriaMcddr[socket];
  369. mPpmPolicyConfiguration.PkgcCriteria.EnablePkgCCriteriaHbm[socket] = SetupData.SocketConfig.PowerManagementConfig.EnablePkgCCriteriaHbm[socket];
  370. mPpmPolicyConfiguration.PkgcCriteria.EnablePkgCCriteriaIio[socket] = SetupData.SocketConfig.PowerManagementConfig.EnablePkgCCriteriaIio[socket];
  371. mPpmPolicyConfiguration.PkgcCriteria.EnablePkgCCriteriaHqm[socket] = SetupData.SocketConfig.PowerManagementConfig.EnablePkgCCriteriaHqm[socket];
  372. mPpmPolicyConfiguration.PkgcCriteria.EnablePkgCCriteriaNac[socket] = SetupData.SocketConfig.PowerManagementConfig.EnablePkgCCriteriaNac[socket];
  373. mPpmPolicyConfiguration.PkgcCriteria.EnablePkgCCriteriaTip[socket] = SetupData.SocketConfig.PowerManagementConfig.EnablePkgCCriteriaTip[socket];
  374. mPpmPolicyConfiguration.PkgcCriteria.EnablePkgCCriteriaMdfs[socket] = SetupData.SocketConfig.PowerManagementConfig.EnablePkgCCriteriaMdfs[socket];
  375. mPpmPolicyConfiguration.PkgcCriteria.PkgCCriteriaLogicalIpType[socket] = SetupData.SocketConfig.PowerManagementConfig.PkgCCriteriaLogicalIpType[socket];
  376. mPpmPolicyConfiguration.PkgcCriteria.PkgCCriteriaLogicalIpTypeMcddr[socket] = SetupData.SocketConfig.PowerManagementConfig.PkgCCriteriaLogicalIpTypeMcddr[socket];
  377. mPpmPolicyConfiguration.PkgcCriteria.PkgCCriteriaLogicalIpTypeIio[socket] = SetupData.SocketConfig.PowerManagementConfig.PkgCCriteriaLogicalIpTypeIio[socket];
  378. mPpmPolicyConfiguration.PkgcCriteria.PkgCCriteriaInstanceNoKti[socket] = SetupData.SocketConfig.PowerManagementConfig.PkgCCriteriaInstanceNoKti[socket];
  379. mPpmPolicyConfiguration.PkgcCriteria.EnableLinkInL1Kti[socket] = SetupData.SocketConfig.PowerManagementConfig.EnableLinkInL1Kti[socket];
  380. mPpmPolicyConfiguration.PkgcCriteria.PkgCCriteriaInstanceNoRlink[socket] = SetupData.SocketConfig.PowerManagementConfig.PkgCCriteriaInstanceNoRlink[socket];
  381. mPpmPolicyConfiguration.PkgcCriteria.EnableLinkInL1Rlink[socket] = SetupData.SocketConfig.PowerManagementConfig.EnableLinkInL1Rlink[socket];
  382. mPpmPolicyConfiguration.PkgcCriteria.PkgCCriteriaInstanceNoFxr[socket] = SetupData.SocketConfig.PowerManagementConfig.PkgCCriteriaInstanceNoFxr[socket];
  383. mPpmPolicyConfiguration.PkgcCriteria.PkgcCriteraPsMaskFxr[socket] = SetupData.SocketConfig.PowerManagementConfig.PkgcCriteraPsMaskFxr[socket];
  384. mPpmPolicyConfiguration.PkgcCriteria.PkgCCriteriaAllowedPsMaskFxr[socket] = SetupData.SocketConfig.PowerManagementConfig.PkgCCriteriaAllowedPsMaskFxr[socket];
  385. mPpmPolicyConfiguration.PkgcCriteria.PkgCCriteriaInstanceNoMcddr[socket] = SetupData.SocketConfig.PowerManagementConfig.PkgCCriteriaInstanceNoMcddr[socket];
  386. mPpmPolicyConfiguration.PkgcCriteria.PkgcCriteriaPsOptionMcddr[socket] = SetupData.SocketConfig.PowerManagementConfig.PkgcCriteriaPsOptionMcddr[socket];
  387. mPpmPolicyConfiguration.PkgcCriteria.PkgCCriteriaInstanceNoHbm[socket] = SetupData.SocketConfig.PowerManagementConfig.PkgCCriteriaInstanceNoHbm[socket];
  388. mPpmPolicyConfiguration.PkgcCriteria.PkgcCriteriaPsOptionHbm[socket] = SetupData.SocketConfig.PowerManagementConfig.PkgcCriteriaPsOptionHbm[socket];
  389. mPpmPolicyConfiguration.PkgcCriteria.PkgCCriteriaInstanceNoIio[socket] = SetupData.SocketConfig.PowerManagementConfig.PkgCCriteriaInstanceNoIio[socket];
  390. mPpmPolicyConfiguration.PkgcCriteria.EnableLinkInL1Iio[socket] = SetupData.SocketConfig.PowerManagementConfig.EnableLinkInL1Iio[socket];
  391. mPpmPolicyConfiguration.PkgcCriteria.PkgCCriteriaInstanceNoHqm[socket] = SetupData.SocketConfig.PowerManagementConfig.PkgCCriteriaInstanceNoHqm[socket];
  392. mPpmPolicyConfiguration.PkgcCriteria.PkgcCriteraPsMaskHqm[socket] = SetupData.SocketConfig.PowerManagementConfig.PkgcCriteraPsMaskHqm[socket];
  393. mPpmPolicyConfiguration.PkgcCriteria.PkgCCriteriaAllowedPsMaskHqm[socket] = SetupData.SocketConfig.PowerManagementConfig.PkgCCriteriaAllowedPsMaskHqm[socket];
  394. mPpmPolicyConfiguration.PkgcCriteria.PkgCCriteriaInstanceNoNac[socket] = SetupData.SocketConfig.PowerManagementConfig.PkgCCriteriaInstanceNoNac[socket];
  395. mPpmPolicyConfiguration.PkgcCriteria.PkgcCriteraPsMaskNac[socket] = SetupData.SocketConfig.PowerManagementConfig.PkgcCriteraPsMaskNac[socket];
  396. mPpmPolicyConfiguration.PkgcCriteria.PkgCCriteriaAllowedPsMaskNac[socket] = SetupData.SocketConfig.PowerManagementConfig.PkgCCriteriaAllowedPsMaskNac[socket];
  397. mPpmPolicyConfiguration.PkgcCriteria.PkgCCriteriaInstanceNoTip[socket] = SetupData.SocketConfig.PowerManagementConfig.PkgCCriteriaInstanceNoTip[socket];
  398. mPpmPolicyConfiguration.PkgcCriteria.PkgcCriteraPsMaskTip[socket] = SetupData.SocketConfig.PowerManagementConfig.PkgcCriteraPsMaskTip[socket];
  399. mPpmPolicyConfiguration.PkgcCriteria.PkgCCriteriaAllowedPsMaskTip[socket] = SetupData.SocketConfig.PowerManagementConfig.PkgCCriteriaAllowedPsMaskTip[socket];
  400. mPpmPolicyConfiguration.PkgcCriteria.PkgCCriteriaInstanceNoMdfs[socket] = SetupData.SocketConfig.PowerManagementConfig.PkgCCriteriaInstanceNoMdfs[socket];
  401. mPpmPolicyConfiguration.PkgcCriteria.AllowLpStateMdfs[socket] = SetupData.SocketConfig.PowerManagementConfig.AllowLpStateMdfs[socket];
  402. }
  403. if ((CpuFamilyModelStepping >> 4) == CPU_FAMILY_SKX) {
  404. mPpmPolicyConfiguration.PpmCst.PkgCstEntryCriteriaMaskKti[socket] = (SetupData.SocketConfig.PowerManagementConfig.Kti0In[socket] |
  405. (SetupData.SocketConfig.PowerManagementConfig.Kti1In[socket] << 1) |
  406. (SetupData.SocketConfig.PowerManagementConfig.Kti2In[socket] << 2) );
  407. if (SetupData.SocketConfig.PowerManagementConfig.PcieIio0In[socket]) {
  408. mPpmPolicyConfiguration.PpmCst.PkgCstEntryCriteriaMaskPcie[socket] |= SET_PCIEx_MASK;
  409. }
  410. if (SetupData.SocketConfig.PowerManagementConfig.PcieIio1In[socket]) {
  411. mPpmPolicyConfiguration.PpmCst.PkgCstEntryCriteriaMaskPcie[socket] |= (SET_PCIEx_MASK << 4);
  412. }
  413. if (SetupData.SocketConfig.PowerManagementConfig.PcieIio2In[socket]) {
  414. mPpmPolicyConfiguration.PpmCst.PkgCstEntryCriteriaMaskPcie[socket] |= (SET_PCIEx_MASK << 8);
  415. }
  416. if (SetupData.SocketConfig.PowerManagementConfig.PcieIio3In[socket]) {
  417. mPpmPolicyConfiguration.PpmCst.PkgCstEntryCriteriaMaskPcie[socket] |= (SET_PCIEx_MASK << 12);
  418. }
  419. if (SetupData.SocketConfig.PowerManagementConfig.PcieIio4In[socket]) {
  420. mPpmPolicyConfiguration.PpmCst.PkgCstEntryCriteriaMaskPcie[socket] |= (SET_PCIEx_MASK << 16);
  421. }
  422. if (SetupData.SocketConfig.PowerManagementConfig.PcieIio5In[socket]) {
  423. mPpmPolicyConfiguration.PpmCst.PkgCstEntryCriteriaMaskPcie[socket] |= (SET_PCIEx_MASK << 20);
  424. }
  425. }
  426. }
  427. mPpmPolicyConfiguration.AdvPwrMgtCtl.SapmctlValCtl = SetupData.SocketConfig.PowerManagementConfig.SapmctlValCtl;
  428. mPpmPolicyConfiguration.AdvPwrMgtCtl.MsrLock = 1;
  429. mPpmPolicyConfiguration.AdvPwrMgtCtl.PkgCstEntryValCtl = SetupData.SocketConfig.PowerManagementConfig.PkgCstEntryValCtl;
  430. mPpmPolicyConfiguration.AdvPwrMgtCtl.CurrentConfig = SetupData.SocketConfig.PowerManagementConfig.CurrentConfig;
  431. mPpmPolicyConfiguration.TurboPowerLimit.TurboLimitCsrLock = 1;
  432. mPpmPolicyConfiguration.AdvPwrMgtCtl.MsrPkgCstConfigControlLock = SetupData.SocketConfig.SocketProcessorCoreConfiguration.ProcessorMsrPkgCstConfigControlLock ? 1 : 0;
  433. if ((PackageCStateSetting > 0) && SetupData.SocketConfig.PowerManagementConfig.DynamicL1) {
  434. mPpmPolicyConfiguration.AdvPwrMgtCtl.DynamicL1Disable = 1;
  435. }
  436. if (SetupData.SocketConfig.PowerManagementConfig.VccSAandVccIOdisable) {
  437. mPpmPolicyConfiguration.AdvPwrMgtCtl.VccsaVccioDisable = 1;
  438. }
  439. mPpmPolicyConfiguration.AdvPwrMgtCtl.SwLtrOvrdCtl = SetupData.SocketConfig.PowerManagementConfig.SwLtrOvrdCtl;
  440. mPpmPolicyConfiguration.AdvPwrMgtCtl.EnableLowerLatencyMode = SetupData.SocketConfig.PowerManagementConfig.EnableLowerLatencyMode;
  441. if (SetupData.SocketConfig.PowerManagementConfig.ProcessorEistEnable == 0) {
  442. mPpmPolicyConfiguration.PowerCtl.EeTurboDisable = 1;
  443. }
  444. mPpmPolicyConfiguration.PowerCtl.PkgCLatNeg = SetupData.SocketConfig.PowerManagementConfig.PkgCLatNeg;
  445. mPpmPolicyConfiguration.PowerCtl.LtrSwInput = SetupData.SocketConfig.PowerManagementConfig.LTRSwInput;
  446. mPpmPolicyConfiguration.PowerCtl.PwrPerfSwitch = SetupData.SocketConfig.PowerManagementConfig.PwrPerfSwitch;
  447. mPpmPolicyConfiguration.PowerCtl.SapmControl = SetupData.SocketConfig.PowerManagementConfig.SAPMControl;
  448. mPpmPolicyConfiguration.PowerCtl.EeTurboDisable = SetupData.SocketConfig.PowerManagementConfig.EETurboDisable;
  449. mPpmPolicyConfiguration.PowerCtl.ProchotLock = 1;
  450. mPpmPolicyConfiguration.PowerCtl.C1eEnable = SetupData.SocketConfig.PowerManagementConfig.ProcessorC1eEnable;
  451. mPpmPolicyConfiguration.PowerCtl.SetvidDecayDisable = SetupData.SocketConfig.PowerManagementConfig.SetvidDecayDisable[0];
  452. if ((SetupData.SocketConfig.PowerManagementConfig.ProcessorHWPMEnable == 3) && !SetupData.SocketConfig.PowerManagementConfig.PwrPerfTuning) {
  453. // If hwp native w/o legacy then default value is "BIOS Controls EPB". OS Control of EPB should not be allowed
  454. mPpmPolicyConfiguration.PowerCtl.PwrPerfTuning = 1;
  455. } else if ((SetupData.SocketConfig.PowerManagementConfig.ProcessorHWPMEnable == 2) && !SetupData.SocketConfig.PowerManagementConfig.PwrPerfTuning) {
  456. // if hwp oob mode then default value is "PECI Controls EPB". OS Control of EPB should not be allowed
  457. mPpmPolicyConfiguration.PowerCtl.PwrPerfTuning = 2;
  458. } else {
  459. mPpmPolicyConfiguration.PowerCtl.PwrPerfTuning = SetupData.SocketConfig.PowerManagementConfig.PwrPerfTuning;
  460. }
  461. // From Setup:
  462. // 0: Output only
  463. // 1: Disable
  464. // 2: Bi-Directional
  465. // 3: Input Only
  466. //
  467. if ((SetupData.SocketConfig.PowerManagementConfig.EnableProcHot & 1) == 0) {
  468. mPpmPolicyConfiguration.PowerCtl.ProchotOutputDisable = 0;
  469. } else {
  470. mPpmPolicyConfiguration.PowerCtl.ProchotOutputDisable = 1;
  471. }
  472. if ((SetupData.SocketConfig.PowerManagementConfig.EnableProcHot & 2) == 0) {
  473. mPpmPolicyConfiguration.PowerCtl.BidirProchotEnable = 0;
  474. } else {
  475. mPpmPolicyConfiguration.PowerCtl.BidirProchotEnable = 1;
  476. }
  477. //
  478. // PROCHOT_RESPONSE_RATIO (CSR 1:30:2:0xB0)
  479. //
  480. mPpmPolicyConfiguration.ProchotRatio = SetupData.SocketConfig.PowerManagementConfig.ProchotResponseRatio;
  481. mPpmPolicyConfiguration.PpoCurrentCfg.PpcccLock = SetupData.SocketConfig.PowerManagementConfig.PpcccLock;
  482. mPpmPolicyConfiguration.PpoCurrentCfg.CurrentLimit = SetupData.SocketConfig.PowerManagementConfig.CurrentLimit;
  483. // MSR_PACKAGE_POWER_LIMIT 0x610
  484. // CSR_TURBO_POWER_LIMIT 1:30:0:0xe8
  485. TurboPowerLimit = &mPpmPolicyConfiguration.TurboPowerLimit;
  486. TurboPowerLimit->TurboPowerLimitLock = SetupData.SocketConfig.PowerManagementConfig.TurboPowerLimitLock;
  487. TurboPowerLimit->PowerLimit1Power = SetupData.SocketConfig.PowerManagementConfig.PowerLimit1Power;
  488. TurboPowerLimit->PowerLimit1Time = SetupData.SocketConfig.PowerManagementConfig.PowerLimit1Time;
  489. TurboPowerLimit->PowerLimit1En = SetupData.SocketConfig.PowerManagementConfig.PowerLimit1En;
  490. TurboPowerLimit->PowerLimit2Power = SetupData.SocketConfig.PowerManagementConfig.PowerLimit2Power;
  491. TurboPowerLimit->PowerLimit2Time = SetupData.SocketConfig.PowerManagementConfig.PowerLimit2Time;
  492. TurboPowerLimit->PowerLimit2En = SetupData.SocketConfig.PowerManagementConfig.PowerLimit2En;
  493. TurboPowerLimit->PkgClmpLim1 = 1;
  494. TurboPowerLimit->PkgClmpLim2 = 1;
  495. // DYNAMIC_PERF_POWER_CTL (CSR 1:30:2:0x64)
  496. mPpmPolicyConfiguration.DynamicPerPowerCtl.UncrPerfPlmtOvrdEn = SetupData.SocketConfig.PowerManagementConfig.UncrPerfPlmtOvrdEn;
  497. mPpmPolicyConfiguration.DynamicPerPowerCtl.EetOverrideEn = SetupData.SocketConfig.PowerManagementConfig.EetOverrideEn;
  498. mPpmPolicyConfiguration.DynamicPerPowerCtl.IoBwPlmtOvrdEn = SetupData.SocketConfig.PowerManagementConfig.IoBwPlmtOvrdEn;
  499. mPpmPolicyConfiguration.DynamicPerPowerCtl.IomApmOvrdEn = SetupData.SocketConfig.PowerManagementConfig.IomApmOvrdEn;
  500. mPpmPolicyConfiguration.DynamicPerPowerCtl.KtiApmOvrdEn = SetupData.SocketConfig.PowerManagementConfig.KtiApmOvrdEn;
  501. //
  502. // CSR_PCIE_ILTR_OVRD (CSR 1:30:1:0xFC)
  503. // SW_LTR_OVRD (MSR 0xa02) -- not used
  504. //
  505. mPpmPolicyConfiguration.PcieIltrOvrd.SnpLatVld = SetupData.SocketConfig.PowerManagementConfig.SnpLatVld;
  506. mPpmPolicyConfiguration.PcieIltrOvrd.SnpLatOvrd = SetupData.SocketConfig.PowerManagementConfig.SnpLatOvrd;
  507. mPpmPolicyConfiguration.PcieIltrOvrd.SnpLatMult = SetupData.SocketConfig.PowerManagementConfig.SnpLatMult;
  508. mPpmPolicyConfiguration.PcieIltrOvrd.SnpLatVal = SetupData.SocketConfig.PowerManagementConfig.SnpLatVal;
  509. mPpmPolicyConfiguration.PcieIltrOvrd.NonSnpLatVld = SetupData.SocketConfig.PowerManagementConfig.NonSnpLatVld;
  510. mPpmPolicyConfiguration.PcieIltrOvrd.NonSnpLatOvrd = SetupData.SocketConfig.PowerManagementConfig.NonSnpLatOvrd;
  511. mPpmPolicyConfiguration.PcieIltrOvrd.NonSnpLatMult = SetupData.SocketConfig.PowerManagementConfig.NonSnpLatMult;
  512. mPpmPolicyConfiguration.PcieIltrOvrd.NonSnpLatVal = SetupData.SocketConfig.PowerManagementConfig.NonSnpLatVal;
  513. for(i = 0; i < 8; i++) {
  514. mPpmPolicyConfiguration.TurboRatioLimit.RatioLimitRatio[i] = SetupData.SocketConfig.PowerManagementConfig.TurboRatioLimitRatio[i];
  515. mPpmPolicyConfiguration.TurboRatioLimit.RatioLimitRatioMask[i] = 0xFF;
  516. if (SetupData.SocketConfig.PowerManagementConfig.TurboRatioLimitRatio[i] > 0) {
  517. mPpmPolicyConfiguration.TurboRatioLimit.RatioLimitRatioMask[i] = 0;
  518. }
  519. mPpmPolicyConfiguration.TurboRatioLimit.RatioLimitCoresMask[i] = 0xFF;
  520. mPpmPolicyConfiguration.TurboRatioLimit.RatioLimitCores[i] = 0;
  521. if (SetupData.SocketConfig.PowerManagementConfig.TurboRatioLimitCores[i] != 0xFF) {
  522. mPpmPolicyConfiguration.TurboRatioLimit.RatioLimitCoresMask[i] = 0;
  523. mPpmPolicyConfiguration.TurboRatioLimit.RatioLimitCores[i] = SetupData.SocketConfig.PowerManagementConfig.TurboRatioLimitCores[i];
  524. }
  525. }
  526. //
  527. // ENERGY_PERF_BIAS_CONFIG (MSR 0xA01)
  528. //
  529. mPpmPolicyConfiguration.PerfBiasConfig.EngAvgTimeWdw1 = SetupData.SocketConfig.PowerManagementConfig.EngAvgTimeWdw1;
  530. mPpmPolicyConfiguration.PerfBiasConfig.P0TtlTimeLow1 = SetupData.SocketConfig.PowerManagementConfig.P0TtlTimeLow1;
  531. mPpmPolicyConfiguration.PerfBiasConfig.P0TtlTimeHigh1 = SetupData.SocketConfig.PowerManagementConfig.P0TtlTimeHigh1;
  532. mPpmPolicyConfiguration.PerfBiasConfig.AltEngPerfBIAS = SetupData.SocketConfig.PowerManagementConfig.AltEngPerfBIAS;
  533. mPpmPolicyConfiguration.PerfBiasConfig.WorkLdConfig = SetupData.SocketConfig.PowerManagementConfig.WorkLdConfig;
  534. //
  535. //ProcessorHWPM-init as disabled.
  536. //
  537. mPpmPolicyConfiguration.Hwpm.HWPMNative = 0;
  538. mPpmPolicyConfiguration.Hwpm.HWPMOOB = 0;
  539. mPpmPolicyConfiguration.Hwpm.HWPMEnable = SetupData.SocketConfig.PowerManagementConfig.ProcessorHWPMEnable;
  540. mPpmPolicyConfiguration.Hwpm.HWPMInterrupt = SetupData.SocketConfig.PowerManagementConfig.ProcessorHWPMInterrupt;
  541. mPpmPolicyConfiguration.Hwpm.EPPEnable = SetupData.SocketConfig.PowerManagementConfig.ProcessorEPPEnable;
  542. mPpmPolicyConfiguration.Hwpm.EPPProfile = SetupData.SocketConfig.PowerManagementConfig.ProcessorEppProfile;
  543. if ((SetupData.SocketConfig.PowerManagementConfig.ProcessorHWPMEnable == 1) ||
  544. (SetupData.SocketConfig.PowerManagementConfig.ProcessorHWPMEnable == 3)) {
  545. mPpmPolicyConfiguration.Hwpm.HWPMNative = SetupData.SocketConfig.PowerManagementConfig.ProcessorHWPMEnable;
  546. }else if (SetupData.SocketConfig.PowerManagementConfig.ProcessorHWPMEnable == 2){
  547. mPpmPolicyConfiguration.Hwpm.HWPMOOB = SetupData.SocketConfig.PowerManagementConfig.ProcessorHWPMEnable;
  548. mPpmPolicyConfiguration.Hwpm.HWPMInterrupt = 0;
  549. }else if (SetupData.SocketConfig.PowerManagementConfig.ProcessorHWPMEnable == 0){
  550. mPpmPolicyConfiguration.Hwpm.HWPMNative = 0;
  551. mPpmPolicyConfiguration.Hwpm.HWPMOOB = 0;
  552. mPpmPolicyConfiguration.Hwpm.HWPMInterrupt = 0;
  553. mPpmPolicyConfiguration.Hwpm.EPPEnable = 0;
  554. }
  555. mPpmPolicyConfiguration.Hwpm.APSrocketing = SetupData.SocketConfig.PowerManagementConfig.ProcessorAPSrocketing;
  556. mPpmPolicyConfiguration.Hwpm.Scalability = SetupData.SocketConfig.PowerManagementConfig.ProcessorScalability;
  557. mPpmPolicyConfiguration.Hwpm.RaplPrioritization = SetupData.SocketConfig.PowerManagementConfig.ProcessorRaplPrioritization;
  558. mPpmPolicyConfiguration.Hwpm.OutofBandAlternateEPB = SetupData.SocketConfig.PowerManagementConfig.ProcessorOutofBandAlternateEPB;
  559. for (i = 0; i < NUM_CST_LAT_MSR; i++) { // CStateLatencyCtrl CSRs
  560. mPpmPolicyConfiguration.PpmCst.LatencyCtrl[i].Valid = SetupData.SocketConfig.PowerManagementConfig.CStateLatencyCtrlValid[i];
  561. mPpmPolicyConfiguration.PpmCst.LatencyCtrl[i].Multiplier = SetupData.SocketConfig.PowerManagementConfig.CStateLatencyCtrlMultiplier[i];
  562. mPpmPolicyConfiguration.PpmCst.LatencyCtrl[i].Value = SetupData.SocketConfig.PowerManagementConfig.CStateLatencyCtrlValue[i];
  563. }
  564. if (SetupData.SocketConfig.PowerManagementConfig.C2C3TT) { //if option is not AUTO
  565. mPpmPolicyConfiguration.C2C3TT = SetupData.SocketConfig.PowerManagementConfig.C2C3TT;
  566. } else {
  567. mPpmPolicyConfiguration.C2C3TT = 0x10;
  568. }
  569. //
  570. // If Emulation flag set by InitializeDefaultData in MemoryQpiInit.c
  571. // force X2APIC
  572. //
  573. Status = gBS->LocateProtocol (
  574. &gEfiPlatformTypeProtocolGuid,
  575. NULL,
  576. &PlatformType
  577. );
  578. ASSERT_EFI_ERROR (Status);
  579. // allocate memory for IedTrace
  580. if ((SetupData.SocketConfig.SocketProcessorCoreConfiguration.IedTraceSize != 0) && (PcdGet32 (PcdCpuIEDRamSize) != 0)) {
  581. DynamicSiLibraryProtocol->CheckAndPopulateIedTraceMemory(0x400000 << (SetupData.SocketConfig.SocketProcessorCoreConfiguration.IedTraceSize - 1), mIioUds);
  582. }
  583. //
  584. // Install CPU PPM Policy Protocol for platform PPM configuration
  585. //
  586. Handle = NULL;
  587. Status = gBS->InstallProtocolInterface (
  588. &Handle,
  589. &gPpmPolicyProtocolGuid,
  590. EFI_NATIVE_INTERFACE,
  591. &mPpmPolicyConfiguration
  592. );
  593. ASSERT_EFI_ERROR (Status);
  594. //
  595. // Install CPU Policy Protocol for platform configuration
  596. // Cpu Driver could be dispatched after this protocol installed.
  597. //
  598. Handle = NULL;
  599. Status = gBS->InstallProtocolInterface (
  600. &Handle,
  601. &gEfiCpuPolicyProtocolGuid,
  602. EFI_NATIVE_INTERFACE,
  603. &mCpuPolicyConfiguration
  604. );
  605. ASSERT_EFI_ERROR (Status);
  606. return Status;
  607. }