• 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 EFI_STATUS
37 EFIAPI
PpmPolicyEntry(IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE * SystemTable)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 }
154