Lines Matching refs:gic
356 struct gic_chip_data *gic = &gic_data[0]; in gic_handle_irq() local
357 void __iomem *cpu_base = gic_data_cpu_base(gic); in gic_handle_irq()
367 handle_domain_irq(gic->domain, irqnr, regs); in gic_handle_irq()
437 static u8 gic_get_cpumask(struct gic_chip_data *gic) in gic_get_cpumask() argument
439 void __iomem *base = gic_data_dist_base(gic); in gic_get_cpumask()
462 static void gic_cpu_if_up(struct gic_chip_data *gic) in gic_cpu_if_up() argument
464 void __iomem *cpu_base = gic_data_cpu_base(gic); in gic_cpu_if_up()
469 if (gic == &gic_data[0] && static_branch_likely(&supports_deactivate_key)) in gic_cpu_if_up()
486 static void gic_dist_init(struct gic_chip_data *gic) in gic_dist_init() argument
490 unsigned int gic_irqs = gic->gic_irqs; in gic_dist_init()
491 void __iomem *base = gic_data_dist_base(gic); in gic_dist_init()
498 cpumask = gic_get_cpumask(gic); in gic_dist_init()
509 static int gic_cpu_init(struct gic_chip_data *gic) in gic_cpu_init() argument
511 void __iomem *dist_base = gic_data_dist_base(gic); in gic_cpu_init()
512 void __iomem *base = gic_data_cpu_base(gic); in gic_cpu_init()
521 if (gic == &gic_data[0]) { in gic_cpu_init()
529 cpu_mask = gic_get_cpumask(gic); in gic_cpu_init()
544 gic_cpu_if_up(gic); in gic_cpu_init()
572 void gic_dist_save(struct gic_chip_data *gic) in gic_dist_save() argument
578 if (WARN_ON(!gic)) in gic_dist_save()
581 gic_irqs = gic->gic_irqs; in gic_dist_save()
582 dist_base = gic_data_dist_base(gic); in gic_dist_save()
588 gic->saved_spi_conf[i] = in gic_dist_save()
592 gic->saved_spi_target[i] = in gic_dist_save()
596 gic->saved_spi_enable[i] = in gic_dist_save()
600 gic->saved_spi_active[i] = in gic_dist_save()
611 void gic_dist_restore(struct gic_chip_data *gic) in gic_dist_restore() argument
617 if (WARN_ON(!gic)) in gic_dist_restore()
620 gic_irqs = gic->gic_irqs; in gic_dist_restore()
621 dist_base = gic_data_dist_base(gic); in gic_dist_restore()
629 writel_relaxed(gic->saved_spi_conf[i], in gic_dist_restore()
637 writel_relaxed(gic->saved_spi_target[i], in gic_dist_restore()
643 writel_relaxed(gic->saved_spi_enable[i], in gic_dist_restore()
650 writel_relaxed(gic->saved_spi_active[i], in gic_dist_restore()
657 void gic_cpu_save(struct gic_chip_data *gic) in gic_cpu_save() argument
664 if (WARN_ON(!gic)) in gic_cpu_save()
667 dist_base = gic_data_dist_base(gic); in gic_cpu_save()
668 cpu_base = gic_data_cpu_base(gic); in gic_cpu_save()
673 ptr = raw_cpu_ptr(gic->saved_ppi_enable); in gic_cpu_save()
677 ptr = raw_cpu_ptr(gic->saved_ppi_active); in gic_cpu_save()
681 ptr = raw_cpu_ptr(gic->saved_ppi_conf); in gic_cpu_save()
687 void gic_cpu_restore(struct gic_chip_data *gic) in gic_cpu_restore() argument
694 if (WARN_ON(!gic)) in gic_cpu_restore()
697 dist_base = gic_data_dist_base(gic); in gic_cpu_restore()
698 cpu_base = gic_data_cpu_base(gic); in gic_cpu_restore()
703 ptr = raw_cpu_ptr(gic->saved_ppi_enable); in gic_cpu_restore()
710 ptr = raw_cpu_ptr(gic->saved_ppi_active); in gic_cpu_restore()
717 ptr = raw_cpu_ptr(gic->saved_ppi_conf); in gic_cpu_restore()
726 gic_cpu_if_up(gic); in gic_cpu_restore()
764 static int gic_pm_init(struct gic_chip_data *gic) in gic_pm_init() argument
766 gic->saved_ppi_enable = __alloc_percpu(DIV_ROUND_UP(32, 32) * 4, in gic_pm_init()
768 if (WARN_ON(!gic->saved_ppi_enable)) in gic_pm_init()
771 gic->saved_ppi_active = __alloc_percpu(DIV_ROUND_UP(32, 32) * 4, in gic_pm_init()
773 if (WARN_ON(!gic->saved_ppi_active)) in gic_pm_init()
776 gic->saved_ppi_conf = __alloc_percpu(DIV_ROUND_UP(32, 16) * 4, in gic_pm_init()
778 if (WARN_ON(!gic->saved_ppi_conf)) in gic_pm_init()
781 if (gic == &gic_data[0]) in gic_pm_init()
787 free_percpu(gic->saved_ppi_active); in gic_pm_init()
789 free_percpu(gic->saved_ppi_enable); in gic_pm_init()
794 static int gic_pm_init(struct gic_chip_data *gic) in gic_pm_init() argument
974 struct gic_chip_data *gic = d->host_data; in gic_irq_domain_map() local
978 irq_domain_set_info(d, irq, hw, &gic->chip, d->host_data, in gic_irq_domain_map()
982 irq_domain_set_info(d, irq, hw, &gic->chip, d->host_data, in gic_irq_domain_map()
1072 static void gic_init_chip(struct gic_chip_data *gic, struct device *dev, in gic_init_chip() argument
1076 gic->chip = gic_chip; in gic_init_chip()
1077 gic->chip.name = name; in gic_init_chip()
1078 gic->chip.parent_device = dev; in gic_init_chip()
1081 gic->chip.irq_mask = gic_eoimode1_mask_irq; in gic_init_chip()
1082 gic->chip.irq_eoi = gic_eoimode1_eoi_irq; in gic_init_chip()
1083 gic->chip.irq_set_vcpu_affinity = gic_irq_set_vcpu_affinity; in gic_init_chip()
1087 if (gic == &gic_data[0]) in gic_init_chip()
1088 gic->chip.irq_set_affinity = gic_set_affinity; in gic_init_chip()
1092 static int gic_init_bases(struct gic_chip_data *gic, int irq_start, in gic_init_bases() argument
1098 if (IS_ENABLED(CONFIG_GIC_NON_BANKED) && gic->percpu_offset) { in gic_init_bases()
1102 gic->dist_base.percpu_base = alloc_percpu(void __iomem *); in gic_init_bases()
1103 gic->cpu_base.percpu_base = alloc_percpu(void __iomem *); in gic_init_bases()
1104 if (WARN_ON(!gic->dist_base.percpu_base || in gic_init_bases()
1105 !gic->cpu_base.percpu_base)) { in gic_init_bases()
1113 unsigned long offset = gic->percpu_offset * core_id; in gic_init_bases()
1114 *per_cpu_ptr(gic->dist_base.percpu_base, cpu) = in gic_init_bases()
1115 gic->raw_dist_base + offset; in gic_init_bases()
1116 *per_cpu_ptr(gic->cpu_base.percpu_base, cpu) = in gic_init_bases()
1117 gic->raw_cpu_base + offset; in gic_init_bases()
1120 gic_set_base_accessor(gic, gic_get_percpu_base); in gic_init_bases()
1123 WARN(gic->percpu_offset, in gic_init_bases()
1125 gic->percpu_offset); in gic_init_bases()
1126 gic->dist_base.common_base = gic->raw_dist_base; in gic_init_bases()
1127 gic->cpu_base.common_base = gic->raw_cpu_base; in gic_init_bases()
1128 gic_set_base_accessor(gic, gic_get_common_base); in gic_init_bases()
1135 gic_irqs = readl_relaxed(gic_data_dist_base(gic) + GIC_DIST_CTR) & 0x1f; in gic_init_bases()
1139 gic->gic_irqs = gic_irqs; in gic_init_bases()
1142 gic->domain = irq_domain_create_linear(handle, gic_irqs, in gic_init_bases()
1144 gic); in gic_init_bases()
1150 if (gic == &gic_data[0] && (irq_start & 31) > 0) { in gic_init_bases()
1168 gic->domain = irq_domain_add_legacy(NULL, gic_irqs, irq_base, in gic_init_bases()
1169 hwirq_base, &gic_irq_domain_ops, gic); in gic_init_bases()
1172 if (WARN_ON(!gic->domain)) { in gic_init_bases()
1177 gic_dist_init(gic); in gic_init_bases()
1178 ret = gic_cpu_init(gic); in gic_init_bases()
1182 ret = gic_pm_init(gic); in gic_init_bases()
1189 if (IS_ENABLED(CONFIG_GIC_NON_BANKED) && gic->percpu_offset) { in gic_init_bases()
1190 free_percpu(gic->dist_base.percpu_base); in gic_init_bases()
1191 free_percpu(gic->cpu_base.percpu_base); in gic_init_bases()
1197 static int __init __gic_init_bases(struct gic_chip_data *gic, in __gic_init_bases() argument
1204 if (WARN_ON(!gic || gic->domain)) in __gic_init_bases()
1207 if (gic == &gic_data[0]) { in __gic_init_bases()
1226 if (static_branch_likely(&supports_deactivate_key) && gic == &gic_data[0]) { in __gic_init_bases()
1228 gic_init_chip(gic, NULL, name, true); in __gic_init_bases()
1230 name = kasprintf(GFP_KERNEL, "GIC-%d", (int)(gic-&gic_data[0])); in __gic_init_bases()
1231 gic_init_chip(gic, NULL, name, false); in __gic_init_bases()
1234 ret = gic_init_bases(gic, irq_start, handle); in __gic_init_bases()
1244 struct gic_chip_data *gic; in gic_init() local
1255 gic = &gic_data[gic_nr]; in gic_init()
1256 gic->raw_dist_base = dist_base; in gic_init()
1257 gic->raw_cpu_base = cpu_base; in gic_init()
1259 __gic_init_bases(gic, irq_start, NULL); in gic_init()
1262 static void gic_teardown(struct gic_chip_data *gic) in gic_teardown() argument
1264 if (WARN_ON(!gic)) in gic_teardown()
1267 if (gic->raw_dist_base) in gic_teardown()
1268 iounmap(gic->raw_dist_base); in gic_teardown()
1269 if (gic->raw_cpu_base) in gic_teardown()
1270 iounmap(gic->raw_cpu_base); in gic_teardown()
1361 static int gic_of_setup(struct gic_chip_data *gic, struct device_node *node) in gic_of_setup() argument
1363 if (!gic || !node) in gic_of_setup()
1366 gic->raw_dist_base = of_iomap(node, 0); in gic_of_setup()
1367 if (WARN(!gic->raw_dist_base, "unable to map gic dist registers\n")) in gic_of_setup()
1370 gic->raw_cpu_base = of_iomap(node, 1); in gic_of_setup()
1371 if (WARN(!gic->raw_cpu_base, "unable to map gic cpu registers\n")) in gic_of_setup()
1374 if (of_property_read_u32(node, "cpu-offset", &gic->percpu_offset)) in gic_of_setup()
1375 gic->percpu_offset = 0; in gic_of_setup()
1380 gic_teardown(gic); in gic_of_setup()
1385 int gic_of_init_child(struct device *dev, struct gic_chip_data **gic, int irq) in gic_of_init_child() argument
1389 if (!dev || !dev->of_node || !gic || !irq) in gic_of_init_child()
1392 *gic = devm_kzalloc(dev, sizeof(**gic), GFP_KERNEL); in gic_of_init_child()
1393 if (!*gic) in gic_of_init_child()
1396 gic_init_chip(*gic, dev, dev->of_node->name, false); in gic_of_init_child()
1398 ret = gic_of_setup(*gic, dev->of_node); in gic_of_init_child()
1402 ret = gic_init_bases(*gic, -1, &dev->of_node->fwnode); in gic_of_init_child()
1404 gic_teardown(*gic); in gic_of_init_child()
1408 irq_set_chained_handler_and_data(irq, gic_handle_cascade_irq, *gic); in gic_of_init_child()
1440 struct gic_chip_data *gic; in gic_of_init() local
1449 gic = &gic_data[gic_cnt]; in gic_of_init()
1451 ret = gic_of_setup(gic, node); in gic_of_init()
1459 if (gic_cnt == 0 && !gic_check_eoimode(node, &gic->raw_cpu_base)) in gic_of_init()
1462 ret = __gic_init_bases(gic, -1, &node->fwnode); in gic_of_init()
1464 gic_teardown(gic); in gic_of_init()
1494 int gic_of_init_child(struct device *dev, struct gic_chip_data **gic, int irq) in gic_of_init_child() argument
1609 struct gic_chip_data *gic = &gic_data[0]; in gic_v2_acpi_init() local
1620 gic->raw_cpu_base = ioremap(acpi_data.cpu_phys_base, ACPI_GIC_CPU_IF_MEM_SIZE); in gic_v2_acpi_init()
1621 if (!gic->raw_cpu_base) { in gic_v2_acpi_init()
1627 gic->raw_dist_base = ioremap(dist->base_address, in gic_v2_acpi_init()
1629 if (!gic->raw_dist_base) { in gic_v2_acpi_init()
1631 gic_teardown(gic); in gic_v2_acpi_init()
1646 domain_handle = irq_domain_alloc_fwnode(gic->raw_dist_base); in gic_v2_acpi_init()
1649 gic_teardown(gic); in gic_v2_acpi_init()
1653 ret = __gic_init_bases(gic, -1, domain_handle); in gic_v2_acpi_init()
1657 gic_teardown(gic); in gic_v2_acpi_init()