]>
Commit | Line | Data |
---|---|---|
c78cbf49 RB |
1 | /* |
2 | * Copyright (C) 2005 MIPS Technologies, Inc. All rights reserved. | |
3 | * | |
4 | * This program is free software; you can distribute it and/or modify it | |
5 | * under the terms of the GNU General Public License (Version 2) as | |
6 | * published by the Free Software Foundation. | |
7 | * | |
8 | * This program is distributed in the hope it will be useful, but WITHOUT | |
9 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
10 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
11 | * for more details. | |
12 | * | |
13 | * You should have received a copy of the GNU General Public License along | |
14 | * with this program; if not, write to the Free Software Foundation, Inc., | |
15 | * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. | |
16 | * | |
17 | */ | |
18 | /* | |
87353d8a | 19 | * Simulator Platform-specific hooks for SMTC operation |
c78cbf49 | 20 | */ |
c78cbf49 RB |
21 | #include <linux/kernel.h> |
22 | #include <linux/sched.h> | |
23 | #include <linux/cpumask.h> | |
24 | #include <linux/interrupt.h> | |
f6e2373a RB |
25 | #include <linux/smp.h> |
26 | ||
60063497 | 27 | #include <linux/atomic.h> |
c78cbf49 RB |
28 | #include <asm/cpu.h> |
29 | #include <asm/processor.h> | |
1685f3b1 | 30 | #include <asm/smtc.h> |
c78cbf49 | 31 | #include <asm/system.h> |
c78cbf49 | 32 | #include <asm/mmu_context.h> |
c78cbf49 | 33 | #include <asm/smtc_ipi.h> |
c78cbf49 RB |
34 | |
35 | /* VPE/SMP Prototype implements platform interfaces directly */ | |
c78cbf49 RB |
36 | |
37 | /* | |
38 | * Cause the specified action to be performed on a targeted "CPU" | |
39 | */ | |
40 | ||
87353d8a | 41 | static void ssmtc_send_ipi_single(int cpu, unsigned int action) |
c78cbf49 | 42 | { |
c78cbf49 | 43 | smtc_send_ipi(cpu, LINUX_SMP_IPI, action); |
87353d8a RB |
44 | /* "CPU" may be TC of same VPE, VPE of same CPU, or different CPU */ |
45 | } | |
46 | ||
48a048fe RR |
47 | static inline void ssmtc_send_ipi_mask(const struct cpumask *mask, |
48 | unsigned int action) | |
87353d8a RB |
49 | { |
50 | unsigned int i; | |
c78cbf49 | 51 | |
48a048fe | 52 | for_each_cpu(i, mask) |
87353d8a | 53 | ssmtc_send_ipi_single(i, action); |
c78cbf49 RB |
54 | } |
55 | ||
c78cbf49 | 56 | /* |
87353d8a | 57 | * Post-config but pre-boot cleanup entry point |
c78cbf49 | 58 | */ |
87353d8a | 59 | static void __cpuinit ssmtc_init_secondary(void) |
c78cbf49 | 60 | { |
87353d8a | 61 | smtc_init_secondary(); |
c78cbf49 RB |
62 | } |
63 | ||
64 | /* | |
87353d8a | 65 | * SMP initialization finalization entry point |
c78cbf49 | 66 | */ |
87353d8a RB |
67 | static void __cpuinit ssmtc_smp_finish(void) |
68 | { | |
69 | smtc_smp_finish(); | |
70 | } | |
c78cbf49 | 71 | |
87353d8a RB |
72 | /* |
73 | * Hook for after all CPUs are online | |
74 | */ | |
75 | static void ssmtc_cpus_done(void) | |
c78cbf49 | 76 | { |
87353d8a | 77 | } |
c78cbf49 | 78 | |
87353d8a RB |
79 | /* |
80 | * Platform "CPU" startup hook | |
81 | */ | |
82 | static void __cpuinit ssmtc_boot_secondary(int cpu, struct task_struct *idle) | |
83 | { | |
84 | smtc_boot_secondary(cpu, idle); | |
c78cbf49 RB |
85 | } |
86 | ||
87353d8a | 87 | static void __init ssmtc_smp_setup(void) |
f6e2373a | 88 | { |
f6e2373a RB |
89 | if (read_c0_config3() & (1 << 2)) |
90 | mipsmt_build_cpu_map(0); | |
f6e2373a RB |
91 | } |
92 | ||
c78cbf49 RB |
93 | /* |
94 | * Platform SMP pre-initialization | |
95 | */ | |
87353d8a | 96 | static void ssmtc_prepare_cpus(unsigned int max_cpus) |
c78cbf49 | 97 | { |
c78cbf49 | 98 | /* |
a3dddd56 | 99 | * As noted above, we can assume a single CPU for now |
c78cbf49 RB |
100 | * but it may be multithreaded. |
101 | */ | |
102 | ||
f6e2373a RB |
103 | if (read_c0_config3() & (1 << 2)) { |
104 | mipsmt_prepare_cpus(); | |
c78cbf49 | 105 | } |
c78cbf49 RB |
106 | } |
107 | ||
87353d8a RB |
108 | struct plat_smp_ops ssmtc_smp_ops = { |
109 | .send_ipi_single = ssmtc_send_ipi_single, | |
110 | .send_ipi_mask = ssmtc_send_ipi_mask, | |
111 | .init_secondary = ssmtc_init_secondary, | |
112 | .smp_finish = ssmtc_smp_finish, | |
113 | .cpus_done = ssmtc_cpus_done, | |
114 | .boot_secondary = ssmtc_boot_secondary, | |
115 | .smp_setup = ssmtc_smp_setup, | |
116 | .prepare_cpus = ssmtc_prepare_cpus, | |
117 | }; |