diff options
Diffstat (limited to 'arch/x86')
-rw-r--r-- | arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c index ecdb682ab516..208ecf6643df 100644 --- a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c +++ b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c | |||
@@ -65,14 +65,18 @@ enum { | |||
65 | struct acpi_cpufreq_data { | 65 | struct acpi_cpufreq_data { |
66 | struct acpi_processor_performance *acpi_data; | 66 | struct acpi_processor_performance *acpi_data; |
67 | struct cpufreq_frequency_table *freq_table; | 67 | struct cpufreq_frequency_table *freq_table; |
68 | unsigned int max_freq; | ||
69 | unsigned int resume; | 68 | unsigned int resume; |
70 | unsigned int cpu_feature; | 69 | unsigned int cpu_feature; |
71 | u64 saved_aperf, saved_mperf; | ||
72 | }; | 70 | }; |
73 | 71 | ||
74 | static DEFINE_PER_CPU(struct acpi_cpufreq_data *, drv_data); | 72 | static DEFINE_PER_CPU(struct acpi_cpufreq_data *, drv_data); |
75 | 73 | ||
74 | struct acpi_msr_data { | ||
75 | u64 saved_aperf, saved_mperf; | ||
76 | }; | ||
77 | |||
78 | static DEFINE_PER_CPU(struct acpi_msr_data, msr_data); | ||
79 | |||
76 | DEFINE_TRACE(power_mark); | 80 | DEFINE_TRACE(power_mark); |
77 | 81 | ||
78 | /* acpi_perf_data is a pointer to percpu data. */ | 82 | /* acpi_perf_data is a pointer to percpu data. */ |
@@ -287,11 +291,11 @@ static unsigned int get_measured_perf(struct cpufreq_policy *policy, | |||
287 | return 0; | 291 | return 0; |
288 | 292 | ||
289 | cur.aperf.whole = readin.aperf.whole - | 293 | cur.aperf.whole = readin.aperf.whole - |
290 | per_cpu(drv_data, cpu)->saved_aperf; | 294 | per_cpu(msr_data, cpu).saved_aperf; |
291 | cur.mperf.whole = readin.mperf.whole - | 295 | cur.mperf.whole = readin.mperf.whole - |
292 | per_cpu(drv_data, cpu)->saved_mperf; | 296 | per_cpu(msr_data, cpu).saved_mperf; |
293 | per_cpu(drv_data, cpu)->saved_aperf = readin.aperf.whole; | 297 | per_cpu(msr_data, cpu).saved_aperf = readin.aperf.whole; |
294 | per_cpu(drv_data, cpu)->saved_mperf = readin.mperf.whole; | 298 | per_cpu(msr_data, cpu).saved_mperf = readin.mperf.whole; |
295 | 299 | ||
296 | #ifdef __i386__ | 300 | #ifdef __i386__ |
297 | /* | 301 | /* |
@@ -335,7 +339,7 @@ static unsigned int get_measured_perf(struct cpufreq_policy *policy, | |||
335 | 339 | ||
336 | #endif | 340 | #endif |
337 | 341 | ||
338 | retval = per_cpu(drv_data, policy->cpu)->max_freq * perf_percent / 100; | 342 | retval = (policy->cpuinfo.max_freq * perf_percent) / 100; |
339 | 343 | ||
340 | return retval; | 344 | return retval; |
341 | } | 345 | } |
@@ -688,16 +692,11 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy) | |||
688 | /* Check for high latency (>20uS) from buggy BIOSes, like on T42 */ | 692 | /* Check for high latency (>20uS) from buggy BIOSes, like on T42 */ |
689 | if (perf->control_register.space_id == ACPI_ADR_SPACE_FIXED_HARDWARE && | 693 | if (perf->control_register.space_id == ACPI_ADR_SPACE_FIXED_HARDWARE && |
690 | policy->cpuinfo.transition_latency > 20 * 1000) { | 694 | policy->cpuinfo.transition_latency > 20 * 1000) { |
691 | static int print_once; | ||
692 | policy->cpuinfo.transition_latency = 20 * 1000; | 695 | policy->cpuinfo.transition_latency = 20 * 1000; |
693 | if (!print_once) { | 696 | printk_once(KERN_INFO "Capping off P-state tranision" |
694 | print_once = 1; | 697 | " latency at 20 uS\n"); |
695 | printk(KERN_INFO "Capping off P-state tranision latency" | ||
696 | " at 20 uS\n"); | ||
697 | } | ||
698 | } | 698 | } |
699 | 699 | ||
700 | data->max_freq = perf->states[0].core_frequency * 1000; | ||
701 | /* table init */ | 700 | /* table init */ |
702 | for (i = 0; i < perf->state_count; i++) { | 701 | for (i = 0; i < perf->state_count; i++) { |
703 | if (i > 0 && perf->states[i].core_frequency >= | 702 | if (i > 0 && perf->states[i].core_frequency >= |
@@ -716,6 +715,9 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy) | |||
716 | if (result) | 715 | if (result) |
717 | goto err_freqfree; | 716 | goto err_freqfree; |
718 | 717 | ||
718 | if (perf->states[0].core_frequency * 1000 != policy->cpuinfo.max_freq) | ||
719 | printk(KERN_WARNING FW_WARN "P-state 0 is not max freq\n"); | ||
720 | |||
719 | switch (perf->control_register.space_id) { | 721 | switch (perf->control_register.space_id) { |
720 | case ACPI_ADR_SPACE_SYSTEM_IO: | 722 | case ACPI_ADR_SPACE_SYSTEM_IO: |
721 | /* Current speed is unknown and not detectable by IO port */ | 723 | /* Current speed is unknown and not detectable by IO port */ |