Messages in this thread Patch in this message | | | Subject | [PATCH 6/14] kexec: ioapic-virtwire-on-shutdown.x86_64 | From | (Eric W. Biederman) | Date | 20 Aug 2004 12:02:51 -0600 |
| |
Restore an ioapic to virtual wire mode on reboot if it has an ExtInt input.
diff -uNr linux-2.6.8.1-mm2-ioapic-virtwire-on-shutdown.i386/arch/x86_64/kernel/io_apic.c linux-2.6.8.1-mm2-ioapic-virtwire-on-shutdown.x86_64/arch/x86_64/kernel/io_apic.c --- linux-2.6.8.1-mm2-ioapic-virtwire-on-shutdown.i386/arch/x86_64/kernel/io_apic.c Sat Aug 14 11:55:02 2004 +++ linux-2.6.8.1-mm2-ioapic-virtwire-on-shutdown.x86_64/arch/x86_64/kernel/io_apic.c Fri Aug 20 10:13:41 2004 @@ -1123,10 +1123,42 @@ */ void disable_IO_APIC(void) { + int pin; /* * Clear the IO-APIC before rebooting: */ clear_IO_APIC(); + + /* + * If the i82559 is routed through an IOAPIC + * Put that IOAPIC in virtual wire mode + * so legacy interrups can be delivered. + */ + pin = find_isa_irq_pin(0, mp_ExtINT); + if (pin != -1) { + struct IO_APIC_route_entry entry; + unsigned long flags; + + memset(&entry, 0, sizeof(entry)); + entry.mask = 0; /* Enabled */ + entry.trigger = 0; /* Edge */ + entry.irr = 0; + entry.polarity = 0; /* High */ + entry.delivery_status = 0; + entry.dest_mode = 0; /* Physical */ + entry.delivery_mode = 7; /* ExtInt */ + entry.vector = 0; + entry.dest.physical.physical_dest = 0; + + + /* + * Add it to the IO-APIC irq-routing table: + */ + spin_lock_irqsave(&ioapic_lock, flags); + io_apic_write(0, 0x11+2*pin, *(((int *)&entry)+1)); + io_apic_write(0, 0x10+2*pin, *(((int *)&entry)+0)); + spin_unlock_irqrestore(&ioapic_lock, flags); + } disconnect_bsp_APIC(); } - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |