diff options
-rw-r--r-- | arch/powerpc/platforms/cell/Kconfig | 5 | ||||
-rw-r--r-- | arch/powerpc/platforms/cell/Makefile | 1 | ||||
-rw-r--r-- | arch/powerpc/platforms/cell/spu_notify.c | 67 | ||||
-rw-r--r-- | arch/powerpc/platforms/cell/spu_syscalls.c | 14 | ||||
-rw-r--r-- | arch/powerpc/platforms/cell/spufs/context.c | 16 | ||||
-rw-r--r-- | arch/powerpc/platforms/cell/spufs/sched.c | 29 | ||||
-rw-r--r-- | arch/powerpc/platforms/cell/spufs/syscalls.c | 1 | ||||
-rw-r--r-- | include/asm-powerpc/spu.h | 4 |
8 files changed, 99 insertions, 38 deletions
diff --git a/arch/powerpc/platforms/cell/Kconfig b/arch/powerpc/platforms/cell/Kconfig index e1e2f6a43019..3a963b4a9be0 100644 --- a/arch/powerpc/platforms/cell/Kconfig +++ b/arch/powerpc/platforms/cell/Kconfig | |||
@@ -88,3 +88,8 @@ config CBE_CPUFREQ_PMI | |||
88 | but also at lower core voltage. | 88 | but also at lower core voltage. |
89 | 89 | ||
90 | endmenu | 90 | endmenu |
91 | |||
92 | config OPROFILE_CELL | ||
93 | def_bool y | ||
94 | depends on PPC_CELL_NATIVE && (OPROFILE = m || OPROFILE = y) | ||
95 | |||
diff --git a/arch/powerpc/platforms/cell/Makefile b/arch/powerpc/platforms/cell/Makefile index 61d12f183036..39d695cb9693 100644 --- a/arch/powerpc/platforms/cell/Makefile +++ b/arch/powerpc/platforms/cell/Makefile | |||
@@ -19,6 +19,7 @@ spu-manage-$(CONFIG_PPC_CELLEB) += spu_manage.o | |||
19 | spu-manage-$(CONFIG_PPC_CELL_NATIVE) += spu_manage.o | 19 | spu-manage-$(CONFIG_PPC_CELL_NATIVE) += spu_manage.o |
20 | 20 | ||
21 | obj-$(CONFIG_SPU_BASE) += spu_callbacks.o spu_base.o \ | 21 | obj-$(CONFIG_SPU_BASE) += spu_callbacks.o spu_base.o \ |
22 | spu_notify.o \ | ||
22 | spu_syscalls.o \ | 23 | spu_syscalls.o \ |
23 | $(spu-priv1-y) \ | 24 | $(spu-priv1-y) \ |
24 | $(spu-manage-y) \ | 25 | $(spu-manage-y) \ |
diff --git a/arch/powerpc/platforms/cell/spu_notify.c b/arch/powerpc/platforms/cell/spu_notify.c new file mode 100644 index 000000000000..34d156959f39 --- /dev/null +++ b/arch/powerpc/platforms/cell/spu_notify.c | |||
@@ -0,0 +1,67 @@ | |||
1 | /* | ||
2 | * Move OProfile dependencies from spufs module to the kernel so it | ||
3 | * can run on non-cell PPC. | ||
4 | * | ||
5 | * Copyright (C) IBM 2005 | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2, or (at your option) | ||
10 | * any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
20 | */ | ||
21 | |||
22 | #undef DEBUG | ||
23 | |||
24 | #include <linux/module.h> | ||
25 | #include <asm/spu.h> | ||
26 | #include "spufs/spufs.h" | ||
27 | |||
28 | static BLOCKING_NOTIFIER_HEAD(spu_switch_notifier); | ||
29 | |||
30 | void spu_switch_notify(struct spu *spu, struct spu_context *ctx) | ||
31 | { | ||
32 | blocking_notifier_call_chain(&spu_switch_notifier, | ||
33 | ctx ? ctx->object_id : 0, spu); | ||
34 | } | ||
35 | EXPORT_SYMBOL_GPL(spu_switch_notify); | ||
36 | |||
37 | int spu_switch_event_register(struct notifier_block *n) | ||
38 | { | ||
39 | int ret; | ||
40 | ret = blocking_notifier_chain_register(&spu_switch_notifier, n); | ||
41 | if (!ret) | ||
42 | notify_spus_active(); | ||
43 | return ret; | ||
44 | } | ||
45 | EXPORT_SYMBOL_GPL(spu_switch_event_register); | ||
46 | |||
47 | int spu_switch_event_unregister(struct notifier_block *n) | ||
48 | { | ||
49 | return blocking_notifier_chain_unregister(&spu_switch_notifier, n); | ||
50 | } | ||
51 | EXPORT_SYMBOL_GPL(spu_switch_event_unregister); | ||
52 | |||
53 | void spu_set_profile_private_kref(struct spu_context *ctx, | ||
54 | struct kref *prof_info_kref, | ||
55 | void (* prof_info_release) (struct kref *kref)) | ||
56 | { | ||
57 | ctx->prof_priv_kref = prof_info_kref; | ||
58 | ctx->prof_priv_release = prof_info_release; | ||
59 | } | ||
60 | EXPORT_SYMBOL_GPL(spu_set_profile_private_kref); | ||
61 | |||
62 | void *spu_get_profile_private_kref(struct spu_context *ctx) | ||
63 | { | ||
64 | return ctx->prof_priv_kref; | ||
65 | } | ||
66 | EXPORT_SYMBOL_GPL(spu_get_profile_private_kref); | ||
67 | |||
diff --git a/arch/powerpc/platforms/cell/spu_syscalls.c b/arch/powerpc/platforms/cell/spu_syscalls.c index a9438b719fe8..75530d99eda6 100644 --- a/arch/powerpc/platforms/cell/spu_syscalls.c +++ b/arch/powerpc/platforms/cell/spu_syscalls.c | |||
@@ -145,6 +145,20 @@ int elf_coredump_extra_notes_write(struct file *file, loff_t *foffset) | |||
145 | return ret; | 145 | return ret; |
146 | } | 146 | } |
147 | 147 | ||
148 | void notify_spus_active(void) | ||
149 | { | ||
150 | struct spufs_calls *calls; | ||
151 | |||
152 | calls = spufs_calls_get(); | ||
153 | if (!calls) | ||
154 | return; | ||
155 | |||
156 | calls->notify_spus_active(); | ||
157 | spufs_calls_put(calls); | ||
158 | |||
159 | return; | ||
160 | } | ||
161 | |||
148 | int register_spu_syscalls(struct spufs_calls *calls) | 162 | int register_spu_syscalls(struct spufs_calls *calls) |
149 | { | 163 | { |
150 | if (spufs_calls) | 164 | if (spufs_calls) |
diff --git a/arch/powerpc/platforms/cell/spufs/context.c b/arch/powerpc/platforms/cell/spufs/context.c index 9cb081c26e71..adf0a030d6fe 100644 --- a/arch/powerpc/platforms/cell/spufs/context.c +++ b/arch/powerpc/platforms/cell/spufs/context.c | |||
@@ -190,19 +190,3 @@ void spu_release_saved(struct spu_context *ctx) | |||
190 | spu_release(ctx); | 190 | spu_release(ctx); |
191 | } | 191 | } |
192 | 192 | ||
193 | void spu_set_profile_private_kref(struct spu_context *ctx, | ||
194 | struct kref *prof_info_kref, | ||
195 | void ( * prof_info_release) (struct kref *kref)) | ||
196 | { | ||
197 | ctx->prof_priv_kref = prof_info_kref; | ||
198 | ctx->prof_priv_release = prof_info_release; | ||
199 | } | ||
200 | EXPORT_SYMBOL_GPL(spu_set_profile_private_kref); | ||
201 | |||
202 | void *spu_get_profile_private_kref(struct spu_context *ctx) | ||
203 | { | ||
204 | return ctx->prof_priv_kref; | ||
205 | } | ||
206 | EXPORT_SYMBOL_GPL(spu_get_profile_private_kref); | ||
207 | |||
208 | |||
diff --git a/arch/powerpc/platforms/cell/spufs/sched.c b/arch/powerpc/platforms/cell/spufs/sched.c index 4d257b3f9336..6e2a45e60261 100644 --- a/arch/powerpc/platforms/cell/spufs/sched.c +++ b/arch/powerpc/platforms/cell/spufs/sched.c | |||
@@ -166,15 +166,7 @@ static int node_allowed(struct spu_context *ctx, int node) | |||
166 | return rval; | 166 | return rval; |
167 | } | 167 | } |
168 | 168 | ||
169 | static BLOCKING_NOTIFIER_HEAD(spu_switch_notifier); | 169 | void do_notify_spus_active(void) |
170 | |||
171 | void spu_switch_notify(struct spu *spu, struct spu_context *ctx) | ||
172 | { | ||
173 | blocking_notifier_call_chain(&spu_switch_notifier, | ||
174 | ctx ? ctx->object_id : 0, spu); | ||
175 | } | ||
176 | |||
177 | static void notify_spus_active(void) | ||
178 | { | 170 | { |
179 | int node; | 171 | int node; |
180 | 172 | ||
@@ -200,22 +192,15 @@ static void notify_spus_active(void) | |||
200 | mutex_unlock(&cbe_spu_info[node].list_mutex); | 192 | mutex_unlock(&cbe_spu_info[node].list_mutex); |
201 | } | 193 | } |
202 | } | 194 | } |
195 | EXPORT_SYMBOL_GPL(do_notify_spus_active); | ||
203 | 196 | ||
204 | int spu_switch_event_register(struct notifier_block * n) | 197 | #ifndef MODULE |
205 | { | 198 | void notify_spus_active(void) |
206 | int ret; | ||
207 | ret = blocking_notifier_chain_register(&spu_switch_notifier, n); | ||
208 | if (!ret) | ||
209 | notify_spus_active(); | ||
210 | return ret; | ||
211 | } | ||
212 | EXPORT_SYMBOL_GPL(spu_switch_event_register); | ||
213 | |||
214 | int spu_switch_event_unregister(struct notifier_block * n) | ||
215 | { | 199 | { |
216 | return blocking_notifier_chain_unregister(&spu_switch_notifier, n); | 200 | do_notify_spus_active(); |
217 | } | 201 | } |
218 | EXPORT_SYMBOL_GPL(spu_switch_event_unregister); | 202 | EXPORT_SYMBOL_GPL(notify_spus_active); |
203 | #endif | ||
219 | 204 | ||
220 | /** | 205 | /** |
221 | * spu_bind_context - bind spu context to physical spu | 206 | * spu_bind_context - bind spu context to physical spu |
diff --git a/arch/powerpc/platforms/cell/spufs/syscalls.c b/arch/powerpc/platforms/cell/spufs/syscalls.c index 2c34f7170190..430404413178 100644 --- a/arch/powerpc/platforms/cell/spufs/syscalls.c +++ b/arch/powerpc/platforms/cell/spufs/syscalls.c | |||
@@ -86,5 +86,6 @@ struct spufs_calls spufs_calls = { | |||
86 | .spu_run = do_spu_run, | 86 | .spu_run = do_spu_run, |
87 | .coredump_extra_notes_size = spufs_coredump_extra_notes_size, | 87 | .coredump_extra_notes_size = spufs_coredump_extra_notes_size, |
88 | .coredump_extra_notes_write = spufs_coredump_extra_notes_write, | 88 | .coredump_extra_notes_write = spufs_coredump_extra_notes_write, |
89 | .notify_spus_active = do_notify_spus_active, | ||
89 | .owner = THIS_MODULE, | 90 | .owner = THIS_MODULE, |
90 | }; | 91 | }; |
diff --git a/include/asm-powerpc/spu.h b/include/asm-powerpc/spu.h index b1accce77bb5..34b7807f068b 100644 --- a/include/asm-powerpc/spu.h +++ b/include/asm-powerpc/spu.h | |||
@@ -246,6 +246,7 @@ struct spufs_calls { | |||
246 | __u32 __user *ustatus); | 246 | __u32 __user *ustatus); |
247 | int (*coredump_extra_notes_size)(void); | 247 | int (*coredump_extra_notes_size)(void); |
248 | int (*coredump_extra_notes_write)(struct file *file, loff_t *foffset); | 248 | int (*coredump_extra_notes_write)(struct file *file, loff_t *foffset); |
249 | void (*notify_spus_active)(void); | ||
249 | struct module *owner; | 250 | struct module *owner; |
250 | }; | 251 | }; |
251 | 252 | ||
@@ -298,6 +299,9 @@ struct notifier_block; | |||
298 | int spu_switch_event_register(struct notifier_block * n); | 299 | int spu_switch_event_register(struct notifier_block * n); |
299 | int spu_switch_event_unregister(struct notifier_block * n); | 300 | int spu_switch_event_unregister(struct notifier_block * n); |
300 | 301 | ||
302 | extern void notify_spus_active(void); | ||
303 | extern void do_notify_spus_active(void); | ||
304 | |||
301 | /* | 305 | /* |
302 | * This defines the Local Store, Problem Area and Privlege Area of an SPU. | 306 | * This defines the Local Store, Problem Area and Privlege Area of an SPU. |
303 | */ | 307 | */ |