Unverified Commit 95355766 authored by Jouni Högander's avatar Jouni Högander Committed by Rodrigo Vivi
Browse files

drm/i915/psr: Deactivate PSR only on LNL and when selective fetch enabled



Using intel_psr_exit in frontbuffer flush on older platforms seems to be
causing problems.

Sending single full frame update using intel_psr_force_update is anyways
more optimal compared to psr deactivate/activate -> move back to this
approach on PSR1, PSR HW tracking and Panel Replay full frame update and
use deactivate/activate only on LunarLake and only when selective fetch is
enabled.

Tested-by: default avatarLemen <lemen@lemen.xyz>
Tested-by: default avatarKoos Vriezen <koos.vriezen@gmail.com>
Closes: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14946


Signed-off-by: default avatarJouni Högander <jouni.hogander@intel.com>
Reviewed-by: default avatarMika Kahola <mika.kahola@intel.com>
Link: https://lore.kernel.org/r/20250922102725.2752742-1-jouni.hogander@intel.com


(cherry picked from commit 924adb0b)
Signed-off-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
parent 86af6b90
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -3402,6 +3402,7 @@ static void _psr_flush_handle(struct intel_dp *intel_dp)
	struct intel_display *display = to_intel_display(intel_dp);

	if (DISPLAY_VER(display) < 20 && intel_dp->psr.psr2_sel_fetch_enabled) {
		/* Selective fetch prior LNL */
		if (intel_dp->psr.psr2_sel_fetch_cff_enabled) {
			/* can we turn CFF off? */
			if (intel_dp->psr.busy_frontbuffer_bits == 0)
@@ -3420,12 +3421,19 @@ static void _psr_flush_handle(struct intel_dp *intel_dp)
		intel_psr_configure_full_frame_update(intel_dp);

		intel_psr_force_update(intel_dp);
	} else if (!intel_dp->psr.psr2_sel_fetch_enabled) {
		/*
		 * PSR1 on all platforms
		 * PSR2 HW tracking
		 * Panel Replay Full frame update
		 */
		intel_psr_force_update(intel_dp);
	} else {
		/* Selective update LNL onwards */
		intel_psr_exit(intel_dp);
	}

	if ((!intel_dp->psr.psr2_sel_fetch_enabled || DISPLAY_VER(display) >= 20) &&
	    !intel_dp->psr.busy_frontbuffer_bits)
	if (!intel_dp->psr.active && !intel_dp->psr.busy_frontbuffer_bits)
		queue_work(display->wq.unordered, &intel_dp->psr.work);
}