aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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) { }