PpmPolicy.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. /**
  2. Copyright (c) 2009 - 2019, Intel Corporation. All rights reserved.<BR>
  3. SPDX-License-Identifier: BSD-2-Clause-Patent
  4. Module Name:
  5. PpmPolicy.c
  6. Abstract:
  7. This file is a wrapper for Intel PPM Platform Policy driver.
  8. Get Setup Value to initilize Intel PPM DXE Platform Policy.
  9. --*/
  10. #include "PpmPolicy.h"
  11. #include <Protocol/MpService.h>
  12. #include <Library/BaseLib.h>
  13. #include <Library/DebugLib.h>
  14. #include <Register/Cpuid.h>
  15. #include <Register/Msr.h>
  16. #include <PchRegs.h>
  17. #include <Library/PchPlatformLib.h>
  18. EFI_STATUS
  19. EFIAPI
  20. PpmPolicyEntry(
  21. IN EFI_HANDLE ImageHandle,
  22. IN EFI_SYSTEM_TABLE *SystemTable
  23. )
  24. {
  25. EFI_BOOT_SERVICES *pBS;
  26. EFI_MP_SERVICES_PROTOCOL *MpService;
  27. EFI_HANDLE Handle;
  28. EFI_STATUS Status;
  29. UINTN CpuCount;
  30. UINTN CpuEnabledCount;
  31. UINT8 CPUMobileFeature;
  32. PCH_STEPPING Stepping;
  33. pBS = SystemTable->BootServices;
  34. //
  35. // Set PPM policy structure to known value
  36. //
  37. pBS->SetMem (&mDxePlatformPpmPolicy, sizeof(PPM_PLATFORM_POLICY_PROTOCOL), 0);
  38. //
  39. // Find the MpService Protocol
  40. //
  41. Status = pBS->LocateProtocol (&gEfiMpServiceProtocolGuid,
  42. NULL,
  43. (void **)&MpService
  44. );
  45. ASSERT_EFI_ERROR (Status);
  46. //
  47. // Get processor count from MP service.
  48. //
  49. Status = MpService->GetNumberOfProcessors (MpService, &CpuCount, &CpuEnabledCount);
  50. ASSERT_EFI_ERROR (Status);
  51. //
  52. // Store the CPUID for use by SETUP items.
  53. //
  54. AsmCpuid (CPUID_VERSION_INFO, NULL, NULL, NULL, NULL);
  55. mDxePlatformPpmPolicy.Revision = PPM_PLATFORM_POLICY_PROTOCOL_REVISION_4;
  56. //Read CPU Mobile feature from PLATFORM_ID_MSR MSR(0x17) NOTFB_I_AM_NOT_MOBILE_FUSE_CLIAMC00H Bit 28
  57. //Bit Description: { Disables Mobile features 0 = I am NOT a mobile part 1 = I am a mobile part (default)"}
  58. CPUMobileFeature = ((RShiftU64 (AsmReadMsr64(MSR_IA32_PLATFORM_ID), 28)) & 0x1);
  59. if (!EFI_ERROR(Status)) {
  60. if (CPUMobileFeature == 1){//CPU mobile feature
  61. mDxePlatformPpmPolicy.FunctionEnables.EnableGv = ICH_DEVICE_ENABLE;
  62. mDxePlatformPpmPolicy.FunctionEnables.EnableCx = ICH_DEVICE_ENABLE;
  63. mDxePlatformPpmPolicy.FunctionEnables.EnableCxe = ICH_DEVICE_DISABLE;
  64. mDxePlatformPpmPolicy.FunctionEnables.EnableTm = ICH_DEVICE_ENABLE;
  65. //MaxC7
  66. mDxePlatformPpmPolicy.FunctionEnables.EnableC7 = ICH_DEVICE_ENABLE;
  67. mDxePlatformPpmPolicy.FunctionEnables.EnableC6 = ICH_DEVICE_ENABLE;
  68. mDxePlatformPpmPolicy.FunctionEnables.EnableC4 = ICH_DEVICE_ENABLE;
  69. }else{//CPU desktop feature
  70. mDxePlatformPpmPolicy.FunctionEnables.EnableGv = ICH_DEVICE_DISABLE;
  71. mDxePlatformPpmPolicy.FunctionEnables.EnableCx = ICH_DEVICE_DISABLE;
  72. mDxePlatformPpmPolicy.FunctionEnables.EnableCxe = ICH_DEVICE_DISABLE;
  73. mDxePlatformPpmPolicy.FunctionEnables.EnableTm = ICH_DEVICE_DISABLE;
  74. mDxePlatformPpmPolicy.FunctionEnables.EnableC4 = ICH_DEVICE_DISABLE;
  75. mDxePlatformPpmPolicy.FunctionEnables.EnableC6 = ICH_DEVICE_DISABLE;
  76. mDxePlatformPpmPolicy.FunctionEnables.EnableC7 = ICH_DEVICE_DISABLE;
  77. }
  78. mDxePlatformPpmPolicy.FunctionEnables.EnableProcHot = ICH_DEVICE_ENABLE;
  79. mDxePlatformPpmPolicy.FunctionEnables.TStatesEnable = ICH_DEVICE_ENABLE;
  80. Stepping = PchStepping();
  81. if (Stepping < PchB3) {
  82. // If SoC is B0~B2 Stepping, disable the Turbo
  83. mDxePlatformPpmPolicy.FunctionEnables.EnableTurboMode= ICH_DEVICE_DISABLE;
  84. } else {
  85. mDxePlatformPpmPolicy.FunctionEnables.EnableTurboMode= ICH_DEVICE_ENABLE;
  86. }
  87. mDxePlatformPpmPolicy.FunctionEnables.EnableTm = ICH_DEVICE_ENABLE;
  88. mDxePlatformPpmPolicy.FunctionEnables.EnableCMP = ICH_DEVICE_ENABLE;
  89. } else {
  90. mDxePlatformPpmPolicy.FunctionEnables.EnableGv = ICH_DEVICE_ENABLE;
  91. mDxePlatformPpmPolicy.FunctionEnables.EnableCx = ICH_DEVICE_ENABLE;
  92. mDxePlatformPpmPolicy.FunctionEnables.EnableCxe = ICH_DEVICE_ENABLE;
  93. mDxePlatformPpmPolicy.FunctionEnables.EnableTm = ICH_DEVICE_ENABLE;
  94. mDxePlatformPpmPolicy.FunctionEnables.EnableProcHot = ICH_DEVICE_ENABLE;
  95. mDxePlatformPpmPolicy.FunctionEnables.EnableCMP = ICH_DEVICE_DISABLE;
  96. mDxePlatformPpmPolicy.FunctionEnables.TStatesEnable = ICH_DEVICE_ENABLE;
  97. mDxePlatformPpmPolicy.FunctionEnables.EnableTurboMode= ICH_DEVICE_ENABLE;
  98. mDxePlatformPpmPolicy.FunctionEnables.EnableC4 = ICH_DEVICE_ENABLE;
  99. mDxePlatformPpmPolicy.FunctionEnables.EnableC6 = ICH_DEVICE_ENABLE;
  100. }
  101. mDxePlatformPpmPolicy.S3RestoreMsrSwSmiNumber = S3_RESTORE_MSR_SW_SMI;
  102. Handle = NULL;
  103. Status = pBS->InstallMultipleProtocolInterfaces (
  104. &Handle,
  105. &gPpmPlatformPolicyProtocolGuid,
  106. &mDxePlatformPpmPolicy,
  107. NULL
  108. );
  109. ASSERT_EFI_ERROR (Status);
  110. return EFI_SUCCESS;
  111. }