irqchip/gic: Allow self-SGIs for SMP on UP configurations
authorMarc Zyngier <marc.zyngier@arm.com>
Tue, 9 Aug 2016 06:50:44 +0000 (07:50 +0100)
committerMarc Zyngier <marc.zyngier@arm.com>
Wed, 17 Aug 2016 17:31:20 +0000 (18:31 +0100)
On systems where a single CPU is present, the GIC may not support
having SGIs delivered to a target list. In that case, we use the
self-SGI mechanism to allow the interrupt to be delivered locally.

Tested-by: Fabio Estevam <fabio.estevam@nxp.com>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
drivers/irqchip/irq-gic.c

index c2cab572c5111c392c076d62232da4828cfa00a1..390fac59c6bca62fbb473e1fc7b091114b5371bf 100644 (file)
@@ -769,6 +769,13 @@ static void gic_raise_softirq(const struct cpumask *mask, unsigned int irq)
        int cpu;
        unsigned long flags, map = 0;
 
+       if (unlikely(nr_cpu_ids == 1)) {
+               /* Only one CPU? let's do a self-IPI... */
+               writel_relaxed(2 << 24 | irq,
+                              gic_data_dist_base(&gic_data[0]) + GIC_DIST_SOFTINT);
+               return;
+       }
+
        raw_spin_lock_irqsave(&irq_controller_lock, flags);
 
        /* Convert our logical CPU mask into a physical one. */