]> git.proxmox.com Git - mirror_edk2.git/blob - Vlv2TbltDevicePkg/PpmPolicy/PpmPolicy.c
Vlv2TbltDevicePkg/PpmPolicy: Remove the usage of global variables
[mirror_edk2.git] / Vlv2TbltDevicePkg / PpmPolicy / PpmPolicy.c
1 /**
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
7
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.
10
11
12 Module Name:
13
14
15 PpmPolicy.c
16
17 Abstract:
18
19 This file is a wrapper for Intel PPM Platform Policy driver.
20 Get Setup Value to initilize Intel PPM DXE Platform Policy.
21
22 --*/
23 #include "PpmPolicy.h"
24 #include <Protocol/MpService.h>
25 #include <Library/BaseLib.h>
26 #include <Library/DebugLib.h>
27 #include <Library/CpuIA32.h>
28
29 #include <PchRegs.h>
30 #include <Library/PchPlatformLib.h>
31
32 #define EFI_CPUID_FAMILY 0x0F00
33 #define EFI_CPUID_MODEL 0x00F0
34 #define EFI_CPUID_STEPPING 0x000F
35
36 EFI_STATUS
37 EFIAPI
38 PpmPolicyEntry(
39 IN EFI_HANDLE ImageHandle,
40 IN EFI_SYSTEM_TABLE *SystemTable
41 )
42 {
43 EFI_BOOT_SERVICES *pBS;
44 EFI_MP_SERVICES_PROTOCOL *MpService;
45 EFI_CPUID_REGISTER Cpuid01 = { 0, 0, 0, 0};
46 EFI_HANDLE Handle;
47 EFI_STATUS Status;
48 UINTN CpuCount;
49 UINT64 MaxRatio;
50 UINT8 CPUMobileFeature;
51
52 PCH_STEPPING Stepping;
53
54 pBS = SystemTable->BootServices;
55
56 //
57 // Set PPM policy structure to known value
58 //
59 pBS->SetMem (&mDxePlatformPpmPolicy, sizeof(PPM_PLATFORM_POLICY_PROTOCOL), 0);
60
61 //
62 // Find the MpService Protocol
63 //
64 Status = pBS->LocateProtocol (&gEfiMpServiceProtocolGuid,
65 NULL,
66 (void **)&MpService
67 );
68 ASSERT_EFI_ERROR (Status);
69
70 //
71 // Get processor count from MP service.
72 //
73 Status = MpService->GetNumberOfProcessors (MpService, &CpuCount, NULL);
74 ASSERT_EFI_ERROR (Status);
75
76 //
77 // Store the CPUID for use by SETUP items.
78 //
79 AsmCpuid (EFI_CPUID_VERSION_INFO, &Cpuid01.RegEax, &Cpuid01.RegEbx, &Cpuid01.RegEcx, &Cpuid01.RegEdx);
80 MaxRatio = ((RShiftU64 (AsmReadMsr64(EFI_MSR_IA32_PLATFORM_ID), 8)) & 0x1F);
81
82
83 mDxePlatformPpmPolicy.Revision = PPM_PLATFORM_POLICY_PROTOCOL_REVISION_4;
84
85 //Read CPU Mobile feature from PLATFORM_ID_MSR MSR(0x17) NOTFB_I_AM_NOT_MOBILE_FUSE_CLIAMC00H Bit 28
86 //Bit Description: { Disables Mobile features 0 = I am NOT a mobile part 1 = I am a mobile part (default)"}
87 CPUMobileFeature = ((RShiftU64 (AsmReadMsr64(EFI_MSR_IA32_PLATFORM_ID), 28)) & 0x1);
88
89 if (!EFI_ERROR(Status)) {
90 if (CPUMobileFeature == 1){//CPU mobile feature
91 mDxePlatformPpmPolicy.FunctionEnables.EnableGv = ICH_DEVICE_ENABLE;
92 mDxePlatformPpmPolicy.FunctionEnables.EnableCx = ICH_DEVICE_ENABLE;
93 mDxePlatformPpmPolicy.FunctionEnables.EnableCxe = ICH_DEVICE_DISABLE;
94 mDxePlatformPpmPolicy.FunctionEnables.EnableTm = ICH_DEVICE_ENABLE;
95 //MaxC7
96 mDxePlatformPpmPolicy.FunctionEnables.EnableC7 = ICH_DEVICE_ENABLE;
97 mDxePlatformPpmPolicy.FunctionEnables.EnableC6 = ICH_DEVICE_ENABLE;
98 mDxePlatformPpmPolicy.FunctionEnables.EnableC4 = ICH_DEVICE_ENABLE;
99
100
101 }else{//CPU desktop feature
102 mDxePlatformPpmPolicy.FunctionEnables.EnableGv = ICH_DEVICE_DISABLE;
103 mDxePlatformPpmPolicy.FunctionEnables.EnableCx = ICH_DEVICE_DISABLE;
104 mDxePlatformPpmPolicy.FunctionEnables.EnableCxe = ICH_DEVICE_DISABLE;
105 mDxePlatformPpmPolicy.FunctionEnables.EnableTm = ICH_DEVICE_DISABLE;
106 mDxePlatformPpmPolicy.FunctionEnables.EnableC4 = ICH_DEVICE_DISABLE;
107 mDxePlatformPpmPolicy.FunctionEnables.EnableC6 = ICH_DEVICE_DISABLE;
108 mDxePlatformPpmPolicy.FunctionEnables.EnableC7 = ICH_DEVICE_DISABLE;
109 }
110
111
112 mDxePlatformPpmPolicy.FunctionEnables.EnableProcHot = ICH_DEVICE_ENABLE;
113 mDxePlatformPpmPolicy.FunctionEnables.TStatesEnable = ICH_DEVICE_ENABLE;
114
115
116 Stepping = PchStepping();
117 if (Stepping < PchB3) {
118 // If SoC is B0~B2 Stepping, disable the Turbo
119 mDxePlatformPpmPolicy.FunctionEnables.EnableTurboMode= ICH_DEVICE_DISABLE;
120 } else {
121 mDxePlatformPpmPolicy.FunctionEnables.EnableTurboMode= ICH_DEVICE_ENABLE;
122 }
123
124 mDxePlatformPpmPolicy.FunctionEnables.EnableTm = ICH_DEVICE_ENABLE;
125
126 mDxePlatformPpmPolicy.FunctionEnables.EnableCMP = ICH_DEVICE_ENABLE;
127
128 } else {
129 mDxePlatformPpmPolicy.FunctionEnables.EnableGv = ICH_DEVICE_ENABLE;
130 mDxePlatformPpmPolicy.FunctionEnables.EnableCx = ICH_DEVICE_ENABLE;
131 mDxePlatformPpmPolicy.FunctionEnables.EnableCxe = ICH_DEVICE_ENABLE;
132 mDxePlatformPpmPolicy.FunctionEnables.EnableTm = ICH_DEVICE_ENABLE;
133 mDxePlatformPpmPolicy.FunctionEnables.EnableProcHot = ICH_DEVICE_ENABLE;
134 mDxePlatformPpmPolicy.FunctionEnables.EnableCMP = ICH_DEVICE_DISABLE;
135 mDxePlatformPpmPolicy.FunctionEnables.TStatesEnable = ICH_DEVICE_ENABLE;
136 mDxePlatformPpmPolicy.FunctionEnables.EnableTurboMode= ICH_DEVICE_ENABLE;
137 mDxePlatformPpmPolicy.FunctionEnables.EnableC4 = ICH_DEVICE_ENABLE;
138 mDxePlatformPpmPolicy.FunctionEnables.EnableC6 = ICH_DEVICE_ENABLE;
139 }
140
141
142
143 mDxePlatformPpmPolicy.S3RestoreMsrSwSmiNumber = S3_RESTORE_MSR_SW_SMI;
144
145 Handle = NULL;
146 Status = pBS->InstallMultipleProtocolInterfaces (
147 &Handle,
148 &gPpmPlatformPolicyProtocolGuid,
149 &mDxePlatformPpmPolicy,
150 NULL
151 );
152
153 ASSERT_EFI_ERROR (Status);
154
155 return EFI_SUCCESS;
156 }