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 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