powernow-k8: Misc fixes
cover powernow-k8: Misc fixes
Hi Dave,
Following two fixes are required on systems where intermediate Pstates are disabled.
Please apply.
Thanks,
Andreas
PATCH 1/3 powernow-k8: Avoid Pstate MSR accesses on systems supporting CPB
Due to CPB we can't directly map SW Pstates to Pstate MSRs. Get rid of the paranoia check. (assuming that the ACPI Pstate information is correct.)
--- drivers/cpufreq/powernow-k8.c | 19 ++++++++++--------- 1 files changed, 10 insertions(+), 9 deletions(-)
drivers/cpufreq/powernow-k8.c +10 -9
@@ -926,23 +926,24 @@ static int fill_powernow_table_pstate(struct powernow_k8_data *data,invalidate_entry (powernow_table, i);continue ; } -rdmsr (MSR_PSTATE_DEF_BASE + index, lo, hi); -if (!(hi &HW_PSTATE_VALID_MASK )) { -pr_debug ("invalid pstate %d, ignoring\n" , index); -invalidate_entry (powernow_table, i); -continue ; - } - - powernow_table[i].index = index; -/* Frequency may be rounded for these */ if ((boot_cpu_data.x86 ==0x10 && boot_cpu_data.x86_model <10 ) || boot_cpu_data.x86 ==0x11 ) { + +rdmsr (MSR_PSTATE_DEF_BASE + index, lo, hi); +if (!(hi &HW_PSTATE_VALID_MASK )) { +pr_debug ("invalid pstate %d, ignoring\n" , index); +invalidate_entry (powernow_table, i); +continue ; + } + powernow_table[i].frequency =freq_from_fid_did (lo &0x3f , (lo >>6 ) &7 ); }else powernow_table[i].frequency = data->acpi_data.states[i].core_frequency *1000 ; + + powernow_table[i].index = index; }return 0 ; }
Signature · 1 line
1.7.8.1
PATCH 2/3 powernow-k8: Fix indexing issue
In reply to Andreas HerrmannThe driver uses the pstate number from the status register as index in its table of ACPI pstates (powernow_table). This is wrong as this is not a 1-to-1 mapping.
For example we can have _PSS information to just utilize Pstate 0 and Pstate 4, ie.
powernow-k8: Core Performance Boosting: on.
powernow-k8: 0 : pstate 0 (2200 MHz)
powernow-k8: 1 : pstate 4 (1400 MHz)
In this example the driver's powernow_table has just 2 entries. Using the pstate number (4) as index into this table is just plain wrong.
--- drivers/cpufreq/powernow-k8.c | 15 +++++++++++---- 1 files changed, 11 insertions(+), 4 deletions(-)
drivers/cpufreq/powernow-k8.c +11 -4
@@ -54,6 +54,9 @@ static DEFINE_PER_CPU(struct powernow_k8_data *, powernow_data);static int cpu_family =CPU_OPTERON ; +/* array to map SW pstate number to acpi state */ +static u32 ps_to_as[8 ]; +/* core performance boost */ static bool cpb_capable, cpb_enabled;static struct msr __percpu *msrs;
@@ -80,9 +83,9 @@ static u32 find_khz_freq_from_fid(u32 fid) }static u32 find_khz_freq_from_pstate (struct cpufreq_frequency_table *data, -u32 pstate) +u32 pstate) { -return data[pstate].frequency; +return data[ps_to_as[pstate]].frequency; }/* Return the vco fid for an input fid
@@ -926,6 +929,9 @@ static int fill_powernow_table_pstate(struct powernow_k8_data *data,invalidate_entry (powernow_table, i);continue ; } + + ps_to_as[index] = i; +/* Frequency may be rounded for these */ if ((boot_cpu_data.x86 ==0x10 && boot_cpu_data.x86_model <10 ) || boot_cpu_data.x86 ==0x11 ) {
@@ -1190,7 +1196,8 @@ static int powernowk8_target(struct cpufreq_policy *pol,powernow_k8_acpi_pst_values (data, newstate);if (cpu_family ==CPU_HW_PSTATE ) - ret =transition_frequency_pstate (data, newstate); + ret =transition_frequency_pstate (data, + data->powernow_table[newstate].index);else ret =transition_frequency_fidvid (data, newstate);if (ret) {
@@ -1203,7 +1210,7 @@ static int powernowk8_target(struct cpufreq_policy *pol,if (cpu_family ==CPU_HW_PSTATE ) pol->cur =find_khz_freq_from_pstate (data->powernow_table, - newstate); + data->powernow_table[newstate].index);else pol->cur =find_khz_freq_from_fid (data->currfid); ret =0 ;
Signature · 1 line
1.7.8.1
PATCH 3/3 powernow-k8: Update copyright, maintainer and documentation information
In reply to Andreas Herrmann--- drivers/cpufreq/powernow-k8.c | 17 ++++++++++------- 1 files changed, 10 insertions(+), 7 deletions(-)
drivers/cpufreq/powernow-k8.c +10 -7
@@ -1,10 +1,11 @@/* -* (c) 2003-2010 Advanced Micro Devices, Inc. +* (c) 2003-2012 Advanced Micro Devices, Inc. * Your use of this code is subject to the terms and conditions of the * GNU general public license version 2. See "COPYING" or * http://www.gnu.org/licenses/gpl.html * -* Support : [email protected] +* Maintainer: +* Andreas Herrmann <[email protected]> * * Based on the powernow-k7.c module written by Dave Jones. * (C) 2003 Dave Jones on behalf of SuSE Labs
@@ -16,12 +17,14 @@* Valuable input gratefully received from Dave Jones, Pavel Machek, * Dominik Brodowski, Jacob Shin, and others. * Originally developed by Paul Devriendt. -* Processor information obtained from Chapter 9 (Power and Thermal Management) -* of the "BIOS and Kernel Developer's Guide for the AMD Athlon 64 and AMD -* Opteron Processors" available for download from www.amd.com * -* Tables for specific CPUs can be inferred from -* http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/30430.pdf +* Processor information obtained from Chapter 9 (Power and Thermal +* Management) of the "BIOS and Kernel Developer's Guide (BKDG) for +* the AMD Athlon 64 and AMD Opteron Processors" and section "2.x +* Power Management" in BKDGs for newer AMD CPU families. +* +* Tables for specific CPUs can be inferred from AMD's processor +* power and thermal data sheets, (e.g. 30417.pdf, 30430.pdf, 43375.pdf) */ #include <linux/kernel.h>
Signature · 1 line
1.7.8.1
Re: [PATCH 3/3] powernow-k8: Update copyright, maintainer and documentation information
Quoted 34 lines · Andreas Herrmann
Signed-off-by Andreas Herrmann <[email protected]>--- drivers/cpufreq/powernow-k8.c | 17 ++++++++++------- 1 files changed, 10 insertions(+), 7 deletions(-)drivers/cpufreq/powernow-k8.c +3
-7@@ -1,10 +1,11 @@/* -* (c) 2003-2010 Advanced Micro Devices, Inc. +* (c) 2003-2012 Advanced Micro Devices, Inc. * Your use of this code is subject to the terms and conditions of the * GNU general public license version 2. See "COPYING" or * http://www.gnu.org/licenses/gpl.html * -* Support : [email protected] +* Maintainer: +* Andreas Herrmann <[email protected]> * * Based on the powernow-k7.c module written by Dave Jones. * (C) 2003 Dave Jones on behalf of SuSE Labs @@ -16,12 +17,14 @@* Valuable input gratefully received from Dave Jones, Pavel Machek, * Dominik Brodowski, Jacob Shin, and others. * Originally developed by Paul Devriendt. -* Processor information obtained from Chapter 9 (Power and Thermal Management) -* of the "BIOS and Kernel Developer's Guide for the AMD Athlon 64 and AMD -* Opteron Processors" available for download from www.amd.com * -* Tables for specific CPUs can be inferred from -* http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/30430.pdf
drivers/cpufreq/powernow-k8.c line 30
Quoted 10 lines
drivers/cpufreq/powernow-k8.c +7
-0+* Processor information obtained from Chapter 9 (Power and Thermal +* Management) of the "BIOS and Kernel Developer's Guide (BKDG) for +* the AMD Athlon 64 and AMD Opteron Processors" and section "2.x +* Power Management" in BKDGs for newer AMD CPU families. +* +* Tables for specific CPUs can be inferred from AMD's processor +* power and thermal data sheets, (e.g. 30417.pdf, 30430.pdf, 43375.pdf) */ #include <linux/kernel.h>
formerly [email protected]