|
@@ -961,8 +961,6 @@ void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi)
|
|
|
void __init mp_config_acpi_legacy_irqs(void)
|
|
|
{
|
|
|
int i;
|
|
|
- int ioapic;
|
|
|
- unsigned int dstapic;
|
|
|
struct mpc_intsrc mp_irq;
|
|
|
|
|
|
#if defined (CONFIG_MCA) || defined (CONFIG_EISA)
|
|
@@ -982,20 +980,28 @@ void __init mp_config_acpi_legacy_irqs(void)
|
|
|
return;
|
|
|
#endif
|
|
|
|
|
|
- /*
|
|
|
- * Locate the IOAPIC that manages the ISA IRQs (0-15).
|
|
|
- */
|
|
|
- ioapic = mp_find_ioapic(0);
|
|
|
- if (ioapic < 0)
|
|
|
- return;
|
|
|
- dstapic = mp_ioapics[ioapic].apicid;
|
|
|
-
|
|
|
/*
|
|
|
* Use the default configuration for the IRQs 0-15. Unless
|
|
|
* overridden by (MADT) interrupt source override entries.
|
|
|
*/
|
|
|
for (i = 0; i < 16; i++) {
|
|
|
+ int ioapic, pin;
|
|
|
+ unsigned int dstapic;
|
|
|
int idx;
|
|
|
+ u32 gsi;
|
|
|
+
|
|
|
+ /* Locate the gsi that irq i maps to. */
|
|
|
+ if (acpi_isa_irq_to_gsi(i, &gsi))
|
|
|
+ continue;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Locate the IOAPIC that manages the ISA IRQ.
|
|
|
+ */
|
|
|
+ ioapic = mp_find_ioapic(gsi);
|
|
|
+ if (ioapic < 0)
|
|
|
+ continue;
|
|
|
+ pin = mp_find_ioapic_pin(ioapic, gsi);
|
|
|
+ dstapic = mp_ioapics[ioapic].apicid;
|
|
|
|
|
|
for (idx = 0; idx < mp_irq_entries; idx++) {
|
|
|
struct mpc_intsrc *irq = mp_irqs + idx;
|
|
@@ -1005,7 +1011,7 @@ void __init mp_config_acpi_legacy_irqs(void)
|
|
|
break;
|
|
|
|
|
|
/* Do we already have a mapping for this IOAPIC pin */
|
|
|
- if (irq->dstapic == dstapic && irq->dstirq == i)
|
|
|
+ if (irq->dstapic == dstapic && irq->dstirq == pin)
|
|
|
break;
|
|
|
}
|
|
|
|
|
@@ -1020,7 +1026,7 @@ void __init mp_config_acpi_legacy_irqs(void)
|
|
|
mp_irq.dstapic = dstapic;
|
|
|
mp_irq.irqtype = mp_INT;
|
|
|
mp_irq.srcbusirq = i; /* Identity mapped */
|
|
|
- mp_irq.dstirq = i;
|
|
|
+ mp_irq.dstirq = pin;
|
|
|
|
|
|
save_mp_irq(&mp_irq);
|
|
|
}
|