#include <acpi/acpi.h>
#include <acpi/cpufreq/cpufreq.h>
-#define CPUID_FREQ_VOLT_CAPABILITIES 0x80000007
-#define CPB_CAPABLE 0x00000200
-#define USE_HW_PSTATE 0x00000080
#define HW_PSTATE_MASK 0x00000007
#define HW_PSTATE_VALID_MASK 0x80000000
#define HW_PSTATE_MAX_MASK 0x000000f0
return cpufreq_frequency_table_verify(policy, data->freq_table);
}
-static void feature_detect(void *info)
-{
- struct cpufreq_policy *policy = info;
- unsigned int edx;
-
- edx = cpuid_edx(CPUID_FREQ_VOLT_CAPABILITIES);
- if ((edx & CPB_CAPABLE) == CPB_CAPABLE) {
- policy->turbo = CPUFREQ_TURBO_ENABLED;
- if (cpufreq_verbose)
- printk(XENLOG_INFO
- "CPU%u: Core Boost/Turbo detected and enabled\n",
- smp_processor_id());
- }
-}
-
static int powernow_cpufreq_cpu_init(struct cpufreq_policy *policy)
{
unsigned int i;
if (result)
goto err_freqfree;
- if (c->cpuid_level >= 6)
- on_selected_cpus(cpumask_of(cpu), feature_detect, policy, 1);
-
+ if ( cpu_has(c, X86_FEATURE_CPB) )
+ policy->turbo = CPUFREQ_TURBO_ENABLED;
+
/*
* the first call to ->target() should result in us actually
* writing something to the appropriate registers.
unsigned int __init powernow_register_driver(void)
{
- if ( !(cpuid_edx(CPUID_FREQ_VOLT_CAPABILITIES) & USE_HW_PSTATE) )
+ if ( !cpu_has_hw_pstate )
return -ENODEV;
return cpufreq_register_driver(&powernow_cpufreq_driver);
#define cpu_has_enqcmd boot_cpu_has(X86_FEATURE_ENQCMD)
/* CPUID level 0x80000007.edx */
+#define cpu_has_hw_pstate boot_cpu_has(X86_FEATURE_HW_PSTATE)
#define cpu_has_itsc boot_cpu_has(X86_FEATURE_ITSC)
/* CPUID level 0x80000008.ebx */
XEN_CPUFEATURE(ENQCMD, 6*32+29) /* ENQCMD{,S} instructions */
/* AMD-defined CPU features, CPUID level 0x80000007.edx, word 7 */
+XEN_CPUFEATURE(HW_PSTATE, 7*32+ 7) /* Hardware Pstates */
XEN_CPUFEATURE(ITSC, 7*32+ 8) /*a Invariant TSC */
+XEN_CPUFEATURE(CPB, 7*32+ 9) /* Core Performance Boost (Turbo) */
XEN_CPUFEATURE(EFRO, 7*32+10) /* APERF/MPERF Read Only interface */
/* AMD-defined CPU features, CPUID level 0x80000008.ebx, word 8 */