Move the force completion handling into each ring
reset function so that each engine can determine
whether or not it needs to force completion on the
jobs in the ring.

Reviewed-by: Christian König <christian.koe...@amd.com>
Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_job.c  |  4 +---
 drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c   | 12 ++++++++++--
 drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c   | 12 ++++++++++--
 drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c   | 12 ++++++++++--
 drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c    |  7 ++++++-
 drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c  |  7 ++++++-
 drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c   |  8 +++++++-
 drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c   |  8 +++++++-
 drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c   |  8 +++++++-
 drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c   |  8 +++++++-
 drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c |  8 +++++++-
 drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_1.c |  8 +++++++-
 drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c |  8 +++++++-
 drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c   |  7 ++++++-
 drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c   |  7 ++++++-
 drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c   |  6 +++++-
 drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c   |  6 +++++-
 drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c    |  7 ++++++-
 drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c  |  6 ++++--
 drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c  |  7 ++++++-
 drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c  |  7 ++++++-
 21 files changed, 136 insertions(+), 27 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
index b398e7d097cc8..461bd551546de 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
@@ -161,10 +161,8 @@ static enum drm_gpu_sched_stat amdgpu_job_timedout(struct 
drm_sched_job *s_job)
 
                r = amdgpu_ring_reset(ring, job);
                if (!r) {
-                       if (is_guilty) {
+                       if (is_guilty)
                                atomic_inc(&ring->adev->gpu_reset_counter);
-                               amdgpu_fence_driver_force_completion(ring);
-                       }
                        drm_sched_wqueue_start(&ring->sched);
                        dev_err(adev->dev, "Ring %s reset succeeded\n",
                                ring->sched.name);
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c 
b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
index c58e7040c732a..7a82c60d923ed 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
@@ -9576,7 +9576,11 @@ static int gfx_v10_0_reset_kgq(struct amdgpu_ring *ring,
                return r;
        }
 
-       return amdgpu_ring_test_ring(ring);
+       r = amdgpu_ring_test_ring(ring);
+       if (r)
+               return r;
+       amdgpu_fence_driver_force_completion(ring);
+       return 0;
 }
 
 static int gfx_v10_0_reset_kcq(struct amdgpu_ring *ring,
@@ -9648,7 +9652,11 @@ static int gfx_v10_0_reset_kcq(struct amdgpu_ring *ring,
        if (r)
                return r;
 
-       return amdgpu_ring_test_ring(ring);
+       r = amdgpu_ring_test_ring(ring);
+       if (r)
+               return r;
+       amdgpu_fence_driver_force_completion(ring);
+       return 0;
 }
 
 static void gfx_v10_ip_print(struct amdgpu_ip_block *ip_block, struct 
drm_printer *p)
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c 
b/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c
index 0ee7bdd509741..9ad4f6971f8bf 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c
@@ -6836,7 +6836,11 @@ static int gfx_v11_0_reset_kgq(struct amdgpu_ring *ring,
                return r;
        }
 
-       return amdgpu_ring_test_ring(ring);
+       r = amdgpu_ring_test_ring(ring);
+       if (r)
+               return r;
+       amdgpu_fence_driver_force_completion(ring);
+       return 0;
 }
 
 static int gfx_v11_0_reset_compute_pipe(struct amdgpu_ring *ring)
@@ -6997,7 +7001,11 @@ static int gfx_v11_0_reset_kcq(struct amdgpu_ring *ring,
                return r;
        }
 
-       return amdgpu_ring_test_ring(ring);
+       r = amdgpu_ring_test_ring(ring);
+       if (r)
+               return r;
+       amdgpu_fence_driver_force_completion(ring);
+       return 0;
 }
 
 static void gfx_v11_ip_print(struct amdgpu_ip_block *ip_block, struct 
drm_printer *p)
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c 
b/drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c
index a26417d53411b..3c628e3de5000 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c
@@ -5336,7 +5336,11 @@ static int gfx_v12_0_reset_kgq(struct amdgpu_ring *ring,
                return r;
        }
 
-       return amdgpu_ring_test_ring(ring);
+       r = amdgpu_ring_test_ring(ring);
+       if (r)
+               return r;
+       amdgpu_fence_driver_force_completion(ring);
+       return 0;
 }
 
 static int gfx_v12_0_reset_compute_pipe(struct amdgpu_ring *ring)
@@ -5450,7 +5454,11 @@ static int gfx_v12_0_reset_kcq(struct amdgpu_ring *ring,
                return r;
        }
 
-       return amdgpu_ring_test_ring(ring);
+       r = amdgpu_ring_test_ring(ring);
+       if (r)
+               return r;
+       amdgpu_fence_driver_force_completion(ring);
+       return 0;
 }
 
 static void gfx_v12_0_ring_begin_use(struct amdgpu_ring *ring)
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c 
b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
index 5e650cc5fcb26..e64b02bb04e26 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
@@ -7222,7 +7222,12 @@ static int gfx_v9_0_reset_kcq(struct amdgpu_ring *ring,
                DRM_ERROR("fail to remap queue\n");
                return r;
        }
-       return amdgpu_ring_test_ring(ring);
+
+       r = amdgpu_ring_test_ring(ring);
+       if (r)
+               return r;
+       amdgpu_fence_driver_force_completion(ring);
+       return 0;
 }
 
 static void gfx_v9_ip_print(struct amdgpu_ip_block *ip_block, struct 
drm_printer *p)
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c 
b/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c
index a7dadff3dca31..0c2e80f73ba49 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c
@@ -3619,7 +3619,12 @@ static int gfx_v9_4_3_reset_kcq(struct amdgpu_ring *ring,
                dev_err(adev->dev, "fail to remap queue\n");
                return r;
        }
-       return amdgpu_ring_test_ring(ring);
+
+       r = amdgpu_ring_test_ring(ring);
+       if (r)
+               return r;
+       amdgpu_fence_driver_force_completion(ring);
+       return 0;
 }
 
 enum amdgpu_gfx_cp_ras_mem_id {
diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c 
b/drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c
index 6cd3fbe00d6b9..cd7c45a77120f 100644
--- a/drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c
@@ -767,9 +767,15 @@ static int jpeg_v2_0_process_interrupt(struct 
amdgpu_device *adev,
 static int jpeg_v2_0_ring_reset(struct amdgpu_ring *ring,
                                struct amdgpu_job *job)
 {
+       int r;
+
        jpeg_v2_0_stop(ring->adev);
        jpeg_v2_0_start(ring->adev);
-       return amdgpu_ring_test_helper(ring);
+       r = amdgpu_ring_test_helper(ring);
+       if (r)
+               return r;
+       amdgpu_fence_driver_force_completion(ring);
+       return 0;
 }
 
 static const struct amd_ip_funcs jpeg_v2_0_ip_funcs = {
diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c 
b/drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c
index 8ed41868f6c32..d936f0063039c 100644
--- a/drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c
+++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c
@@ -646,9 +646,15 @@ static int jpeg_v2_5_process_interrupt(struct 
amdgpu_device *adev,
 static int jpeg_v2_5_ring_reset(struct amdgpu_ring *ring,
                                struct amdgpu_job *job)
 {
+       int r;
+
        jpeg_v2_5_stop_inst(ring->adev, ring->me);
        jpeg_v2_5_start_inst(ring->adev, ring->me);
-       return amdgpu_ring_test_helper(ring);
+       r = amdgpu_ring_test_helper(ring);
+       if (r)
+               return r;
+       amdgpu_fence_driver_force_completion(ring);
+       return 0;
 }
 
 static const struct amd_ip_funcs jpeg_v2_5_ip_funcs = {
diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c 
b/drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c
index 3512fbb543301..9e1ae935c6663 100644
--- a/drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c
@@ -558,9 +558,15 @@ static int jpeg_v3_0_process_interrupt(struct 
amdgpu_device *adev,
 static int jpeg_v3_0_ring_reset(struct amdgpu_ring *ring,
                                struct amdgpu_job *job)
 {
+       int r;
+
        jpeg_v3_0_stop(ring->adev);
        jpeg_v3_0_start(ring->adev);
-       return amdgpu_ring_test_helper(ring);
+       r = amdgpu_ring_test_helper(ring);
+       if (r)
+               return r;
+       amdgpu_fence_driver_force_completion(ring);
+       return 0;
 }
 
 static const struct amd_ip_funcs jpeg_v3_0_ip_funcs = {
diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c 
b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c
index c8efeaf0a2a69..da27eac1115ee 100644
--- a/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c
@@ -723,12 +723,18 @@ static int jpeg_v4_0_process_interrupt(struct 
amdgpu_device *adev,
 static int jpeg_v4_0_ring_reset(struct amdgpu_ring *ring,
                                struct amdgpu_job *job)
 {
+       int r;
+
        if (amdgpu_sriov_vf(ring->adev))
                return -EINVAL;
 
        jpeg_v4_0_stop(ring->adev);
        jpeg_v4_0_start(ring->adev);
-       return amdgpu_ring_test_helper(ring);
+       r = amdgpu_ring_test_helper(ring);
+       if (r)
+               return r;
+       amdgpu_fence_driver_force_completion(ring);
+       return 0;
 }
 
 static const struct amd_ip_funcs jpeg_v4_0_ip_funcs = {
diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c 
b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c
index 8b07c3651c579..f1a6fe7f7b3af 100644
--- a/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c
+++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c
@@ -1146,12 +1146,18 @@ static void jpeg_v4_0_3_core_stall_reset(struct 
amdgpu_ring *ring)
 static int jpeg_v4_0_3_ring_reset(struct amdgpu_ring *ring,
                                  struct amdgpu_job *job)
 {
+       int r;
+
        if (amdgpu_sriov_vf(ring->adev))
                return -EOPNOTSUPP;
 
        jpeg_v4_0_3_core_stall_reset(ring);
        jpeg_v4_0_3_start_jrbc(ring);
-       return amdgpu_ring_test_helper(ring);
+       r = amdgpu_ring_test_helper(ring);
+       if (r)
+               return r;
+       amdgpu_fence_driver_force_completion(ring);
+       return 0;
 }
 
 static const struct amd_ip_funcs jpeg_v4_0_3_ip_funcs = {
diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_1.c 
b/drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_1.c
index 0a21a13e19360..3d2b9d38c306a 100644
--- a/drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_1.c
+++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_1.c
@@ -837,12 +837,18 @@ static void jpeg_v5_0_1_core_stall_reset(struct 
amdgpu_ring *ring)
 static int jpeg_v5_0_1_ring_reset(struct amdgpu_ring *ring,
                                  struct amdgpu_job *job)
 {
+       int r;
+
        if (amdgpu_sriov_vf(ring->adev))
                return -EOPNOTSUPP;
 
        jpeg_v5_0_1_core_stall_reset(ring);
        jpeg_v5_0_1_init_jrbc(ring);
-       return amdgpu_ring_test_helper(ring);
+       r = amdgpu_ring_test_helper(ring);
+       if (r)
+               return r;
+       amdgpu_fence_driver_force_completion(ring);
+       return 0;
 }
 
 static const struct amd_ip_funcs jpeg_v5_0_1_ip_funcs = {
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c 
b/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
index ffd67d51b335f..73328e213c247 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
@@ -1671,6 +1671,7 @@ static int sdma_v4_4_2_reset_queue(struct amdgpu_ring 
*ring,
                                   struct amdgpu_job *job)
 {
        struct amdgpu_device *adev = ring->adev;
+       bool is_guilty = ring->funcs->is_guilty(ring);
        u32 id = GET_INST(SDMA0, ring->me);
        int r;
 
@@ -1680,8 +1681,13 @@ static int sdma_v4_4_2_reset_queue(struct amdgpu_ring 
*ring,
        amdgpu_amdkfd_suspend(adev, false);
        r = amdgpu_sdma_reset_engine(adev, id);
        amdgpu_amdkfd_resume(adev, false);
+       if (r)
+               return r;
 
-       return r;
+       if (is_guilty)
+               amdgpu_fence_driver_force_completion(ring);
+
+       return 0;
 }
 
 static int sdma_v4_4_2_stop_queue(struct amdgpu_ring *ring)
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c 
b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
index 46affee1c2da0..8d1c43ed39994 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
@@ -1543,8 +1543,13 @@ static int sdma_v5_0_reset_queue(struct amdgpu_ring 
*ring,
 {
        struct amdgpu_device *adev = ring->adev;
        u32 inst_id = ring->me;
+       int r;
 
-       return amdgpu_sdma_reset_engine(adev, inst_id);
+       r = amdgpu_sdma_reset_engine(adev, inst_id);
+       if (r)
+               return r;
+       amdgpu_fence_driver_force_completion(ring);
+       return 0;
 }
 
 static int sdma_v5_0_stop_queue(struct amdgpu_ring *ring)
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c 
b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
index 581e75b7d01a8..f700ac64fb616 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
@@ -1456,8 +1456,13 @@ static int sdma_v5_2_reset_queue(struct amdgpu_ring 
*ring,
 {
        struct amdgpu_device *adev = ring->adev;
        u32 inst_id = ring->me;
+       int r;
 
-       return amdgpu_sdma_reset_engine(adev, inst_id);
+       r = amdgpu_sdma_reset_engine(adev, inst_id);
+       if (r)
+               return r;
+       amdgpu_fence_driver_force_completion(ring);
+       return 0;
 }
 
 static int sdma_v5_2_stop_queue(struct amdgpu_ring *ring)
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c 
b/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
index d9866009edbfc..25c01acac2cd9 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
@@ -1560,7 +1560,11 @@ static int sdma_v6_0_reset_queue(struct amdgpu_ring 
*ring,
        if (r)
                return r;
 
-       return sdma_v6_0_gfx_resume_instance(adev, i, true);
+       r = sdma_v6_0_gfx_resume_instance(adev, i, true);
+       if (r)
+               return r;
+       amdgpu_fence_driver_force_completion(ring);
+       return 0;
 }
 
 static int sdma_v6_0_set_trap_irq_state(struct amdgpu_device *adev,
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c 
b/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
index c546e73642296..97ea5392ab85d 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
@@ -825,7 +825,11 @@ static int sdma_v7_0_reset_queue(struct amdgpu_ring *ring,
        if (r)
                return r;
 
-       return sdma_v7_0_gfx_resume_instance(adev, i, true);
+       r = sdma_v7_0_gfx_resume_instance(adev, i, true);
+       if (r)
+               return r;
+       amdgpu_fence_driver_force_completion(ring);
+       return 0;
 }
 
 /**
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c 
b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
index 47a0deceff433..f3ff3c6c155fd 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
@@ -1972,6 +1972,7 @@ static int vcn_v4_0_ring_reset(struct amdgpu_ring *ring,
 {
        struct amdgpu_device *adev = ring->adev;
        struct amdgpu_vcn_inst *vinst = &adev->vcn.inst[ring->me];
+       int r;
 
        if (!(adev->vcn.supported_reset & AMDGPU_RESET_TYPE_PER_QUEUE))
                return -EOPNOTSUPP;
@@ -1979,7 +1980,11 @@ static int vcn_v4_0_ring_reset(struct amdgpu_ring *ring,
        vcn_v4_0_stop(vinst);
        vcn_v4_0_start(vinst);
 
-       return amdgpu_ring_test_helper(ring);
+       r = amdgpu_ring_test_helper(ring);
+       if (r)
+               return r;
+       amdgpu_fence_driver_force_completion(ring);
+       return 0;
 }
 
 static struct amdgpu_ring_funcs vcn_v4_0_unified_ring_vm_funcs = {
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c 
b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
index d961a824d2098..e15057333a459 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
@@ -1622,8 +1622,10 @@ static int vcn_v4_0_3_ring_reset(struct amdgpu_ring 
*ring,
        vcn_v4_0_3_hw_init_inst(vinst);
        vcn_v4_0_3_start_dpg_mode(vinst, 
adev->vcn.inst[ring->me].indirect_sram);
        r = amdgpu_ring_test_helper(ring);
-
-       return r;
+       if (r)
+               return r;
+       amdgpu_fence_driver_force_completion(ring);
+       return 0;
 }
 
 static const struct amdgpu_ring_funcs vcn_v4_0_3_unified_ring_vm_funcs = {
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c 
b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c
index 10bd714592278..9fd3127dc8828 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c
@@ -1470,6 +1470,7 @@ static int vcn_v4_0_5_ring_reset(struct amdgpu_ring *ring,
 {
        struct amdgpu_device *adev = ring->adev;
        struct amdgpu_vcn_inst *vinst = &adev->vcn.inst[ring->me];
+       int r;
 
        if (!(adev->vcn.supported_reset & AMDGPU_RESET_TYPE_PER_QUEUE))
                return -EOPNOTSUPP;
@@ -1477,7 +1478,11 @@ static int vcn_v4_0_5_ring_reset(struct amdgpu_ring 
*ring,
        vcn_v4_0_5_stop(vinst);
        vcn_v4_0_5_start(vinst);
 
-       return amdgpu_ring_test_helper(ring);
+       r = amdgpu_ring_test_helper(ring);
+       if (r)
+               return r;
+       amdgpu_fence_driver_force_completion(ring);
+       return 0;
 }
 
 static struct amdgpu_ring_funcs vcn_v4_0_5_unified_ring_vm_funcs = {
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c 
b/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c
index 7e6a7ead9a086..c5afe2a7f9f5d 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c
@@ -1197,6 +1197,7 @@ static int vcn_v5_0_0_ring_reset(struct amdgpu_ring *ring,
 {
        struct amdgpu_device *adev = ring->adev;
        struct amdgpu_vcn_inst *vinst = &adev->vcn.inst[ring->me];
+       int r;
 
        if (!(adev->vcn.supported_reset & AMDGPU_RESET_TYPE_PER_QUEUE))
                return -EOPNOTSUPP;
@@ -1204,7 +1205,11 @@ static int vcn_v5_0_0_ring_reset(struct amdgpu_ring 
*ring,
        vcn_v5_0_0_stop(vinst);
        vcn_v5_0_0_start(vinst);
 
-       return amdgpu_ring_test_helper(ring);
+       r = amdgpu_ring_test_helper(ring);
+       if (r)
+               return r;
+       amdgpu_fence_driver_force_completion(ring);
+       return 0;
 }
 
 static const struct amdgpu_ring_funcs vcn_v5_0_0_unified_ring_vm_funcs = {
-- 
2.49.0

Reply via email to