aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/irqchip/irq-gic.c
diff options
context:
space:
mode:
authorMarc Zyngier <marc.zyngier@arm.com>2015-10-13 07:51:40 -0400
committerThomas Gleixner <tglx@linutronix.de>2015-10-13 13:01:24 -0400
commit891ae7694f862c3605d037066e15ca128faa95d5 (patch)
tree79b1ced5d64d502e482e5d5929fc7f952da3641b /drivers/irqchip/irq-gic.c
parente81a7cd96bd55bb57d92486c514b7b8f8c8cd8ce (diff)
irqchip/gic: Switch ACPI support to stacked domains
Now that the basic ACPI GSI code is irq domain aware, make sure that the ACPI support in the GIC doesn't pointlessly deviate from the DT path. Signed-off-by: Marc Zyngier <marc.zyngier@arm.com> Reviewed-and-tested-by: Hanjun Guo <hanjun.guo@linaro.org> Tested-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> Cc: <linux-arm-kernel@lists.infradead.org> Cc: Tomasz Nowicki <tomasz.nowicki@linaro.org> Cc: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com> Cc: Graeme Gregory <graeme@xora.org.uk> Cc: Jake Oshins <jakeo@microsoft.com> Cc: Jiang Liu <jiang.liu@linux.intel.com> Cc: Jason Cooper <jason@lakedaemon.net> Cc: Rafael J. Wysocki <rjw@rjwysocki.net> Link: http://lkml.kernel.org/r/1444737105-31573-13-git-send-email-marc.zyngier@arm.com Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'drivers/irqchip/irq-gic.c')
-rw-r--r--drivers/irqchip/irq-gic.c44
1 files changed, 30 insertions, 14 deletions
diff --git a/drivers/irqchip/irq-gic.c b/drivers/irqchip/irq-gic.c
index 12b2973530ed..491eacb0b413 100644
--- a/drivers/irqchip/irq-gic.c
+++ b/drivers/irqchip/irq-gic.c
@@ -963,6 +963,15 @@ static int gic_irq_domain_translate(struct irq_domain *d,
963 return 0; 963 return 0;
964 } 964 }
965 965
966 if (fwspec->fwnode->type == FWNODE_IRQCHIP) {
967 if(fwspec->param_count != 2)
968 return -EINVAL;
969
970 *hwirq = fwspec->param[0];
971 *type = fwspec->param[1];
972 return 0;
973 }
974
966 return -EINVAL; 975 return -EINVAL;
967} 976}
968 977
@@ -1017,7 +1026,7 @@ static const struct irq_domain_ops gic_irq_domain_ops = {
1017 1026
1018static void __init __gic_init_bases(unsigned int gic_nr, int irq_start, 1027static void __init __gic_init_bases(unsigned int gic_nr, int irq_start,
1019 void __iomem *dist_base, void __iomem *cpu_base, 1028 void __iomem *dist_base, void __iomem *cpu_base,
1020 u32 percpu_offset, struct device_node *node) 1029 u32 percpu_offset, struct fwnode_handle *handle)
1021{ 1030{
1022 irq_hw_number_t hwirq_base; 1031 irq_hw_number_t hwirq_base;
1023 struct gic_chip_data *gic; 1032 struct gic_chip_data *gic;
@@ -1071,11 +1080,11 @@ static void __init __gic_init_bases(unsigned int gic_nr, int irq_start,
1071 gic_irqs = 1020; 1080 gic_irqs = 1020;
1072 gic->gic_irqs = gic_irqs; 1081 gic->gic_irqs = gic_irqs;
1073 1082
1074 if (node) { /* DT case */ 1083 if (handle) { /* DT/ACPI */
1075 gic->domain = irq_domain_add_linear(node, gic_irqs, 1084 gic->domain = irq_domain_create_linear(handle, gic_irqs,
1076 &gic_irq_domain_hierarchy_ops, 1085 &gic_irq_domain_hierarchy_ops,
1077 gic); 1086 gic);
1078 } else { /* Non-DT case */ 1087 } else { /* Legacy support */
1079 /* 1088 /*
1080 * For primary GICs, skip over SGIs. 1089 * For primary GICs, skip over SGIs.
1081 * For secondary GICs, skip over PPIs, too. 1090 * For secondary GICs, skip over PPIs, too.
@@ -1098,7 +1107,7 @@ static void __init __gic_init_bases(unsigned int gic_nr, int irq_start,
1098 irq_base = irq_start; 1107 irq_base = irq_start;
1099 } 1108 }
1100 1109
1101 gic->domain = irq_domain_add_legacy(node, gic_irqs, irq_base, 1110 gic->domain = irq_domain_add_legacy(NULL, gic_irqs, irq_base,
1102 hwirq_base, &gic_irq_domain_ops, gic); 1111 hwirq_base, &gic_irq_domain_ops, gic);
1103 } 1112 }
1104 1113
@@ -1206,7 +1215,8 @@ gic_of_init(struct device_node *node, struct device_node *parent)
1206 if (of_property_read_u32(node, "cpu-offset", &percpu_offset)) 1215 if (of_property_read_u32(node, "cpu-offset", &percpu_offset))
1207 percpu_offset = 0; 1216 percpu_offset = 0;
1208 1217
1209 __gic_init_bases(gic_cnt, -1, dist_base, cpu_base, percpu_offset, node); 1218 __gic_init_bases(gic_cnt, -1, dist_base, cpu_base, percpu_offset,
1219 &node->fwnode);
1210 if (!gic_cnt) 1220 if (!gic_cnt)
1211 gic_init_physaddr(node); 1221 gic_init_physaddr(node);
1212 1222
@@ -1281,6 +1291,7 @@ int __init
1281gic_v2_acpi_init(struct acpi_table_header *table) 1291gic_v2_acpi_init(struct acpi_table_header *table)
1282{ 1292{
1283 void __iomem *cpu_base, *dist_base; 1293 void __iomem *cpu_base, *dist_base;
1294 struct fwnode_handle *domain_handle;
1284 int count; 1295 int count;
1285 1296
1286 /* Collect CPU base addresses */ 1297 /* Collect CPU base addresses */
@@ -1331,14 +1342,19 @@ gic_v2_acpi_init(struct acpi_table_header *table)
1331 static_key_slow_dec(&supports_deactivate); 1342 static_key_slow_dec(&supports_deactivate);
1332 1343
1333 /* 1344 /*
1334 * Initialize zero GIC instance (no multi-GIC support). Also, set GIC 1345 * Initialize GIC instance zero (no multi-GIC support).
1335 * as default IRQ domain to allow for GSI registration and GSI to IRQ
1336 * number translation (see acpi_register_gsi() and acpi_gsi_to_irq()).
1337 */ 1346 */
1338 __gic_init_bases(0, -1, dist_base, cpu_base, 0, NULL); 1347 domain_handle = irq_domain_alloc_fwnode(dist_base);
1339 irq_set_default_host(gic_data[0].domain); 1348 if (!domain_handle) {
1349 pr_err("Unable to allocate domain handle\n");
1350 iounmap(cpu_base);
1351 iounmap(dist_base);
1352 return -ENOMEM;
1353 }
1354
1355 __gic_init_bases(0, -1, dist_base, cpu_base, 0, domain_handle);
1340 1356
1341 acpi_irq_model = ACPI_IRQ_MODEL_GIC; 1357 acpi_set_irq_model(ACPI_IRQ_MODEL_GIC, domain_handle);
1342 return 0; 1358 return 0;
1343} 1359}
1344#endif 1360#endif