diff options
author | Mark Nutter <mnutter@us.ibm.com> | 2005-11-15 15:53:49 -0500 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2006-01-09 14:49:16 +1100 |
commit | 5473af049d8b3556874174e61ce1986c9b5e8fa6 (patch) | |
tree | 53da74c13eb9125b85e85f9fc44981d3d1b41b49 /arch/powerpc/platforms/cell/spufs/context.c | |
parent | 67207b9664a8d603138ef1556141e6d0a102bea7 (diff) | |
download | op-kernel-dev-5473af049d8b3556874174e61ce1986c9b5e8fa6.zip op-kernel-dev-5473af049d8b3556874174e61ce1986c9b5e8fa6.tar.gz |
[PATCH] spufs: switchable spu contexts
Add some infrastructure for saving and restoring the context of an
SPE. This patch creates a new structure that can hold the whole
state of a physical SPE in memory. It also contains code that
avoids races during the context switch and the binary code that
is loaded to the SPU in order to access its registers.
The actual PPE- and SPE-side context switch code are two separate
patches.
Signed-off-by: Arnd Bergmann <arndb@de.ibm.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch/powerpc/platforms/cell/spufs/context.c')
-rw-r--r-- | arch/powerpc/platforms/cell/spufs/context.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/arch/powerpc/platforms/cell/spufs/context.c b/arch/powerpc/platforms/cell/spufs/context.c index a69b85e..41eea45 100644 --- a/arch/powerpc/platforms/cell/spufs/context.c +++ b/arch/powerpc/platforms/cell/spufs/context.c @@ -22,6 +22,7 @@ #include <linux/slab.h> #include <asm/spu.h> +#include <asm/spu_csa.h> #include "spufs.h" struct spu_context *alloc_spu_context(void) @@ -30,9 +31,25 @@ struct spu_context *alloc_spu_context(void) ctx = kmalloc(sizeof *ctx, GFP_KERNEL); if (!ctx) goto out; + /* Future enhancement: do not call spu_alloc() + * here. This step should be deferred until + * spu_run()!! + * + * More work needs to be done to read(), + * write(), mmap(), etc., so that operations + * are performed on CSA when the context is + * not currently being run. In this way we + * can support arbitrarily large number of + * entries in /spu, allow state queries, etc. + */ ctx->spu = spu_alloc(); if (!ctx->spu) goto out_free; + spu_init_csa(&ctx->csa); + if (!ctx->csa.lscsa) { + spu_free(ctx->spu); + goto out_free; + } init_rwsem(&ctx->backing_sema); spin_lock_init(&ctx->mmio_lock); kref_init(&ctx->kref); @@ -50,6 +67,7 @@ void destroy_spu_context(struct kref *kref) ctx = container_of(kref, struct spu_context, kref); if (ctx->spu) spu_free(ctx->spu); + spu_fini_csa(&ctx->csa); kfree(ctx); } |