|
@@ -887,6 +887,16 @@ int mp_find_ioapic(int gsi)
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
+int mp_find_ioapic_pin(int ioapic, int gsi)
|
|
|
+{
|
|
|
+ if (WARN_ON(ioapic == -1))
|
|
|
+ return -1;
|
|
|
+ if (WARN_ON(gsi > mp_ioapic_routing[ioapic].gsi_end))
|
|
|
+ return -1;
|
|
|
+
|
|
|
+ return gsi - mp_ioapic_routing[ioapic].gsi_base;
|
|
|
+}
|
|
|
+
|
|
|
static u8 __init uniq_ioapic_id(u8 id)
|
|
|
{
|
|
|
#ifdef CONFIG_X86_32
|
|
@@ -1022,7 +1032,7 @@ void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi)
|
|
|
ioapic = mp_find_ioapic(gsi);
|
|
|
if (ioapic < 0)
|
|
|
return;
|
|
|
- pin = gsi - mp_ioapic_routing[ioapic].gsi_base;
|
|
|
+ pin = mp_find_ioapic_pin(ioapic, gsi);
|
|
|
|
|
|
/*
|
|
|
* TBD: This check is for faulty timer entries, where the override
|
|
@@ -1142,7 +1152,7 @@ int mp_register_gsi(u32 gsi, int triggering, int polarity)
|
|
|
return gsi;
|
|
|
}
|
|
|
|
|
|
- ioapic_pin = gsi - mp_ioapic_routing[ioapic].gsi_base;
|
|
|
+ ioapic_pin = mp_find_ioapic_pin(ioapic, gsi);
|
|
|
|
|
|
#ifdef CONFIG_X86_32
|
|
|
if (ioapic_renumber_irq)
|
|
@@ -1231,7 +1241,7 @@ int mp_config_acpi_gsi(unsigned char number, unsigned int devfn, u8 pin,
|
|
|
mp_irq.srcbusirq = (((devfn >> 3) & 0x1f) << 2) | ((pin - 1) & 3);
|
|
|
ioapic = mp_find_ioapic(gsi);
|
|
|
mp_irq.dstapic = mp_ioapic_routing[ioapic].apic_id;
|
|
|
- mp_irq.dstirq = gsi - mp_ioapic_routing[ioapic].gsi_base;
|
|
|
+ mp_irq.dstirq = mp_find_ioapic_pin(ioapic, gsi);
|
|
|
|
|
|
save_mp_irq(&mp_irq);
|
|
|
#endif
|