Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=8d038e0433e3164e460c2daeca1ec6947a08f81a
Commit:     8d038e0433e3164e460c2daeca1ec6947a08f81a
Parent:     933b0e35247ef0dbd1a078a0ba3705ddbbda129f
Author:     Kazunori Asayama <[EMAIL PROTECTED]>
AuthorDate: Fri Jun 29 10:58:09 2007 +1000
Committer:  Paul Mackerras <[EMAIL PROTECTED]>
CommitDate: Tue Jul 3 15:24:47 2007 +1000

    [POWERPC] spufs: Save dma_tagstatus_R in CSA
    
    The function backing_ops->read_mfc_tagstatus() doesn't return a
    correct value because the dma_tagstatus_R register isn't saved in
    CSA.  This fixes the problem.
    
    Signed-off-by: Kazunori Asayama <[EMAIL PROTECTED]>
    Signed-off-by: Jeremy Kerr <[EMAIL PROTECTED]>
    Signed-off-by: Paul Mackerras <[EMAIL PROTECTED]>
---
 arch/powerpc/platforms/cell/spufs/backing_ops.c |    6 ++++++
 arch/powerpc/platforms/cell/spufs/switch.c      |   14 ++++++++++++++
 2 files changed, 20 insertions(+), 0 deletions(-)

diff --git a/arch/powerpc/platforms/cell/spufs/backing_ops.c 
b/arch/powerpc/platforms/cell/spufs/backing_ops.c
index d32db9f..07a0e81 100644
--- a/arch/powerpc/platforms/cell/spufs/backing_ops.c
+++ b/arch/powerpc/platforms/cell/spufs/backing_ops.c
@@ -320,6 +320,12 @@ static int spu_backing_set_mfc_query(struct spu_context * 
ctx, u32 mask,
        /* FIXME: what are the side-effects of this? */
        prob->dma_querymask_RW = mask;
        prob->dma_querytype_RW = mode;
+       /* In the current implementation, the SPU context is always
+        * acquired in runnable state when new bits are added to the
+        * mask (tagwait), so it's sufficient just to mask
+        * dma_tagstatus_R with the 'mask' parameter here.
+        */
+       ctx->csa.prob.dma_tagstatus_R &= mask;
 out:
        spin_unlock(&ctx->csa.register_lock);
 
diff --git a/arch/powerpc/platforms/cell/spufs/switch.c 
b/arch/powerpc/platforms/cell/spufs/switch.c
index 8814858..9c506ba 100644
--- a/arch/powerpc/platforms/cell/spufs/switch.c
+++ b/arch/powerpc/platforms/cell/spufs/switch.c
@@ -387,6 +387,19 @@ static inline void save_ppu_querytype(struct spu_state 
*csa, struct spu *spu)
        csa->prob.dma_querytype_RW = in_be32(&prob->dma_querytype_RW);
 }
 
+static inline void save_ppu_tagstatus(struct spu_state *csa, struct spu *spu)
+{
+       struct spu_problem __iomem *prob = spu->problem;
+
+       /* Save the Prxy_TagStatus register in the CSA.
+        *
+        * It is unnecessary to restore dma_tagstatus_R, however,
+        * dma_tagstatus_R in the CSA is accessed via backing_ops, so
+        * we must save it.
+        */
+       csa->prob.dma_tagstatus_R = in_be32(&prob->dma_tagstatus_R);
+}
+
 static inline void save_mfc_csr_tsq(struct spu_state *csa, struct spu *spu)
 {
        struct spu_priv2 __iomem *priv2 = spu->priv2;
@@ -1812,6 +1825,7 @@ static void save_csa(struct spu_state *prev, struct spu 
*spu)
        save_mfc_queues(prev, spu);     /* Step 19. */
        save_ppu_querymask(prev, spu);  /* Step 20. */
        save_ppu_querytype(prev, spu);  /* Step 21. */
+       save_ppu_tagstatus(prev, spu);  /* NEW.     */
        save_mfc_csr_tsq(prev, spu);    /* Step 22. */
        save_mfc_csr_cmd(prev, spu);    /* Step 23. */
        save_mfc_csr_ato(prev, spu);    /* Step 24. */
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to