Skip to content

Commit 269a3f6

Browse files
mlankhorstrodrigovivi
authored andcommitted
drm/xe/display: Match i915 driver suspend/resume sequences better
Suspend fbdev sooner, and disable user access before suspending to prevent some races. I've noticed this when comparing xe suspend to i915's. Matches the following commits from i915: 24b412b ("drm/i915: Disable intel HPD poll after DRM poll init/enable") 1ef28d8 ("drm/i915: Suspend the framebuffer console earlier during system suspend") bd738d8 ("drm/i915: Prevent modesets during driver init/shutdown") Thanks to Imre for pointing me to those commits. Driver shutdown is currently missing, but I have some idea how to implement it next. Signed-off-by: Maarten Lankhorst <[email protected]> Cc: Imre Deak <[email protected]> Reviewed-by: Uma Shankar <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected] Signed-off-by: Maarten Lankhorst,,, <[email protected]> (cherry picked from commit 492be2a) Signed-off-by: Rodrigo Vivi <[email protected]>
1 parent 82122d1 commit 269a3f6

File tree

1 file changed

+14
-5
lines changed

1 file changed

+14
-5
lines changed

drivers/gpu/drm/xe/display/xe_display.c

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -315,8 +315,11 @@ void xe_display_pm_suspend(struct xe_device *xe, bool runtime)
315315
* properly.
316316
*/
317317
intel_power_domains_disable(xe);
318-
if (has_display(xe))
318+
intel_fbdev_set_suspend(&xe->drm, FBINFO_STATE_SUSPENDED, true);
319+
if (has_display(xe)) {
319320
drm_kms_helper_poll_disable(&xe->drm);
321+
intel_display_driver_disable_user_access(xe);
322+
}
320323

321324
if (!runtime)
322325
intel_display_driver_suspend(xe);
@@ -327,12 +330,13 @@ void xe_display_pm_suspend(struct xe_device *xe, bool runtime)
327330

328331
intel_hpd_cancel_work(xe);
329332

333+
if (has_display(xe))
334+
intel_display_driver_suspend_access(xe);
335+
330336
intel_encoder_suspend_all(&xe->display);
331337

332338
intel_opregion_suspend(xe, s2idle ? PCI_D1 : PCI_D3cold);
333339

334-
intel_fbdev_set_suspend(&xe->drm, FBINFO_STATE_SUSPENDED, true);
335-
336340
intel_dmc_suspend(xe);
337341
}
338342

@@ -370,14 +374,19 @@ void xe_display_pm_resume(struct xe_device *xe, bool runtime)
370374
intel_display_driver_init_hw(xe);
371375
intel_hpd_init(xe);
372376

377+
if (has_display(xe))
378+
intel_display_driver_resume_access(xe);
379+
373380
/* MST sideband requires HPD interrupts enabled */
374381
intel_dp_mst_resume(xe);
375382
if (!runtime)
376383
intel_display_driver_resume(xe);
377384

378-
intel_hpd_poll_disable(xe);
379-
if (has_display(xe))
385+
if (has_display(xe)) {
380386
drm_kms_helper_poll_enable(&xe->drm);
387+
intel_display_driver_enable_user_access(xe);
388+
}
389+
intel_hpd_poll_disable(xe);
381390

382391
intel_opregion_resume(xe);
383392

0 commit comments

Comments
 (0)