|
@@ -360,6 +360,26 @@ static void add_pin_to_irq(unsigned int irq, int apic, int pin)
|
|
|
entry->pin = pin;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Reroute an IRQ to a different pin.
|
|
|
+ */
|
|
|
+static void __init replace_pin_at_irq(unsigned int irq,
|
|
|
+ int oldapic, int oldpin,
|
|
|
+ int newapic, int newpin)
|
|
|
+{
|
|
|
+ struct irq_pin_list *entry = irq_2_pin + irq;
|
|
|
+
|
|
|
+ while (1) {
|
|
|
+ if (entry->apic == oldapic && entry->pin == oldpin) {
|
|
|
+ entry->apic = newapic;
|
|
|
+ entry->pin = newpin;
|
|
|
+ }
|
|
|
+ if (!entry->next)
|
|
|
+ break;
|
|
|
+ entry = irq_2_pin + entry->next;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
|
|
|
#define DO_ACTION(name,R,ACTION, FINAL) \
|
|
|
\
|
|
@@ -1680,6 +1700,11 @@ static inline void __init check_timer(void)
|
|
|
apic2 = apic1;
|
|
|
}
|
|
|
|
|
|
+ replace_pin_at_irq(0, 0, 0, apic1, pin1);
|
|
|
+ apic1 = 0;
|
|
|
+ pin1 = 0;
|
|
|
+ setup_timer_IRQ0_pin(apic1, pin1, cfg->vector);
|
|
|
+
|
|
|
if (pin1 != -1) {
|
|
|
/*
|
|
|
* Ok, does IRQ0 through the IOAPIC work?
|
|
@@ -1712,10 +1737,9 @@ static inline void __init check_timer(void)
|
|
|
/*
|
|
|
* legacy devices should be connected to IO APIC #0
|
|
|
*/
|
|
|
- /* replace_pin_at_irq(0, apic1, pin1, apic2, pin2); */
|
|
|
+ replace_pin_at_irq(0, apic1, pin1, apic2, pin2);
|
|
|
setup_timer_IRQ0_pin(apic2, pin2, cfg->vector);
|
|
|
unmask_IO_APIC_irq(0);
|
|
|
- clear_IO_APIC_pin(apic2, pin2);
|
|
|
enable_8259A_irq(0);
|
|
|
if (timer_irq_works()) {
|
|
|
apic_printk(APIC_VERBOSE," works.\n");
|