Commit d32932d0 authored by Jiang Liu's avatar Jiang Liu Committed by Thomas Gleixner

x86/irq: Convert IOAPIC to use hierarchical irqdomain interfaces

Convert IOAPIC driver to support and use hierarchical irqdomain
interfaces.  It's a little big, but would break bisecting if we split
it into multiple patches.

Fold in a patch from Andy Shevchenko <andriy.shevchenko@linux.intel.com>
to make it bisectable.
http://lkml.org/lkml/2014/12/10/622Signed-off-by: default avatarJiang Liu <jiang.liu@linux.intel.com>
Tested-by: default avatarJoerg Roedel <jroedel@suse.de>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: Sander Eikelenboom <linux@eikelenboom.it>
Cc: David Vrabel <david.vrabel@citrix.com>
Cc: Tony Luck <tony.luck@intel.com>
Cc: Joerg Roedel <joro@8bytes.org>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: sfi-devel@simplefirmware.org
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Rafael J. Wysocki <rjw@rjwysocki.net>
Cc: Randy Dunlap <rdunlap@infradead.org>
Cc: Yinghai Lu <yinghai@kernel.org>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Dimitri Sivanich <sivanich@sgi.com>
Cc: Len Brown <len.brown@intel.com>
Cc: Pavel Machek <pavel@ucw.cz>
Cc: Grant Likely <grant.likely@linaro.org>
Cc: Rob Herring <robh@kernel.org>
Cc: David Rientjes <rientjes@google.com>
Cc: David Cohen <david.a.cohen@linux.intel.com>
Link: http://lkml.kernel.org/r/1428905519-23704-38-git-send-email-jiang.liu@linux.intel.comSigned-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent 96ed44b2
...@@ -412,11 +412,6 @@ static int mp_register_gsi(struct device *dev, u32 gsi, int trigger, ...@@ -412,11 +412,6 @@ static int mp_register_gsi(struct device *dev, u32 gsi, int trigger,
trigger = trigger == ACPI_EDGE_SENSITIVE ? 0 : 1; trigger = trigger == ACPI_EDGE_SENSITIVE ? 0 : 1;
polarity = polarity == ACPI_ACTIVE_HIGH ? 0 : 1; polarity = polarity == ACPI_ACTIVE_HIGH ? 0 : 1;
node = dev ? dev_to_node(dev) : NUMA_NO_NODE; node = dev ? dev_to_node(dev) : NUMA_NO_NODE;
if (mp_set_gsi_attr(gsi, trigger, polarity, node)) {
pr_warn("Failed to set pin attr for GSI%d\n", gsi);
return -1;
}
ioapic_set_alloc_attr(&info, node, trigger, polarity); ioapic_set_alloc_attr(&info, node, trigger, polarity);
irq = mp_map_gsi_to_irq(gsi, IOAPIC_MAP_ALLOC, &info); irq = mp_map_gsi_to_irq(gsi, IOAPIC_MAP_ALLOC, &info);
if (irq < 0) if (irq < 0)
...@@ -442,8 +437,10 @@ static void mp_unregister_gsi(u32 gsi) ...@@ -442,8 +437,10 @@ static void mp_unregister_gsi(u32 gsi)
} }
static struct irq_domain_ops acpi_irqdomain_ops = { static struct irq_domain_ops acpi_irqdomain_ops = {
.map = mp_irqdomain_map, .alloc = mp_irqdomain_alloc,
.unmap = mp_irqdomain_unmap, .free = mp_irqdomain_free,
.activate = mp_irqdomain_activate,
.deactivate = mp_irqdomain_deactivate,
}; };
static int __init static int __init
......
This diff is collapsed.
...@@ -196,38 +196,31 @@ static struct of_ioapic_type of_ioapic_type[] = ...@@ -196,38 +196,31 @@ static struct of_ioapic_type of_ioapic_type[] =
}, },
}; };
static int ioapic_xlate(struct irq_domain *domain, static int dt_irqdomain_alloc(struct irq_domain *domain, unsigned int virq,
struct device_node *controller, unsigned int nr_irqs, void *arg)
const u32 *intspec, u32 intsize,
irq_hw_number_t *out_hwirq, u32 *out_type)
{ {
struct of_phandle_args *irq_data = (void *)arg;
struct of_ioapic_type *it; struct of_ioapic_type *it;
u32 line, idx, gsi; struct irq_alloc_info tmp;
if (WARN_ON(intsize < 2)) if (WARN_ON(irq_data->args_count < 2))
return -EINVAL; return -EINVAL;
if (irq_data->args[1] >= ARRAY_SIZE(of_ioapic_type))
line = intspec[0];
if (intspec[1] >= ARRAY_SIZE(of_ioapic_type))
return -EINVAL; return -EINVAL;
it = &of_ioapic_type[intspec[1]]; it = &of_ioapic_type[irq_data->args[1]];
ioapic_set_alloc_attr(&tmp, NUMA_NO_NODE, it->trigger, it->polarity);
tmp.ioapic_id = mpc_ioapic_id(mp_irqdomain_ioapic_idx(domain));
tmp.ioapic_pin = irq_data->args[0];
idx = (u32)(long)domain->host_data; return mp_irqdomain_alloc(domain, virq, nr_irqs, &tmp);
gsi = mp_pin_to_gsi(idx, line);
if (mp_set_gsi_attr(gsi, it->trigger, it->polarity, cpu_to_node(0)))
return -EBUSY;
*out_hwirq = line;
*out_type = it->out_type;
return 0;
} }
const struct irq_domain_ops ioapic_irq_domain_ops = { const struct irq_domain_ops ioapic_irq_domain_ops = {
.map = mp_irqdomain_map, .alloc = dt_irqdomain_alloc,
.unmap = mp_irqdomain_unmap, .free = mp_irqdomain_free,
.xlate = ioapic_xlate, .activate = mp_irqdomain_activate,
.deactivate = mp_irqdomain_deactivate,
}; };
static void __init dtb_add_ioapic(struct device_node *dn) static void __init dtb_add_ioapic(struct device_node *dn)
......
...@@ -114,8 +114,10 @@ static void __init MP_bus_info(struct mpc_bus *m) ...@@ -114,8 +114,10 @@ static void __init MP_bus_info(struct mpc_bus *m)
} }
static struct irq_domain_ops mp_ioapic_irqdomain_ops = { static struct irq_domain_ops mp_ioapic_irqdomain_ops = {
.map = mp_irqdomain_map, .alloc = mp_irqdomain_alloc,
.unmap = mp_irqdomain_unmap, .free = mp_irqdomain_free,
.activate = mp_irqdomain_activate,
.deactivate = mp_irqdomain_deactivate,
}; };
static void __init MP_ioapic_info(struct mpc_ioapic *m) static void __init MP_ioapic_info(struct mpc_ioapic *m)
......
...@@ -224,8 +224,6 @@ static int intel_mid_pci_irq_enable(struct pci_dev *dev) ...@@ -224,8 +224,6 @@ static int intel_mid_pci_irq_enable(struct pci_dev *dev)
* MRST only have IOAPIC, the PCI irq lines are 1:1 mapped to * MRST only have IOAPIC, the PCI irq lines are 1:1 mapped to
* IOAPIC RTE entries, so we just enable RTE for the device. * IOAPIC RTE entries, so we just enable RTE for the device.
*/ */
if (mp_set_gsi_attr(dev->irq, 1, polarity, dev_to_node(&dev->dev)))
return -EBUSY;
if (mp_map_gsi_to_irq(dev->irq, IOAPIC_MAP_ALLOC, &info) < 0) if (mp_map_gsi_to_irq(dev->irq, IOAPIC_MAP_ALLOC, &info) < 0)
return -EBUSY; return -EBUSY;
......
...@@ -36,8 +36,7 @@ static int tangier_probe(struct platform_device *pdev) ...@@ -36,8 +36,7 @@ static int tangier_probe(struct platform_device *pdev)
/* IOAPIC builds identity mapping between GSI and IRQ on MID */ /* IOAPIC builds identity mapping between GSI and IRQ on MID */
gsi = pdata->irq; gsi = pdata->irq;
ioapic_set_alloc_attr(&info, cpu_to_node(0), 1, 0); ioapic_set_alloc_attr(&info, cpu_to_node(0), 1, 0);
if (mp_set_gsi_attr(gsi, 1, 0, cpu_to_node(0)) || if (mp_map_gsi_to_irq(gsi, IOAPIC_MAP_ALLOC, &info) <= 0) {
mp_map_gsi_to_irq(gsi, IOAPIC_MAP_ALLOC, &info) <= 0) {
dev_warn(&pdev->dev, "cannot find interrupt %d in ioapic\n", dev_warn(&pdev->dev, "cannot find interrupt %d in ioapic\n",
gsi); gsi);
return -EINVAL; return -EINVAL;
......
...@@ -469,10 +469,7 @@ static int __init sfi_parse_devs(struct sfi_table_header *table) ...@@ -469,10 +469,7 @@ static int __init sfi_parse_devs(struct sfi_table_header *table)
} }
ioapic_set_alloc_attr(&info, NUMA_NO_NODE, 1, polarity); ioapic_set_alloc_attr(&info, NUMA_NO_NODE, 1, polarity);
ret = mp_set_gsi_attr(irq, 1, polarity, NUMA_NO_NODE); ret = mp_map_gsi_to_irq(irq, IOAPIC_MAP_ALLOC, &info);
if (ret == 0)
ret = mp_map_gsi_to_irq(irq, IOAPIC_MAP_ALLOC,
&info);
WARN_ON(ret < 0); WARN_ON(ret < 0);
} }
......
...@@ -72,7 +72,10 @@ static int __init sfi_parse_cpus(struct sfi_table_header *table) ...@@ -72,7 +72,10 @@ static int __init sfi_parse_cpus(struct sfi_table_header *table)
#ifdef CONFIG_X86_IO_APIC #ifdef CONFIG_X86_IO_APIC
static struct irq_domain_ops sfi_ioapic_irqdomain_ops = { static struct irq_domain_ops sfi_ioapic_irqdomain_ops = {
.map = mp_irqdomain_map, .alloc = mp_irqdomain_alloc,
.free = mp_irqdomain_free,
.activate = mp_irqdomain_activate,
.deactivate = mp_irqdomain_deactivate,
}; };
static int __init sfi_parse_ioapic(struct sfi_table_header *table) static int __init sfi_parse_ioapic(struct sfi_table_header *table)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment