summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2026-05-12 13:11:36 -0400
committerAlex Deucher <alexander.deucher@amd.com>2026-06-17 15:51:33 -0400
commit59c66cc3605cc9246e227a942ba9fcdb90feeacb (patch)
treeb8c3207b51680bfd78e43c0b02e9c60fd41fea2d /drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c
parent659fe71521358f5bb9ac740a279ce868a32cd31f (diff)
downloadlinux-next-59c66cc3605cc9246e227a942ba9fcdb90feeacb.tar.gz
linux-next-59c66cc3605cc9246e227a942ba9fcdb90feeacb.zip
drm/amdgpu/sdma: handle pipe reset more gracefully
Save any unprocessed work in the queues using the new ring helper. Reviewed-by: Jesse Zhang <jesse.zhang@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c
index fcd81242059e..fbac732f3e01 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c
@@ -553,10 +553,11 @@ static int amdgpu_sdma_soft_reset(struct amdgpu_device *adev, u32 instance_id)
int amdgpu_sdma_reset_engine(struct amdgpu_device *adev, uint32_t instance_id,
bool caller_handles_kernel_queues)
{
- int ret = 0;
struct amdgpu_sdma_instance *sdma_instance = &adev->sdma.instance[instance_id];
struct amdgpu_ring *gfx_ring = &sdma_instance->ring;
struct amdgpu_ring *page_ring = &sdma_instance->page;
+ struct amdgpu_fence *gfx_fence, *page_fence;
+ int ret = 0;
if (amdgpu_sriov_vf(adev))
return -EOPNOTSUPP;
@@ -569,9 +570,14 @@ int amdgpu_sdma_reset_engine(struct amdgpu_device *adev, uint32_t instance_id,
* the reset is in progress.
*/
drm_sched_wqueue_stop(&gfx_ring->sched);
+ gfx_fence = amdgpu_ring_find_guilty_fence(gfx_ring);
+ amdgpu_ring_reset_helper_begin(gfx_ring, gfx_fence);
- if (adev->sdma.has_page_queue)
+ if (adev->sdma.has_page_queue) {
drm_sched_wqueue_stop(&page_ring->sched);
+ page_fence = amdgpu_ring_find_guilty_fence(page_ring);
+ amdgpu_ring_reset_helper_begin(page_ring, page_fence);
+ }
}
if (sdma_instance->funcs->stop_kernel_queue) {
@@ -600,14 +606,19 @@ exit:
* to be submitted to the queues after the reset is complete.
*/
if (!ret) {
- amdgpu_fence_driver_force_completion(gfx_ring, NULL);
+ ret = amdgpu_ring_reset_helper_end(gfx_ring, gfx_fence);
+ if (ret)
+ goto unlock;
drm_sched_wqueue_start(&gfx_ring->sched);
if (adev->sdma.has_page_queue) {
- amdgpu_fence_driver_force_completion(page_ring, NULL);
+ ret = amdgpu_ring_reset_helper_end(page_ring, page_fence);
+ if (ret)
+ goto unlock;
drm_sched_wqueue_start(&page_ring->sched);
}
}
}
+unlock:
mutex_unlock(&sdma_instance->engine_reset_mutex);
return ret;