2 Copyright (c) 2009 - 2019, Intel Corporation. All rights reserved.<BR>
3 SPDX-License-Identifier: BSD-2-Clause-Patent
13 This file is a wrapper for Intel PPM Platform Policy driver.
14 Get Setup Value to initilize Intel PPM DXE Platform Policy.
17 #include "PpmPolicy.h"
18 #include <Protocol/MpService.h>
19 #include <Library/BaseLib.h>
20 #include <Library/DebugLib.h>
21 #include <Library/CpuIA32.h>
24 #include <Library/PchPlatformLib.h>
26 #define EFI_CPUID_FAMILY 0x0F00
27 #define EFI_CPUID_MODEL 0x00F0
28 #define EFI_CPUID_STEPPING 0x000F
33 IN EFI_HANDLE ImageHandle
,
34 IN EFI_SYSTEM_TABLE
*SystemTable
37 EFI_BOOT_SERVICES
*pBS
;
38 EFI_MP_SERVICES_PROTOCOL
*MpService
;
39 EFI_CPUID_REGISTER Cpuid01
= { 0, 0, 0, 0};
43 UINTN CpuEnabledCount
;
44 UINT8 CPUMobileFeature
;
46 PCH_STEPPING Stepping
;
48 pBS
= SystemTable
->BootServices
;
51 // Set PPM policy structure to known value
53 pBS
->SetMem (&mDxePlatformPpmPolicy
, sizeof(PPM_PLATFORM_POLICY_PROTOCOL
), 0);
56 // Find the MpService Protocol
58 Status
= pBS
->LocateProtocol (&gEfiMpServiceProtocolGuid
,
62 ASSERT_EFI_ERROR (Status
);
65 // Get processor count from MP service.
67 Status
= MpService
->GetNumberOfProcessors (MpService
, &CpuCount
, &CpuEnabledCount
);
68 ASSERT_EFI_ERROR (Status
);
71 // Store the CPUID for use by SETUP items.
73 AsmCpuid (EFI_CPUID_VERSION_INFO
, &Cpuid01
.RegEax
, &Cpuid01
.RegEbx
, &Cpuid01
.RegEcx
, &Cpuid01
.RegEdx
);
75 mDxePlatformPpmPolicy
.Revision
= PPM_PLATFORM_POLICY_PROTOCOL_REVISION_4
;
77 //Read CPU Mobile feature from PLATFORM_ID_MSR MSR(0x17) NOTFB_I_AM_NOT_MOBILE_FUSE_CLIAMC00H Bit 28
78 //Bit Description: { Disables Mobile features 0 = I am NOT a mobile part 1 = I am a mobile part (default)"}
79 CPUMobileFeature
= ((RShiftU64 (AsmReadMsr64(EFI_MSR_IA32_PLATFORM_ID
), 28)) & 0x1);
81 if (!EFI_ERROR(Status
)) {
82 if (CPUMobileFeature
== 1){//CPU mobile feature
83 mDxePlatformPpmPolicy
.FunctionEnables
.EnableGv
= ICH_DEVICE_ENABLE
;
84 mDxePlatformPpmPolicy
.FunctionEnables
.EnableCx
= ICH_DEVICE_ENABLE
;
85 mDxePlatformPpmPolicy
.FunctionEnables
.EnableCxe
= ICH_DEVICE_DISABLE
;
86 mDxePlatformPpmPolicy
.FunctionEnables
.EnableTm
= ICH_DEVICE_ENABLE
;
88 mDxePlatformPpmPolicy
.FunctionEnables
.EnableC7
= ICH_DEVICE_ENABLE
;
89 mDxePlatformPpmPolicy
.FunctionEnables
.EnableC6
= ICH_DEVICE_ENABLE
;
90 mDxePlatformPpmPolicy
.FunctionEnables
.EnableC4
= ICH_DEVICE_ENABLE
;
93 }else{//CPU desktop feature
94 mDxePlatformPpmPolicy
.FunctionEnables
.EnableGv
= ICH_DEVICE_DISABLE
;
95 mDxePlatformPpmPolicy
.FunctionEnables
.EnableCx
= ICH_DEVICE_DISABLE
;
96 mDxePlatformPpmPolicy
.FunctionEnables
.EnableCxe
= ICH_DEVICE_DISABLE
;
97 mDxePlatformPpmPolicy
.FunctionEnables
.EnableTm
= ICH_DEVICE_DISABLE
;
98 mDxePlatformPpmPolicy
.FunctionEnables
.EnableC4
= ICH_DEVICE_DISABLE
;
99 mDxePlatformPpmPolicy
.FunctionEnables
.EnableC6
= ICH_DEVICE_DISABLE
;
100 mDxePlatformPpmPolicy
.FunctionEnables
.EnableC7
= ICH_DEVICE_DISABLE
;
104 mDxePlatformPpmPolicy
.FunctionEnables
.EnableProcHot
= ICH_DEVICE_ENABLE
;
105 mDxePlatformPpmPolicy
.FunctionEnables
.TStatesEnable
= ICH_DEVICE_ENABLE
;
108 Stepping
= PchStepping();
109 if (Stepping
< PchB3
) {
110 // If SoC is B0~B2 Stepping, disable the Turbo
111 mDxePlatformPpmPolicy
.FunctionEnables
.EnableTurboMode
= ICH_DEVICE_DISABLE
;
113 mDxePlatformPpmPolicy
.FunctionEnables
.EnableTurboMode
= ICH_DEVICE_ENABLE
;
116 mDxePlatformPpmPolicy
.FunctionEnables
.EnableTm
= ICH_DEVICE_ENABLE
;
118 mDxePlatformPpmPolicy
.FunctionEnables
.EnableCMP
= ICH_DEVICE_ENABLE
;
121 mDxePlatformPpmPolicy
.FunctionEnables
.EnableGv
= ICH_DEVICE_ENABLE
;
122 mDxePlatformPpmPolicy
.FunctionEnables
.EnableCx
= ICH_DEVICE_ENABLE
;
123 mDxePlatformPpmPolicy
.FunctionEnables
.EnableCxe
= ICH_DEVICE_ENABLE
;
124 mDxePlatformPpmPolicy
.FunctionEnables
.EnableTm
= ICH_DEVICE_ENABLE
;
125 mDxePlatformPpmPolicy
.FunctionEnables
.EnableProcHot
= ICH_DEVICE_ENABLE
;
126 mDxePlatformPpmPolicy
.FunctionEnables
.EnableCMP
= ICH_DEVICE_DISABLE
;
127 mDxePlatformPpmPolicy
.FunctionEnables
.TStatesEnable
= ICH_DEVICE_ENABLE
;
128 mDxePlatformPpmPolicy
.FunctionEnables
.EnableTurboMode
= ICH_DEVICE_ENABLE
;
129 mDxePlatformPpmPolicy
.FunctionEnables
.EnableC4
= ICH_DEVICE_ENABLE
;
130 mDxePlatformPpmPolicy
.FunctionEnables
.EnableC6
= ICH_DEVICE_ENABLE
;
135 mDxePlatformPpmPolicy
.S3RestoreMsrSwSmiNumber
= S3_RESTORE_MSR_SW_SMI
;
138 Status
= pBS
->InstallMultipleProtocolInterfaces (
140 &gPpmPlatformPolicyProtocolGuid
,
141 &mDxePlatformPpmPolicy
,
145 ASSERT_EFI_ERROR (Status
);