ARC: [Review] Multi-platform image #8: platform registers SMP callbacks
authorVineet Gupta <vgupta@synopsys.com>
Fri, 18 Jan 2013 09:42:26 +0000 (15:12 +0530)
committerVineet Gupta <vgupta@synopsys.com>
Fri, 15 Feb 2013 17:46:17 +0000 (23:16 +0530)
Platforms export their SMP callbacks by populating arc_smp_ops.
The population itself needs to be done pretty early, from init_early
callback.

Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
Cc: Arnd Bergmann <arnd@arndb.de>
arch/arc/plat-arcfpga/include/plat/smp.h
arch/arc/plat-arcfpga/platform.c
arch/arc/plat-arcfpga/smp.c

index 27822ac8155ee99c90e50c483989195b30968f7a..c09eb4cfc77c193a2597072dde49e29e97baf122 100644 (file)
@@ -111,6 +111,7 @@ extern void idu_irq_set_tgtcpu(uint8_t irq, uint32_t mask);
 extern void idu_irq_set_mode(uint8_t irq, uint8_t dest_mode, uint8_t trig_mode);
 
 extern void iss_model_init_smp(unsigned int cpu);
+extern void iss_model_init_early_smp(void);
 
 #endif /* CONFIG_SMP */
 
index 4024f10a39ca3ac29841b37237ad33be8f244e24..4e20a1a5104d0196fff53f666780b48ad19919e2 100644 (file)
@@ -162,6 +162,10 @@ static void __init plat_fpga_early_init(void)
        setup_bvci_lat_unit();
 
        arc_fpga_serial_init();
+
+#ifdef CONFIG_SMP
+       iss_model_init_early_smp();
+#endif
 }
 
 static struct of_dev_auxdata plat_auxdata_lookup[] __initdata = {
index 68a53b153d03caa55e448f8608262cab32b1dcc2..91b55349a5f8a9d82a9f59de19aaf8ee68b1a706 100644 (file)
@@ -24,25 +24,10 @@ static char smp_cpuinfo_buf[128];
  *-------------------------------------------------------------------
  */
 
-const char *arc_platform_smp_cpuinfo(void)
-{
-#define IS_AVAIL1(var, str)    ((var) ? str : "")
-
-       struct bcr_mp mp;
-
-       READ_BCR(ARC_REG_MP_BCR, mp);
-
-       sprintf(smp_cpuinfo_buf, "Extn [700-SMP]: v%d, arch(%d) %s %s %s\n",
-               mp.ver, mp.mp_arch, IS_AVAIL1(mp.scu, "SCU"),
-               IS_AVAIL1(mp.idu, "IDU"), IS_AVAIL1(mp.sdu, "SDU"));
-
-       return smp_cpuinfo_buf;
-}
-
 /*
  * Master kick starting another CPU
  */
-void arc_platform_smp_wakeup_cpu(int cpu, unsigned long pc)
+static void iss_model_smp_wakeup_cpu(int cpu, unsigned long pc)
 {
        /* setup the start PC */
        write_aux_reg(ARC_AUX_XTL_REG_PARAM, pc);
@@ -103,19 +88,39 @@ void iss_model_init_smp(unsigned int cpu)
        smp_ipi_irq_setup(cpu, IDU_INTERRUPT_0 + cpu);
 }
 
-void arc_platform_ipi_send(const struct cpumask *callmap)
+static void iss_model_ipi_send(void *arg)
 {
+       struct cpumask *callmap = arg;
        unsigned int cpu;
 
        for_each_cpu(cpu, callmap)
                idu_irq_assert(cpu);
 }
 
-void arc_platform_ipi_clear(int cpu, int irq)
+static void iss_model_ipi_clear(int cpu, int irq)
 {
        idu_irq_clear(IDU_INTERRUPT_0 + cpu);
 }
 
+void iss_model_init_early_smp(void)
+{
+#define IS_AVAIL1(var, str)    ((var) ? str : "")
+
+       struct bcr_mp mp;
+
+       READ_BCR(ARC_REG_MP_BCR, mp);
+
+       sprintf(smp_cpuinfo_buf, "Extn [ISS-SMP]: v%d, arch(%d) %s %s %s\n",
+               mp.ver, mp.mp_arch, IS_AVAIL1(mp.scu, "SCU"),
+               IS_AVAIL1(mp.idu, "IDU"), IS_AVAIL1(mp.sdu, "SDU"));
+
+       plat_smp_ops.info = smp_cpuinfo_buf;
+
+       plat_smp_ops.cpu_kick = iss_model_smp_wakeup_cpu;
+       plat_smp_ops.ipi_send = iss_model_ipi_send;
+       plat_smp_ops.ipi_clear = iss_model_ipi_clear;
+}
+
 /*
  *-------------------------------------------------------------------
  * Low level Platform IPI Providers