diff options
author | Boris Ostrovsky <boris.ostrovsky@amd.com> | 2012-06-18 15:08:43 +0100 |
---|---|---|
committer | Boris Ostrovsky <boris.ostrovsky@amd.com> | 2012-06-18 15:08:43 +0100 |
commit | 5f4acea2cec04e8e756ad3ab9291df098b4fb550 (patch) | |
tree | 214992c0d5eff03314daa47cbbcc164f08402095 /xen/arch/x86/acpi | |
parent | e4a459fca595f572178e90fe3d7565b2648bce44 (diff) | |
download | xen-5f4acea2cec04e8e756ad3ab9291df098b4fb550.tar.gz xen-5f4acea2cec04e8e756ad3ab9291df098b4fb550.tar.bz2 xen-5f4acea2cec04e8e756ad3ab9291df098b4fb550.zip |
x86, cpufreq: Change powernow's CPB status immediately
When command to modify turbo mode (CPB on AMD processors) comes
in the actual change happens later, when P-state transition is
requested. There is no time limit on when this transition will
occur and therefore change in CPB state may take long time from
the moment when command to toggle it is issued.
This patch makes CPB mode change happen immediately when request
is made.
Signed-off-by: Boris Ostrovsky <boris.ostrovsky@amd.com>
Committed-by: Keir Fraser <keir@xen.org>
Diffstat (limited to 'xen/arch/x86/acpi')
-rw-r--r-- | xen/arch/x86/acpi/cpufreq/powernow.c | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/xen/arch/x86/acpi/cpufreq/powernow.c b/xen/arch/x86/acpi/cpufreq/powernow.c index 69d7f94a1e..48b7188b8a 100644 --- a/xen/arch/x86/acpi/cpufreq/powernow.c +++ b/xen/arch/x86/acpi/cpufreq/powernow.c @@ -68,16 +68,37 @@ static void transition_pstate(void *drvcmd) struct drv_cmd *cmd; cmd = (struct drv_cmd *) drvcmd; - if (cmd->turbo != CPUFREQ_TURBO_UNSUPPORTED) { + + wrmsrl(MSR_PSTATE_CTRL, cmd->val); +} + +static void update_cpb(void *data) +{ + struct cpufreq_policy *policy = (struct cpufreq_policy *)data; + + if (policy->turbo != CPUFREQ_TURBO_UNSUPPORTED) { uint64_t msr_content; + rdmsrl(MSR_K8_HWCR, msr_content); - if (cmd->turbo == CPUFREQ_TURBO_ENABLED) + + if (policy->turbo == CPUFREQ_TURBO_ENABLED) msr_content &= ~MSR_HWCR_CPBDIS_MASK; else msr_content |= MSR_HWCR_CPBDIS_MASK; + wrmsrl(MSR_K8_HWCR, msr_content); } - wrmsrl(MSR_PSTATE_CTRL, cmd->val); +} + +static int powernow_cpufreq_update (int cpuid, + struct cpufreq_policy *policy) +{ + if (!cpumask_test_cpu(cpuid, &cpu_online_map)) + return -EINVAL; + + on_selected_cpus(cpumask_of(cpuid), update_cpb, policy, 1); + + return 0; } static int powernow_cpufreq_target(struct cpufreq_policy *policy, @@ -300,7 +321,8 @@ static struct cpufreq_driver powernow_cpufreq_driver = { .verify = powernow_cpufreq_verify, .target = powernow_cpufreq_target, .init = powernow_cpufreq_cpu_init, - .exit = powernow_cpufreq_cpu_exit + .exit = powernow_cpufreq_cpu_exit, + .update = powernow_cpufreq_update }; unsigned int __init powernow_register_driver() |