]> git.proxmox.com Git - mirror_edk2.git/blame - Vlv2TbltDevicePkg/PpmPolicy/PpmPolicy.c
UefiCpuPkg/PiSmmCpuDxeSmm: patch "gSmiCr3" with PatchInstructionX86()
[mirror_edk2.git] / Vlv2TbltDevicePkg / PpmPolicy / PpmPolicy.c
CommitLineData
3cbfba02
DW
1/** \r
2 Copyright (c) 2009 - 2013, Intel Corporation. All rights reserved.<BR>\r
3 This program and the accompanying materials\r
4 are licensed and made available under the terms and conditions of the BSD License\r
5 which accompanies this distribution. The full text of the license may be found at\r
6 http://opensource.org/licenses/bsd-license.php\r
7\r
8 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
9 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
10\r
11\r
12Module Name:\r
13\r
14\r
15 PpmPolicy.c\r
16\r
17Abstract:\r
18\r
19 This file is a wrapper for Intel PPM Platform Policy driver.\r
20 Get Setup Value to initilize Intel PPM DXE Platform Policy.\r
21\r
22--*/\r
23#include "PpmPolicy.h"\r
24#include <Protocol/MpService.h>\r
25#include <Library/BaseLib.h>\r
26#include <Library/DebugLib.h>\r
27#include <Library/CpuIA32.h>\r
28\r
29#include <PchRegs.h>\r
30#include <Library/PchPlatformLib.h>\r
31\r
32#define EFI_CPUID_FAMILY 0x0F00\r
33#define EFI_CPUID_MODEL 0x00F0\r
34#define EFI_CPUID_STEPPING 0x000F\r
35\r
3cbfba02
DW
36EFI_STATUS \r
37EFIAPI\r
38PpmPolicyEntry(\r
39 IN EFI_HANDLE ImageHandle,\r
40 IN EFI_SYSTEM_TABLE *SystemTable\r
41)\r
42{\r
55ef35d2 43 EFI_BOOT_SERVICES *pBS;\r
3cbfba02
DW
44 EFI_MP_SERVICES_PROTOCOL *MpService;\r
45 EFI_CPUID_REGISTER Cpuid01 = { 0, 0, 0, 0};\r
46 EFI_HANDLE Handle;\r
47 EFI_STATUS Status;\r
48 UINTN CpuCount;\r
3cbfba02
DW
49 UINT8 CPUMobileFeature;\r
50\r
51 PCH_STEPPING Stepping;\r
52\r
3cbfba02 53 pBS = SystemTable->BootServices;\r
3cbfba02
DW
54\r
55 //\r
56 // Set PPM policy structure to known value\r
57 //\r
55ef35d2 58 pBS->SetMem (&mDxePlatformPpmPolicy, sizeof(PPM_PLATFORM_POLICY_PROTOCOL), 0);\r
3cbfba02
DW
59\r
60 //\r
61 // Find the MpService Protocol\r
62 //\r
63 Status = pBS->LocateProtocol (&gEfiMpServiceProtocolGuid,\r
64 NULL,\r
65 (void **)&MpService\r
66 );\r
67 ASSERT_EFI_ERROR (Status);\r
68\r
69 //\r
70 // Get processor count from MP service.\r
71 //\r
72 Status = MpService->GetNumberOfProcessors (MpService, &CpuCount, NULL);\r
73 ASSERT_EFI_ERROR (Status);\r
74\r
75 //\r
76 // Store the CPUID for use by SETUP items.\r
77 //\r
78 AsmCpuid (EFI_CPUID_VERSION_INFO, &Cpuid01.RegEax, &Cpuid01.RegEbx, &Cpuid01.RegEcx, &Cpuid01.RegEdx);\r
3cbfba02
DW
79\r
80 mDxePlatformPpmPolicy.Revision = PPM_PLATFORM_POLICY_PROTOCOL_REVISION_4;\r
81\r
82 //Read CPU Mobile feature from PLATFORM_ID_MSR MSR(0x17) NOTFB_I_AM_NOT_MOBILE_FUSE_CLIAMC00H Bit 28\r
83 //Bit Description: { Disables Mobile features 0 = I am NOT a mobile part 1 = I am a mobile part (default)"}\r
84 CPUMobileFeature = ((RShiftU64 (AsmReadMsr64(EFI_MSR_IA32_PLATFORM_ID), 28)) & 0x1);\r
85\r
86 if (!EFI_ERROR(Status)) {\r
87 if (CPUMobileFeature == 1){//CPU mobile feature\r
88 mDxePlatformPpmPolicy.FunctionEnables.EnableGv = ICH_DEVICE_ENABLE;\r
89 mDxePlatformPpmPolicy.FunctionEnables.EnableCx = ICH_DEVICE_ENABLE;\r
90 mDxePlatformPpmPolicy.FunctionEnables.EnableCxe = ICH_DEVICE_DISABLE;\r
91 mDxePlatformPpmPolicy.FunctionEnables.EnableTm = ICH_DEVICE_ENABLE;\r
92 //MaxC7\r
93 mDxePlatformPpmPolicy.FunctionEnables.EnableC7 = ICH_DEVICE_ENABLE;\r
94 mDxePlatformPpmPolicy.FunctionEnables.EnableC6 = ICH_DEVICE_ENABLE;\r
95 mDxePlatformPpmPolicy.FunctionEnables.EnableC4 = ICH_DEVICE_ENABLE;\r
96 \r
97 \r
98 }else{//CPU desktop feature\r
99 mDxePlatformPpmPolicy.FunctionEnables.EnableGv = ICH_DEVICE_DISABLE;\r
100 mDxePlatformPpmPolicy.FunctionEnables.EnableCx = ICH_DEVICE_DISABLE;\r
101 mDxePlatformPpmPolicy.FunctionEnables.EnableCxe = ICH_DEVICE_DISABLE;\r
102 mDxePlatformPpmPolicy.FunctionEnables.EnableTm = ICH_DEVICE_DISABLE;\r
103 mDxePlatformPpmPolicy.FunctionEnables.EnableC4 = ICH_DEVICE_DISABLE;\r
104 mDxePlatformPpmPolicy.FunctionEnables.EnableC6 = ICH_DEVICE_DISABLE;\r
105 mDxePlatformPpmPolicy.FunctionEnables.EnableC7 = ICH_DEVICE_DISABLE;\r
106 }\r
107\r
108\r
109 mDxePlatformPpmPolicy.FunctionEnables.EnableProcHot = ICH_DEVICE_ENABLE;\r
110 mDxePlatformPpmPolicy.FunctionEnables.TStatesEnable = ICH_DEVICE_ENABLE;\r
111\r
112 \r
113 Stepping = PchStepping();\r
114 if (Stepping < PchB3) {\r
115 // If SoC is B0~B2 Stepping, disable the Turbo\r
116 mDxePlatformPpmPolicy.FunctionEnables.EnableTurboMode= ICH_DEVICE_DISABLE;\r
117 } else {\r
118 mDxePlatformPpmPolicy.FunctionEnables.EnableTurboMode= ICH_DEVICE_ENABLE;\r
119 }\r
120 \r
121 mDxePlatformPpmPolicy.FunctionEnables.EnableTm = ICH_DEVICE_ENABLE;\r
122\r
123 mDxePlatformPpmPolicy.FunctionEnables.EnableCMP = ICH_DEVICE_ENABLE;\r
124\r
125 } else {\r
126 mDxePlatformPpmPolicy.FunctionEnables.EnableGv = ICH_DEVICE_ENABLE;\r
127 mDxePlatformPpmPolicy.FunctionEnables.EnableCx = ICH_DEVICE_ENABLE;\r
128 mDxePlatformPpmPolicy.FunctionEnables.EnableCxe = ICH_DEVICE_ENABLE;\r
129 mDxePlatformPpmPolicy.FunctionEnables.EnableTm = ICH_DEVICE_ENABLE;\r
130 mDxePlatformPpmPolicy.FunctionEnables.EnableProcHot = ICH_DEVICE_ENABLE;\r
131 mDxePlatformPpmPolicy.FunctionEnables.EnableCMP = ICH_DEVICE_DISABLE;\r
132 mDxePlatformPpmPolicy.FunctionEnables.TStatesEnable = ICH_DEVICE_ENABLE;\r
133 mDxePlatformPpmPolicy.FunctionEnables.EnableTurboMode= ICH_DEVICE_ENABLE;\r
134 mDxePlatformPpmPolicy.FunctionEnables.EnableC4 = ICH_DEVICE_ENABLE;\r
135 mDxePlatformPpmPolicy.FunctionEnables.EnableC6 = ICH_DEVICE_ENABLE;\r
136 }\r
137\r
138\r
139\r
140 mDxePlatformPpmPolicy.S3RestoreMsrSwSmiNumber = S3_RESTORE_MSR_SW_SMI;\r
141\r
142 Handle = NULL;\r
55ef35d2 143 Status = pBS->InstallMultipleProtocolInterfaces (\r
3cbfba02
DW
144 &Handle,\r
145 &gPpmPlatformPolicyProtocolGuid,\r
146 &mDxePlatformPpmPolicy,\r
147 NULL\r
148 );\r
149\r
150 ASSERT_EFI_ERROR (Status);\r
151\r
152 return EFI_SUCCESS;\r
153}\r