[POWERPC] spufs: Fix restore_decr_wrapped() to match CBE Handbook
authorJeremy Kerr <jk@ozlabs.org>
Wed, 19 Sep 2007 04:38:12 +0000 (14:38 +1000)
committerPaul Mackerras <paulus@samba.org>
Wed, 19 Sep 2007 05:12:17 +0000 (15:12 +1000)
Based on an original patch from Masato Noguchi
<Masato.Noguchi@jp.sony.com>.

We're currently not restoring the SPE decrementer as specified by the
CBE handbook. This change fixes our implementation to match, and makes
the function read more like the docs.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
arch/powerpc/platforms/cell/spufs/switch.c

index 2506619..de7e5ee 100644 (file)
@@ -1559,15 +1559,15 @@ static inline void restore_decr_wrapped(struct spu_state *csa, struct spu *spu)
         *     "wrapped" flag is set, OR in a '1' to
         *     CSA.SPU_Event_Status[Tm].
         */
-       if (csa->lscsa->decr_status.slot[0] & SPU_DECR_STATUS_WRAPPED) {
-               csa->spu_chnldata_RW[0] |= 0x20;
-       }
-       if ((csa->lscsa->decr_status.slot[0] & SPU_DECR_STATUS_WRAPPED) &&
-           (csa->spu_chnlcnt_RW[0] == 0 &&
-            ((csa->spu_chnldata_RW[2] & 0x20) == 0x0) &&
-            ((csa->spu_chnldata_RW[0] & 0x20) != 0x1))) {
+       if (!(csa->lscsa->decr_status.slot[0] & SPU_DECR_STATUS_WRAPPED))
+               return;
+
+       if ((csa->spu_chnlcnt_RW[0] == 0) &&
+           (csa->spu_chnldata_RW[1] & 0x20) &&
+           !(csa->spu_chnldata_RW[0] & 0x20))
                csa->spu_chnlcnt_RW[0] = 1;
-       }
+
+       csa->spu_chnldata_RW[0] |= 0x20;
 }
 
 static inline void restore_ch_part1(struct spu_state *csa, struct spu *spu)