aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2007-03-23 11:08:01 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-03-23 13:21:02 -0400
commite585bef815c0315f2730d7bb4e15b82602454efd (patch)
tree914d777ba187e656a89075398f81e485885f0aab
parent296d93cd0205433489b0689533426ce0a8cf2dec (diff)
[PATCH] i386: add command line option "local_apic_timer_c2_ok"
It turned out that it is almost impossible to trust ACPI, BIOS & Co. regarding the C states. This was the reason to switch the local apic timer off in C2 state already. OTOH there are sane and well behaving systems, which get punished by that decision. Allow the user to confirm that the local apic timer is trustworthy in C2 state. This keeps the default behaviour on the safe side. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Acked-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--Documentation/kernel-parameters.txt3
-rw-r--r--arch/i386/kernel/apic.c10
-rw-r--r--drivers/acpi/processor_idle.c3
-rw-r--r--include/asm-i386/apic.h1
4 files changed, 16 insertions, 1 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index e39ab0c99fbb..09640a8f7ceb 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -780,6 +780,9 @@ and is between 256 and 4096 characters. It is defined in the file
780 lapic [IA-32,APIC] Enable the local APIC even if BIOS 780 lapic [IA-32,APIC] Enable the local APIC even if BIOS
781 disabled it. 781 disabled it.
782 782
783 lapic_timer_c2_ok [IA-32,APIC] trust the local apic timer in
784 C2 power state.
785
783 lasi= [HW,SCSI] PARISC LASI driver for the 53c700 chip 786 lasi= [HW,SCSI] PARISC LASI driver for the 53c700 chip
784 Format: addr:<io>,irq:<irq> 787 Format: addr:<io>,irq:<irq>
785 788
diff --git a/arch/i386/kernel/apic.c b/arch/i386/kernel/apic.c
index 244c3fe9b8c3..e88415282a6f 100644
--- a/arch/i386/kernel/apic.c
+++ b/arch/i386/kernel/apic.c
@@ -64,6 +64,9 @@ static int enable_local_apic __initdata = 0;
64static int local_apic_timer_verify_ok; 64static int local_apic_timer_verify_ok;
65/* Disable local APIC timer from the kernel commandline or via dmi quirk */ 65/* Disable local APIC timer from the kernel commandline or via dmi quirk */
66static int local_apic_timer_disabled; 66static int local_apic_timer_disabled;
67/* Local APIC timer works in C2 */
68int local_apic_timer_c2_ok;
69EXPORT_SYMBOL_GPL(local_apic_timer_c2_ok);
67 70
68/* 71/*
69 * Debug level, exported for io_apic.c 72 * Debug level, exported for io_apic.c
@@ -1232,6 +1235,13 @@ static int __init parse_disable_lapic_timer(char *arg)
1232} 1235}
1233early_param("nolapic_timer", parse_disable_lapic_timer); 1236early_param("nolapic_timer", parse_disable_lapic_timer);
1234 1237
1238static int __init parse_lapic_timer_c2_ok(char *arg)
1239{
1240 local_apic_timer_c2_ok = 1;
1241 return 0;
1242}
1243early_param("lapic_timer_c2_ok", parse_lapic_timer_c2_ok);
1244
1235static int __init apic_set_verbosity(char *str) 1245static int __init apic_set_verbosity(char *str)
1236{ 1246{
1237 if (strcmp("debug", str) == 0) 1247 if (strcmp("debug", str) == 0)
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c
index 60773005b8af..cdf78943af4d 100644
--- a/drivers/acpi/processor_idle.c
+++ b/drivers/acpi/processor_idle.c
@@ -268,6 +268,7 @@ static void acpi_timer_check_state(int state, struct acpi_processor *pr,
268 struct acpi_processor_cx *cx) 268 struct acpi_processor_cx *cx)
269{ 269{
270 struct acpi_processor_power *pwr = &pr->power; 270 struct acpi_processor_power *pwr = &pr->power;
271 u8 type = local_apic_timer_c2_ok ? ACPI_STATE_C3 : ACPI_STATE_C2;
271 272
272 /* 273 /*
273 * Check, if one of the previous states already marked the lapic 274 * Check, if one of the previous states already marked the lapic
@@ -276,7 +277,7 @@ static void acpi_timer_check_state(int state, struct acpi_processor *pr,
276 if (pwr->timer_broadcast_on_state < state) 277 if (pwr->timer_broadcast_on_state < state)
277 return; 278 return;
278 279
279 if (cx->type >= ACPI_STATE_C2) 280 if (cx->type >= type)
280 pr->power.timer_broadcast_on_state = state; 281 pr->power.timer_broadcast_on_state = state;
281} 282}
282 283
diff --git a/include/asm-i386/apic.h b/include/asm-i386/apic.h
index cc6b1652249a..a19810a08ae9 100644
--- a/include/asm-i386/apic.h
+++ b/include/asm-i386/apic.h
@@ -117,6 +117,7 @@ extern void enable_NMI_through_LVT0 (void * dummy);
117#define ARCH_APICTIMER_STOPS_ON_C3 1 117#define ARCH_APICTIMER_STOPS_ON_C3 1
118 118
119extern int timer_over_8254; 119extern int timer_over_8254;
120extern int local_apic_timer_c2_ok;
120 121
121#else /* !CONFIG_X86_LOCAL_APIC */ 122#else /* !CONFIG_X86_LOCAL_APIC */
122static inline void lapic_shutdown(void) { } 123static inline void lapic_shutdown(void) { }