[PATCH v5 04/11] irqchip/mips-gic: Support multi-cluster in for_each_online_cpu_gic()

From: Aleksandar Rikalo
Date: Thu Jul 11 2024 - 04:28:03 EST


From: Paul Burton <paulburton@xxxxxxxxxx>

Use CM's GCR_CL_REDIRECT register to access registers in remote clusters,
so users of gic_with_each_online_cpu() gain support for multi-cluster with
no further changes.

Signed-off-by: Paul Burton <paulburton@xxxxxxxxxx>
Signed-off-by: Chao-ying Fu <cfu@xxxxxxxxxxxx>
Signed-off-by: Dragan Mladjenovic <dragan.mladjenovic@xxxxxxxxxx>
Signed-off-by: Aleksandar Rikalo <arikalo@xxxxxxxxx>
Signed-off-by: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
Tested-by: Serge Semin <fancer.lancer@xxxxxxxxx>
---
drivers/irqchip/irq-mips-gic.c | 7 +++++++
1 file changed, 7 insertions(+)

diff --git a/drivers/irqchip/irq-mips-gic.c b/drivers/irqchip/irq-mips-gic.c
index 6c7a7d2f0438..e7358d3f4e74 100644
--- a/drivers/irqchip/irq-mips-gic.c
+++ b/drivers/irqchip/irq-mips-gic.c
@@ -98,10 +98,17 @@ static int __gic_with_next_online_cpu(int prev)
* loop body using read_gic_vo_*() or write_gic_vo_*() accessor functions or
* their derivatives.
*/
+static inline void gic_unlock_cluster(void)
+{
+ if (mips_cps_multicluster_cpus())
+ mips_cm_unlock_other();
+}
+
#define for_each_online_cpu_gic(cpu, gic_lock) \
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)
--
2.25.1