• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
37 
38 EFI_STATUS
39 EFIAPI
PpmPolicyEntry(IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE * SystemTable)40 PpmPolicyEntry(
41   IN EFI_HANDLE ImageHandle,
42   IN EFI_SYSTEM_TABLE *SystemTable
43 )
44 {
45   EFI_MP_SERVICES_PROTOCOL *MpService;
46   EFI_CPUID_REGISTER        Cpuid01 = { 0, 0, 0, 0};
47   EFI_HANDLE                Handle;
48   EFI_STATUS                Status;
49   UINTN                     CpuCount;
50   UINT64                    MaxRatio;
51   UINT8                     CPUMobileFeature;
52 
53   PCH_STEPPING              Stepping;
54 
55 
56   gBS = SystemTable->BootServices;
57   pBS = SystemTable->BootServices;
58   pRS = SystemTable->RuntimeServices;
59 
60   //
61   // Set PPM policy structure to known value
62   //
63   gBS->SetMem (&mDxePlatformPpmPolicy, sizeof(PPM_PLATFORM_POLICY_PROTOCOL), 0);
64 
65   //
66   // Find the MpService Protocol
67   //
68   Status = pBS->LocateProtocol (&gEfiMpServiceProtocolGuid,
69                                 NULL,
70                                 (void **)&MpService
71                                );
72   ASSERT_EFI_ERROR (Status);
73 
74   //
75   // Get processor count from MP service.
76   //
77   Status = MpService->GetNumberOfProcessors (MpService, &CpuCount, NULL);
78   ASSERT_EFI_ERROR (Status);
79 
80   //
81   // Store the CPUID for use by SETUP items.
82   //
83   AsmCpuid (EFI_CPUID_VERSION_INFO, &Cpuid01.RegEax, &Cpuid01.RegEbx, &Cpuid01.RegEcx, &Cpuid01.RegEdx);
84   MaxRatio = ((RShiftU64 (AsmReadMsr64(EFI_MSR_IA32_PLATFORM_ID), 8)) & 0x1F);
85 
86 
87   mDxePlatformPpmPolicy.Revision                       = PPM_PLATFORM_POLICY_PROTOCOL_REVISION_4;
88 
89   //Read CPU Mobile feature from PLATFORM_ID_MSR MSR(0x17) NOTFB_I_AM_NOT_MOBILE_FUSE_CLIAMC00H Bit 28
90   //Bit Description: { Disables Mobile features 0 = I am NOT a mobile part 1 = I am a mobile part (default)"}
91   CPUMobileFeature = ((RShiftU64 (AsmReadMsr64(EFI_MSR_IA32_PLATFORM_ID), 28)) & 0x1);
92 
93   if (!EFI_ERROR(Status)) {
94     if (CPUMobileFeature == 1){//CPU mobile feature
95       mDxePlatformPpmPolicy.FunctionEnables.EnableGv       = ICH_DEVICE_ENABLE;
96       mDxePlatformPpmPolicy.FunctionEnables.EnableCx       = ICH_DEVICE_ENABLE;
97       mDxePlatformPpmPolicy.FunctionEnables.EnableCxe      = ICH_DEVICE_DISABLE;
98       mDxePlatformPpmPolicy.FunctionEnables.EnableTm       = ICH_DEVICE_ENABLE;
99       //MaxC7
100       mDxePlatformPpmPolicy.FunctionEnables.EnableC7       = ICH_DEVICE_ENABLE;
101       mDxePlatformPpmPolicy.FunctionEnables.EnableC6       = ICH_DEVICE_ENABLE;
102       mDxePlatformPpmPolicy.FunctionEnables.EnableC4       = ICH_DEVICE_ENABLE;
103 
104 
105     }else{//CPU desktop feature
106        mDxePlatformPpmPolicy.FunctionEnables.EnableGv       = ICH_DEVICE_DISABLE;
107        mDxePlatformPpmPolicy.FunctionEnables.EnableCx       = ICH_DEVICE_DISABLE;
108        mDxePlatformPpmPolicy.FunctionEnables.EnableCxe      = ICH_DEVICE_DISABLE;
109        mDxePlatformPpmPolicy.FunctionEnables.EnableTm       = ICH_DEVICE_DISABLE;
110        mDxePlatformPpmPolicy.FunctionEnables.EnableC4       = ICH_DEVICE_DISABLE;
111        mDxePlatformPpmPolicy.FunctionEnables.EnableC6       = ICH_DEVICE_DISABLE;
112        mDxePlatformPpmPolicy.FunctionEnables.EnableC7       = ICH_DEVICE_DISABLE;
113     }
114 
115 
116     mDxePlatformPpmPolicy.FunctionEnables.EnableProcHot  = ICH_DEVICE_ENABLE;
117     mDxePlatformPpmPolicy.FunctionEnables.TStatesEnable  = ICH_DEVICE_ENABLE;
118 
119 
120     Stepping = PchStepping();
121     if (Stepping < PchB3) {
122       // If SoC is B0~B2 Stepping, disable the Turbo
123       mDxePlatformPpmPolicy.FunctionEnables.EnableTurboMode= ICH_DEVICE_DISABLE;
124     } else {
125       mDxePlatformPpmPolicy.FunctionEnables.EnableTurboMode= ICH_DEVICE_ENABLE;
126     }
127 
128     mDxePlatformPpmPolicy.FunctionEnables.EnableTm      = ICH_DEVICE_ENABLE;
129 
130     mDxePlatformPpmPolicy.FunctionEnables.EnableCMP      = ICH_DEVICE_ENABLE;
131 
132   } else {
133     mDxePlatformPpmPolicy.FunctionEnables.EnableGv       = ICH_DEVICE_ENABLE;
134     mDxePlatformPpmPolicy.FunctionEnables.EnableCx       = ICH_DEVICE_ENABLE;
135     mDxePlatformPpmPolicy.FunctionEnables.EnableCxe      = ICH_DEVICE_ENABLE;
136     mDxePlatformPpmPolicy.FunctionEnables.EnableTm      = ICH_DEVICE_ENABLE;
137     mDxePlatformPpmPolicy.FunctionEnables.EnableProcHot  = ICH_DEVICE_ENABLE;
138     mDxePlatformPpmPolicy.FunctionEnables.EnableCMP       = ICH_DEVICE_DISABLE;
139     mDxePlatformPpmPolicy.FunctionEnables.TStatesEnable  = ICH_DEVICE_ENABLE;
140     mDxePlatformPpmPolicy.FunctionEnables.EnableTurboMode= ICH_DEVICE_ENABLE;
141     mDxePlatformPpmPolicy.FunctionEnables.EnableC4       = ICH_DEVICE_ENABLE;
142     mDxePlatformPpmPolicy.FunctionEnables.EnableC6       = ICH_DEVICE_ENABLE;
143   }
144 
145 
146 
147   mDxePlatformPpmPolicy.S3RestoreMsrSwSmiNumber                       = S3_RESTORE_MSR_SW_SMI;
148 
149   Handle = NULL;
150   Status = gBS->InstallMultipleProtocolInterfaces (
151                                                   &Handle,
152                                                   &gPpmPlatformPolicyProtocolGuid,
153                                                   &mDxePlatformPpmPolicy,
154                                                   NULL
155                                                   );
156 
157   ASSERT_EFI_ERROR (Status);
158 
159   return EFI_SUCCESS;
160 }
161