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

Commit 86c71da0 authored by Tarun Karra's avatar Tarun Karra
Browse files

msm: kgsl: Wait additional 50ms for CP to complete preemption



We observed CP preemption state to be busy even after preemption
interrupt is triggered by CP. If CP preemption state is busy after
preemption interrupt is triggered, instead of triggering a GPU hang
immediately give CP additional 50ms to update the state to be
preemption complete. If CP state is not updated after 50ms, trigger a
GPU hang.

Change-Id: I27a3bbd8efa9aa932dc9b185457099ca4358e83a
Signed-off-by: default avatarTarun Karra <tkarra@codeaurora.org>
parent 5f914600
Loading
Loading
Loading
Loading
+15 −3
Original line number Diff line number Diff line
@@ -3068,20 +3068,32 @@ static void a5xx_preempt_complete_state(
	uint64_t rbbase;
	unsigned int wptr;
	unsigned int val;
	static unsigned long wait_for_preemption_complete;

	del_timer_sync(&dispatcher->preempt_timer);

	adreno_readreg(adreno_dev, ADRENO_REG_CP_PREEMPT, &val);

	if (val) {
		/*
		 * Wait for 50ms for preemption state to be updated by CP
		 * before triggering hang
		 */
		if (wait_for_preemption_complete == 0)
			wait_for_preemption_complete = jiffies +
						msecs_to_jiffies(50);
		if (time_after(jiffies, wait_for_preemption_complete)) {
			wait_for_preemption_complete = 0;
			KGSL_DRV_ERR(device,
		"Invalid state after preemption CP_PREEMPT:%08x BUSY:%1x STOP:%1x\n",
			"Invalid state after preemption CP_PREEMPT:%08x STOP:%1x BUSY:%1x\n",
					 val, (val & 0x1), (val & 0x10)>>4);
			adreno_set_gpu_fault(adreno_dev, ADRENO_PREEMPT_FAULT);
		}
		adreno_dispatcher_schedule(device);
		return;
	}

	wait_for_preemption_complete = 0;
	adreno_readreg64(adreno_dev, ADRENO_REG_CP_RB_BASE,
				ADRENO_REG_CP_RB_BASE_HI, &rbbase);
	if (rbbase != adreno_dev->next_rb->buffer_desc.gpuaddr) {