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