aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicolas Pitre <nicolas.pitre@linaro.org>2012-11-28 18:48:19 -0500
committerNicolas Pitre <nicolas.pitre@linaro.org>2013-09-23 18:47:28 -0400
commit14d2ca615a85e2dbc744c12c296affd35f119fa7 (patch)
tree45e8d8a2746d5f5447363a93b7d015f407f69e29
parenteeb446581ba23a5a36b4f5c7bfa2b1f8f7c9fb66 (diff)
ARM: GIC: interface to send a SGI directly
The regular gic_raise_softirq() takes as input a CPU mask which is not adequate when we need to send an IPI to a CPU which is not represented in the kernel to GIC mapping. That is the case with the b.L switcher when GIC migration to the inbound CPU has not yet occurred. Signed-off-by: Nicolas Pitre <nico@linaro.org>
-rw-r--r--drivers/irqchip/irq-gic.c14
-rw-r--r--include/linux/irqchip/arm-gic.h1
2 files changed, 15 insertions, 0 deletions
diff --git a/drivers/irqchip/irq-gic.c b/drivers/irqchip/irq-gic.c
index 09fdf3d574cd..9031171c141b 100644
--- a/drivers/irqchip/irq-gic.c
+++ b/drivers/irqchip/irq-gic.c
@@ -674,6 +674,20 @@ void gic_raise_softirq(const struct cpumask *mask, unsigned int irq)
674 674
675#ifdef CONFIG_BL_SWITCHER 675#ifdef CONFIG_BL_SWITCHER
676/* 676/*
677 * gic_send_sgi - send a SGI directly to given CPU interface number
678 *
679 * cpu_id: the ID for the destination CPU interface
680 * irq: the IPI number to send a SGI for
681 */
682void gic_send_sgi(unsigned int cpu_id, unsigned int irq)
683{
684 BUG_ON(cpu_id >= NR_GIC_CPU_IF);
685 cpu_id = 1 << cpu_id;
686 /* this always happens on GIC0 */
687 writel_relaxed((cpu_id << 16) | irq, gic_data_dist_base(&gic_data[0]) + GIC_DIST_SOFTINT);
688}
689
690/*
677 * gic_get_cpu_id - get the CPU interface ID for the specified CPU 691 * gic_get_cpu_id - get the CPU interface ID for the specified CPU
678 * 692 *
679 * @cpu: the logical CPU number to get the GIC ID for. 693 * @cpu: the logical CPU number to get the GIC ID for.
diff --git a/include/linux/irqchip/arm-gic.h b/include/linux/irqchip/arm-gic.h
index dc30835099e3..cac496b1e279 100644
--- a/include/linux/irqchip/arm-gic.h
+++ b/include/linux/irqchip/arm-gic.h
@@ -76,6 +76,7 @@ static inline void gic_init(unsigned int nr, int start,
76 gic_init_bases(nr, start, dist, cpu, 0, NULL); 76 gic_init_bases(nr, start, dist, cpu, 0, NULL);
77} 77}
78 78
79void gic_send_sgi(unsigned int cpu_id, unsigned int irq);
79int gic_get_cpu_id(unsigned int cpu); 80int gic_get_cpu_id(unsigned int cpu);
80void gic_migrate_target(unsigned int new_cpu_id); 81void gic_migrate_target(unsigned int new_cpu_id);
81unsigned long gic_get_sgir_physaddr(void); 82unsigned long gic_get_sgir_physaddr(void);