Skip to content

Commit 2dee58c

Browse files
committed
drm/amdgpu: move force completion into ring resets
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.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent 821aacb commit 2dee58c

21 files changed

Lines changed: 152 additions & 30 deletions

drivers/gpu/drm/amd/amdgpu/amdgpu_job.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -161,10 +161,8 @@ static enum drm_gpu_sched_stat amdgpu_job_timedout(struct drm_sched_job *s_job)
161161

162162
r = amdgpu_ring_reset(ring, job->vmid, NULL);
163163
if (!r) {
164-
if (is_guilty) {
164+
if (is_guilty)
165165
atomic_inc(&ring->adev->gpu_reset_counter);
166-
amdgpu_fence_driver_force_completion(ring);
167-
}
168166
drm_sched_wqueue_start(&ring->sched);
169167
dev_err(adev->dev, "Ring %s reset succeeded\n",
170168
ring->sched.name);

drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9577,7 +9577,11 @@ static int gfx_v10_0_reset_kgq(struct amdgpu_ring *ring,
95779577
return r;
95789578
}
95799579

9580-
return amdgpu_ring_test_ring(ring);
9580+
r = amdgpu_ring_test_ring(ring);
9581+
if (r)
9582+
return r;
9583+
amdgpu_fence_driver_force_completion(ring);
9584+
return 0;
95819585
}
95829586

95839587
static int gfx_v10_0_reset_kcq(struct amdgpu_ring *ring,
@@ -9650,7 +9654,11 @@ static int gfx_v10_0_reset_kcq(struct amdgpu_ring *ring,
96509654
if (r)
96519655
return r;
96529656

9653-
return amdgpu_ring_test_ring(ring);
9657+
r = amdgpu_ring_test_ring(ring);
9658+
if (r)
9659+
return r;
9660+
amdgpu_fence_driver_force_completion(ring);
9661+
return 0;
96549662
}
96559663

96569664
static void gfx_v10_ip_print(struct amdgpu_ip_block *ip_block, struct drm_printer *p)

drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6842,7 +6842,11 @@ static int gfx_v11_0_reset_kgq(struct amdgpu_ring *ring,
68426842
return r;
68436843
}
68446844

6845-
return amdgpu_ring_test_ring(ring);
6845+
r = amdgpu_ring_test_ring(ring);
6846+
if (r)
6847+
return r;
6848+
amdgpu_fence_driver_force_completion(ring);
6849+
return 0;
68466850
}
68476851

68486852
static int gfx_v11_0_reset_compute_pipe(struct amdgpu_ring *ring)
@@ -7004,7 +7008,11 @@ static int gfx_v11_0_reset_kcq(struct amdgpu_ring *ring,
70047008
return r;
70057009
}
70067010

7007-
return amdgpu_ring_test_ring(ring);
7011+
r = amdgpu_ring_test_ring(ring);
7012+
if (r)
7013+
return r;
7014+
amdgpu_fence_driver_force_completion(ring);
7015+
return 0;
70087016
}
70097017

70107018
static void gfx_v11_ip_print(struct amdgpu_ip_block *ip_block, struct drm_printer *p)

drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5337,7 +5337,11 @@ static int gfx_v12_0_reset_kgq(struct amdgpu_ring *ring,
53375337
return r;
53385338
}
53395339

5340-
return amdgpu_ring_test_ring(ring);
5340+
r = amdgpu_ring_test_ring(ring);
5341+
if (r)
5342+
return r;
5343+
amdgpu_fence_driver_force_completion(ring);
5344+
return 0;
53415345
}
53425346

53435347
static int gfx_v12_0_reset_compute_pipe(struct amdgpu_ring *ring)
@@ -5452,7 +5456,11 @@ static int gfx_v12_0_reset_kcq(struct amdgpu_ring *ring,
54525456
return r;
54535457
}
54545458

5455-
return amdgpu_ring_test_ring(ring);
5459+
r = amdgpu_ring_test_ring(ring);
5460+
if (r)
5461+
return r;
5462+
amdgpu_fence_driver_force_completion(ring);
5463+
return 0;
54565464
}
54575465

54585466
static void gfx_v12_0_ring_begin_use(struct amdgpu_ring *ring)

drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7242,7 +7242,12 @@ static int gfx_v9_0_reset_kcq(struct amdgpu_ring *ring,
72427242
DRM_ERROR("fail to remap queue\n");
72437243
return r;
72447244
}
7245-
return amdgpu_ring_test_ring(ring);
7245+
7246+
r = amdgpu_ring_test_ring(ring);
7247+
if (r)
7248+
return r;
7249+
amdgpu_fence_driver_force_completion(ring);
7250+
return 0;
72467251
}
72477252

72487253
static void gfx_v9_ip_print(struct amdgpu_ip_block *ip_block, struct drm_printer *p)

drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3620,7 +3620,12 @@ static int gfx_v9_4_3_reset_kcq(struct amdgpu_ring *ring,
36203620
dev_err(adev->dev, "fail to remap queue\n");
36213621
return r;
36223622
}
3623-
return amdgpu_ring_test_ring(ring);
3623+
3624+
r = amdgpu_ring_test_ring(ring);
3625+
if (r)
3626+
return r;
3627+
amdgpu_fence_driver_force_completion(ring);
3628+
return 0;
36243629
}
36253630

36263631
enum amdgpu_gfx_cp_ras_mem_id {

drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -768,9 +768,15 @@ static int jpeg_v2_0_ring_reset(struct amdgpu_ring *ring,
768768
unsigned int vmid,
769769
struct amdgpu_fence *timedout_fence)
770770
{
771+
int r;
772+
771773
jpeg_v2_0_stop(ring->adev);
772774
jpeg_v2_0_start(ring->adev);
773-
return amdgpu_ring_test_helper(ring);
775+
r = amdgpu_ring_test_helper(ring);
776+
if (r)
777+
return r;
778+
amdgpu_fence_driver_force_completion(ring);
779+
return 0;
774780
}
775781

776782
static const struct amd_ip_funcs jpeg_v2_0_ip_funcs = {

drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -647,9 +647,15 @@ static int jpeg_v2_5_ring_reset(struct amdgpu_ring *ring,
647647
unsigned int vmid,
648648
struct amdgpu_fence *timedout_fence)
649649
{
650+
int r;
651+
650652
jpeg_v2_5_stop_inst(ring->adev, ring->me);
651653
jpeg_v2_5_start_inst(ring->adev, ring->me);
652-
return amdgpu_ring_test_helper(ring);
654+
r = amdgpu_ring_test_helper(ring);
655+
if (r)
656+
return r;
657+
amdgpu_fence_driver_force_completion(ring);
658+
return 0;
653659
}
654660

655661
static const struct amd_ip_funcs jpeg_v2_5_ip_funcs = {

drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -559,9 +559,15 @@ static int jpeg_v3_0_ring_reset(struct amdgpu_ring *ring,
559559
unsigned int vmid,
560560
struct amdgpu_fence *timedout_fence)
561561
{
562+
int r;
563+
562564
jpeg_v3_0_stop(ring->adev);
563565
jpeg_v3_0_start(ring->adev);
564-
return amdgpu_ring_test_helper(ring);
566+
r = amdgpu_ring_test_helper(ring);
567+
if (r)
568+
return r;
569+
amdgpu_fence_driver_force_completion(ring);
570+
return 0;
565571
}
566572

567573
static const struct amd_ip_funcs jpeg_v3_0_ip_funcs = {

drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -724,12 +724,18 @@ static int jpeg_v4_0_ring_reset(struct amdgpu_ring *ring,
724724
unsigned int vmid,
725725
struct amdgpu_fence *timedout_fence)
726726
{
727+
int r;
728+
727729
if (amdgpu_sriov_vf(ring->adev))
728730
return -EINVAL;
729731

730732
jpeg_v4_0_stop(ring->adev);
731733
jpeg_v4_0_start(ring->adev);
732-
return amdgpu_ring_test_helper(ring);
734+
r = amdgpu_ring_test_helper(ring);
735+
if (r)
736+
return r;
737+
amdgpu_fence_driver_force_completion(ring);
738+
return 0;
733739
}
734740

735741
static const struct amd_ip_funcs jpeg_v4_0_ip_funcs = {

0 commit comments

Comments
 (0)