diff options
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); | |||
111 | extern void idu_irq_set_mode(uint8_t irq, uint8_t dest_mode, uint8_t trig_mode); | 111 | extern void idu_irq_set_mode(uint8_t irq, uint8_t dest_mode, uint8_t trig_mode); |
112 | 112 | ||
113 | extern void iss_model_init_smp(unsigned int cpu); | 113 | extern void iss_model_init_smp(unsigned int cpu); |
114 | extern 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 | ||
167 | static struct of_dev_auxdata plat_auxdata_lookup[] __initdata = { | 171 | 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]; | |||
24 | *------------------------------------------------------------------- | 24 | *------------------------------------------------------------------- |
25 | */ | 25 | */ |
26 | 26 | ||
27 | const 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 | */ |
45 | void arc_platform_smp_wakeup_cpu(int cpu, unsigned long pc) | 30 | static 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 | ||
106 | void arc_platform_ipi_send(const struct cpumask *callmap) | 91 | static 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 | ||
114 | void arc_platform_ipi_clear(int cpu, int irq) | 100 | static 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 | ||
105 | void 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 |