forked from Minki/linux
[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 <asayama@sm.sony.co.jp> Signed-off-by: Jeremy Kerr <jk@ozlabs.org> Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
parent
933b0e3524
commit
8d038e0433
@ -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);
|
||||
|
||||
|
@ -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. */
|
||||
|
Loading…
Reference in New Issue
Block a user