From: "Andy Currid" <ACurrid@xxxxxxxxxx> This patch fixes a kernel panic during boot that occurs on NVIDIA platforms that have HPET enabled. When HPET is enabled, the standard timer IRQ is routed to IOAPIC pin 2 and is advertised as such in the ACPI APIC table - but an earlier workaround in the kernel was ignoring this override. The fix is to honor timer IRQ overrides from ACPI when HPET is detected on an NVIDIA platform. Signed-off-by: Andy Currid <acurrid@xxxxxxxxxx> Cc: "Brown, Len" <len.brown@xxxxxxxxx> Cc: "Yu, Luming" <luming.yu@xxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxx> --- arch/i386/kernel/acpi/earlyquirk.c | 24 ++++++++++++++++++++---- arch/i386/kernel/setup.c | 11 +++++++---- 2 files changed, 27 insertions(+), 8 deletions(-) diff -puN arch/i386/kernel/acpi/earlyquirk.c~fix-hpet-operation-on-32-bit-nvidia-platforms arch/i386/kernel/acpi/earlyquirk.c --- devel/arch/i386/kernel/acpi/earlyquirk.c~fix-hpet-operation-on-32-bit-nvidia-platforms 2006-06-01 20:17:09.000000000 -0700 +++ devel-akpm/arch/i386/kernel/acpi/earlyquirk.c 2006-06-01 20:17:09.000000000 -0700 @@ -5,17 +5,33 @@ #include <linux/init.h> #include <linux/kernel.h> #include <linux/pci.h> +#include <linux/acpi.h> + #include <asm/pci-direct.h> #include <asm/acpi.h> -#include <asm/apic.h> + +#ifdef CONFIG_ACPI + +static int nvidia_hpet_detected __initdata; + +static int __init nvidia_hpet_check(unsigned long phys, unsigned long size) +{ + nvidia_hpet_detected = 1; + return 0; +} +#endif static int __init check_bridge(int vendor, int device) { #ifdef CONFIG_ACPI - /* According to Nvidia all timer overrides are bogus. Just ignore - them all. */ + /* According to Nvidia all timer overrides are bogus unless HPET + is enabled. */ if (vendor == PCI_VENDOR_ID_NVIDIA) { - acpi_skip_timer_override = 1; + nvidia_hpet_detected = 0; + acpi_table_parse(ACPI_HPET, nvidia_hpet_check); + if (nvidia_hpet_detected == 0) { + acpi_skip_timer_override = 1; + } } #endif if (vendor == PCI_VENDOR_ID_ATI && timer_over_8254 == 1) { diff -puN arch/i386/kernel/setup.c~fix-hpet-operation-on-32-bit-nvidia-platforms arch/i386/kernel/setup.c --- devel/arch/i386/kernel/setup.c~fix-hpet-operation-on-32-bit-nvidia-platforms 2006-06-01 20:17:09.000000000 -0700 +++ devel-akpm/arch/i386/kernel/setup.c 2006-06-01 20:17:09.000000000 -0700 @@ -1547,15 +1547,18 @@ void __init setup_arch(char **cmdline_p) if (efi_enabled) efi_map_memmap(); -#ifdef CONFIG_X86_IO_APIC - check_acpi_pci(); /* Checks more than just ACPI actually */ -#endif - #ifdef CONFIG_ACPI /* * Parse the ACPI tables for possible boot-time SMP configuration. */ acpi_boot_table_init(); +#endif + +#ifdef CONFIG_X86_IO_APIC + check_acpi_pci(); /* Checks more than just ACPI actually */ +#endif + +#ifdef CONFIG_ACPI acpi_boot_init(); #if defined(CONFIG_SMP) && defined(CONFIG_X86_PC) _ - To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html