powerpc/spufs: wait for stable spu status in spu_stopped()
If the spu is stopping (ie, the SPU_STATUS_RUNNING bit is still set), re-read the register to get the final stopped value. Signed-off-by: Luke Browning <lukebrowning@us.ibm.com> Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
This commit is contained in:
parent
d563923011
commit
d84050f48e
|
@ -51,14 +51,22 @@ int spu_stopped(struct spu_context *ctx, u32 *stat)
|
||||||
u64 dsisr;
|
u64 dsisr;
|
||||||
u32 stopped;
|
u32 stopped;
|
||||||
|
|
||||||
*stat = ctx->ops->status_read(ctx);
|
|
||||||
|
|
||||||
if (test_bit(SPU_SCHED_NOTIFY_ACTIVE, &ctx->sched_flags))
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
stopped = SPU_STATUS_INVALID_INSTR | SPU_STATUS_SINGLE_STEP |
|
stopped = SPU_STATUS_INVALID_INSTR | SPU_STATUS_SINGLE_STEP |
|
||||||
SPU_STATUS_STOPPED_BY_HALT | SPU_STATUS_STOPPED_BY_STOP;
|
SPU_STATUS_STOPPED_BY_HALT | SPU_STATUS_STOPPED_BY_STOP;
|
||||||
if (!(*stat & SPU_STATUS_RUNNING) && (*stat & stopped))
|
|
||||||
|
top:
|
||||||
|
*stat = ctx->ops->status_read(ctx);
|
||||||
|
if (*stat & stopped) {
|
||||||
|
/*
|
||||||
|
* If the spu hasn't finished stopping, we need to
|
||||||
|
* re-read the register to get the stopped value.
|
||||||
|
*/
|
||||||
|
if (*stat & SPU_STATUS_RUNNING)
|
||||||
|
goto top;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (test_bit(SPU_SCHED_NOTIFY_ACTIVE, &ctx->sched_flags))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
dsisr = ctx->csa.class_0_dsisr;
|
dsisr = ctx->csa.class_0_dsisr;
|
||||||
|
|
Loading…
Reference in New Issue