diff options
| -rw-r--r-- | arch/x86/kernel/io_apic_32.c | 25 | ||||
| -rw-r--r-- | arch/x86/kernel/io_apic_64.c | 25 |
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 | ||
