Unverified Commit 269a3f60 authored by Maarten Lankhorst's avatar Maarten Lankhorst Committed by Rodrigo Vivi
Browse files

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:
24b412b1 ("drm/i915: Disable intel HPD poll after DRM poll init/enable")
1ef28d86 ("drm/i915: Suspend the framebuffer console earlier during system suspend")
bd738d85 ("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: default avatarMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Cc: Imre Deak <imre.deak@intel.com>
Reviewed-by: default avatarUma Shankar <uma.shankar@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240806105044.596842-2-maarten.lankhorst@linux.intel.com


Signed-off-by: default avatarMaarten Lankhorst,,, <maarten.lankhorst@linux.intel.com>
(cherry picked from commit 492be2a0)
Signed-off-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
parent 82122d1f
Loading
Loading
Loading
Loading
+14 −5
Original line number Diff line number Diff line
@@ -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);