summaryrefslogtreecommitdiffstats
path: root/arch/powerpc/platforms/cell/spufs/context.c
diff options
context:
space:
mode:
authorMark Nutter <mnutter@us.ibm.com>2005-11-15 15:53:49 -0500
committerPaul Mackerras <paulus@samba.org>2006-01-09 14:49:16 +1100
commit5473af049d8b3556874174e61ce1986c9b5e8fa6 (patch)
tree53da74c13eb9125b85e85f9fc44981d3d1b41b49 /arch/powerpc/platforms/cell/spufs/context.c
parent67207b9664a8d603138ef1556141e6d0a102bea7 (diff)
downloadop-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.c18
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);
}
OpenPOWER on IntegriCloud