[PATCH] x86: Add acpi_user_timer_override option for Asus boards

Timer overrides are normally disabled on Nvidia board because
they are commonly wrong, except on new ones with HPET support.
Unfortunately there are quite some Asus boards around that
don't have HPET, but need a timer override.

We don't know yet how to handle this transparently,
but at least add a command line option to force the timer override
and let them boot.

Cc: len.brown@intel.com

Signed-off-by: Andi Kleen <ak@suse.de>

authored by Andi Kleen and committed by Andi Kleen fa18f477 15803a43

+29 -1
+4
Documentation/kernel-parameters.txt
··· 164 acpi_skip_timer_override [HW,ACPI] 165 Recognize and ignore IRQ0/pin2 Interrupt Override. 166 For broken nForce2 BIOS resulting in XT-PIC timer. 167 168 acpi_dbg_layer= [HW,ACPI] 169 Format: <int>
··· 164 acpi_skip_timer_override [HW,ACPI] 165 Recognize and ignore IRQ0/pin2 Interrupt Override. 166 For broken nForce2 BIOS resulting in XT-PIC timer. 167 + acpi_use_timer_override [HW,ACPI} 168 + Use timer override. For some broken Nvidia NF5 boards 169 + that require a timer override, but don't have 170 + HPET 171 172 acpi_dbg_layer= [HW,ACPI] 173 Format: <int>
+8
arch/i386/kernel/acpi/boot.c
··· 82 acpi_interrupt_flags acpi_sci_flags __initdata; 83 int acpi_sci_override_gsi __initdata; 84 int acpi_skip_timer_override __initdata; 85 86 #ifdef CONFIG_X86_LOCAL_APIC 87 static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE; ··· 1301 return 0; 1302 } 1303 early_param("acpi_skip_timer_override", parse_acpi_skip_timer_override); 1304 #endif /* CONFIG_X86_IO_APIC */ 1305 1306 static int __init setup_acpi_sci(char *s)
··· 82 acpi_interrupt_flags acpi_sci_flags __initdata; 83 int acpi_sci_override_gsi __initdata; 84 int acpi_skip_timer_override __initdata; 85 + int acpi_use_timer_override __initdata; 86 87 #ifdef CONFIG_X86_LOCAL_APIC 88 static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE; ··· 1300 return 0; 1301 } 1302 early_param("acpi_skip_timer_override", parse_acpi_skip_timer_override); 1303 + 1304 + static int __init parse_acpi_use_timer_override(char *arg) 1305 + { 1306 + acpi_use_timer_override = 1; 1307 + return 0; 1308 + } 1309 + early_param("acpi_use_timer_override", parse_acpi_use_timer_override); 1310 #endif /* CONFIG_X86_IO_APIC */ 1311 1312 static int __init setup_acpi_sci(char *s)
+7 -1
arch/i386/kernel/acpi/earlyquirk.c
··· 27 #ifdef CONFIG_ACPI 28 /* According to Nvidia all timer overrides are bogus unless HPET 29 is enabled. */ 30 - if (vendor == PCI_VENDOR_ID_NVIDIA) { 31 nvidia_hpet_detected = 0; 32 acpi_table_parse(ACPI_HPET, nvidia_hpet_check); 33 if (nvidia_hpet_detected == 0) { 34 acpi_skip_timer_override = 1; 35 } 36 } 37 #endif
··· 27 #ifdef CONFIG_ACPI 28 /* According to Nvidia all timer overrides are bogus unless HPET 29 is enabled. */ 30 + if (!acpi_use_timer_override && vendor == PCI_VENDOR_ID_NVIDIA) { 31 nvidia_hpet_detected = 0; 32 acpi_table_parse(ACPI_HPET, nvidia_hpet_check); 33 if (nvidia_hpet_detected == 0) { 34 acpi_skip_timer_override = 1; 35 + printk(KERN_INFO "Nvidia board " 36 + "detected. Ignoring ACPI " 37 + "timer override.\n"); 38 + printk(KERN_INFO "If you got timer trouble " 39 + "try acpi_use_timer_override\n"); 40 + 41 } 42 } 43 #endif
+8
arch/x86_64/kernel/early-quirks.c
··· 45 /* 46 * All timer overrides on Nvidia are 47 * wrong unless HPET is enabled. 48 */ 49 nvidia_hpet_detected = 0; 50 acpi_table_parse(ACPI_HPET, nvidia_hpet_check); 51 if (nvidia_hpet_detected == 0) { ··· 59 printk(KERN_INFO "Nvidia board " 60 "detected. Ignoring ACPI " 61 "timer override.\n"); 62 } 63 #endif 64 /* RED-PEN skip them on mptables too? */
··· 45 /* 46 * All timer overrides on Nvidia are 47 * wrong unless HPET is enabled. 48 + * Unfortunately that's not true on many Asus boards. 49 + * We don't know yet how to detect this automatically, but 50 + * at least allow a command line override. 51 */ 52 + if (acpi_use_timer_override) 53 + return; 54 + 55 nvidia_hpet_detected = 0; 56 acpi_table_parse(ACPI_HPET, nvidia_hpet_check); 57 if (nvidia_hpet_detected == 0) { ··· 53 printk(KERN_INFO "Nvidia board " 54 "detected. Ignoring ACPI " 55 "timer override.\n"); 56 + printk(KERN_INFO "If you got timer trouble " 57 + "try acpi_use_timer_override\n"); 58 } 59 #endif 60 /* RED-PEN skip them on mptables too? */
+1
include/asm-i386/acpi.h
··· 132 133 #ifdef CONFIG_X86_IO_APIC 134 extern int acpi_skip_timer_override; 135 #endif 136 137 static inline void acpi_noirq_set(void) { acpi_noirq = 1; }
··· 132 133 #ifdef CONFIG_X86_IO_APIC 134 extern int acpi_skip_timer_override; 135 + extern int acpi_use_timer_override; 136 #endif 137 138 static inline void acpi_noirq_set(void) { acpi_noirq = 1; }
+1
include/asm-x86_64/acpi.h
··· 163 #define ARCH_HAS_POWER_INIT 1 164 165 extern int acpi_skip_timer_override; 166 167 #endif /*__KERNEL__*/ 168
··· 163 #define ARCH_HAS_POWER_INIT 1 164 165 extern int acpi_skip_timer_override; 166 + extern int acpi_use_timer_override; 167 168 #endif /*__KERNEL__*/ 169