diff options
Diffstat (limited to 'arch/mn10300/include/asm/smp.h')
-rw-r--r-- | arch/mn10300/include/asm/smp.h | 91 |
1 files changed, 89 insertions, 2 deletions
diff --git a/arch/mn10300/include/asm/smp.h b/arch/mn10300/include/asm/smp.h index 4eb8c61b7dab..a3930e43a958 100644 --- a/arch/mn10300/include/asm/smp.h +++ b/arch/mn10300/include/asm/smp.h | |||
@@ -3,6 +3,16 @@ | |||
3 | * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. | 3 | * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. |
4 | * Written by David Howells (dhowells@redhat.com) | 4 | * Written by David Howells (dhowells@redhat.com) |
5 | * | 5 | * |
6 | * Modified by Matsushita Electric Industrial Co., Ltd. | ||
7 | * Modifications: | ||
8 | * 13-Nov-2006 MEI Define IPI-IRQ number and add inline/macro function | ||
9 | * for SMP support. | ||
10 | * 22-Jan-2007 MEI Add the define related to SMP_BOOT_IRQ. | ||
11 | * 23-Feb-2007 MEI Add the define related to SMP icahce invalidate. | ||
12 | * 23-Jun-2008 MEI Delete INTC_IPI. | ||
13 | * 22-Jul-2008 MEI Add smp_nmi_call_function and related defines. | ||
14 | * 04-Aug-2008 MEI Delete USE_DOIRQ_CACHE_IPI. | ||
15 | * | ||
6 | * This program is free software; you can redistribute it and/or | 16 | * This program is free software; you can redistribute it and/or |
7 | * modify it under the terms of the GNU General Public Licence | 17 | * modify it under the terms of the GNU General Public Licence |
8 | * as published by the Free Software Foundation; either version | 18 | * as published by the Free Software Foundation; either version |
@@ -11,8 +21,85 @@ | |||
11 | #ifndef _ASM_SMP_H | 21 | #ifndef _ASM_SMP_H |
12 | #define _ASM_SMP_H | 22 | #define _ASM_SMP_H |
13 | 23 | ||
14 | #ifdef CONFIG_SMP | 24 | #ifndef __ASSEMBLY__ |
15 | #error SMP not yet supported for MN10300 | 25 | #include <linux/threads.h> |
26 | #include <linux/cpumask.h> | ||
16 | #endif | 27 | #endif |
17 | 28 | ||
29 | #ifdef CONFIG_SMP | ||
30 | #include <proc/smp-regs.h> | ||
31 | |||
32 | #define RESCHEDULE_IPI 63 | ||
33 | #define CALL_FUNC_SINGLE_IPI 192 | ||
34 | #define LOCAL_TIMER_IPI 193 | ||
35 | #define FLUSH_CACHE_IPI 194 | ||
36 | #define CALL_FUNCTION_NMI_IPI 195 | ||
37 | #define GDB_NMI_IPI 196 | ||
38 | |||
39 | #define SMP_BOOT_IRQ 195 | ||
40 | |||
41 | #define RESCHEDULE_GxICR_LV GxICR_LEVEL_6 | ||
42 | #define CALL_FUNCTION_GxICR_LV GxICR_LEVEL_4 | ||
43 | #define LOCAL_TIMER_GxICR_LV GxICR_LEVEL_4 | ||
44 | #define FLUSH_CACHE_GxICR_LV GxICR_LEVEL_0 | ||
45 | #define SMP_BOOT_GxICR_LV GxICR_LEVEL_0 | ||
46 | |||
47 | #define TIME_OUT_COUNT_BOOT_IPI 100 | ||
48 | #define DELAY_TIME_BOOT_IPI 75000 | ||
49 | |||
50 | |||
51 | #ifndef __ASSEMBLY__ | ||
52 | |||
53 | /** | ||
54 | * raw_smp_processor_id - Determine the raw CPU ID of the CPU running it | ||
55 | * | ||
56 | * What we really want to do is to use the CPUID hardware CPU register to get | ||
57 | * this information, but accesses to that aren't cached, and run at system bus | ||
58 | * speed, not CPU speed. A copy of this value is, however, stored in the | ||
59 | * thread_info struct, and that can be cached. | ||
60 | * | ||
61 | * An alternate way of dealing with this could be to use the EPSW.S bits to | ||
62 | * cache this information for systems with up to four CPUs. | ||
63 | */ | ||
64 | #if 0 | ||
65 | #define raw_smp_processor_id() (CPUID) | ||
66 | #else | ||
67 | #define raw_smp_processor_id() (current_thread_info()->cpu) | ||
18 | #endif | 68 | #endif |
69 | |||
70 | static inline int cpu_logical_map(int cpu) | ||
71 | { | ||
72 | return cpu; | ||
73 | } | ||
74 | |||
75 | static inline int cpu_number_map(int cpu) | ||
76 | { | ||
77 | return cpu; | ||
78 | } | ||
79 | |||
80 | |||
81 | extern cpumask_t cpu_boot_map; | ||
82 | |||
83 | extern void smp_init_cpus(void); | ||
84 | extern void smp_cache_interrupt(void); | ||
85 | extern void send_IPI_allbutself(int irq); | ||
86 | extern int smp_nmi_call_function(smp_call_func_t func, void *info, int wait); | ||
87 | |||
88 | extern void arch_send_call_function_single_ipi(int cpu); | ||
89 | extern void arch_send_call_function_ipi_mask(const struct cpumask *mask); | ||
90 | |||
91 | #ifdef CONFIG_HOTPLUG_CPU | ||
92 | extern int __cpu_disable(void); | ||
93 | extern void __cpu_die(unsigned int cpu); | ||
94 | #endif /* CONFIG_HOTPLUG_CPU */ | ||
95 | |||
96 | #endif /* __ASSEMBLY__ */ | ||
97 | #else /* CONFIG_SMP */ | ||
98 | #ifndef __ASSEMBLY__ | ||
99 | |||
100 | static inline void smp_init_cpus(void) {} | ||
101 | |||
102 | #endif /* __ASSEMBLY__ */ | ||
103 | #endif /* CONFIG_SMP */ | ||
104 | |||
105 | #endif /* _ASM_SMP_H */ | ||