2 Copyright (c) 2009 - 2013, 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 UINT8 CPUMobileFeature
;
45 PCH_STEPPING Stepping
;
47 pBS
= SystemTable
->BootServices
;
50 // Set PPM policy structure to known value
52 pBS
->SetMem (&mDxePlatformPpmPolicy
, sizeof(PPM_PLATFORM_POLICY_PROTOCOL
), 0);
55 // Find the MpService Protocol
57 Status
= pBS
->LocateProtocol (&gEfiMpServiceProtocolGuid
,
61 ASSERT_EFI_ERROR (Status
);
64 // Get processor count from MP service.
66 Status
= MpService
->GetNumberOfProcessors (MpService
, &CpuCount
, NULL
);
67 ASSERT_EFI_ERROR (Status
);
70 // Store the CPUID for use by SETUP items.
72 AsmCpuid (EFI_CPUID_VERSION_INFO
, &Cpuid01
.RegEax
, &Cpuid01
.RegEbx
, &Cpuid01
.RegEcx
, &Cpuid01
.RegEdx
);
74 mDxePlatformPpmPolicy
.Revision
= PPM_PLATFORM_POLICY_PROTOCOL_REVISION_4
;
76 //Read CPU Mobile feature from PLATFORM_ID_MSR MSR(0x17) NOTFB_I_AM_NOT_MOBILE_FUSE_CLIAMC00H Bit 28
77 //Bit Description: { Disables Mobile features 0 = I am NOT a mobile part 1 = I am a mobile part (default)"}
78 CPUMobileFeature
= ((RShiftU64 (AsmReadMsr64(EFI_MSR_IA32_PLATFORM_ID
), 28)) & 0x1);
80 if (!EFI_ERROR(Status
)) {
81 if (CPUMobileFeature
== 1){//CPU mobile feature
82 mDxePlatformPpmPolicy
.FunctionEnables
.EnableGv
= ICH_DEVICE_ENABLE
;
83 mDxePlatformPpmPolicy
.FunctionEnables
.EnableCx
= ICH_DEVICE_ENABLE
;
84 mDxePlatformPpmPolicy
.FunctionEnables
.EnableCxe
= ICH_DEVICE_DISABLE
;
85 mDxePlatformPpmPolicy
.FunctionEnables
.EnableTm
= ICH_DEVICE_ENABLE
;
87 mDxePlatformPpmPolicy
.FunctionEnables
.EnableC7
= ICH_DEVICE_ENABLE
;
88 mDxePlatformPpmPolicy
.FunctionEnables
.EnableC6
= ICH_DEVICE_ENABLE
;
89 mDxePlatformPpmPolicy
.FunctionEnables
.EnableC4
= ICH_DEVICE_ENABLE
;
92 }else{//CPU desktop feature
93 mDxePlatformPpmPolicy
.FunctionEnables
.EnableGv
= ICH_DEVICE_DISABLE
;
94 mDxePlatformPpmPolicy
.FunctionEnables
.EnableCx
= ICH_DEVICE_DISABLE
;
95 mDxePlatformPpmPolicy
.FunctionEnables
.EnableCxe
= ICH_DEVICE_DISABLE
;
96 mDxePlatformPpmPolicy
.FunctionEnables
.EnableTm
= ICH_DEVICE_DISABLE
;
97 mDxePlatformPpmPolicy
.FunctionEnables
.EnableC4
= ICH_DEVICE_DISABLE
;
98 mDxePlatformPpmPolicy
.FunctionEnables
.EnableC6
= ICH_DEVICE_DISABLE
;
99 mDxePlatformPpmPolicy
.FunctionEnables
.EnableC7
= ICH_DEVICE_DISABLE
;
103 mDxePlatformPpmPolicy
.FunctionEnables
.EnableProcHot
= ICH_DEVICE_ENABLE
;
104 mDxePlatformPpmPolicy
.FunctionEnables
.TStatesEnable
= ICH_DEVICE_ENABLE
;
107 Stepping
= PchStepping();
108 if (Stepping
< PchB3
) {
109 // If SoC is B0~B2 Stepping, disable the Turbo
110 mDxePlatformPpmPolicy
.FunctionEnables
.EnableTurboMode
= ICH_DEVICE_DISABLE
;
112 mDxePlatformPpmPolicy
.FunctionEnables
.EnableTurboMode
= ICH_DEVICE_ENABLE
;
115 mDxePlatformPpmPolicy
.FunctionEnables
.EnableTm
= ICH_DEVICE_ENABLE
;
117 mDxePlatformPpmPolicy
.FunctionEnables
.EnableCMP
= ICH_DEVICE_ENABLE
;
120 mDxePlatformPpmPolicy
.FunctionEnables
.EnableGv
= ICH_DEVICE_ENABLE
;
121 mDxePlatformPpmPolicy
.FunctionEnables
.EnableCx
= ICH_DEVICE_ENABLE
;
122 mDxePlatformPpmPolicy
.FunctionEnables
.EnableCxe
= ICH_DEVICE_ENABLE
;
123 mDxePlatformPpmPolicy
.FunctionEnables
.EnableTm
= ICH_DEVICE_ENABLE
;
124 mDxePlatformPpmPolicy
.FunctionEnables
.EnableProcHot
= ICH_DEVICE_ENABLE
;
125 mDxePlatformPpmPolicy
.FunctionEnables
.EnableCMP
= ICH_DEVICE_DISABLE
;
126 mDxePlatformPpmPolicy
.FunctionEnables
.TStatesEnable
= ICH_DEVICE_ENABLE
;
127 mDxePlatformPpmPolicy
.FunctionEnables
.EnableTurboMode
= ICH_DEVICE_ENABLE
;
128 mDxePlatformPpmPolicy
.FunctionEnables
.EnableC4
= ICH_DEVICE_ENABLE
;
129 mDxePlatformPpmPolicy
.FunctionEnables
.EnableC6
= ICH_DEVICE_ENABLE
;
134 mDxePlatformPpmPolicy
.S3RestoreMsrSwSmiNumber
= S3_RESTORE_MSR_SW_SMI
;
137 Status
= pBS
->InstallMultipleProtocolInterfaces (
139 &gPpmPlatformPolicyProtocolGuid
,
140 &mDxePlatformPpmPolicy
,
144 ASSERT_EFI_ERROR (Status
);