|
@@ -31,6 +31,7 @@
|
|
|
#include <linux/module.h>
|
|
|
#include <linux/dmi.h>
|
|
|
#include <linux/irq.h>
|
|
|
+#include <linux/irqdomain.h>
|
|
|
#include <linux/slab.h>
|
|
|
#include <linux/bootmem.h>
|
|
|
#include <linux/ioport.h>
|
|
@@ -449,10 +450,16 @@ static int mp_register_gsi(struct device *dev, u32 gsi, int trigger,
|
|
|
return irq;
|
|
|
}
|
|
|
|
|
|
+static struct irq_domain_ops acpi_irqdomain_ops;
|
|
|
+
|
|
|
static int __init
|
|
|
acpi_parse_ioapic(struct acpi_subtable_header * header, const unsigned long end)
|
|
|
{
|
|
|
struct acpi_madt_io_apic *ioapic = NULL;
|
|
|
+ struct ioapic_domain_cfg cfg = {
|
|
|
+ .type = IOAPIC_DOMAIN_DYNAMIC,
|
|
|
+ .ops = &acpi_irqdomain_ops,
|
|
|
+ };
|
|
|
|
|
|
ioapic = (struct acpi_madt_io_apic *)header;
|
|
|
|
|
@@ -461,8 +468,12 @@ acpi_parse_ioapic(struct acpi_subtable_header * header, const unsigned long end)
|
|
|
|
|
|
acpi_table_print_madt_entry(header);
|
|
|
|
|
|
- mp_register_ioapic(ioapic->id,
|
|
|
- ioapic->address, ioapic->global_irq_base, NULL);
|
|
|
+ /* Statically assign IRQ numbers for IOAPICs hosting legacy IRQs */
|
|
|
+ if (ioapic->global_irq_base < nr_legacy_irqs())
|
|
|
+ cfg.type = IOAPIC_DOMAIN_LEGACY;
|
|
|
+
|
|
|
+ mp_register_ioapic(ioapic->id, ioapic->address, ioapic->global_irq_base,
|
|
|
+ &cfg);
|
|
|
|
|
|
return 0;
|
|
|
}
|