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:24b412b1bf("drm/i915: Disable intel HPD poll after DRM poll init/enable")1ef28d86be("drm/i915: Suspend the framebuffer console earlier during system suspend")bd738d859e("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> (cherry picked from commit492be2a070) Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
This commit is contained in:
committed by
Rodrigo Vivi
parent
82122d1f54
commit
269a3f6084
@@ -315,8 +315,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);
|
||||
@@ -327,12 +330,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(xe, s2idle ? PCI_D1 : PCI_D3cold);
|
||||
|
||||
intel_fbdev_set_suspend(&xe->drm, FBINFO_STATE_SUSPENDED, true);
|
||||
|
||||
intel_dmc_suspend(xe);
|
||||
}
|
||||
|
||||
@@ -370,14 +374,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(xe);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user