Run GPU post-reset callbacks, including KFD and display-audio resume, before restarting DRM scheduler workqueues. IP hardware initialization already happens inside ASIC recovery; this change orders the remaining callbacks before new scheduler submissions. Preserve the emergency-stop and guity job completition path's callbacks without starting schedulers,
Signed-off-by: Prike Liang <[email protected]> --- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index fa67de6d066c..83d98c9191b0 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -5783,8 +5783,10 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev, amdgpu_device_halt_activities(adev, job, reset_context, &device_list, hive, need_emergency_restart); - if (need_emergency_restart) - goto skip_sched_resume; + if (need_emergency_restart) { + amdgpu_device_gpu_resume(adev, &device_list, need_emergency_restart); + goto reset_unlock; + } /* * Must check guilty signal here since after this point all old * HW fences are force signaled. @@ -5794,18 +5796,17 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev, if (job && (dma_fence_get_status(&job->hw_fence->base) > 0)) { job_signaled = true; dev_info(adev->dev, "Guilty job already signaled, skipping HW reset"); - goto skip_hw_reset; + goto post_resume; } r = amdgpu_device_asic_reset(adev, &device_list, reset_context); if (r) goto reset_unlock; -skip_hw_reset: +post_resume: + amdgpu_device_gpu_resume(adev, &device_list, need_emergency_restart); r = amdgpu_device_sched_resume(&device_list, reset_context, job_signaled); if (r) goto reset_unlock; -skip_sched_resume: - amdgpu_device_gpu_resume(adev, &device_list, need_emergency_restart); reset_unlock: amdgpu_device_recovery_put_reset_lock(adev, &device_list); amdgpu_ras_post_reset(adev, &device_list); -- 2.34.1
