aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/acpi')
-rw-r--r--drivers/acpi/processor_idle.c38
1 files changed, 9 insertions, 29 deletions
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c
index 562124ed785e..60773005b8af 100644
--- a/drivers/acpi/processor_idle.c
+++ b/drivers/acpi/processor_idle.c
@@ -89,12 +89,6 @@ module_param(nocst, uint, 0000);
89static unsigned int bm_history __read_mostly = 89static unsigned int bm_history __read_mostly =
90 (HZ >= 800 ? 0xFFFFFFFF : ((1U << (HZ / 25)) - 1)); 90 (HZ >= 800 ? 0xFFFFFFFF : ((1U << (HZ / 25)) - 1));
91module_param(bm_history, uint, 0644); 91module_param(bm_history, uint, 0644);
92
93static unsigned use_ipi = 2;
94module_param(use_ipi, uint, 0644);
95MODULE_PARM_DESC(use_ipi, "IPI (vs. LAPIC) irqs for not waking up from C2/C3"
96 " machines. 0=apic, 1=ipi, 2=auto\n");
97
98/* -------------------------------------------------------------------------- 92/* --------------------------------------------------------------------------
99 Power Management 93 Power Management
100 -------------------------------------------------------------------------- */ 94 -------------------------------------------------------------------------- */
@@ -266,8 +260,9 @@ static void acpi_cstate_enter(struct acpi_processor_cx *cstate)
266 260
267/* 261/*
268 * Some BIOS implementations switch to C3 in the published C2 state. 262 * Some BIOS implementations switch to C3 in the published C2 state.
269 * This seems to be a common problem on AMD boxen and Intel Dothan/Banias 263 * This seems to be a common problem on AMD boxen, but other vendors
270 * Pentium M machines. 264 * are affected too. We pick the most conservative approach: we assume
265 * that the local APIC stops in both C2 and C3.
271 */ 266 */
272static void acpi_timer_check_state(int state, struct acpi_processor *pr, 267static void acpi_timer_check_state(int state, struct acpi_processor *pr,
273 struct acpi_processor_cx *cx) 268 struct acpi_processor_cx *cx)
@@ -281,17 +276,8 @@ static void acpi_timer_check_state(int state, struct acpi_processor *pr,
281 if (pwr->timer_broadcast_on_state < state) 276 if (pwr->timer_broadcast_on_state < state)
282 return; 277 return;
283 278
284 if (cx->type >= ACPI_STATE_C2) { 279 if (cx->type >= ACPI_STATE_C2)
285 if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD) 280 pr->power.timer_broadcast_on_state = state;
286 pr->power.timer_broadcast_on_state = state;
287 else if ((boot_cpu_data.x86_vendor == X86_VENDOR_INTEL &&
288 boot_cpu_data.x86 == 6) &&
289 (boot_cpu_data.x86_model == 13 ||
290 boot_cpu_data.x86_model == 9))
291 {
292 pr->power.timer_broadcast_on_state = state;
293 }
294 }
295} 281}
296 282
297static void acpi_propagate_timer_broadcast(struct acpi_processor *pr) 283static void acpi_propagate_timer_broadcast(struct acpi_processor *pr)
@@ -306,16 +292,10 @@ static void acpi_propagate_timer_broadcast(struct acpi_processor *pr)
306#else 292#else
307 cpumask_t mask = cpumask_of_cpu(pr->id); 293 cpumask_t mask = cpumask_of_cpu(pr->id);
308 294
309 if (use_ipi == 0) 295 if (pr->power.timer_broadcast_on_state < INT_MAX)
310 on_each_cpu(switch_APIC_timer_to_ipi, &mask, 1, 1); 296 on_each_cpu(switch_APIC_timer_to_ipi, &mask, 1, 1);
311 else if (use_ipi == 1) 297 else
312 on_each_cpu(switch_ipi_to_APIC_timer, &mask, 1, 1); 298 on_each_cpu(switch_ipi_to_APIC_timer, &mask, 1, 1);
313 else {
314 if (pr->power.timer_broadcast_on_state < INT_MAX)
315 on_each_cpu(switch_APIC_timer_to_ipi, &mask, 1, 1);
316 else
317 on_each_cpu(switch_ipi_to_APIC_timer, &mask, 1, 1);
318 }
319#endif 299#endif
320} 300}
321 301
@@ -1033,13 +1013,13 @@ static int acpi_processor_power_verify(struct acpi_processor *pr)
1033 1013
1034 case ACPI_STATE_C2: 1014 case ACPI_STATE_C2:
1035 acpi_processor_power_verify_c2(cx); 1015 acpi_processor_power_verify_c2(cx);
1036 if (cx->valid && use_ipi != 0 && use_ipi != 1) 1016 if (cx->valid)
1037 acpi_timer_check_state(i, pr, cx); 1017 acpi_timer_check_state(i, pr, cx);
1038 break; 1018 break;
1039 1019
1040 case ACPI_STATE_C3: 1020 case ACPI_STATE_C3:
1041 acpi_processor_power_verify_c3(pr, cx); 1021 acpi_processor_power_verify_c3(pr, cx);
1042 if (cx->valid && use_ipi != 0 && use_ipi != 1) 1022 if (cx->valid)
1043 acpi_timer_check_state(i, pr, cx); 1023 acpi_timer_check_state(i, pr, cx);
1044 break; 1024 break;
1045 } 1025 }