• Benjamin Herrenschmidt's avatar
    [POWERPC] spufs: fix MFC command queue purge · 910ab66b
    Benjamin Herrenschmidt authored
    In the context save/restore code, the SPU MFC command queue purge
    code has a bug:
    
    static inline void wait_purge_complete(struct spu_state *csa, struct
    				       spu *spu)
    {
        struct spu_priv2 __iomem *priv2 = spu->priv2;
    
        /* Save, Step 28:
         *     Poll MFC_CNTL[Ps] until value '11' is
         *     read
         *      (purge complete).
         */
        POLL_WHILE_FALSE(in_be64(&priv2->mfc_control_RW)
    		     & MFC_CNTL_PURGE_DMA_COMPLETE);
    }
    
    This will exit as soon as _one_ of the 2 bits that compose
    MFC_CNTL_PURGE_DMA_COMPLETE is set, and one of them happens to be
    "purge in progress"...  which means that we'll happily continue
    restoring the MFC while it's being purged at the same time.
    Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
    Signed-off-by: default avatarArnd Bergmann <arnd.bergmann@de.ibm.com>
    Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
    910ab66b
switch.c 62.6 KB