diff options
author | Vineet Gupta <vgupta@synopsys.com> | 2013-01-18 13:42:26 +0400 |
---|---|---|
committer | Vineet Gupta <vgupta@synopsys.com> | 2013-02-15 21:46:17 +0400 |
commit | b830cde5a486d1157105fe928dfa0ddcb9f1b840 (patch) | |
tree | ead354ab7a78eafe0f189d1d26cd4bbdbf8ffe7b /arch/arc | |
parent | 10b1271875abb9d590c14fa6c8b24b0d6f768ca2 (diff) | |
download | linux-b830cde5a486d1157105fe928dfa0ddcb9f1b840.tar.xz |
ARC: [Review] Multi-platform image #8: platform registers SMP callbacks
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>
Diffstat (limited to 'arch/arc')
-rw-r--r-- | arch/arc/plat-arcfpga/include/plat/smp.h | 1 | ||||
-rw-r--r-- | arch/arc/plat-arcfpga/platform.c | 4 | ||||
-rw-r--r-- | arch/arc/plat-arcfpga/smp.c | 41 |
3 files changed, 28 insertions, 18 deletions
diff --git a/arch/arc/plat-arcfpga/include/plat/smp.h b/arch/arc/plat-arcfpga/include/plat/smp.h index 27822ac8155e..c09eb4cfc77c 100644 --- a/arch/arc/plat-arcfpga/include/plat/smp.h +++ b/arch/arc/plat-arcfpga/include/plat/smp.h @@ -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 */ diff --git a/arch/arc/plat-arcfpga/platform.c b/arch/arc/plat-arcfpga/platform.c index 4024f10a39ca..4e20a1a5104d 100644 --- a/arch/arc/plat-arcfpga/platform.c +++ b/arch/arc/plat-arcfpga/platform.c @@ -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 = { diff --git a/arch/arc/plat-arcfpga/smp.c b/arch/arc/plat-arcfpga/smp.c index 68a53b153d03..91b55349a5f8 100644 --- a/arch/arc/plat-arcfpga/smp.c +++ b/arch/arc/plat-arcfpga/smp.c @@ -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 |