|
@@ -429,6 +429,34 @@ static int mp_config_acpi_gsi(struct device *dev, u32 gsi, int trigger,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int __init mp_register_ioapic_irq(u8 bus_irq, u8 polarity,
|
|
|
+ u8 trigger, u32 gsi)
|
|
|
+{
|
|
|
+ struct mpc_intsrc mp_irq;
|
|
|
+ int ioapic, pin;
|
|
|
+
|
|
|
+ /* Convert 'gsi' to 'ioapic.pin'(INTIN#) */
|
|
|
+ ioapic = mp_find_ioapic(gsi);
|
|
|
+ if (ioapic < 0) {
|
|
|
+ pr_warn("Failed to find ioapic for gsi : %u\n", gsi);
|
|
|
+ return ioapic;
|
|
|
+ }
|
|
|
+
|
|
|
+ pin = mp_find_ioapic_pin(ioapic, gsi);
|
|
|
+
|
|
|
+ mp_irq.type = MP_INTSRC;
|
|
|
+ mp_irq.irqtype = mp_INT;
|
|
|
+ mp_irq.irqflag = (trigger << 2) | polarity;
|
|
|
+ mp_irq.srcbus = MP_ISA_BUS;
|
|
|
+ mp_irq.srcbusirq = bus_irq;
|
|
|
+ mp_irq.dstapic = mpc_ioapic_id(ioapic);
|
|
|
+ mp_irq.dstirq = pin;
|
|
|
+
|
|
|
+ mp_save_irq(&mp_irq);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int __init
|
|
|
acpi_parse_ioapic(struct acpi_subtable_header * header, const unsigned long end)
|
|
|
{
|
|
@@ -473,7 +501,11 @@ static void __init acpi_sci_ioapic_setup(u8 bus_irq, u16 polarity, u16 trigger,
|
|
|
if (acpi_sci_flags & ACPI_MADT_POLARITY_MASK)
|
|
|
polarity = acpi_sci_flags & ACPI_MADT_POLARITY_MASK;
|
|
|
|
|
|
- mp_override_legacy_irq(bus_irq, polarity, trigger, gsi);
|
|
|
+ if (bus_irq < NR_IRQS_LEGACY)
|
|
|
+ mp_override_legacy_irq(bus_irq, polarity, trigger, gsi);
|
|
|
+ else
|
|
|
+ mp_register_ioapic_irq(bus_irq, polarity, trigger, gsi);
|
|
|
+
|
|
|
acpi_penalize_sci_irq(bus_irq, trigger, polarity);
|
|
|
|
|
|
/*
|