drm/amdgpu: detect timeout error when deactivating hqd
authorAndres Rodriguez <andresx7@gmail.com>
Wed, 1 Feb 2017 05:01:46 +0000 (00:01 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 31 May 2017 20:48:47 +0000 (16:48 -0400)
Handle HQD deactivation timeouts instead of ignoring them.

Reviewed-by: Edward O'Callaghan <funfunctor@folklore1984.net>
Acked-by: Christian König <christian.koenig@amd.com>
Acked-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Andres Rodriguez <andresx7@gmail.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c

index c549d538932b364942ce2dc94356e1ae34426b76..476e20ebec0f9762503e2f12dff80eb7ab45b900 100644 (file)
@@ -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)