diff options
Diffstat (limited to 'arch/x86/kernel/i8259.c')
-rw-r--r-- | arch/x86/kernel/i8259.c | 22 |
1 files changed, 8 insertions, 14 deletions
diff --git a/arch/x86/kernel/i8259.c b/arch/x86/kernel/i8259.c index 7a0fda8f01b5..dc92b49d9204 100644 --- a/arch/x86/kernel/i8259.c +++ b/arch/x86/kernel/i8259.c | |||
@@ -297,34 +297,28 @@ void init_8259A(int auto_eoi) | |||
297 | * outb_pic - this has to work on a wide range of PC hardware. | 297 | * outb_pic - this has to work on a wide range of PC hardware. |
298 | */ | 298 | */ |
299 | outb_pic(0x11, PIC_MASTER_CMD); /* ICW1: select 8259A-1 init */ | 299 | outb_pic(0x11, PIC_MASTER_CMD); /* ICW1: select 8259A-1 init */ |
300 | #ifndef CONFIG_X86_64 | 300 | |
301 | outb_pic(0x20 + 0, PIC_MASTER_IMR); /* ICW2: 8259A-1 IR0-7 mapped to 0x20-0x27 */ | 301 | /* ICW2: 8259A-1 IR0-7 mapped to 0x30-0x37 on x86-64, |
302 | outb_pic(1U << PIC_CASCADE_IR, PIC_MASTER_IMR); /* 8259A-1 (the master) has a slave on IR2 */ | 302 | to 0x20-0x27 on i386 */ |
303 | #else /* CONFIG_X86_64 */ | ||
304 | /* ICW2: 8259A-1 IR0-7 mapped to 0x30-0x37 */ | ||
305 | outb_pic(IRQ0_VECTOR, PIC_MASTER_IMR); | 303 | outb_pic(IRQ0_VECTOR, PIC_MASTER_IMR); |
304 | |||
306 | /* 8259A-1 (the master) has a slave on IR2 */ | 305 | /* 8259A-1 (the master) has a slave on IR2 */ |
307 | outb_pic(0x04, PIC_MASTER_IMR); | 306 | outb_pic(1U << PIC_CASCADE_IR, PIC_MASTER_IMR); |
308 | #endif /* CONFIG_X86_64 */ | 307 | |
309 | if (auto_eoi) /* master does Auto EOI */ | 308 | if (auto_eoi) /* master does Auto EOI */ |
310 | outb_pic(MASTER_ICW4_DEFAULT | PIC_ICW4_AEOI, PIC_MASTER_IMR); | 309 | outb_pic(MASTER_ICW4_DEFAULT | PIC_ICW4_AEOI, PIC_MASTER_IMR); |
311 | else /* master expects normal EOI */ | 310 | else /* master expects normal EOI */ |
312 | outb_pic(MASTER_ICW4_DEFAULT, PIC_MASTER_IMR); | 311 | outb_pic(MASTER_ICW4_DEFAULT, PIC_MASTER_IMR); |
313 | 312 | ||
314 | outb_pic(0x11, PIC_SLAVE_CMD); /* ICW1: select 8259A-2 init */ | 313 | outb_pic(0x11, PIC_SLAVE_CMD); /* ICW1: select 8259A-2 init */ |
315 | #ifndef CONFIG_X86_64 | 314 | |
316 | outb_pic(0x20 + 8, PIC_SLAVE_IMR); /* ICW2: 8259A-2 IR0-7 mapped to 0x28-0x2f */ | 315 | /* ICW2: 8259A-2 IR0-7 mapped to IRQ8_VECTOR */ |
317 | outb_pic(PIC_CASCADE_IR, PIC_SLAVE_IMR); /* 8259A-2 is a slave on master's IR2 */ | ||
318 | outb_pic(SLAVE_ICW4_DEFAULT, PIC_SLAVE_IMR); /* (slave's support for AEOI in flat mode is to be investigated) */ | ||
319 | #else /* CONFIG_X86_64 */ | ||
320 | /* ICW2: 8259A-2 IR0-7 mapped to 0x38-0x3f */ | ||
321 | outb_pic(IRQ8_VECTOR, PIC_SLAVE_IMR); | 316 | outb_pic(IRQ8_VECTOR, PIC_SLAVE_IMR); |
322 | /* 8259A-2 is a slave on master's IR2 */ | 317 | /* 8259A-2 is a slave on master's IR2 */ |
323 | outb_pic(PIC_CASCADE_IR, PIC_SLAVE_IMR); | 318 | outb_pic(PIC_CASCADE_IR, PIC_SLAVE_IMR); |
324 | /* (slave's support for AEOI in flat mode is to be investigated) */ | 319 | /* (slave's support for AEOI in flat mode is to be investigated) */ |
325 | outb_pic(SLAVE_ICW4_DEFAULT, PIC_SLAVE_IMR); | 320 | outb_pic(SLAVE_ICW4_DEFAULT, PIC_SLAVE_IMR); |
326 | 321 | ||
327 | #endif /* CONFIG_X86_64 */ | ||
328 | if (auto_eoi) | 322 | if (auto_eoi) |
329 | /* | 323 | /* |
330 | * In AEOI mode we just have to mask the interrupt | 324 | * In AEOI mode we just have to mask the interrupt |