aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/kernel/io_apic_32.c25
-rw-r--r--arch/x86/kernel/io_apic_64.c25
2 files changed, 32 insertions, 18 deletions
diff --git a/arch/x86/kernel/io_apic_32.c b/arch/x86/kernel/io_apic_32.c
index 74d49e04de58..c50adb84ea6f 100644
--- a/arch/x86/kernel/io_apic_32.c
+++ b/arch/x86/kernel/io_apic_32.c
@@ -2297,11 +2297,21 @@ out:
2297} 2297}
2298 2298
2299/* 2299/*
2300 * 2300 * Traditionally ISA IRQ2 is the cascade IRQ, and is not available
2301 * IRQ's that are handled by the PIC in the MPS IOAPIC case. 2301 * to devices. However there may be an I/O APIC pin available for
2302 * - IRQ2 is the cascade IRQ, and cannot be a io-apic IRQ. 2302 * this interrupt regardless. The pin may be left unconnected, but
2303 * Linux doesn't really care, as it's not actually used 2303 * typically it will be reused as an ExtINT cascade interrupt for
2304 * for any interrupt handling anyway. 2304 * the master 8259A. In the MPS case such a pin will normally be
2305 * reported as an ExtINT interrupt in the MP table. With ACPI
2306 * there is no provision for ExtINT interrupts, and in the absence
2307 * of an override it would be treated as an ordinary ISA I/O APIC
2308 * interrupt, that is edge-triggered and unmasked by default. We
2309 * used to do this, but it caused problems on some systems because
2310 * of the NMI watchdog and sometimes IRQ0 of the 8254 timer using
2311 * the same ExtINT cascade interrupt to drive the local APIC of the
2312 * bootstrap processor. Therefore we refrain from routing IRQ2 to
2313 * the I/O APIC in all cases now. No actual device should request
2314 * it anyway. --macro
2305 */ 2315 */
2306#define PIC_IRQS (1 << PIC_CASCADE_IR) 2316#define PIC_IRQS (1 << PIC_CASCADE_IR)
2307 2317
@@ -2315,10 +2325,7 @@ void __init setup_IO_APIC(void)
2315 2325
2316 enable_IO_APIC(); 2326 enable_IO_APIC();
2317 2327
2318 if (acpi_ioapic) 2328 io_apic_irqs = ~PIC_IRQS;
2319 io_apic_irqs = ~0; /* all IRQs go through IOAPIC */
2320 else
2321 io_apic_irqs = ~PIC_IRQS;
2322 2329
2323 printk("ENABLING IO-APIC IRQs\n"); 2330 printk("ENABLING IO-APIC IRQs\n");
2324 2331
diff --git a/arch/x86/kernel/io_apic_64.c b/arch/x86/kernel/io_apic_64.c
index 07ebcd305fb7..9e645cba11c4 100644
--- a/arch/x86/kernel/io_apic_64.c
+++ b/arch/x86/kernel/io_apic_64.c
@@ -1823,11 +1823,21 @@ static int __init notimercheck(char *s)
1823__setup("no_timer_check", notimercheck); 1823__setup("no_timer_check", notimercheck);
1824 1824
1825/* 1825/*
1826 * 1826 * Traditionally ISA IRQ2 is the cascade IRQ, and is not available
1827 * IRQs that are handled by the PIC in the MPS IOAPIC case. 1827 * to devices. However there may be an I/O APIC pin available for
1828 * - IRQ2 is the cascade IRQ, and cannot be a io-apic IRQ. 1828 * this interrupt regardless. The pin may be left unconnected, but
1829 * Linux doesn't really care, as it's not actually used 1829 * typically it will be reused as an ExtINT cascade interrupt for
1830 * for any interrupt handling anyway. 1830 * the master 8259A. In the MPS case such a pin will normally be
1831 * reported as an ExtINT interrupt in the MP table. With ACPI
1832 * there is no provision for ExtINT interrupts, and in the absence
1833 * of an override it would be treated as an ordinary ISA I/O APIC
1834 * interrupt, that is edge-triggered and unmasked by default. We
1835 * used to do this, but it caused problems on some systems because
1836 * of the NMI watchdog and sometimes IRQ0 of the 8254 timer using
1837 * the same ExtINT cascade interrupt to drive the local APIC of the
1838 * bootstrap processor. Therefore we refrain from routing IRQ2 to
1839 * the I/O APIC in all cases now. No actual device should request
1840 * it anyway. --macro
1831 */ 1841 */
1832#define PIC_IRQS (1<<2) 1842#define PIC_IRQS (1<<2)
1833 1843
@@ -1838,10 +1848,7 @@ void __init setup_IO_APIC(void)
1838 * calling enable_IO_APIC() is moved to setup_local_APIC for BP 1848 * calling enable_IO_APIC() is moved to setup_local_APIC for BP
1839 */ 1849 */
1840 1850
1841 if (acpi_ioapic) 1851 io_apic_irqs = ~PIC_IRQS;
1842 io_apic_irqs = ~0; /* all IRQs go through IOAPIC */
1843 else
1844 io_apic_irqs = ~PIC_IRQS;
1845 1852
1846 apic_printk(APIC_VERBOSE, "ENABLING IO-APIC IRQs\n"); 1853 apic_printk(APIC_VERBOSE, "ENABLING IO-APIC IRQs\n");
1847 1854