|
@@ -33,6 +33,7 @@
|
|
|
#include <linux/irq.h>
|
|
|
#include <linux/bootmem.h>
|
|
|
#include <linux/ioport.h>
|
|
|
+#include <linux/pci.h>
|
|
|
|
|
|
#include <asm/pgtable.h>
|
|
|
#include <asm/io_apic.h>
|
|
@@ -1158,6 +1159,44 @@ void __init mp_config_acpi_legacy_irqs(void)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static int mp_config_acpi_gsi(struct device *dev, u32 gsi, int triggering,
|
|
|
+ int polarity)
|
|
|
+{
|
|
|
+#ifdef CONFIG_X86_MPPARSE
|
|
|
+ struct mpc_intsrc mp_irq;
|
|
|
+ struct pci_dev *pdev;
|
|
|
+ unsigned char number;
|
|
|
+ unsigned int devfn;
|
|
|
+ int ioapic;
|
|
|
+ u8 pin;
|
|
|
+
|
|
|
+ if (!acpi_ioapic)
|
|
|
+ return 0;
|
|
|
+ if (!dev)
|
|
|
+ return 0;
|
|
|
+ if (dev->bus != &pci_bus_type)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ pdev = to_pci_dev(dev);
|
|
|
+ number = pdev->bus->number;
|
|
|
+ devfn = pdev->devfn;
|
|
|
+ pin = pdev->pin;
|
|
|
+ /* print the entry should happen on mptable identically */
|
|
|
+ mp_irq.type = MP_INTSRC;
|
|
|
+ mp_irq.irqtype = mp_INT;
|
|
|
+ mp_irq.irqflag = (triggering == ACPI_EDGE_SENSITIVE ? 4 : 0x0c) |
|
|
|
+ (polarity == ACPI_ACTIVE_HIGH ? 1 : 3);
|
|
|
+ mp_irq.srcbus = number;
|
|
|
+ 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 = mp_find_ioapic_pin(ioapic, gsi);
|
|
|
+
|
|
|
+ save_mp_irq(&mp_irq);
|
|
|
+#endif
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
int mp_register_gsi(struct device *dev, u32 gsi, int triggering, int polarity)
|
|
|
{
|
|
|
int ioapic;
|
|
@@ -1189,6 +1228,7 @@ int mp_register_gsi(struct device *dev, u32 gsi, int triggering, int polarity)
|
|
|
ioapic_pin);
|
|
|
return gsi;
|
|
|
}
|
|
|
+ mp_config_acpi_gsi(dev, gsi, triggering, polarity);
|
|
|
|
|
|
/*
|
|
|
* Avoid pin reprogramming. PRTs typically include entries
|
|
@@ -1208,32 +1248,6 @@ int mp_register_gsi(struct device *dev, u32 gsi, int triggering, int polarity)
|
|
|
return gsi;
|
|
|
}
|
|
|
|
|
|
-int mp_config_acpi_gsi(unsigned char number, unsigned int devfn, u8 pin,
|
|
|
- u32 gsi, int triggering, int polarity)
|
|
|
-{
|
|
|
-#ifdef CONFIG_X86_MPPARSE
|
|
|
- struct mpc_intsrc mp_irq;
|
|
|
- int ioapic;
|
|
|
-
|
|
|
- if (!acpi_ioapic)
|
|
|
- return 0;
|
|
|
-
|
|
|
- /* print the entry should happen on mptable identically */
|
|
|
- mp_irq.type = MP_INTSRC;
|
|
|
- mp_irq.irqtype = mp_INT;
|
|
|
- mp_irq.irqflag = (triggering == ACPI_EDGE_SENSITIVE ? 4 : 0x0c) |
|
|
|
- (polarity == ACPI_ACTIVE_HIGH ? 1 : 3);
|
|
|
- mp_irq.srcbus = number;
|
|
|
- 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 = mp_find_ioapic_pin(ioapic, gsi);
|
|
|
-
|
|
|
- save_mp_irq(&mp_irq);
|
|
|
-#endif
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
/*
|
|
|
* Parse IOAPIC related entries in MADT
|
|
|
* returns 0 on success, < 0 on error
|