]> git.proxmox.com Git - mirror_edk2.git/blob - Vlv2TbltDevicePkg/PpmPolicy/PpmPolicy.c
3583e324e6c8cb201d0d60501f3763bcd3b818ea
[mirror_edk2.git] / Vlv2TbltDevicePkg / PpmPolicy / PpmPolicy.c
1 /**
2 Copyright (c) 2009 - 2019, 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 UINTN CpuEnabledCount;
44 UINT8 CPUMobileFeature;
45
46 PCH_STEPPING Stepping;
47
48 pBS = SystemTable->BootServices;
49
50 //
51 // Set PPM policy structure to known value
52 //
53 pBS->SetMem (&mDxePlatformPpmPolicy, sizeof(PPM_PLATFORM_POLICY_PROTOCOL), 0);
54
55 //
56 // Find the MpService Protocol
57 //
58 Status = pBS->LocateProtocol (&gEfiMpServiceProtocolGuid,
59 NULL,
60 (void **)&MpService
61 );
62 ASSERT_EFI_ERROR (Status);
63
64 //
65 // Get processor count from MP service.
66 //
67 Status = MpService->GetNumberOfProcessors (MpService, &CpuCount, &CpuEnabledCount);
68 ASSERT_EFI_ERROR (Status);
69
70 //
71 // Store the CPUID for use by SETUP items.
72 //
73 AsmCpuid (EFI_CPUID_VERSION_INFO, &Cpuid01.RegEax, &Cpuid01.RegEbx, &Cpuid01.RegEcx, &Cpuid01.RegEdx);
74
75 mDxePlatformPpmPolicy.Revision = PPM_PLATFORM_POLICY_PROTOCOL_REVISION_4;
76
77 //Read CPU Mobile feature from PLATFORM_ID_MSR MSR(0x17) NOTFB_I_AM_NOT_MOBILE_FUSE_CLIAMC00H Bit 28
78 //Bit Description: { Disables Mobile features 0 = I am NOT a mobile part 1 = I am a mobile part (default)"}
79 CPUMobileFeature = ((RShiftU64 (AsmReadMsr64(EFI_MSR_IA32_PLATFORM_ID), 28)) & 0x1);
80
81 if (!EFI_ERROR(Status)) {
82 if (CPUMobileFeature == 1){//CPU mobile feature
83 mDxePlatformPpmPolicy.FunctionEnables.EnableGv = ICH_DEVICE_ENABLE;
84 mDxePlatformPpmPolicy.FunctionEnables.EnableCx = ICH_DEVICE_ENABLE;
85 mDxePlatformPpmPolicy.FunctionEnables.EnableCxe = ICH_DEVICE_DISABLE;
86 mDxePlatformPpmPolicy.FunctionEnables.EnableTm = ICH_DEVICE_ENABLE;
87 //MaxC7
88 mDxePlatformPpmPolicy.FunctionEnables.EnableC7 = ICH_DEVICE_ENABLE;
89 mDxePlatformPpmPolicy.FunctionEnables.EnableC6 = ICH_DEVICE_ENABLE;
90 mDxePlatformPpmPolicy.FunctionEnables.EnableC4 = ICH_DEVICE_ENABLE;
91
92
93 }else{//CPU desktop feature
94 mDxePlatformPpmPolicy.FunctionEnables.EnableGv = ICH_DEVICE_DISABLE;
95 mDxePlatformPpmPolicy.FunctionEnables.EnableCx = ICH_DEVICE_DISABLE;
96 mDxePlatformPpmPolicy.FunctionEnables.EnableCxe = ICH_DEVICE_DISABLE;
97 mDxePlatformPpmPolicy.FunctionEnables.EnableTm = ICH_DEVICE_DISABLE;
98 mDxePlatformPpmPolicy.FunctionEnables.EnableC4 = ICH_DEVICE_DISABLE;
99 mDxePlatformPpmPolicy.FunctionEnables.EnableC6 = ICH_DEVICE_DISABLE;
100 mDxePlatformPpmPolicy.FunctionEnables.EnableC7 = ICH_DEVICE_DISABLE;
101 }
102
103
104 mDxePlatformPpmPolicy.FunctionEnables.EnableProcHot = ICH_DEVICE_ENABLE;
105 mDxePlatformPpmPolicy.FunctionEnables.TStatesEnable = ICH_DEVICE_ENABLE;
106
107
108 Stepping = PchStepping();
109 if (Stepping < PchB3) {
110 // If SoC is B0~B2 Stepping, disable the Turbo
111 mDxePlatformPpmPolicy.FunctionEnables.EnableTurboMode= ICH_DEVICE_DISABLE;
112 } else {
113 mDxePlatformPpmPolicy.FunctionEnables.EnableTurboMode= ICH_DEVICE_ENABLE;
114 }
115
116 mDxePlatformPpmPolicy.FunctionEnables.EnableTm = ICH_DEVICE_ENABLE;
117
118 mDxePlatformPpmPolicy.FunctionEnables.EnableCMP = ICH_DEVICE_ENABLE;
119
120 } else {
121 mDxePlatformPpmPolicy.FunctionEnables.EnableGv = ICH_DEVICE_ENABLE;
122 mDxePlatformPpmPolicy.FunctionEnables.EnableCx = ICH_DEVICE_ENABLE;
123 mDxePlatformPpmPolicy.FunctionEnables.EnableCxe = ICH_DEVICE_ENABLE;
124 mDxePlatformPpmPolicy.FunctionEnables.EnableTm = ICH_DEVICE_ENABLE;
125 mDxePlatformPpmPolicy.FunctionEnables.EnableProcHot = ICH_DEVICE_ENABLE;
126 mDxePlatformPpmPolicy.FunctionEnables.EnableCMP = ICH_DEVICE_DISABLE;
127 mDxePlatformPpmPolicy.FunctionEnables.TStatesEnable = ICH_DEVICE_ENABLE;
128 mDxePlatformPpmPolicy.FunctionEnables.EnableTurboMode= ICH_DEVICE_ENABLE;
129 mDxePlatformPpmPolicy.FunctionEnables.EnableC4 = ICH_DEVICE_ENABLE;
130 mDxePlatformPpmPolicy.FunctionEnables.EnableC6 = ICH_DEVICE_ENABLE;
131 }
132
133
134
135 mDxePlatformPpmPolicy.S3RestoreMsrSwSmiNumber = S3_RESTORE_MSR_SW_SMI;
136
137 Handle = NULL;
138 Status = pBS->InstallMultipleProtocolInterfaces (
139 &Handle,
140 &gPpmPlatformPolicyProtocolGuid,
141 &mDxePlatformPpmPolicy,
142 NULL
143 );
144
145 ASSERT_EFI_ERROR (Status);
146
147 return EFI_SUCCESS;
148 }