summaryrefslogtreecommitdiffstats
path: root/drivers/acpi
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@woody.linux-foundation.org>2007-03-23 08:03:47 -0700
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-03-23 08:03:47 -0700
commit296d93cd0205433489b0689533426ce0a8cf2dec (patch)
tree0f64a2115b068d1892f01eb689a52076dbb2bde8 /drivers/acpi
parent12998096cc48563a04ca751965ba17c3f73a5461 (diff)
downloadblackbird-op-linux-296d93cd0205433489b0689533426ce0a8cf2dec.tar.gz
blackbird-op-linux-296d93cd0205433489b0689533426ce0a8cf2dec.zip
Revert "ACPI: Only use IPI on known broken machines (AMD, Dothan/BaniasPentium M)"
This reverts commit 25496caec111481161e7f06bbfa12a533c43cc6f, which broke bootup on at least Ingo's ThinkPad T60. Need to figure out exactly what is wrong before we can re-do the logic. Requested-by: Ingo Molnar <mingo@elte.hu> Acked-by: Thomas Gleixner <tglx@linutronix.de> Cc: Thomas Renninger <trenn@suse.de> Cc: Len Brown <len.brown@intel.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
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);
static unsigned int bm_history __read_mostly =
(HZ >= 800 ? 0xFFFFFFFF : ((1U << (HZ / 25)) - 1));
module_param(bm_history, uint, 0644);
-
-static unsigned use_ipi = 2;
-module_param(use_ipi, uint, 0644);
-MODULE_PARM_DESC(use_ipi, "IPI (vs. LAPIC) irqs for not waking up from C2/C3"
- " machines. 0=apic, 1=ipi, 2=auto\n");
-
/* --------------------------------------------------------------------------
Power Management
-------------------------------------------------------------------------- */
@@ -266,8 +260,9 @@ static void acpi_cstate_enter(struct acpi_processor_cx *cstate)
/*
* Some BIOS implementations switch to C3 in the published C2 state.
- * This seems to be a common problem on AMD boxen and Intel Dothan/Banias
- * Pentium M machines.
+ * This seems to be a common problem on AMD boxen, but other vendors
+ * are affected too. We pick the most conservative approach: we assume
+ * that the local APIC stops in both C2 and C3.
*/
static void acpi_timer_check_state(int state, struct acpi_processor *pr,
struct acpi_processor_cx *cx)
@@ -281,17 +276,8 @@ static void acpi_timer_check_state(int state, struct acpi_processor *pr,
if (pwr->timer_broadcast_on_state < state)
return;
- if (cx->type >= ACPI_STATE_C2) {
- if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD)
- pr->power.timer_broadcast_on_state = state;
- else if ((boot_cpu_data.x86_vendor == X86_VENDOR_INTEL &&
- boot_cpu_data.x86 == 6) &&
- (boot_cpu_data.x86_model == 13 ||
- boot_cpu_data.x86_model == 9))
- {
- pr->power.timer_broadcast_on_state = state;
- }
- }
+ if (cx->type >= ACPI_STATE_C2)
+ pr->power.timer_broadcast_on_state = state;
}
static void acpi_propagate_timer_broadcast(struct acpi_processor *pr)
@@ -306,16 +292,10 @@ static void acpi_propagate_timer_broadcast(struct acpi_processor *pr)
#else
cpumask_t mask = cpumask_of_cpu(pr->id);
- if (use_ipi == 0)
+ if (pr->power.timer_broadcast_on_state < INT_MAX)
on_each_cpu(switch_APIC_timer_to_ipi, &mask, 1, 1);
- else if (use_ipi == 1)
+ else
on_each_cpu(switch_ipi_to_APIC_timer, &mask, 1, 1);
- else {
- if (pr->power.timer_broadcast_on_state < INT_MAX)
- on_each_cpu(switch_APIC_timer_to_ipi, &mask, 1, 1);
- else
- on_each_cpu(switch_ipi_to_APIC_timer, &mask, 1, 1);
- }
#endif
}
@@ -1033,13 +1013,13 @@ static int acpi_processor_power_verify(struct acpi_processor *pr)
case ACPI_STATE_C2:
acpi_processor_power_verify_c2(cx);
- if (cx->valid && use_ipi != 0 && use_ipi != 1)
+ if (cx->valid)
acpi_timer_check_state(i, pr, cx);
break;
case ACPI_STATE_C3:
acpi_processor_power_verify_c3(pr, cx);
- if (cx->valid && use_ipi != 0 && use_ipi != 1)
+ if (cx->valid)
acpi_timer_check_state(i, pr, cx);
break;
}
OpenPOWER on IntegriCloud