aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc')
-rw-r--r--arch/powerpc/platforms/cell/spufs/switch.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/arch/powerpc/platforms/cell/spufs/switch.c b/arch/powerpc/platforms/cell/spufs/switch.c
index 4131784216bb..53361d0c070f 100644
--- a/arch/powerpc/platforms/cell/spufs/switch.c
+++ b/arch/powerpc/platforms/cell/spufs/switch.c
@@ -250,16 +250,21 @@ static inline void save_spu_status(struct spu_state *csa, struct spu *spu)
250 } 250 }
251} 251}
252 252
253static inline void save_mfc_decr(struct spu_state *csa, struct spu *spu) 253static inline void save_mfc_stopped_status(struct spu_state *csa,
254 struct spu *spu)
254{ 255{
255 struct spu_priv2 __iomem *priv2 = spu->priv2; 256 struct spu_priv2 __iomem *priv2 = spu->priv2;
257 const u64 mask = MFC_CNTL_DECREMENTER_RUNNING |
258 MFC_CNTL_DMA_QUEUES_EMPTY;
256 259
257 /* Save, Step 12: 260 /* Save, Step 12:
258 * Read MFC_CNTL[Ds]. Update saved copy of 261 * Read MFC_CNTL[Ds]. Update saved copy of
259 * CSA.MFC_CNTL[Ds]. 262 * CSA.MFC_CNTL[Ds].
263 *
264 * update: do the same with MFC_CNTL[Q].
260 */ 265 */
261 csa->priv2.mfc_control_RW |= 266 csa->priv2.mfc_control_RW &= ~mask;
262 in_be64(&priv2->mfc_control_RW) & MFC_CNTL_DECREMENTER_RUNNING; 267 csa->priv2.mfc_control_RW |= in_be64(&priv2->mfc_control_RW) & mask;
263} 268}
264 269
265static inline void halt_mfc_decr(struct spu_state *csa, struct spu *spu) 270static inline void halt_mfc_decr(struct spu_state *csa, struct spu *spu)
@@ -1791,7 +1796,7 @@ static int quiece_spu(struct spu_state *prev, struct spu *spu)
1791 save_spu_runcntl(prev, spu); /* Step 9. */ 1796 save_spu_runcntl(prev, spu); /* Step 9. */
1792 save_mfc_sr1(prev, spu); /* Step 10. */ 1797 save_mfc_sr1(prev, spu); /* Step 10. */
1793 save_spu_status(prev, spu); /* Step 11. */ 1798 save_spu_status(prev, spu); /* Step 11. */
1794 save_mfc_decr(prev, spu); /* Step 12. */ 1799 save_mfc_stopped_status(prev, spu); /* Step 12. */
1795 halt_mfc_decr(prev, spu); /* Step 13. */ 1800 halt_mfc_decr(prev, spu); /* Step 13. */
1796 save_timebase(prev, spu); /* Step 14. */ 1801 save_timebase(prev, spu); /* Step 14. */
1797 remove_other_spu_access(prev, spu); /* Step 15. */ 1802 remove_other_spu_access(prev, spu); /* Step 15. */