drm/amdgpu/gfx8: Fix compute ring failure after resetting
authorXiangliang.Yu <Xiangliang.Yu@amd.com>
Fri, 10 Nov 2017 06:23:38 +0000 (14:23 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 6 Dec 2017 17:47:20 +0000 (12:47 -0500)
Do ring clear before ring test, otherwise compute ring test will
fail after gpu resetting. Still can't find the root cause, just
workaround it.

Signed-off-by: Xiangliang.Yu <Xiangliang.Yu@amd.com>
Acked-by: Monk Liu <Monk.Liu@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c

index 2ddf126614da6e28c7a13242eb9fb4f276151164..96a3345e872e82f15caf9b289706b3aac7c892ff 100644 (file)
@@ -4877,9 +4877,6 @@ static int gfx_v8_0_kcq_init_queue(struct amdgpu_ring *ring)
                /* reset MQD to a clean status */
                if (adev->gfx.mec.mqd_backup[mqd_idx])
                        memcpy(mqd, adev->gfx.mec.mqd_backup[mqd_idx], sizeof(struct vi_mqd_allocation));
-               /* reset ring buffer */
-               ring->wptr = 0;
-               amdgpu_ring_clear_ring(ring);
        } else {
                amdgpu_ring_clear_ring(ring);
        }
@@ -4954,6 +4951,13 @@ static int gfx_v8_0_kiq_resume(struct amdgpu_device *adev)
        /* Test KCQs */
        for (i = 0; i < adev->gfx.num_compute_rings; i++) {
                ring = &adev->gfx.compute_ring[i];
+               if (adev->in_gpu_reset) {
+                       /* move reset ring buffer to here to workaround
+                        * compute ring test failed
+                        */
+                       ring->wptr = 0;
+                       amdgpu_ring_clear_ring(ring);
+               }
                ring->ready = true;
                r = amdgpu_ring_test_ring(ring);
                if (r)