diff options
Diffstat (limited to 'arch/sh/kernel/smp.c')
| -rw-r--r-- | arch/sh/kernel/smp.c | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/arch/sh/kernel/smp.c b/arch/sh/kernel/smp.c index 001778f9adaf..508dfb023628 100644 --- a/arch/sh/kernel/smp.c +++ b/arch/sh/kernel/smp.c | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | * | 3 | * |
| 4 | * SMP support for the SuperH processors. | 4 | * SMP support for the SuperH processors. |
| 5 | * | 5 | * |
| 6 | * Copyright (C) 2002 - 2007 Paul Mundt | 6 | * Copyright (C) 2002 - 2008 Paul Mundt |
| 7 | * Copyright (C) 2006 - 2007 Akio Idehara | 7 | * Copyright (C) 2006 - 2007 Akio Idehara |
| 8 | * | 8 | * |
| 9 | * This file is subject to the terms and conditions of the GNU General Public | 9 | * This file is subject to the terms and conditions of the GNU General Public |
| @@ -86,9 +86,12 @@ asmlinkage void __cpuinit start_secondary(void) | |||
| 86 | 86 | ||
| 87 | local_irq_enable(); | 87 | local_irq_enable(); |
| 88 | 88 | ||
| 89 | cpu = smp_processor_id(); | ||
| 90 | |||
| 91 | /* Enable local timers */ | ||
| 92 | local_timer_setup(cpu); | ||
| 89 | calibrate_delay(); | 93 | calibrate_delay(); |
| 90 | 94 | ||
| 91 | cpu = smp_processor_id(); | ||
| 92 | smp_store_cpu_info(cpu); | 95 | smp_store_cpu_info(cpu); |
| 93 | 96 | ||
| 94 | cpu_set(cpu, cpu_online_map); | 97 | cpu_set(cpu, cpu_online_map); |
| @@ -186,6 +189,42 @@ void arch_send_call_function_single_ipi(int cpu) | |||
| 186 | plat_send_ipi(cpu, SMP_MSG_FUNCTION_SINGLE); | 189 | plat_send_ipi(cpu, SMP_MSG_FUNCTION_SINGLE); |
| 187 | } | 190 | } |
| 188 | 191 | ||
| 192 | void smp_timer_broadcast(cpumask_t mask) | ||
| 193 | { | ||
| 194 | int cpu; | ||
| 195 | |||
| 196 | for_each_cpu_mask(cpu, mask) | ||
| 197 | plat_send_ipi(cpu, SMP_MSG_TIMER); | ||
| 198 | } | ||
| 199 | |||
| 200 | static void ipi_timer(void) | ||
| 201 | { | ||
| 202 | irq_enter(); | ||
| 203 | local_timer_interrupt(); | ||
| 204 | irq_exit(); | ||
| 205 | } | ||
| 206 | |||
| 207 | void smp_message_recv(unsigned int msg) | ||
| 208 | { | ||
| 209 | switch (msg) { | ||
| 210 | case SMP_MSG_FUNCTION: | ||
| 211 | generic_smp_call_function_interrupt(); | ||
| 212 | break; | ||
| 213 | case SMP_MSG_RESCHEDULE: | ||
| 214 | break; | ||
| 215 | case SMP_MSG_FUNCTION_SINGLE: | ||
| 216 | generic_smp_call_function_single_interrupt(); | ||
| 217 | break; | ||
| 218 | case SMP_MSG_TIMER: | ||
| 219 | ipi_timer(); | ||
| 220 | break; | ||
| 221 | default: | ||
| 222 | printk(KERN_WARNING "SMP %d: %s(): unknown IPI %d\n", | ||
| 223 | smp_processor_id(), __func__, msg); | ||
| 224 | break; | ||
| 225 | } | ||
| 226 | } | ||
| 227 | |||
| 189 | /* Not really SMP stuff ... */ | 228 | /* Not really SMP stuff ... */ |
| 190 | int setup_profiling_timer(unsigned int multiplier) | 229 | int setup_profiling_timer(unsigned int multiplier) |
| 191 | { | 230 | { |
