Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d84050f4 authored by Luke Browning's avatar Luke Browning Committed by Jeremy Kerr
Browse files

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: default avatarLuke Browning <lukebrowning@us.ibm.com>
Signed-off-by: default avatarJeremy Kerr <jk@ozlabs.org>
parent d5639230
Loading
Loading
Loading
Loading
+13 −5
Original line number Diff line number Diff line
@@ -51,14 +51,22 @@ int spu_stopped(struct spu_context *ctx, u32 *stat)
	u64 dsisr;
	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;
	}

	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;

	dsisr = ctx->csa.class_0_dsisr;