mirror of
https://github.com/torvalds/linux.git
synced 2024-12-11 21:52:04 +00:00
[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? */
|
/* FIXME: what are the side-effects of this? */
|
||||||
prob->dma_querymask_RW = mask;
|
prob->dma_querymask_RW = mask;
|
||||||
prob->dma_querytype_RW = mode;
|
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:
|
out:
|
||||||
spin_unlock(&ctx->csa.register_lock);
|
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);
|
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)
|
static inline void save_mfc_csr_tsq(struct spu_state *csa, struct spu *spu)
|
||||||
{
|
{
|
||||||
struct spu_priv2 __iomem *priv2 = spu->priv2;
|
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_mfc_queues(prev, spu); /* Step 19. */
|
||||||
save_ppu_querymask(prev, spu); /* Step 20. */
|
save_ppu_querymask(prev, spu); /* Step 20. */
|
||||||
save_ppu_querytype(prev, spu); /* Step 21. */
|
save_ppu_querytype(prev, spu); /* Step 21. */
|
||||||
|
save_ppu_tagstatus(prev, spu); /* NEW. */
|
||||||
save_mfc_csr_tsq(prev, spu); /* Step 22. */
|
save_mfc_csr_tsq(prev, spu); /* Step 22. */
|
||||||
save_mfc_csr_cmd(prev, spu); /* Step 23. */
|
save_mfc_csr_cmd(prev, spu); /* Step 23. */
|
||||||
save_mfc_csr_ato(prev, spu); /* Step 24. */
|
save_mfc_csr_ato(prev, spu); /* Step 24. */
|
||||||
|
Loading…
Reference in New Issue
Block a user