On 5/29/25 22:07, Alex Deucher wrote:
> 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.
> 
> Signed-off-by: Alex Deucher <[email protected]>

Reviewed-by: Christian König <[email protected]>

> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_job.c  | 6 +-----
>  drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c   | 1 +
>  drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c   | 1 +
>  drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c   | 1 +
>  drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c   | 1 +
>  drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c | 1 +
>  drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_1.c | 1 +
>  drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c | 4 ++++
>  drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c   | 5 ++++-
>  drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c   | 5 ++++-
>  drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c   | 1 +
>  drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c   | 1 +
>  drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c    | 1 +
>  drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c  | 5 ++---
>  drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c  | 1 +
>  drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c  | 1 +
>  16 files changed, 26 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
> index 0b9086a747c0a..a0fab947143b5 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
> @@ -159,12 +159,8 @@ static enum drm_gpu_sched_stat 
> amdgpu_job_timedout(struct drm_sched_job *s_job)
>  
>               r = amdgpu_ring_reset(ring, job->vmid);
>               if (!r) {
> -                     if (is_guilty) {
> +                     if (is_guilty)
>                               atomic_inc(&ring->adev->gpu_reset_counter);
> -                             if ((ring->funcs->type != AMDGPU_RING_TYPE_GFX) 
> &&
> -                                 (ring->funcs->type != 
> AMDGPU_RING_TYPE_COMPUTE))
> -                                     
> 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/jpeg_v2_0.c 
> b/drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c
> index 4cde8a8bcc837..336ca44950dfa 100644
> --- a/drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c
> @@ -768,6 +768,7 @@ static int jpeg_v2_0_ring_reset(struct amdgpu_ring *ring, 
> unsigned int vmid)
>  {
>       jpeg_v2_0_stop(ring->adev);
>       jpeg_v2_0_start(ring->adev);
> +     amdgpu_fence_driver_force_completion(ring);
>       return amdgpu_ring_test_helper(ring);
>  }
>  
> diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c 
> b/drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c
> index 8b39e114f3be1..72d739e38a8ae 100644
> --- a/drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c
> +++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c
> @@ -647,6 +647,7 @@ static int jpeg_v2_5_ring_reset(struct amdgpu_ring *ring, 
> unsigned int vmid)
>  {
>       jpeg_v2_5_stop_inst(ring->adev, ring->me);
>       jpeg_v2_5_start_inst(ring->adev, ring->me);
> +     amdgpu_fence_driver_force_completion(ring);
>       return amdgpu_ring_test_helper(ring);
>  }
>  
> diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c 
> b/drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c
> index 2f8510c2986b9..7974d04c15e92 100644
> --- a/drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c
> @@ -559,6 +559,7 @@ static int jpeg_v3_0_ring_reset(struct amdgpu_ring *ring, 
> unsigned int vmid)
>  {
>       jpeg_v3_0_stop(ring->adev);
>       jpeg_v3_0_start(ring->adev);
> +     amdgpu_fence_driver_force_completion(ring);
>       return amdgpu_ring_test_helper(ring);
>  }
>  
> diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c 
> b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c
> index f17ec5414fd69..9301d0ff2593b 100644
> --- a/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c
> @@ -727,6 +727,7 @@ static int jpeg_v4_0_ring_reset(struct amdgpu_ring *ring, 
> unsigned int vmid)
>  
>       jpeg_v4_0_stop(ring->adev);
>       jpeg_v4_0_start(ring->adev);
> +     amdgpu_fence_driver_force_completion(ring);
>       return amdgpu_ring_test_helper(ring);
>  }
>  
> 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 79e342d5ab28d..ef5075e111300 100644
> --- a/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c
> +++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c
> @@ -1150,6 +1150,7 @@ static int jpeg_v4_0_3_ring_reset(struct amdgpu_ring 
> *ring, unsigned int vmid)
>  
>       jpeg_v4_0_3_core_stall_reset(ring);
>       jpeg_v4_0_3_start_jrbc(ring);
> +     amdgpu_fence_driver_force_completion(ring);
>       return amdgpu_ring_test_helper(ring);
>  }
>  
> 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 3b6f65a256464..858b930d1dd54 100644
> --- a/drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_1.c
> +++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_1.c
> @@ -841,6 +841,7 @@ static int jpeg_v5_0_1_ring_reset(struct amdgpu_ring 
> *ring, unsigned int vmid)
>  
>       jpeg_v5_0_1_core_stall_reset(ring);
>       jpeg_v5_0_1_init_jrbc(ring);
> +     amdgpu_fence_driver_force_completion(ring);
>       return amdgpu_ring_test_helper(ring);
>  }
>  
> 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 9c169112a5e7b..eb78bf04a490b 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
> @@ -1670,6 +1670,7 @@ static bool sdma_v4_4_2_page_ring_is_guilty(struct 
> amdgpu_ring *ring)
>  static int sdma_v4_4_2_reset_queue(struct amdgpu_ring *ring, unsigned int 
> vmid)
>  {
>       struct amdgpu_device *adev = ring->adev;
> +     bool is_guilty = ring->funcs->is_guilty(ring);
>       u32 id = GET_INST(SDMA0, ring->me);
>       int r;
>  
> @@ -1680,6 +1681,9 @@ static int sdma_v4_4_2_reset_queue(struct amdgpu_ring 
> *ring, unsigned int vmid)
>       r = amdgpu_sdma_reset_engine(adev, id);
>       amdgpu_amdkfd_resume(adev, false);
>  
> +     if (is_guilty)
> +             amdgpu_fence_driver_force_completion(ring);
> +
>       return r;
>  }
>  
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c 
> b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
> index 9505ae96fbecc..43885dc04b632 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
> @@ -1542,8 +1542,11 @@ static int sdma_v5_0_reset_queue(struct amdgpu_ring 
> *ring, unsigned int vmid)
>  {
>       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);
> +     amdgpu_fence_driver_force_completion(ring);
> +     return r;
>  }
>  
>  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 a6e612b4a8928..ee94e457ee25d 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
> @@ -1455,8 +1455,11 @@ static int sdma_v5_2_reset_queue(struct amdgpu_ring 
> *ring, unsigned int vmid)
>  {
>       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);
> +     amdgpu_fence_driver_force_completion(ring);
> +     return r;
>  }
>  
>  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 5a70ae17be04e..86ef0e30a89e8 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
> @@ -1559,6 +1559,7 @@ static int sdma_v6_0_reset_queue(struct amdgpu_ring 
> *ring, unsigned int vmid)
>       if (r)
>               return r;
>  
> +     amdgpu_fence_driver_force_completion(ring);
>       return sdma_v6_0_gfx_resume_instance(adev, i, true);
>  }
>  
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c 
> b/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
> index befe013b11a78..c9993424b3923 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
> @@ -823,6 +823,7 @@ static int sdma_v7_0_reset_queue(struct amdgpu_ring 
> *ring, unsigned int vmid)
>       if (r)
>               return r;
>  
> +     amdgpu_fence_driver_force_completion(ring);
>       return sdma_v7_0_gfx_resume_instance(adev, i, true);
>  }
>  
> diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c 
> b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
> index b5071f77f78d2..f1ccc6c7be390 100644
> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
> @@ -1977,6 +1977,7 @@ static int vcn_v4_0_ring_reset(struct amdgpu_ring 
> *ring, unsigned int vmid)
>  
>       vcn_v4_0_stop(vinst);
>       vcn_v4_0_start(vinst);
> +     amdgpu_fence_driver_force_completion(ring);
>  
>       return amdgpu_ring_test_helper(ring);
>  }
> 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 5a33140f57235..6ef5944584e56 100644
> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
> @@ -1620,9 +1620,8 @@ static int vcn_v4_0_3_ring_reset(struct amdgpu_ring 
> *ring, unsigned int vmid)
>               adev->vcn.caps |= AMDGPU_VCN_CAPS(RRMT_ENABLED);
>       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;
> +     amdgpu_fence_driver_force_completion(ring);
> +     return amdgpu_ring_test_helper(ring);
>  }
>  
>  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 16ade84facc78..1c13ceb3bed8b 100644
> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c
> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c
> @@ -1475,6 +1475,7 @@ static int vcn_v4_0_5_ring_reset(struct amdgpu_ring 
> *ring, unsigned int vmid)
>  
>       vcn_v4_0_5_stop(vinst);
>       vcn_v4_0_5_start(vinst);
> +     amdgpu_fence_driver_force_completion(ring);
>  
>       return amdgpu_ring_test_helper(ring);
>  }
> 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 f8e3f0b882da5..a998708bc0745 100644
> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c
> @@ -1202,6 +1202,7 @@ static int vcn_v5_0_0_ring_reset(struct amdgpu_ring 
> *ring, unsigned int vmid)
>  
>       vcn_v5_0_0_stop(vinst);
>       vcn_v5_0_0_start(vinst);
> +     amdgpu_fence_driver_force_completion(ring);
>  
>       return amdgpu_ring_test_helper(ring);
>  }

Reply via email to