|
@@ -400,42 +400,6 @@ static int mp_config_acpi_gsi(struct device *dev, u32 gsi, int trigger,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int mp_register_gsi(struct device *dev, u32 gsi, int trigger,
|
|
|
- int polarity)
|
|
|
-{
|
|
|
- int irq, node;
|
|
|
- struct irq_alloc_info info;
|
|
|
-
|
|
|
- if (acpi_irq_model != ACPI_IRQ_MODEL_IOAPIC)
|
|
|
- return gsi;
|
|
|
-
|
|
|
- trigger = trigger == ACPI_EDGE_SENSITIVE ? 0 : 1;
|
|
|
- polarity = polarity == ACPI_ACTIVE_HIGH ? 0 : 1;
|
|
|
- node = dev ? dev_to_node(dev) : NUMA_NO_NODE;
|
|
|
- ioapic_set_alloc_attr(&info, node, trigger, polarity);
|
|
|
- irq = mp_map_gsi_to_irq(gsi, IOAPIC_MAP_ALLOC, &info);
|
|
|
- if (irq < 0)
|
|
|
- return irq;
|
|
|
-
|
|
|
- /* Don't set up the ACPI SCI because it's already set up */
|
|
|
- if (enable_update_mptable && acpi_gbl_FADT.sci_interrupt != gsi)
|
|
|
- mp_config_acpi_gsi(dev, gsi, trigger, polarity);
|
|
|
-
|
|
|
- return irq;
|
|
|
-}
|
|
|
-
|
|
|
-static void mp_unregister_gsi(u32 gsi)
|
|
|
-{
|
|
|
- int irq;
|
|
|
-
|
|
|
- if (acpi_irq_model != ACPI_IRQ_MODEL_IOAPIC)
|
|
|
- return;
|
|
|
-
|
|
|
- irq = mp_map_gsi_to_irq(gsi, 0, NULL);
|
|
|
- if (irq > 0)
|
|
|
- mp_unmap_irq(irq);
|
|
|
-}
|
|
|
-
|
|
|
static struct irq_domain_ops acpi_irqdomain_ops = {
|
|
|
.alloc = mp_irqdomain_alloc,
|
|
|
.free = mp_irqdomain_free,
|
|
@@ -662,10 +626,21 @@ static int acpi_register_gsi_ioapic(struct device *dev, u32 gsi,
|
|
|
int trigger, int polarity)
|
|
|
{
|
|
|
int irq = gsi;
|
|
|
-
|
|
|
#ifdef CONFIG_X86_IO_APIC
|
|
|
+ int node;
|
|
|
+ struct irq_alloc_info info;
|
|
|
+
|
|
|
+ node = dev ? dev_to_node(dev) : NUMA_NO_NODE;
|
|
|
+ trigger = trigger == ACPI_EDGE_SENSITIVE ? 0 : 1;
|
|
|
+ polarity = polarity == ACPI_ACTIVE_HIGH ? 0 : 1;
|
|
|
+ ioapic_set_alloc_attr(&info, node, trigger, polarity);
|
|
|
+
|
|
|
mutex_lock(&acpi_ioapic_lock);
|
|
|
- irq = mp_register_gsi(dev, gsi, trigger, polarity);
|
|
|
+ irq = mp_map_gsi_to_irq(gsi, IOAPIC_MAP_ALLOC, &info);
|
|
|
+ /* Don't set up the ACPI SCI because it's already set up */
|
|
|
+ if (irq >= 0 && enable_update_mptable &&
|
|
|
+ acpi_gbl_FADT.sci_interrupt != gsi)
|
|
|
+ mp_config_acpi_gsi(dev, gsi, trigger, polarity);
|
|
|
mutex_unlock(&acpi_ioapic_lock);
|
|
|
#endif
|
|
|
|
|
@@ -675,8 +650,12 @@ static int acpi_register_gsi_ioapic(struct device *dev, u32 gsi,
|
|
|
static void acpi_unregister_gsi_ioapic(u32 gsi)
|
|
|
{
|
|
|
#ifdef CONFIG_X86_IO_APIC
|
|
|
+ int irq;
|
|
|
+
|
|
|
mutex_lock(&acpi_ioapic_lock);
|
|
|
- mp_unregister_gsi(gsi);
|
|
|
+ irq = mp_map_gsi_to_irq(gsi, 0, NULL);
|
|
|
+ if (irq > 0)
|
|
|
+ mp_unmap_irq(irq);
|
|
|
mutex_unlock(&acpi_ioapic_lock);
|
|
|
#endif
|
|
|
}
|