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
39 IN EFI_HANDLE ImageHandle
,
40 IN EFI_SYSTEM_TABLE
*SystemTable
43 EFI_BOOT_SERVICES
*pBS
;
44 EFI_MP_SERVICES_PROTOCOL
*MpService
;
45 EFI_CPUID_REGISTER Cpuid01
= { 0, 0, 0, 0};
49 UINT8 CPUMobileFeature
;
51 PCH_STEPPING Stepping
;
53 pBS
= SystemTable
->BootServices
;
56 // Set PPM policy structure to known value
58 pBS
->SetMem (&mDxePlatformPpmPolicy
, sizeof(PPM_PLATFORM_POLICY_PROTOCOL
), 0);
61 // Find the MpService Protocol
63 Status
= pBS
->LocateProtocol (&gEfiMpServiceProtocolGuid
,
67 ASSERT_EFI_ERROR (Status
);
70 // Get processor count from MP service.
72 Status
= MpService
->GetNumberOfProcessors (MpService
, &CpuCount
, NULL
);
73 ASSERT_EFI_ERROR (Status
);
76 // Store the CPUID for use by SETUP items.
78 AsmCpuid (EFI_CPUID_VERSION_INFO
, &Cpuid01
.RegEax
, &Cpuid01
.RegEbx
, &Cpuid01
.RegEcx
, &Cpuid01
.RegEdx
);
80 mDxePlatformPpmPolicy
.Revision
= PPM_PLATFORM_POLICY_PROTOCOL_REVISION_4
;
82 //Read CPU Mobile feature from PLATFORM_ID_MSR MSR(0x17) NOTFB_I_AM_NOT_MOBILE_FUSE_CLIAMC00H Bit 28
83 //Bit Description: { Disables Mobile features 0 = I am NOT a mobile part 1 = I am a mobile part (default)"}
84 CPUMobileFeature
= ((RShiftU64 (AsmReadMsr64(EFI_MSR_IA32_PLATFORM_ID
), 28)) & 0x1);
86 if (!EFI_ERROR(Status
)) {
87 if (CPUMobileFeature
== 1){//CPU mobile feature
88 mDxePlatformPpmPolicy
.FunctionEnables
.EnableGv
= ICH_DEVICE_ENABLE
;
89 mDxePlatformPpmPolicy
.FunctionEnables
.EnableCx
= ICH_DEVICE_ENABLE
;
90 mDxePlatformPpmPolicy
.FunctionEnables
.EnableCxe
= ICH_DEVICE_DISABLE
;
91 mDxePlatformPpmPolicy
.FunctionEnables
.EnableTm
= ICH_DEVICE_ENABLE
;
93 mDxePlatformPpmPolicy
.FunctionEnables
.EnableC7
= ICH_DEVICE_ENABLE
;
94 mDxePlatformPpmPolicy
.FunctionEnables
.EnableC6
= ICH_DEVICE_ENABLE
;
95 mDxePlatformPpmPolicy
.FunctionEnables
.EnableC4
= ICH_DEVICE_ENABLE
;
98 }else{//CPU desktop feature
99 mDxePlatformPpmPolicy
.FunctionEnables
.EnableGv
= ICH_DEVICE_DISABLE
;
100 mDxePlatformPpmPolicy
.FunctionEnables
.EnableCx
= ICH_DEVICE_DISABLE
;
101 mDxePlatformPpmPolicy
.FunctionEnables
.EnableCxe
= ICH_DEVICE_DISABLE
;
102 mDxePlatformPpmPolicy
.FunctionEnables
.EnableTm
= ICH_DEVICE_DISABLE
;
103 mDxePlatformPpmPolicy
.FunctionEnables
.EnableC4
= ICH_DEVICE_DISABLE
;
104 mDxePlatformPpmPolicy
.FunctionEnables
.EnableC6
= ICH_DEVICE_DISABLE
;
105 mDxePlatformPpmPolicy
.FunctionEnables
.EnableC7
= ICH_DEVICE_DISABLE
;
109 mDxePlatformPpmPolicy
.FunctionEnables
.EnableProcHot
= ICH_DEVICE_ENABLE
;
110 mDxePlatformPpmPolicy
.FunctionEnables
.TStatesEnable
= ICH_DEVICE_ENABLE
;
113 Stepping
= PchStepping();
114 if (Stepping
< PchB3
) {
115 // If SoC is B0~B2 Stepping, disable the Turbo
116 mDxePlatformPpmPolicy
.FunctionEnables
.EnableTurboMode
= ICH_DEVICE_DISABLE
;
118 mDxePlatformPpmPolicy
.FunctionEnables
.EnableTurboMode
= ICH_DEVICE_ENABLE
;
121 mDxePlatformPpmPolicy
.FunctionEnables
.EnableTm
= ICH_DEVICE_ENABLE
;
123 mDxePlatformPpmPolicy
.FunctionEnables
.EnableCMP
= ICH_DEVICE_ENABLE
;
126 mDxePlatformPpmPolicy
.FunctionEnables
.EnableGv
= ICH_DEVICE_ENABLE
;
127 mDxePlatformPpmPolicy
.FunctionEnables
.EnableCx
= ICH_DEVICE_ENABLE
;
128 mDxePlatformPpmPolicy
.FunctionEnables
.EnableCxe
= ICH_DEVICE_ENABLE
;
129 mDxePlatformPpmPolicy
.FunctionEnables
.EnableTm
= ICH_DEVICE_ENABLE
;
130 mDxePlatformPpmPolicy
.FunctionEnables
.EnableProcHot
= ICH_DEVICE_ENABLE
;
131 mDxePlatformPpmPolicy
.FunctionEnables
.EnableCMP
= ICH_DEVICE_DISABLE
;
132 mDxePlatformPpmPolicy
.FunctionEnables
.TStatesEnable
= ICH_DEVICE_ENABLE
;
133 mDxePlatformPpmPolicy
.FunctionEnables
.EnableTurboMode
= ICH_DEVICE_ENABLE
;
134 mDxePlatformPpmPolicy
.FunctionEnables
.EnableC4
= ICH_DEVICE_ENABLE
;
135 mDxePlatformPpmPolicy
.FunctionEnables
.EnableC6
= ICH_DEVICE_ENABLE
;
140 mDxePlatformPpmPolicy
.S3RestoreMsrSwSmiNumber
= S3_RESTORE_MSR_SW_SMI
;
143 Status
= pBS
->InstallMultipleProtocolInterfaces (
145 &gPpmPlatformPolicyProtocolGuid
,
146 &mDxePlatformPpmPolicy
,
150 ASSERT_EFI_ERROR (Status
);