Skip to content

Commit

Permalink
drm/xe/display: Match i915 driver suspend/resume sequences better
Browse files Browse the repository at this point in the history
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 <maarten.lankhorst@linux.intel.com>
Cc: Imre Deak <imre.deak@intel.com>
Reviewed-by: Uma Shankar <uma.shankar@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240806105044.596842-2-maarten.lankhorst@linux.intel.com
Signed-off-by: Maarten Lankhorst,,, <maarten.lankhorst@linux.intel.com>
  • Loading branch information
Maarten Lankhorst committed Aug 19, 2024
1 parent 7116c35 commit 492be2a
Showing 1 changed file with 14 additions and 5 deletions.
19 changes: 14 additions & 5 deletions drivers/gpu/drm/xe/display/xe_display.c
Original file line number Diff line number Diff line change
Expand Up @@ -299,8 +299,11 @@ void xe_display_pm_suspend(struct xe_device *xe, bool runtime)
* properly.
*/
intel_power_domains_disable(xe);
if (has_display(xe))
intel_fbdev_set_suspend(&xe->drm, FBINFO_STATE_SUSPENDED, true);
if (has_display(xe)) {
drm_kms_helper_poll_disable(&xe->drm);
intel_display_driver_disable_user_access(xe);
}

if (!runtime)
intel_display_driver_suspend(xe);
Expand All @@ -309,12 +312,13 @@ void xe_display_pm_suspend(struct xe_device *xe, bool runtime)

intel_hpd_cancel_work(xe);

if (has_display(xe))
intel_display_driver_suspend_access(xe);

intel_encoder_suspend_all(&xe->display);

intel_opregion_suspend(display, s2idle ? PCI_D1 : PCI_D3cold);

intel_fbdev_set_suspend(&xe->drm, FBINFO_STATE_SUSPENDED, true);

intel_dmc_suspend(xe);
}

Expand Down Expand Up @@ -354,14 +358,19 @@ void xe_display_pm_resume(struct xe_device *xe, bool runtime)
intel_display_driver_init_hw(xe);
intel_hpd_init(xe);

if (has_display(xe))
intel_display_driver_resume_access(xe);

/* MST sideband requires HPD interrupts enabled */
intel_dp_mst_resume(xe);
if (!runtime)
intel_display_driver_resume(xe);

intel_hpd_poll_disable(xe);
if (has_display(xe))
if (has_display(xe)) {
drm_kms_helper_poll_enable(&xe->drm);
intel_display_driver_enable_user_access(xe);
}
intel_hpd_poll_disable(xe);

intel_opregion_resume(display);

Expand Down

0 comments on commit 492be2a

Please sign in to comment.