ARC: smp: Introduce smp hook @init_irq_cpu called for all cores
authorVineet Gupta <vgupta@synopsys.com>
Wed, 14 Oct 2015 09:08:02 +0000 (14:38 +0530)
committerVineet Gupta <vgupta@synopsys.com>
Wed, 28 Oct 2015 10:43:41 +0000 (16:13 +0530)
Note this is not part of platform owned static machine_desc,
but more of device owned plat_smp_ops (rather misnamed) which a IPI
provider or some such typically defines.

This will help us seperate out the IPI registration from platform
specific init_cpu_smp() into device specific init_irq_cpu()

Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
arch/arc/include/asm/smp.h
arch/arc/kernel/irq.c
arch/arc/kernel/smp.c

index 5ea4cf8cd1a8ec61a739243dc7c521c15dc93791..133c867d15af0a627576d9faf89c0569220a6f47 100644 (file)
@@ -48,6 +48,8 @@ extern int smp_ipi_irq_setup(int cpu, int irq);
  * @init_early_smp:    A SMP specific h/w block can init itself
  *                     Could be common across platforms so not covered by
  *                     mach_desc->init_early()
+ * @init_irq_cpu:      Called for each core so SMP h/w block driver can do
+ *                     any needed setup per cpu (e.g. IPI request)
  * @cpu_kick:          For Master to kickstart a cpu (optionally at a PC)
  * @ipi_send:          To send IPI to a @cpu
  * @ips_clear:         To clear IPI received at @irq
@@ -55,6 +57,7 @@ extern int smp_ipi_irq_setup(int cpu, int irq);
 struct plat_smp_ops {
        const char      *info;
        void            (*init_early_smp)(void);
+       void            (*init_irq_cpu)(int cpu);
        void            (*cpu_kick)(int cpu, unsigned long pc);
        void            (*ipi_send)(int cpu);
        void            (*ipi_clear)(int irq);
index 1dd8f2685afc66e8a6af5a02c7e0bb50738617dd..2ee226546c6a821f739a079326ed92ad52fe16b8 100644 (file)
@@ -10,6 +10,7 @@
 #include <linux/interrupt.h>
 #include <linux/irqchip.h>
 #include <asm/mach_desc.h>
+#include <asm/smp.h>
 
 /*
  * Late Interrupt system init called from start_kernel for Boot CPU only
@@ -27,7 +28,10 @@ void __init init_IRQ(void)
        irqchip_init();
 
 #ifdef CONFIG_SMP
-       /* Master CPU can initialize it's side of IPI */
+       /* a SMP H/w block could do IPI IRQ request here */
+       if (plat_smp_ops.init_irq_cpu)
+               plat_smp_ops.init_irq_cpu(smp_processor_id());
+
        if (machine_desc->init_cpu_smp)
                machine_desc->init_cpu_smp(smp_processor_id());
 #endif
index 35ee18f1de5864a51b206e04c61ebf2e9788b84a..580587805fa302d0d28f7adc89434b920b3be651 100644 (file)
@@ -131,6 +131,10 @@ void start_kernel_secondary(void)
 
        pr_info("## CPU%u LIVE ##: Executing Code...\n", cpu);
 
+       /* Some SMP H/w setup - for each cpu */
+       if (plat_smp_ops.init_irq_cpu)
+               plat_smp_ops.init_irq_cpu(cpu);
+
        if (machine_desc->init_cpu_smp)
                machine_desc->init_cpu_smp(cpu);