| From stable-bounces@linux.kernel.org Mon Jul 16 13:57:50 2007 |
| From: Venki Pallipadi <venkatesh.pallipadi@intel.com> |
| Date: Mon, 16 Jul 2007 16:57:38 -0400 |
| Subject: acpi-cpufreq: Proper ReadModifyWrite of PERF_CTL MSR |
| Cc: Dave Jones <davej@redhat.com> |
| Message-ID: <469BDBC2.3030701@redhat.com> |
| |
| |
| From: Venki Pallipadi <venkatesh.pallipadi@intel.com> |
| |
| [CPUFREQ] acpi-cpufreq: Proper ReadModifyWrite of PERF_CTL MSR |
| |
| During recent acpi-cpufreq changes, writing to PERF_CTL msr |
| changed from RMW of entire 64 bit to RMW of low 32 bit and clearing of |
| upper 32 bit. Fix it back to do a proper RMW of the MSR. |
| |
| Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com> |
| Signed-off-by: Dave Jones <davej@redhat.com> |
| Cc: Chuck Ebbert <cebbert@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c | 13 +++++-------- |
| 1 file changed, 5 insertions(+), 8 deletions(-) |
| |
| --- a/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c |
| +++ b/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c |
| @@ -167,11 +167,13 @@ static void do_drv_read(struct drv_cmd * |
| |
| static void do_drv_write(struct drv_cmd *cmd) |
| { |
| - u32 h = 0; |
| + u32 lo, hi; |
| |
| switch (cmd->type) { |
| case SYSTEM_INTEL_MSR_CAPABLE: |
| - wrmsr(cmd->addr.msr.reg, cmd->val, h); |
| + rdmsr(cmd->addr.msr.reg, lo, hi); |
| + lo = (lo & ~INTEL_MSR_RANGE) | (cmd->val & INTEL_MSR_RANGE); |
| + wrmsr(cmd->addr.msr.reg, lo, hi); |
| break; |
| case SYSTEM_IO_CAPABLE: |
| acpi_os_write_port((acpi_io_address)cmd->addr.io.port, |
| @@ -372,7 +374,6 @@ static int acpi_cpufreq_target(struct cp |
| struct cpufreq_freqs freqs; |
| cpumask_t online_policy_cpus; |
| struct drv_cmd cmd; |
| - unsigned int msr; |
| unsigned int next_state = 0; /* Index into freq_table */ |
| unsigned int next_perf_state = 0; /* Index into perf table */ |
| unsigned int i; |
| @@ -417,11 +418,7 @@ static int acpi_cpufreq_target(struct cp |
| case SYSTEM_INTEL_MSR_CAPABLE: |
| cmd.type = SYSTEM_INTEL_MSR_CAPABLE; |
| cmd.addr.msr.reg = MSR_IA32_PERF_CTL; |
| - msr = |
| - (u32) perf->states[next_perf_state]. |
| - control & INTEL_MSR_RANGE; |
| - cmd.val = get_cur_val(online_policy_cpus); |
| - cmd.val = (cmd.val & ~INTEL_MSR_RANGE) | msr; |
| + cmd.val = (u32) perf->states[next_perf_state].control; |
| break; |
| case SYSTEM_IO_CAPABLE: |
| cmd.type = SYSTEM_IO_CAPABLE; |