6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rodrigo Vivi rodrigo.vivi@intel.com
[ Upstream commit f7f24b7950af4b1548ad5075ddb13eeb333bb782 ]
In case of the suspend/resume flow getting locked up we can get reports with some useful hints on where it might get locked and if that has failed.
Reviewed-by: Matthew Auld matthew.auld@intel.com Link: https://patchwork.freedesktop.org/patch/msgid/20240318180141.267458-2-rodrig... Signed-off-by: Rodrigo Vivi rodrigo.vivi@intel.com Stable-dep-of: 77b79df0268b ("drm/xe: Change pcode timeout to 50msec while polling again") Signed-off-by: Sasha Levin sashal@kernel.org --- drivers/gpu/drm/xe/xe_pm.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_pm.c b/drivers/gpu/drm/xe/xe_pm.c index 53b3b0b019acd..669b626c06c22 100644 --- a/drivers/gpu/drm/xe/xe_pm.c +++ b/drivers/gpu/drm/xe/xe_pm.c @@ -54,13 +54,15 @@ int xe_pm_suspend(struct xe_device *xe) u8 id; int err;
+ drm_dbg(&xe->drm, "Suspending device\n"); + for_each_gt(gt, xe, id) xe_gt_suspend_prepare(gt);
/* FIXME: Super racey... */ err = xe_bo_evict_all(xe); if (err) - return err; + goto err;
xe_display_pm_suspend(xe);
@@ -68,7 +70,7 @@ int xe_pm_suspend(struct xe_device *xe) err = xe_gt_suspend(gt); if (err) { xe_display_pm_resume(xe); - return err; + goto err; } }
@@ -76,7 +78,11 @@ int xe_pm_suspend(struct xe_device *xe)
xe_display_pm_suspend_late(xe);
+ drm_dbg(&xe->drm, "Device suspended\n"); return 0; +err: + drm_dbg(&xe->drm, "Device suspend failed %d\n", err); + return err; }
/** @@ -92,13 +98,15 @@ int xe_pm_resume(struct xe_device *xe) u8 id; int err;
+ drm_dbg(&xe->drm, "Resuming device\n"); + for_each_tile(tile, xe, id) xe_wa_apply_tile_workarounds(tile);
for_each_gt(gt, xe, id) { err = xe_pcode_init(gt); if (err) - return err; + goto err; }
xe_display_pm_resume_early(xe); @@ -109,7 +117,7 @@ int xe_pm_resume(struct xe_device *xe) */ err = xe_bo_restore_kernel(xe); if (err) - return err; + goto err;
xe_irq_resume(xe);
@@ -120,9 +128,13 @@ int xe_pm_resume(struct xe_device *xe)
err = xe_bo_restore_user(xe); if (err) - return err; + goto err;
+ drm_dbg(&xe->drm, "Device resumed\n"); return 0; +err: + drm_dbg(&xe->drm, "Device resume failed %d\n", err); + return err; }
static bool xe_pm_pci_d3cold_capable(struct xe_device *xe)