2 Copyright (c) 2009 - 2013, Intel Corporation. All rights reserved.<BR>
3 This program and the accompanying materials
4 are licensed and made available under the terms and conditions of the BSD License
5 which accompanies this distribution. The full text of the license may be found at
6 http://opensource.org/licenses/bsd-license.php
8 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
9 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
19 This file is a wrapper for Intel PPM Platform Policy driver.
20 Get Setup Value to initilize Intel PPM DXE Platform Policy.
23 #include "PpmPolicy.h"
24 #include <Protocol/MpService.h>
25 #include <Library/BaseLib.h>
26 #include <Library/DebugLib.h>
27 #include <Library/CpuIA32.h>
30 #include <Library/PchPlatformLib.h>
32 #define EFI_CPUID_FAMILY 0x0F00
33 #define EFI_CPUID_MODEL 0x00F0
34 #define EFI_CPUID_STEPPING 0x000F
41 IN EFI_HANDLE ImageHandle
,
42 IN EFI_SYSTEM_TABLE
*SystemTable
45 EFI_MP_SERVICES_PROTOCOL
*MpService
;
46 EFI_CPUID_REGISTER Cpuid01
= { 0, 0, 0, 0};
51 UINT8 CPUMobileFeature
;
53 PCH_STEPPING Stepping
;
56 gBS
= SystemTable
->BootServices
;
57 pBS
= SystemTable
->BootServices
;
58 pRS
= SystemTable
->RuntimeServices
;
61 // Set PPM policy structure to known value
63 gBS
->SetMem (&mDxePlatformPpmPolicy
, sizeof(PPM_PLATFORM_POLICY_PROTOCOL
), 0);
66 // Find the MpService Protocol
68 Status
= pBS
->LocateProtocol (&gEfiMpServiceProtocolGuid
,
72 ASSERT_EFI_ERROR (Status
);
75 // Get processor count from MP service.
77 Status
= MpService
->GetNumberOfProcessors (MpService
, &CpuCount
, NULL
);
78 ASSERT_EFI_ERROR (Status
);
81 // Store the CPUID for use by SETUP items.
83 AsmCpuid (EFI_CPUID_VERSION_INFO
, &Cpuid01
.RegEax
, &Cpuid01
.RegEbx
, &Cpuid01
.RegEcx
, &Cpuid01
.RegEdx
);
84 MaxRatio
= ((RShiftU64 (AsmReadMsr64(EFI_MSR_IA32_PLATFORM_ID
), 8)) & 0x1F);
87 mDxePlatformPpmPolicy
.Revision
= PPM_PLATFORM_POLICY_PROTOCOL_REVISION_4
;
89 //Read CPU Mobile feature from PLATFORM_ID_MSR MSR(0x17) NOTFB_I_AM_NOT_MOBILE_FUSE_CLIAMC00H Bit 28
90 //Bit Description: { Disables Mobile features 0 = I am NOT a mobile part 1 = I am a mobile part (default)"}
91 CPUMobileFeature
= ((RShiftU64 (AsmReadMsr64(EFI_MSR_IA32_PLATFORM_ID
), 28)) & 0x1);
93 if (!EFI_ERROR(Status
)) {
94 if (CPUMobileFeature
== 1){//CPU mobile feature
95 mDxePlatformPpmPolicy
.FunctionEnables
.EnableGv
= ICH_DEVICE_ENABLE
;
96 mDxePlatformPpmPolicy
.FunctionEnables
.EnableCx
= ICH_DEVICE_ENABLE
;
97 mDxePlatformPpmPolicy
.FunctionEnables
.EnableCxe
= ICH_DEVICE_DISABLE
;
98 mDxePlatformPpmPolicy
.FunctionEnables
.EnableTm
= ICH_DEVICE_ENABLE
;
100 mDxePlatformPpmPolicy
.FunctionEnables
.EnableC7
= ICH_DEVICE_ENABLE
;
101 mDxePlatformPpmPolicy
.FunctionEnables
.EnableC6
= ICH_DEVICE_ENABLE
;
102 mDxePlatformPpmPolicy
.FunctionEnables
.EnableC4
= ICH_DEVICE_ENABLE
;
105 }else{//CPU desktop feature
106 mDxePlatformPpmPolicy
.FunctionEnables
.EnableGv
= ICH_DEVICE_DISABLE
;
107 mDxePlatformPpmPolicy
.FunctionEnables
.EnableCx
= ICH_DEVICE_DISABLE
;
108 mDxePlatformPpmPolicy
.FunctionEnables
.EnableCxe
= ICH_DEVICE_DISABLE
;
109 mDxePlatformPpmPolicy
.FunctionEnables
.EnableTm
= ICH_DEVICE_DISABLE
;
110 mDxePlatformPpmPolicy
.FunctionEnables
.EnableC4
= ICH_DEVICE_DISABLE
;
111 mDxePlatformPpmPolicy
.FunctionEnables
.EnableC6
= ICH_DEVICE_DISABLE
;
112 mDxePlatformPpmPolicy
.FunctionEnables
.EnableC7
= ICH_DEVICE_DISABLE
;
116 mDxePlatformPpmPolicy
.FunctionEnables
.EnableProcHot
= ICH_DEVICE_ENABLE
;
117 mDxePlatformPpmPolicy
.FunctionEnables
.TStatesEnable
= ICH_DEVICE_ENABLE
;
120 Stepping
= PchStepping();
121 if (Stepping
< PchB3
) {
122 // If SoC is B0~B2 Stepping, disable the Turbo
123 mDxePlatformPpmPolicy
.FunctionEnables
.EnableTurboMode
= ICH_DEVICE_DISABLE
;
125 mDxePlatformPpmPolicy
.FunctionEnables
.EnableTurboMode
= ICH_DEVICE_ENABLE
;
128 mDxePlatformPpmPolicy
.FunctionEnables
.EnableTm
= ICH_DEVICE_ENABLE
;
130 mDxePlatformPpmPolicy
.FunctionEnables
.EnableCMP
= ICH_DEVICE_ENABLE
;
133 mDxePlatformPpmPolicy
.FunctionEnables
.EnableGv
= ICH_DEVICE_ENABLE
;
134 mDxePlatformPpmPolicy
.FunctionEnables
.EnableCx
= ICH_DEVICE_ENABLE
;
135 mDxePlatformPpmPolicy
.FunctionEnables
.EnableCxe
= ICH_DEVICE_ENABLE
;
136 mDxePlatformPpmPolicy
.FunctionEnables
.EnableTm
= ICH_DEVICE_ENABLE
;
137 mDxePlatformPpmPolicy
.FunctionEnables
.EnableProcHot
= ICH_DEVICE_ENABLE
;
138 mDxePlatformPpmPolicy
.FunctionEnables
.EnableCMP
= ICH_DEVICE_DISABLE
;
139 mDxePlatformPpmPolicy
.FunctionEnables
.TStatesEnable
= ICH_DEVICE_ENABLE
;
140 mDxePlatformPpmPolicy
.FunctionEnables
.EnableTurboMode
= ICH_DEVICE_ENABLE
;
141 mDxePlatformPpmPolicy
.FunctionEnables
.EnableC4
= ICH_DEVICE_ENABLE
;
142 mDxePlatformPpmPolicy
.FunctionEnables
.EnableC6
= ICH_DEVICE_ENABLE
;
147 mDxePlatformPpmPolicy
.S3RestoreMsrSwSmiNumber
= S3_RESTORE_MSR_SW_SMI
;
150 Status
= gBS
->InstallMultipleProtocolInterfaces (
152 &gPpmPlatformPolicyProtocolGuid
,
153 &mDxePlatformPpmPolicy
,
157 ASSERT_EFI_ERROR (Status
);