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

Commit bf13ed6b authored by Andres Rodriguez's avatar Andres Rodriguez Committed by Alex Deucher
Browse files

drm/amdgpu: detect timeout error when deactivating hqd



Handle HQD deactivation timeouts instead of ignoring them.

Reviewed-by: default avatarEdward O'Callaghan <funfunctor@folklore1984.net>
Acked-by: default avatarChristian König <christian.koenig@amd.com>
Acked-by: default avatarFelix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: default avatarAndres Rodriguez <andresx7@gmail.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 34130fb1
Loading
Loading
Loading
Loading
+17 −3
Original line number Diff line number Diff line
@@ -4984,6 +4984,7 @@ static int gfx_v8_0_mqd_commit(struct amdgpu_ring *ring)

static int gfx_v8_0_kiq_init_queue(struct amdgpu_ring *ring)
{
	int r = 0;
	struct amdgpu_device *adev = ring->adev;
	struct vi_mqd *mqd = ring->mqd_ptr;
	int mqd_idx = AMDGPU_MAX_COMPUTE_RINGS;
@@ -5000,7 +5001,11 @@ static int gfx_v8_0_kiq_init_queue(struct amdgpu_ring *ring)
		amdgpu_ring_clear_ring(ring);
		mutex_lock(&adev->srbm_mutex);
		vi_srbm_select(adev, ring->me, ring->pipe, ring->queue, 0);
		gfx_v8_0_deactivate_hqd(adev, 1);
		r = gfx_v8_0_deactivate_hqd(adev, 1);
		if (r) {
			dev_err(adev->dev, "failed to deactivate ring %s\n", ring->name);
			goto out_unlock;
		}
		gfx_v8_0_mqd_commit(ring);
		vi_srbm_select(adev, 0, 0, 0, 0);
		mutex_unlock(&adev->srbm_mutex);
@@ -5008,7 +5013,11 @@ static int gfx_v8_0_kiq_init_queue(struct amdgpu_ring *ring)
		mutex_lock(&adev->srbm_mutex);
		vi_srbm_select(adev, ring->me, ring->pipe, ring->queue, 0);
		gfx_v8_0_mqd_init(ring);
		gfx_v8_0_deactivate_hqd(adev, 1);
		r = gfx_v8_0_deactivate_hqd(adev, 1);
		if (r) {
			dev_err(adev->dev, "failed to deactivate ring %s\n", ring->name);
			goto out_unlock;
		}
		gfx_v8_0_mqd_commit(ring);
		vi_srbm_select(adev, 0, 0, 0, 0);
		mutex_unlock(&adev->srbm_mutex);
@@ -5017,7 +5026,12 @@ static int gfx_v8_0_kiq_init_queue(struct amdgpu_ring *ring)
			memcpy(adev->gfx.mec.mqd_backup[mqd_idx], mqd, sizeof(*mqd));
	}

	return 0;
	return r;

out_unlock:
	vi_srbm_select(adev, 0, 0, 0, 0);
	mutex_unlock(&adev->srbm_mutex);
	return r;
}

static int gfx_v8_0_kcq_init_queue(struct amdgpu_ring *ring)