cpu/intel: allow non-packaged scoped turbo setting

In the past the turbo disable setting (bit 38) of the
IA32_MISC_ENABLES msr has been package scoped. That means
knocking the turbo disable bit down enabled turbo for the
entire package. Sadly, that's no longer true on all Intel
processors. Therefore, allow non-packaged scoped turbo
setting by introducing the CPU_INTEL_TURBO_NOT_PACKAGE_SCOPED
Kconfig option. It defaults to false which was the original
assumption.

BUG=chrome-os-partner:25014
BRANCH=baytrail
TEST=Built and ran both ways successfully.

Change-Id: I71a31e76ff47878023081fc47da643187517b597
Signed-off-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/182405
Reviewed-by: Duncan Laurie <dlaurie@chromium.org>
Reviewed-on: http://review.coreboot.org/5047
Tested-by: build bot (Jenkins)
Reviewed-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>
This commit is contained in:
Aaron Durbin 2014-01-14 17:28:33 -06:00 committed by Aaron Durbin
parent cd3f8ad235
commit ba6b07e888
3 changed files with 32 additions and 2 deletions

View File

@ -37,3 +37,4 @@ source src/cpu/intel/socket_LGA775/Kconfig
source src/cpu/intel/socket_rPGA989/Kconfig source src/cpu/intel/socket_rPGA989/Kconfig
# Architecture specific features # Architecture specific features
source src/cpu/intel/fit/Kconfig source src/cpu/intel/fit/Kconfig
source src/cpu/intel/turbo/Kconfig

View File

@ -0,0 +1,6 @@
config CPU_INTEL_TURBO_NOT_PACKAGE_SCOPED
def_bool n
help
This option indicates that the turbo mode setting is not package
scoped. i.e. enable_turbo() needs to be called on not just the bsp

View File

@ -24,7 +24,28 @@
#include <cpu/x86/msr.h> #include <cpu/x86/msr.h>
#include <arch/cpu.h> #include <arch/cpu.h>
static int turbo_state = TURBO_UNKNOWN; #if CONFIG_CPU_INTEL_TURBO_NOT_PACKAGE_SCOPED
static inline int get_global_turbo_state(void)
{
return TURBO_UNKNOWN;
}
static inline void set_global_turbo_state(int state)
{
}
#else
static int g_turbo_state = TURBO_UNKNOWN;
static inline int get_global_turbo_state(void)
{
return g_turbo_state;
}
static inline void set_global_turbo_state(int state)
{
g_turbo_state = state;
}
#endif
static const char *turbo_state_desc[] = { static const char *turbo_state_desc[] = {
[TURBO_UNKNOWN] = "unknown", [TURBO_UNKNOWN] = "unknown",
@ -43,6 +64,7 @@ int get_turbo_state(void)
struct cpuid_result cpuid_regs; struct cpuid_result cpuid_regs;
int turbo_en, turbo_cap; int turbo_en, turbo_cap;
msr_t msr; msr_t msr;
int turbo_state = get_global_turbo_state();
/* Return cached state if available */ /* Return cached state if available */
if (turbo_state != TURBO_UNKNOWN) if (turbo_state != TURBO_UNKNOWN)
@ -65,6 +87,7 @@ int get_turbo_state(void)
turbo_state = TURBO_ENABLED; turbo_state = TURBO_ENABLED;
} }
set_global_turbo_state(turbo_state);
printk(BIOS_INFO, "Turbo is %s\n", turbo_state_desc[turbo_state]); printk(BIOS_INFO, "Turbo is %s\n", turbo_state_desc[turbo_state]);
return turbo_state; return turbo_state;
} }
@ -84,7 +107,7 @@ void enable_turbo(void)
wrmsr(MSR_IA32_MISC_ENABLES, msr); wrmsr(MSR_IA32_MISC_ENABLES, msr);
/* Update cached turbo state */ /* Update cached turbo state */
turbo_state = TURBO_ENABLED; set_global_turbo_state(TURBO_ENABLED);
printk(BIOS_INFO, "Turbo has been enabled\n"); printk(BIOS_INFO, "Turbo has been enabled\n");
} }
} }