]> git.proxmox.com Git - mirror_edk2.git/blob - Vlv2TbltDevicePkg/PpmPolicy/PpmPolicy.c
Vlv2TbltDevicePkg: Use DpDynamicCommand to replace PerformancePkg/dp
[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 UINT8 CPUMobileFeature;
50
51 PCH_STEPPING Stepping;
52
53 pBS = SystemTable->BootServices;
54
55 //
56 // Set PPM policy structure to known value
57 //
58 pBS->SetMem (&mDxePlatformPpmPolicy, sizeof(PPM_PLATFORM_POLICY_PROTOCOL), 0);
59
60 //
61 // Find the MpService Protocol
62 //
63 Status = pBS->LocateProtocol (&gEfiMpServiceProtocolGuid,
64 NULL,
65 (void **)&MpService
66 );
67 ASSERT_EFI_ERROR (Status);
68
69 //
70 // Get processor count from MP service.
71 //
72 Status = MpService->GetNumberOfProcessors (MpService, &CpuCount, NULL);
73 ASSERT_EFI_ERROR (Status);
74
75 //
76 // Store the CPUID for use by SETUP items.
77 //
78 AsmCpuid (EFI_CPUID_VERSION_INFO, &Cpuid01.RegEax, &Cpuid01.RegEbx, &Cpuid01.RegEcx, &Cpuid01.RegEdx);
79
80 mDxePlatformPpmPolicy.Revision = PPM_PLATFORM_POLICY_PROTOCOL_REVISION_4;
81
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);
85
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;
92 //MaxC7
93 mDxePlatformPpmPolicy.FunctionEnables.EnableC7 = ICH_DEVICE_ENABLE;
94 mDxePlatformPpmPolicy.FunctionEnables.EnableC6 = ICH_DEVICE_ENABLE;
95 mDxePlatformPpmPolicy.FunctionEnables.EnableC4 = ICH_DEVICE_ENABLE;
96
97
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;
106 }
107
108
109 mDxePlatformPpmPolicy.FunctionEnables.EnableProcHot = ICH_DEVICE_ENABLE;
110 mDxePlatformPpmPolicy.FunctionEnables.TStatesEnable = ICH_DEVICE_ENABLE;
111
112
113 Stepping = PchStepping();
114 if (Stepping < PchB3) {
115 // If SoC is B0~B2 Stepping, disable the Turbo
116 mDxePlatformPpmPolicy.FunctionEnables.EnableTurboMode= ICH_DEVICE_DISABLE;
117 } else {
118 mDxePlatformPpmPolicy.FunctionEnables.EnableTurboMode= ICH_DEVICE_ENABLE;
119 }
120
121 mDxePlatformPpmPolicy.FunctionEnables.EnableTm = ICH_DEVICE_ENABLE;
122
123 mDxePlatformPpmPolicy.FunctionEnables.EnableCMP = ICH_DEVICE_ENABLE;
124
125 } else {
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;
136 }
137
138
139
140 mDxePlatformPpmPolicy.S3RestoreMsrSwSmiNumber = S3_RESTORE_MSR_SW_SMI;
141
142 Handle = NULL;
143 Status = pBS->InstallMultipleProtocolInterfaces (
144 &Handle,
145 &gPpmPlatformPolicyProtocolGuid,
146 &mDxePlatformPpmPolicy,
147 NULL
148 );
149
150 ASSERT_EFI_ERROR (Status);
151
152 return EFI_SUCCESS;
153 }