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/drivers/cpufreq | |
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/drivers/cpufreq')
-rw-r--r-- | xen/drivers/cpufreq/utility.c | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/xen/drivers/cpufreq/utility.c b/xen/drivers/cpufreq/utility.c index fad54651b3..3dd70e2716 100644 --- a/xen/drivers/cpufreq/utility.c +++ b/xen/drivers/cpufreq/utility.c @@ -390,24 +390,39 @@ int cpufreq_driver_getavg(unsigned int cpu, unsigned int flag) return policy->cur; } -void cpufreq_enable_turbo(int cpuid) +int cpufreq_update_turbo(int cpuid, int new_state) { struct cpufreq_policy *policy; + int curr_state; + int ret = 0; + + if (new_state != CPUFREQ_TURBO_ENABLED && + new_state != CPUFREQ_TURBO_DISABLED) + return -EINVAL; policy = per_cpu(cpufreq_cpu_policy, cpuid); - if (policy && policy->turbo != CPUFREQ_TURBO_UNSUPPORTED) - policy->turbo = CPUFREQ_TURBO_ENABLED; -} + if (!policy) + return -EACCES; -void cpufreq_disable_turbo(int cpuid) -{ - struct cpufreq_policy *policy; + if (policy->turbo == CPUFREQ_TURBO_UNSUPPORTED) + return -EOPNOTSUPP; - policy = per_cpu(cpufreq_cpu_policy, cpuid); - if (policy && policy->turbo != CPUFREQ_TURBO_UNSUPPORTED) - policy->turbo = CPUFREQ_TURBO_DISABLED; + curr_state = policy->turbo; + if (curr_state == new_state) + return 0; + + policy->turbo = new_state; + if (cpufreq_driver->update) + { + ret = cpufreq_driver->update(cpuid, policy); + if (ret) + policy->turbo = curr_state; + } + + return ret; } + int cpufreq_get_turbo_status(int cpuid) { struct cpufreq_policy *policy; |