diff options
| -rw-r--r-- | arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c | 10 | ||||
| -rw-r--r-- | arch/i386/kernel/cpu/cpufreq/longhaul.c | 120 | ||||
| -rw-r--r-- | arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c | 6 | ||||
| -rw-r--r-- | arch/x86_64/kernel/cpufreq/Kconfig | 1 | ||||
| -rw-r--r-- | drivers/cpufreq/cpufreq_stats.c | 4 |
5 files changed, 67 insertions, 74 deletions
diff --git a/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c index b735458c6e3a..10baa3501ed3 100644 --- a/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c +++ b/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c | |||
| @@ -373,8 +373,8 @@ static int acpi_cpufreq_target(struct cpufreq_policy *policy, | |||
| 373 | cpumask_t online_policy_cpus; | 373 | cpumask_t online_policy_cpus; |
| 374 | struct drv_cmd cmd; | 374 | struct drv_cmd cmd; |
| 375 | unsigned int msr; | 375 | unsigned int msr; |
| 376 | unsigned int next_state = 0; | 376 | unsigned int next_state = 0; /* Index into freq_table */ |
| 377 | unsigned int next_perf_state = 0; | 377 | unsigned int next_perf_state = 0; /* Index into perf table */ |
| 378 | unsigned int i; | 378 | unsigned int i; |
| 379 | int result = 0; | 379 | int result = 0; |
| 380 | 380 | ||
| @@ -420,6 +420,7 @@ static int acpi_cpufreq_target(struct cpufreq_policy *policy, | |||
| 420 | msr = | 420 | msr = |
| 421 | (u32) perf->states[next_perf_state]. | 421 | (u32) perf->states[next_perf_state]. |
| 422 | control & INTEL_MSR_RANGE; | 422 | control & INTEL_MSR_RANGE; |
| 423 | cmd.val = get_cur_val(online_policy_cpus); | ||
| 423 | cmd.val = (cmd.val & ~INTEL_MSR_RANGE) | msr; | 424 | cmd.val = (cmd.val & ~INTEL_MSR_RANGE) | msr; |
| 424 | break; | 425 | break; |
| 425 | case SYSTEM_IO_CAPABLE: | 426 | case SYSTEM_IO_CAPABLE: |
| @@ -439,8 +440,8 @@ static int acpi_cpufreq_target(struct cpufreq_policy *policy, | |||
| 439 | else | 440 | else |
| 440 | cpu_set(policy->cpu, cmd.mask); | 441 | cpu_set(policy->cpu, cmd.mask); |
| 441 | 442 | ||
| 442 | freqs.old = data->freq_table[perf->state].frequency; | 443 | freqs.old = perf->states[perf->state].core_frequency * 1000; |
| 443 | freqs.new = data->freq_table[next_perf_state].frequency; | 444 | freqs.new = data->freq_table[next_state].frequency; |
| 444 | for_each_cpu_mask(i, cmd.mask) { | 445 | for_each_cpu_mask(i, cmd.mask) { |
| 445 | freqs.cpu = i; | 446 | freqs.cpu = i; |
| 446 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); | 447 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); |
| @@ -677,6 +678,7 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy) | |||
| 677 | valid_states++; | 678 | valid_states++; |
| 678 | } | 679 | } |
| 679 | data->freq_table[valid_states].frequency = CPUFREQ_TABLE_END; | 680 | data->freq_table[valid_states].frequency = CPUFREQ_TABLE_END; |
| 681 | perf->state = 0; | ||
| 680 | 682 | ||
| 681 | result = cpufreq_frequency_table_cpuinfo(policy, data->freq_table); | 683 | result = cpufreq_frequency_table_cpuinfo(policy, data->freq_table); |
| 682 | if (result) | 684 | if (result) |
diff --git a/arch/i386/kernel/cpu/cpufreq/longhaul.c b/arch/i386/kernel/cpu/cpufreq/longhaul.c index 6d9c97a690fd..e940e00b96c9 100644 --- a/arch/i386/kernel/cpu/cpufreq/longhaul.c +++ b/arch/i386/kernel/cpu/cpufreq/longhaul.c | |||
| @@ -52,6 +52,10 @@ | |||
| 52 | #define CPU_EZRA_T 4 | 52 | #define CPU_EZRA_T 4 |
| 53 | #define CPU_NEHEMIAH 5 | 53 | #define CPU_NEHEMIAH 5 |
| 54 | 54 | ||
| 55 | /* Flags */ | ||
| 56 | #define USE_ACPI_C3 (1 << 1) | ||
| 57 | #define USE_NORTHBRIDGE (1 << 2) | ||
| 58 | |||
| 55 | static int cpu_model; | 59 | static int cpu_model; |
| 56 | static unsigned int numscales=16; | 60 | static unsigned int numscales=16; |
| 57 | static unsigned int fsb; | 61 | static unsigned int fsb; |
| @@ -68,7 +72,7 @@ static unsigned int minmult, maxmult; | |||
| 68 | static int can_scale_voltage; | 72 | static int can_scale_voltage; |
| 69 | static struct acpi_processor *pr = NULL; | 73 | static struct acpi_processor *pr = NULL; |
| 70 | static struct acpi_processor_cx *cx = NULL; | 74 | static struct acpi_processor_cx *cx = NULL; |
| 71 | static int port22_en; | 75 | static u8 longhaul_flags; |
| 72 | 76 | ||
| 73 | /* Module parameters */ | 77 | /* Module parameters */ |
| 74 | static int scale_voltage; | 78 | static int scale_voltage; |
| @@ -80,7 +84,6 @@ static int ignore_latency; | |||
| 80 | /* Clock ratios multiplied by 10 */ | 84 | /* Clock ratios multiplied by 10 */ |
| 81 | static int clock_ratio[32]; | 85 | static int clock_ratio[32]; |
| 82 | static int eblcr_table[32]; | 86 | static int eblcr_table[32]; |
| 83 | static unsigned int highest_speed, lowest_speed; /* kHz */ | ||
| 84 | static int longhaul_version; | 87 | static int longhaul_version; |
| 85 | static struct cpufreq_frequency_table *longhaul_table; | 88 | static struct cpufreq_frequency_table *longhaul_table; |
| 86 | 89 | ||
| @@ -178,7 +181,7 @@ static void do_powersaver(int cx_address, unsigned int clock_ratio_index) | |||
| 178 | safe_halt(); | 181 | safe_halt(); |
| 179 | /* Change frequency on next halt or sleep */ | 182 | /* Change frequency on next halt or sleep */ |
| 180 | wrmsrl(MSR_VIA_LONGHAUL, longhaul.val); | 183 | wrmsrl(MSR_VIA_LONGHAUL, longhaul.val); |
| 181 | if (port22_en) { | 184 | if (!cx_address) { |
| 182 | ACPI_FLUSH_CPU_CACHE(); | 185 | ACPI_FLUSH_CPU_CACHE(); |
| 183 | /* Invoke C1 */ | 186 | /* Invoke C1 */ |
| 184 | halt(); | 187 | halt(); |
| @@ -189,7 +192,6 @@ static void do_powersaver(int cx_address, unsigned int clock_ratio_index) | |||
| 189 | /* Dummy op - must do something useless after P_LVL3 read */ | 192 | /* Dummy op - must do something useless after P_LVL3 read */ |
| 190 | t = inl(acpi_fadt.xpm_tmr_blk.address); | 193 | t = inl(acpi_fadt.xpm_tmr_blk.address); |
| 191 | } | 194 | } |
| 192 | |||
| 193 | /* Disable bus ratio bit */ | 195 | /* Disable bus ratio bit */ |
| 194 | local_irq_disable(); | 196 | local_irq_disable(); |
| 195 | longhaul.bits.RevisionKey = longhaul.bits.RevisionID; | 197 | longhaul.bits.RevisionKey = longhaul.bits.RevisionID; |
| @@ -243,15 +245,14 @@ static void longhaul_setstate(unsigned int clock_ratio_index) | |||
| 243 | outb(0xFF,0xA1); /* Overkill */ | 245 | outb(0xFF,0xA1); /* Overkill */ |
| 244 | outb(0xFE,0x21); /* TMR0 only */ | 246 | outb(0xFE,0x21); /* TMR0 only */ |
| 245 | 247 | ||
| 246 | if (pr->flags.bm_control) { | 248 | if (longhaul_flags & USE_NORTHBRIDGE) { |
| 249 | /* Disable AGP and PCI arbiters */ | ||
| 250 | outb(3, 0x22); | ||
| 251 | } else if ((pr != NULL) && pr->flags.bm_control) { | ||
| 247 | /* Disable bus master arbitration */ | 252 | /* Disable bus master arbitration */ |
| 248 | acpi_set_register(ACPI_BITREG_ARB_DISABLE, 1, | 253 | acpi_set_register(ACPI_BITREG_ARB_DISABLE, 1, |
| 249 | ACPI_MTX_DO_NOT_LOCK); | 254 | ACPI_MTX_DO_NOT_LOCK); |
| 250 | } else if (port22_en) { | ||
| 251 | /* Disable AGP and PCI arbiters */ | ||
| 252 | outb(3, 0x22); | ||
| 253 | } | 255 | } |
| 254 | |||
| 255 | switch (longhaul_version) { | 256 | switch (longhaul_version) { |
| 256 | 257 | ||
| 257 | /* | 258 | /* |
| @@ -278,22 +279,25 @@ static void longhaul_setstate(unsigned int clock_ratio_index) | |||
| 278 | * to work in practice. | 279 | * to work in practice. |
| 279 | */ | 280 | */ |
| 280 | case TYPE_POWERSAVER: | 281 | case TYPE_POWERSAVER: |
| 281 | /* Don't allow wakeup */ | 282 | if (longhaul_flags & USE_ACPI_C3) { |
| 282 | acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 0, | 283 | /* Don't allow wakeup */ |
| 283 | ACPI_MTX_DO_NOT_LOCK); | 284 | acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 0, |
| 284 | do_powersaver(cx->address, clock_ratio_index); | 285 | ACPI_MTX_DO_NOT_LOCK); |
| 286 | do_powersaver(cx->address, clock_ratio_index); | ||
| 287 | } else { | ||
| 288 | do_powersaver(0, clock_ratio_index); | ||
| 289 | } | ||
| 285 | break; | 290 | break; |
| 286 | } | 291 | } |
| 287 | 292 | ||
| 288 | if (pr->flags.bm_control) { | 293 | if (longhaul_flags & USE_NORTHBRIDGE) { |
| 294 | /* Enable arbiters */ | ||
| 295 | outb(0, 0x22); | ||
| 296 | } else if ((pr != NULL) && pr->flags.bm_control) { | ||
| 289 | /* Enable bus master arbitration */ | 297 | /* Enable bus master arbitration */ |
| 290 | acpi_set_register(ACPI_BITREG_ARB_DISABLE, 0, | 298 | acpi_set_register(ACPI_BITREG_ARB_DISABLE, 0, |
| 291 | ACPI_MTX_DO_NOT_LOCK); | 299 | ACPI_MTX_DO_NOT_LOCK); |
| 292 | } else if (port22_en) { | ||
| 293 | /* Enable arbiters */ | ||
| 294 | outb(0, 0x22); | ||
| 295 | } | 300 | } |
| 296 | |||
| 297 | outb(pic2_mask,0xA1); /* restore mask */ | 301 | outb(pic2_mask,0xA1); /* restore mask */ |
| 298 | outb(pic1_mask,0x21); | 302 | outb(pic1_mask,0x21); |
| 299 | 303 | ||
| @@ -314,12 +318,12 @@ static void longhaul_setstate(unsigned int clock_ratio_index) | |||
| 314 | 318 | ||
| 315 | #define ROUNDING 0xf | 319 | #define ROUNDING 0xf |
| 316 | 320 | ||
| 317 | static int _guess(int guess) | 321 | static int _guess(int guess, int mult) |
| 318 | { | ||
