aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arc
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arc')
-rw-r--r--arch/arc/plat-arcfpga/include/plat/smp.h1
-rw-r--r--arch/arc/plat-arcfpga/platform.c4
-rw-r--r--arch/arc/plat-arcfpga/smp.c41
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);
111extern void idu_irq_set_mode(uint8_t irq, uint8_t dest_mode, uint8_t trig_mode); 111extern void idu_irq_set_mode(uint8_t irq, uint8_t dest_mode, uint8_t trig_mode);
112 112
113extern void iss_model_init_smp(unsigned int cpu); 113extern void iss_model_init_smp(unsigned int cpu);
114extern void iss_model_init_early_smp(void);
114 115
115#endif /* CONFIG_SMP */ 116#endif /* CONFIG_SMP */
116 117
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)
162 setup_bvci_lat_unit(); 162 setup_bvci_lat_unit();
163 163
164 arc_fpga_serial_init(); 164 arc_fpga_serial_init();
165
166#ifdef CONFIG_SMP
167 iss_model_init_early_smp();
168#endif
165} 169}
166 170
167static struct of_dev_auxdata plat_auxdata_lookup[] __initdata = { 171static 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];
24 *------------------------------------------------------------------- 24 *-------------------------------------------------------------------
25 */ 25 */
26 26
27const char *arc_platform_smp_cpuinfo(void)
28{
29#define IS_AVAIL1(var, str) ((var) ? str : "")
30
31 struct bcr_mp mp;
32
33 READ_BCR(ARC_REG_MP_BCR, mp);
34
35 sprintf(smp_cpuinfo_buf, "Extn [700-SMP]: v%d, arch(%d) %s %s %s\n",
36 mp.ver, mp.mp_arch, IS_AVAIL1(mp.scu, "SCU"),
37 IS_AVAIL1(mp.idu, "IDU"), IS_AVAIL1(mp.sdu, "SDU"));
38
39 return smp_cpuinfo_buf;
40}
41
42/* 27/*
43 * Master kick starting another CPU 28 * Master kick starting another CPU
44 */ 29 */
45void arc_platform_smp_wakeup_cpu(int cpu, unsigned long pc) 30static void iss_model_smp_wakeup_cpu(int cpu, unsigned long pc)
46{ 31{
47 /* setup the start PC */ 32 /* setup the start PC */
48 write_aux_reg(ARC_AUX_XTL_REG_PARAM, pc); 33 write_aux_reg(ARC_AUX_XTL_REG_PARAM, pc);
@@ -103,19 +88,39 @@ void iss_model_init_smp(unsigned int cpu)
103 smp_ipi_irq_setup(cpu, IDU_INTERRUPT_0 + cpu); 88 smp_ipi_irq_setup(cpu, IDU_INTERRUPT_0 + cpu);
104} 89}
105 90
106void arc_platform_ipi_send(const struct cpumask *callmap) 91static void iss_model_ipi_send(void *arg)
107{ 92{
93 struct cpumask *callmap = arg;
108 unsigned int cpu; 94 unsigned int cpu;
109 95
110 for_each_cpu(cpu, callmap) 96 for_each_cpu(cpu, callmap)
111 idu_irq_assert(cpu); 97 idu_irq_assert(cpu);
112} 98}
113 99
114void arc_platform_ipi_clear(int cpu, int irq) 100static void iss_model_ipi_clear(int cpu, int irq)
115{ 101{
116 idu_irq_clear(IDU_INTERRUPT_0 + cpu); 102 idu_irq_clear(IDU_INTERRUPT_0 + cpu);
117} 103}
118 104
105void iss_model_init_early_smp(void)
106{
107#define IS_AVAIL1(var, str) ((var) ? str : "")
108
109 struct bcr_mp mp;
110
111 READ_BCR(ARC_REG_MP_BCR, mp);
112
113 sprintf(smp_cpuinfo_buf, "Extn [ISS-SMP]: v%d, arch(%d) %s %s %s\n",
114 mp.ver, mp.mp_arch, IS_AVAIL1(mp.scu, "SCU"),
115 IS_AVAIL1(mp.idu, "IDU"), IS_AVAIL1(mp.sdu, "SDU"));
116
117 plat_smp_ops.info = smp_cpuinfo_buf;
118
119 plat_smp_ops.cpu_kick = iss_model_smp_wakeup_cpu;
120 plat_smp_ops.ipi_send = iss_model_ipi_send;
121 plat_smp_ops.ipi_clear = iss_model_ipi_clear;
122}
123
119/* 124/*
120 *------------------------------------------------------------------- 125 *-------------------------------------------------------------------
121 * Low level Platform IPI Providers 126 * Low level Platform IPI Providers