diff options
| -rw-r--r-- | arch/i386/kernel/cpu/cpufreq/powernow-k8.c | 29 | ||||
| -rw-r--r-- | arch/i386/kernel/cpu/cpufreq/powernow-k8.h | 30 |
2 files changed, 30 insertions, 29 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)) { |
diff --git a/arch/i386/kernel/cpu/cpufreq/powernow-k8.h b/arch/i386/kernel/cpu/cpufreq/powernow-k8.h index 9ed5bf221cb7..927e2dd6a69f 100644 --- a/arch/i386/kernel/cpu/cpufreq/powernow-k8.h +++ b/arch/i386/kernel/cpu/cpufreq/powernow-k8.h | |||
| @@ -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 |
| @@ -19,6 +19,7 @@ struct powernow_k8_data { | |||
| 19 | u32 vidmvs; /* usable value calculated from mvs */ | 19 | u32 vidmvs; /* usable value calculated from mvs */ |
| 20 | u32 vstable; /* voltage stabilization time, units 20 us */ | 20 | u32 vstable; /* voltage stabilization time, units 20 us */ |
| 21 | u32 plllock; /* pll lock time, units 1 us */ | 21 | u32 plllock; /* pll lock time, units 1 us */ |
| 22 | u32 exttype; /* extended interface = 1 */ | ||
| 22 | 23 | ||
| 23 | /* keep track of the current fid / vid */ | 24 | /* keep track of the current fid / vid */ |
| 24 | u32 currvid, currfid; | 25 | u32 currvid, currfid; |
| @@ -41,7 +42,7 @@ struct powernow_k8_data { | |||
| 41 | #define CPUID_XFAM 0x0ff00000 /* extended family */ | 42 | #define CPUID_XFAM 0x0ff00000 /* extended family */ |
| 42 | #define CPUID_XFAM_K8 0 | 43 | #define CPUID_XFAM_K8 0 |
| 43 | #define CPUID_XMOD 0x000f0000 /* extended model */ | 44 | #define CPUID_XMOD 0x000f0000 /* extended model */ |
| 44 | #define CPUID_XMOD_REV_E 0x00020000 | 45 | #define CPUID_XMOD_REV_F 0x00040000 |
| 45 | #define CPUID_USE_XFAM_XMOD 0x00000f00 | 46 | #define CPUID_USE_XFAM_XMOD 0x00000f00 |
| 46 | #define CPUID_GET_MAX_CAPABILITIES 0x80000000 | 47 | #define CPUID_GET_MAX_CAPABILITIES 0x80000000 |
| 47 | #define CPUID_FREQ_VOLT_CAPABILITIES 0x80000007 | 48 | #define CPUID_FREQ_VOLT_CAPABILITIES 0x80000007 |
| @@ -57,25 +58,26 @@ struct powernow_k8_data { | |||
| 57 | 58 | ||
| 58 | /* Field definitions within the FID VID Low Control MSR : */ | 59 | /* Field definitions within the FID VID Low Control MSR : */ |
| 59 | #define MSR_C_LO_INIT_FID_VID 0x00010000 | 60 | #define MSR_C_LO_INIT_FID_VID 0x00010000 |
| 60 | #define MSR_C_LO_NEW_VID 0x00001f00 | 61 | #define MSR_C_LO_NEW_VID 0x00003f00 |
| 61 | #define MSR_C_LO_NEW_FID 0x0000002f | 62 | #define MSR_C_LO_NEW_FID 0x0000003f |
| 62 | #define MSR_C_LO_VID_SHIFT 8 | 63 | #define MSR_C_LO_VID_SHIFT 8 |
| 63 | 64 | ||
| 64 | /* Field definitions within the FID VID High Control MSR : */ | 65 | /* Field definitions within the FID VID High Control MSR : */ |
| 65 | #define MSR_C_HI_STP_GNT_TO 0x000fffff | 66 | #define MSR_C_HI_STP_GNT_TO 0x000fffff |
| 66 | 67 | ||
| 67 | /* Field definitions within the FID VID Low Status MSR : */ | 68 | /* Field definitions within the FID VID Low Status MSR : */ |
| 68 | #define MSR_S_LO_CHANGE_PENDING 0x80000000 /* cleared when completed */ | 69 | #define MSR_S_LO_CHANGE_PENDING 0x80000000 /* cleared when completed */ |
| 69 | #define MSR_S_LO_MAX_RAMP_VID 0x1f000000 | 70 | #define MSR_S_LO_MAX_RAMP_VID 0x3f000000 |
| 70 | #define MSR_S_LO_MAX_FID 0x003f0000 | 71 | #define MSR_S_LO_MAX_FID 0x003f0000 |
| 71 | #define MSR_S_LO_START_FID 0x00003f00 | 72 | #define MSR_S_LO_START_FID 0x00003f00 |
| 72 | #define MSR_S_LO_CURRENT_FID 0x0000003f | 73 | #define MSR_S_LO_CURRENT_FID 0x0000003f |
| 73 | 74 | ||
| 74 | /* Field definitions within the FID VID High Status MSR : */ | 75 | /* Field definitions within the FID VID High Status MSR : */ |
| 75 | #define MSR_S_HI_MAX_WORKING_VID 0x001f0000 | 76 | #define MSR_S_HI_MIN_WORKING_VID 0x3f000000 |
| 76 | #define MSR_S_HI_START_VID 0x00001f00 | 77 | #define MSR_S_HI_MAX_WORKING_VID 0x003f0000 |
| 77 | #define MSR_S_HI_CURRENT_VID 0x0000001f | 78 | #define MSR_S_HI_START_VID 0x00003f00 |
| 78 | #define MSR_C_HI_STP_GNT_BENIGN 0x00000001 | 79 | #define MSR_S_HI_CURRENT_VID 0x0000003f |
| 80 | #define MSR_C_HI_STP_GNT_BENIGN 0x00000001 | ||
| 79 | 81 | ||
| 80 | /* | 82 | /* |
| 81 | * There are restrictions frequencies have to follow: | 83 | * There are restrictions frequencies have to follow: |
| @@ -99,13 +101,15 @@ struct powernow_k8_data { | |||
| 99 | #define MIN_FREQ_RESOLUTION 200 /* fids jump by 2 matching freq jumps by 200 */ | 101 | #define MIN_FREQ_RESOLUTION 200 /* fids jump by 2 matching freq jumps by 200 */ |
| 100 | 102 | ||
| 101 | #define MAX_FID 0x2a /* Spec only gives FID values as far as 5 GHz */ | 103 | #define MAX_FID 0x2a /* Spec only gives FID values as far as 5 GHz */ |
| 102 | #define LEAST_VID 0x1e /* Lowest (numerically highest) useful vid value */ | 104 | #define LEAST_VID 0x3e /* Lowest (numerically highest) useful vid value */ |
| 103 | 105 | ||
| 104 | #define MIN_FREQ 800 /* Min and max freqs, per spec */ | 106 | #define MIN_FREQ 800 /* Min and max freqs, per spec */ |
| 105 | #define MAX_FREQ 5000 | 107 | #define MAX_FREQ 5000 |
| 106 | 108 | ||
| 107 | #define INVALID_FID_MASK 0xffffffc1 /* not a valid fid if these bits are set */ | 109 | #define INVALID_FID_MASK 0xffffffc1 /* not a valid fid if these bits are set */ |
| 108 | #define INVALID_VID_MASK 0xffffffe0 /* not a valid vid if these bits are set */ | 110 | #define INVALID_VID_MASK 0xffffffc0 /* not a valid vid if these bits are set */ |
| 111 | |||
| 112 | #define VID_OFF 0x3f | ||
| 109 | 113 | ||
| 110 | #define STOP_GRANT_5NS 1 /* min poss memory access latency for voltage change */ | 114 | #define STOP_GRANT_5NS 1 /* min poss memory access latency for voltage change */ |
| 111 | 115 | ||
