diff -u -r linux-2.6.21.3.orig/arch/i386/kernel/io_apic.c linux-2.6.21.3/arch/i386/kernel/io_apic.c --- linux-2.6.21.3.orig/arch/i386/kernel/io_apic.c 2007-06-01 19:01:35.000000000 +0000 +++ linux-2.6.21.3/arch/i386/kernel/io_apic.c 2007-06-01 21:00:46.000000000 +0000 @@ -35,6 +35,7 @@ #include #include #include +#include #include #include @@ -98,6 +99,30 @@ unsigned int data; }; +static int __init disable_blacklisted_ioapic(struct dmi_system_id *d) +{ + printk(KERN_WARNING "%s detected... Disabling IO-APIC\n", d->ident); + skip_ioapic_setup = 1; + return(0); +} + +static struct dmi_system_id __initdata ioapic_blacklist_dmi_table[] = { + { + .callback = disable_blacklisted_ioapic, + .ident = "Dell OptiPlex GX240", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"), + DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex GX240"), + }, + }, + { } +}; + +void __init check_ioapic_blacklist(void) { + printk(KERN_INFO "Checking for IO-APIC blacklisted systems...\n"); + dmi_check_system(ioapic_blacklist_dmi_table); +} + static __attribute_const__ struct io_apic __iomem *io_apic_base(int idx) { return (void __iomem *) __fix_to_virt(FIX_IO_APIC_BASE_0 + idx) diff -u -r linux-2.6.21.3.orig/arch/i386/kernel/setup.c linux-2.6.21.3/arch/i386/kernel/setup.c --- linux-2.6.21.3.orig/arch/i386/kernel/setup.c 2007-06-01 19:01:35.000000000 +0000 +++ linux-2.6.21.3/arch/i386/kernel/setup.c 2007-06-01 21:04:01.000000000 +0000 @@ -124,6 +124,7 @@ #endif extern void early_cpu_init(void); +extern void check_ioapic_blacklist(void); extern int root_mountflags; unsigned long saved_videomode; @@ -616,6 +617,11 @@ #ifdef CONFIG_X86_GENERICARCH generic_apic_probe(); #endif + +#ifdef CONFIG_X86_IO_APIC + check_ioapic_blacklist(); +#endif + if (efi_enabled) efi_map_memmap();