diff options
author | Dave Jones <davej@redhat.com> | 2005-07-28 12:40:04 -0400 |
---|---|---|
committer | Dave Jones <davej@redhat.com> | 2005-07-28 12:40:04 -0400 |
commit | 841e40b380a70933e8dc1184e0f9ba1c6cac48af (patch) | |
tree | 2a975a06793c5cd8303f0e4c4d3b474d4ed7d5f6 /arch/i386/kernel/cpu/cpufreq/powernow-k8.c | |
parent | 03938c3f1062b0f279a0ef937a471d4db83702ed (diff) |
Opteron revision F will support higher frequencies than
can be encoded in the current driver's 4 bit frequency
field. This patch updates the driver to support Rev F
including 6 bit FIDs and processor ID updates.
This should apply cleanly whether or not the dual-core
bugfix I sent out last week is applied. I'd prefer
that both get applied, of course.
Signed-off-by: David Keck <david.keck@amd.com>
Signed-off-by: Mark Langsdorf <mark.langsdorf@amd.com>
Signed-off-by: Dave Jones <davej@redhat.com>
Diffstat (limited to 'arch/i386/kernel/cpu/cpufreq/powernow-k8.c')
-rw-r--r-- | arch/i386/kernel/cpu/cpufreq/powernow-k8.c | 29 |
1 files changed, 13 insertions, 16 deletions
diff --git a/arch/i386/kernel/cpu/cpufreq/powernow-k8.c b/arch/i386/kernel/cpu/cpufreq/powernow-k8.c index 9cf7b67b8afc..7fe5b2aaa209 100644 --- a/arch/i386/kernel/cpu/cpufreq/powernow-k8.c +++ b/arch/i386/kernel/cpu/cpufreq/powernow-k8.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * (c) 2003, 2004 Advanced Micro Devices, Inc. | 2 | * (c) 2003, 2004, 2005 Advanced Micro Devices, Inc. |
3 | * Your use of this code is subject to the terms and conditions of the | 3 | * Your use of this code is subject to the terms and conditions of the |
4 | * GNU general public license version 2. See "COPYING" or | 4 | * GNU general public license version 2. See "COPYING" or |
5 | * http://www.gnu.org/licenses/gpl.html | 5 | * http://www.gnu.org/licenses/gpl.html |
@@ -44,7 +44,7 @@ | |||
44 | 44 | ||
45 | #define PFX "powernow-k8: " | 45 | #define PFX "powernow-k8: " |
46 | #define BFX PFX "BIOS error: " | 46 | #define BFX PFX "BIOS error: " |
47 | #define VERSION "version 1.40.4" | 47 | #define VERSION "version 1.50.3" |
48 | #include "powernow-k8.h" | 48 | #include "powernow-k8.h" |
49 | 49 | ||
50 | /* serialize freq changes */ | 50 | /* serialize freq changes */ |
@@ -232,7 +232,7 @@ static int write_new_vid(struct powernow_k8_data *data, u32 vid) | |||
232 | /* | 232 | /* |
233 | * Reduce the vid by the max of step or reqvid. | 233 | * Reduce the vid by the max of step or reqvid. |
234 | * Decreasing vid codes represent increasing voltages: | 234 | * Decreasing vid codes represent increasing voltages: |
235 | * vid of 0 is 1.550V, vid of 0x1e is 0.800V, vid of 0x1f is off. | 235 | * vid of 0 is 1.550V, vid of 0x1e is 0.800V, vid of VID_OFF is off. |
236 | */ | 236 | */ |
237 | static int decrease_vid_code_by_step(struct powernow_k8_data *data, u32 reqvid, u32 step) | 237 | static int decrease_vid_code_by_step(struct powernow_k8_data *data, u32 reqvid, u32 step) |
238 | { | 238 | { |
@@ -467,7 +467,7 @@ static int check_supported_cpu(unsigned int cpu) | |||
467 | eax = cpuid_eax(CPUID_PROCESSOR_SIGNATURE); | 467 | eax = cpuid_eax(CPUID_PROCESSOR_SIGNATURE); |
468 | if (((eax & CPUID_USE_XFAM_XMOD) != CPUID_USE_XFAM_XMOD) || | 468 | if (((eax & CPUID_USE_XFAM_XMOD) != CPUID_USE_XFAM_XMOD) || |
469 | ((eax & CPUID_XFAM) != CPUID_XFAM_K8) || | 469 | ((eax & CPUID_XFAM) != CPUID_XFAM_K8) || |
470 | ((eax & CPUID_XMOD) > CPUID_XMOD_REV_E)) { | 470 | ((eax & CPUID_XMOD) > CPUID_XMOD_REV_F)) { |
471 | printk(KERN_INFO PFX "Processor cpuid %x not supported\n", eax); | 471 | printk(KERN_INFO PFX "Processor cpuid %x not supported\n", eax); |
472 | goto out; | 472 | goto out; |
473 | } | 473 | } |
@@ -696,6 +696,7 @@ static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned | |||
696 | 696 | ||
697 | data->irt = (data->acpi_data.states[index].control >> IRT_SHIFT) & IRT_MASK; | 697 | data->irt = (data->acpi_data.states[index].control >> IRT_SHIFT) & IRT_MASK; |
698 | data->rvo = (data->acpi_data.states[index].control >> RVO_SHIFT) & RVO_MASK; | 698 | data->rvo = (data->acpi_data.states[index].control >> RVO_SHIFT) & RVO_MASK; |
699 | data->exttype = (data->acpi_data.states[index].control >> EXT_TYPE_SHIFT) & EXT_TYPE_MASK; | ||
699 | data->plllock = (data->acpi_data.states[index].control >> PLL_L_SHIFT) & PLL_L_MASK; | 700 | data->plllock = (data->acpi_data.states[index].control >> PLL_L_SHIFT) & PLL_L_MASK; |
700 | data->vidmvs = 1 << ((data->acpi_data.states[index].control >> MVS_SHIFT) & MVS_MASK); | 701 | data->vidmvs = 1 << ((data->acpi_data.states[index].control >> MVS_SHIFT) & MVS_MASK); |
701 | data->vstable = (data->acpi_data.states[index].control >> VST_SHIFT) & VST_MASK; | 702 | data->vstable = (data->acpi_data.states[index].control >> VST_SHIFT) & VST_MASK; |
@@ -735,8 +736,13 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) | |||
735 | } | 736 | } |
736 | 737 | ||
737 | for (i = 0; i < data->acpi_data.state_count; i++) { | 738 | for (i = 0; i < data->acpi_data.state_count; i++) { |
738 | u32 fid = data->acpi_data.states[i].control & FID_MASK; | 739 | if (data->exttype) { |
739 | u32 vid = (data->acpi_data.states[i].control >> VID_SHIFT) & VID_MASK; | 740 | u32 fid = data->acpi_data.states[i].status & FID_MASK; |
741 | u32 vid = (data->acpi_data.states[i].status >> VID_SHIFT) & VID_MASK; | ||
742 | } else { | ||
743 | u32 fid = data->acpi_data.states[i].control & FID_MASK; | ||
744 | u32 vid = (data->acpi_data.states[i].control >> VID_SHIFT) & VID_MASK; | ||
745 | } | ||
740 | 746 | ||
741 | dprintk(" %d : fid 0x%x, vid 0x%x\n", i, fid, vid); | 747 | dprintk(" %d : fid 0x%x, vid 0x%x\n", i, fid, vid); |
742 | 748 | ||
@@ -753,7 +759,7 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) | |||
753 | } | 759 | } |
754 | 760 | ||
755 | /* verify voltage is OK - BIOSs are using "off" to indicate invalid */ | 761 | /* verify voltage is OK - BIOSs are using "off" to indicate invalid */ |
756 | if (vid == 0x1f) { | 762 | if (vid == VID_OFF) { |
757 | dprintk("invalid vid %u, ignoring\n", vid); | 763 | dprintk("invalid vid %u, ignoring\n", vid); |
758 | powernow_table[i].frequency = CPUFREQ_ENTRY_INVALID; | 764 | powernow_table[i].frequency = CPUFREQ_ENTRY_INVALID; |
759 | continue; | 765 | continue; |
@@ -930,15 +936,6 @@ static int powernowk8_target(struct cpufreq_policy *pol, unsigned targfreq, unsi | |||
930 | 936 | ||
931 | down(&fidvid_sem); | 937 | down(&fidvid_sem); |
932 | 938 | ||
933 | for_each_cpu_mask(i, cpu_core_map[pol->cpu]) { | ||
934 | /* make sure the sibling is initialized */ | ||
935 | if (!powernow_data[i]) { | ||
936 | ret = 0; | ||
937 | up(&fidvid_sem); | ||
938 | goto err_out; | ||
939 | } | ||
940 | } | ||
941 | |||
942 | powernow_k8_acpi_pst_values(data, newstate); | 939 | powernow_k8_acpi_pst_values(data, newstate); |
943 | 940 | ||
944 | if (transition_frequency(data, newstate)) { | 941 | if (transition_frequency(data, newstate)) { |