]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
irqchip/mips-gic: Support multi-cluster in for_each_online_cpu_gic()
authorPaul Burton <paulburton@kernel.org>
Mon, 28 Oct 2024 17:59:24 +0000 (18:59 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Wed, 30 Oct 2024 14:41:18 +0000 (15:41 +0100)
Use CM's GCR_CL_REDIRECT register to access registers in remote clusters,
so that users of gic_with_each_online_cpu() gains support for multi-cluster
without further changes.

Signed-off-by: Paul Burton <paulburton@kernel.org>
Signed-off-by: Chao-ying Fu <cfu@wavecomp.com>
Signed-off-by: Dragan Mladjenovic <dragan.mladjenovic@syrmia.com>
Signed-off-by: Aleksandar Rikalo <arikalo@gmail.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Tested-by: Serge Semin <fancer.lancer@gmail.com>
Tested-by: Gregory CLEMENT <gregory.clement@bootlin.com>
Link: https://lore.kernel.org/all/20241028175935.51250-3-arikalo@gmail.com
drivers/irqchip/irq-mips-gic.c

index 6c7a7d2f0438570be6649fad24ee7d4a5f77ba01..29bdfdce2123e207c757297b70ccd5b964759704 100644 (file)
@@ -88,6 +88,12 @@ static int __gic_with_next_online_cpu(int prev)
        return cpu;
 }
 
+static inline void gic_unlock_cluster(void)
+{
+       if (mips_cps_multicluster_cpus())
+               mips_cm_unlock_other();
+}
+
 /**
  * for_each_online_cpu_gic() - Iterate over online CPUs, access local registers
  * @cpu: An integer variable to hold the current CPU number
@@ -102,6 +108,7 @@ static int __gic_with_next_online_cpu(int prev)
        guard(raw_spinlock_irqsave)(gic_lock);          \
        for ((cpu) = __gic_with_next_online_cpu(-1);    \
             (cpu) < nr_cpu_ids;                        \
+            gic_unlock_cluster(),                      \
             (cpu) = __gic_with_next_online_cpu(cpu))
 
 static void gic_clear_pcpu_masks(unsigned int intr)