161 lines
6.0 KiB
C
161 lines
6.0 KiB
C
/**
|
|
Copyright (c) 2009 - 2013, Intel Corporation. All rights reserved.<BR>
|
|
This program and the accompanying materials
|
|
are licensed and made available under the terms and conditions of the BSD License
|
|
which accompanies this distribution. The full text of the license may be found at
|
|
http://opensource.org/licenses/bsd-license.php
|
|
|
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
|
|
|
|
Module Name:
|
|
|
|
|
|
PpmPolicy.c
|
|
|
|
Abstract:
|
|
|
|
This file is a wrapper for Intel PPM Platform Policy driver.
|
|
Get Setup Value to initilize Intel PPM DXE Platform Policy.
|
|
|
|
--*/
|
|
#include "PpmPolicy.h"
|
|
#include <Protocol/MpService.h>
|
|
#include <Library/BaseLib.h>
|
|
#include <Library/DebugLib.h>
|
|
#include <Library/CpuIA32.h>
|
|
|
|
#include <PchRegs.h>
|
|
#include <Library/PchPlatformLib.h>
|
|
|
|
#define EFI_CPUID_FAMILY 0x0F00
|
|
#define EFI_CPUID_MODEL 0x00F0
|
|
#define EFI_CPUID_STEPPING 0x000F
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
PpmPolicyEntry(
|
|
IN EFI_HANDLE ImageHandle,
|
|
IN EFI_SYSTEM_TABLE *SystemTable
|
|
)
|
|
{
|
|
EFI_MP_SERVICES_PROTOCOL *MpService;
|
|
EFI_CPUID_REGISTER Cpuid01 = { 0, 0, 0, 0};
|
|
EFI_HANDLE Handle;
|
|
EFI_STATUS Status;
|
|
UINTN CpuCount;
|
|
UINT64 MaxRatio;
|
|
UINT8 CPUMobileFeature;
|
|
|
|
PCH_STEPPING Stepping;
|
|
|
|
|
|
gBS = SystemTable->BootServices;
|
|
pBS = SystemTable->BootServices;
|
|
pRS = SystemTable->RuntimeServices;
|
|
|
|
//
|
|
// Set PPM policy structure to known value
|
|
//
|
|
gBS->SetMem (&mDxePlatformPpmPolicy, sizeof(PPM_PLATFORM_POLICY_PROTOCOL), 0);
|
|
|
|
//
|
|
// Find the MpService Protocol
|
|
//
|
|
Status = pBS->LocateProtocol (&gEfiMpServiceProtocolGuid,
|
|
NULL,
|
|
(void **)&MpService
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
|
|
//
|
|
// Get processor count from MP service.
|
|
//
|
|
Status = MpService->GetNumberOfProcessors (MpService, &CpuCount, NULL);
|
|
ASSERT_EFI_ERROR (Status);
|
|
|
|
//
|
|
// Store the CPUID for use by SETUP items.
|
|
//
|
|
AsmCpuid (EFI_CPUID_VERSION_INFO, &Cpuid01.RegEax, &Cpuid01.RegEbx, &Cpuid01.RegEcx, &Cpuid01.RegEdx);
|
|
MaxRatio = ((RShiftU64 (AsmReadMsr64(EFI_MSR_IA32_PLATFORM_ID), 8)) & 0x1F);
|
|
|
|
|
|
mDxePlatformPpmPolicy.Revision = PPM_PLATFORM_POLICY_PROTOCOL_REVISION_4;
|
|
|
|
//Read CPU Mobile feature from PLATFORM_ID_MSR MSR(0x17) NOTFB_I_AM_NOT_MOBILE_FUSE_CLIAMC00H Bit 28
|
|
//Bit Description: { Disables Mobile features 0 = I am NOT a mobile part 1 = I am a mobile part (default)"}
|
|
CPUMobileFeature = ((RShiftU64 (AsmReadMsr64(EFI_MSR_IA32_PLATFORM_ID), 28)) & 0x1);
|
|
|
|
if (!EFI_ERROR(Status)) {
|
|
if (CPUMobileFeature == 1){//CPU mobile feature
|
|
mDxePlatformPpmPolicy.FunctionEnables.EnableGv = ICH_DEVICE_ENABLE;
|
|
mDxePlatformPpmPolicy.FunctionEnables.EnableCx = ICH_DEVICE_ENABLE;
|
|
mDxePlatformPpmPolicy.FunctionEnables.EnableCxe = ICH_DEVICE_DISABLE;
|
|
mDxePlatformPpmPolicy.FunctionEnables.EnableTm = ICH_DEVICE_ENABLE;
|
|
//MaxC7
|
|
mDxePlatformPpmPolicy.FunctionEnables.EnableC7 = ICH_DEVICE_ENABLE;
|
|
mDxePlatformPpmPolicy.FunctionEnables.EnableC6 = ICH_DEVICE_ENABLE;
|
|
mDxePlatformPpmPolicy.FunctionEnables.EnableC4 = ICH_DEVICE_ENABLE;
|
|
|
|
|
|
}else{//CPU desktop feature
|
|
mDxePlatformPpmPolicy.FunctionEnables.EnableGv = ICH_DEVICE_DISABLE;
|
|
mDxePlatformPpmPolicy.FunctionEnables.EnableCx = ICH_DEVICE_DISABLE;
|
|
mDxePlatformPpmPolicy.FunctionEnables.EnableCxe = ICH_DEVICE_DISABLE;
|
|
mDxePlatformPpmPolicy.FunctionEnables.EnableTm = ICH_DEVICE_DISABLE;
|
|
mDxePlatformPpmPolicy.FunctionEnables.EnableC4 = ICH_DEVICE_DISABLE;
|
|
mDxePlatformPpmPolicy.FunctionEnables.EnableC6 = ICH_DEVICE_DISABLE;
|
|
mDxePlatformPpmPolicy.FunctionEnables.EnableC7 = ICH_DEVICE_DISABLE;
|
|
}
|
|
|
|
|
|
mDxePlatformPpmPolicy.FunctionEnables.EnableProcHot = ICH_DEVICE_ENABLE;
|
|
mDxePlatformPpmPolicy.FunctionEnables.TStatesEnable = ICH_DEVICE_ENABLE;
|
|
|
|
|
|
Stepping = PchStepping();
|
|
if (Stepping < PchB3) {
|
|
// If SoC is B0~B2 Stepping, disable the Turbo
|
|
mDxePlatformPpmPolicy.FunctionEnables.EnableTurboMode= ICH_DEVICE_DISABLE;
|
|
} else {
|
|
mDxePlatformPpmPolicy.FunctionEnables.EnableTurboMode= ICH_DEVICE_ENABLE;
|
|
}
|
|
|
|
mDxePlatformPpmPolicy.FunctionEnables.EnableTm = ICH_DEVICE_ENABLE;
|
|
|
|
mDxePlatformPpmPolicy.FunctionEnables.EnableCMP = ICH_DEVICE_ENABLE;
|
|
|
|
} else {
|
|
mDxePlatformPpmPolicy.FunctionEnables.EnableGv = ICH_DEVICE_ENABLE;
|
|
mDxePlatformPpmPolicy.FunctionEnables.EnableCx = ICH_DEVICE_ENABLE;
|
|
mDxePlatformPpmPolicy.FunctionEnables.EnableCxe = ICH_DEVICE_ENABLE;
|
|
mDxePlatformPpmPolicy.FunctionEnables.EnableTm = ICH_DEVICE_ENABLE;
|
|
mDxePlatformPpmPolicy.FunctionEnables.EnableProcHot = ICH_DEVICE_ENABLE;
|
|
mDxePlatformPpmPolicy.FunctionEnables.EnableCMP = ICH_DEVICE_DISABLE;
|
|
mDxePlatformPpmPolicy.FunctionEnables.TStatesEnable = ICH_DEVICE_ENABLE;
|
|
mDxePlatformPpmPolicy.FunctionEnables.EnableTurboMode= ICH_DEVICE_ENABLE;
|
|
mDxePlatformPpmPolicy.FunctionEnables.EnableC4 = ICH_DEVICE_ENABLE;
|
|
mDxePlatformPpmPolicy.FunctionEnables.EnableC6 = ICH_DEVICE_ENABLE;
|
|
}
|
|
|
|
|
|
|
|
mDxePlatformPpmPolicy.S3RestoreMsrSwSmiNumber = S3_RESTORE_MSR_SW_SMI;
|
|
|
|
Handle = NULL;
|
|
Status = gBS->InstallMultipleProtocolInterfaces (
|
|
&Handle,
|
|
&gPpmPlatformPolicyProtocolGuid,
|
|
&mDxePlatformPpmPolicy,
|
|
NULL
|
|
);
|
|
|
|
ASSERT_EFI_ERROR (Status);
|
|
|
|
return EFI_SUCCESS;
|
|
}
|