[PATCH 05/10] drm/i915/psr: Ensure SFF/CFF bits are not written at their sample point

Jouni Högander jouni.hogander at intel.com
Tue Dec 10 13:45:28 UTC 2024


Bspec says this for SFF/CFF:

"Hardware samples this bit on the start of every V. Blank Guardband
region. For deterministic behavior, Software should ensure it is not
changing this bit around the sample point."

This can be achieved by using intel_vblank_evade.

Signed-off-by: Jouni Högander <jouni.hogander at intel.com>
---
 drivers/gpu/drm/i915/display/intel_psr.c | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_psr.c b/drivers/gpu/drm/i915/display/intel_psr.c
index c074de6b6c12..5eabf3102ed3 100644
--- a/drivers/gpu/drm/i915/display/intel_psr.c
+++ b/drivers/gpu/drm/i915/display/intel_psr.c
@@ -26,6 +26,7 @@
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_damage_helper.h>
 #include <drm/drm_debugfs.h>
+#include <drm/drm_vblank.h>
 
 #include "i915_drv.h"
 #include "i915_reg.h"
@@ -44,6 +45,7 @@
 #include "intel_psr.h"
 #include "intel_psr_regs.h"
 #include "intel_snps_phy.h"
+#include "intel_vblank.h"
 #include "skl_universal_plane.h"
 
 /**
@@ -3114,16 +3116,33 @@ static void intel_psr_configure_full_frame_update(struct intel_dp *intel_dp)
 {
 	struct intel_display *display = to_intel_display(intel_dp);
 	enum transcoder cpu_transcoder = intel_dp->psr.transcoder;
+	struct intel_crtc *crtc =
+		to_intel_crtc(intel_dp->attached_connector->base.state->crtc);
+	struct intel_crtc_state *crtc_state =
+		to_intel_crtc_state(crtc->base.state);
+	struct intel_vblank_evade_ctx evade;
 
 	if (!intel_dp->psr.psr2_sel_fetch_enabled)
 		return;
 
+	intel_vblank_evade_init(crtc_state, crtc_state, &evade);
+
+	drm_crtc_vblank_get(&crtc->base);
+
+	local_irq_disable();
+
+	intel_vblank_evade(&evade);
+
+	drm_crtc_vblank_put(&crtc->base);
+
 	intel_de_write(display,
 		       PSR2_MAN_TRK_CTL(display, cpu_transcoder),
 		       man_trk_ctl_enable_bit_get(display) |
 		       man_trk_ctl_partial_frame_bit_get(display) |
 		       man_trk_ctl_single_full_frame_bit_get(display) |
 		       man_trk_ctl_continuos_full_frame(display));
+
+	local_irq_enable();
 }
 
 static void _psr_invalidate_handle(struct intel_dp *intel_dp)
-- 
2.34.1



More information about the Intel-gfx-trybot mailing list