|
@@ -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);
|
|
|
|
|
|
+ stopped = SPU_STATUS_INVALID_INSTR | SPU_STATUS_SINGLE_STEP |
|
|
|
|
+ SPU_STATUS_STOPPED_BY_HALT | SPU_STATUS_STOPPED_BY_STOP;
|
|
|
|
|
|
- if (test_bit(SPU_SCHED_NOTIFY_ACTIVE, &ctx->sched_flags))
|
|
|
|
|
|
+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;
|
|
return 1;
|
|
|
|
+ }
|
|
|
|
|
|
- stopped = SPU_STATUS_INVALID_INSTR | SPU_STATUS_SINGLE_STEP |
|
|
|
|
- SPU_STATUS_STOPPED_BY_HALT | SPU_STATUS_STOPPED_BY_STOP;
|
|
|
|
- if (!(*stat & SPU_STATUS_RUNNING) && (*stat & stopped))
|
|
|
|
|
|
+ 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;
|