]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/i915/psr: Allow writing PSR2_MAN_TRK_CTL using DSB
authorJouni Högander <jouni.hogander@intel.com>
Thu, 13 Feb 2025 06:47:57 +0000 (08:47 +0200)
committerJouni Högander <jouni.hogander@intel.com>
Thu, 13 Feb 2025 14:41:22 +0000 (16:41 +0200)
Allow writing PSR2_MAN_TRK_CTL using DSB by using intel_de_write_dsb. Do
not check intel_dp->psr.lock being held when using DSB. This assertion
doesn't make sense as in case of using DSB the actual write happens later
and we are not taking intel_dp->psr.lock mutex over dsb commit.

Signed-off-by: Jouni Högander <jouni.hogander@intel.com>
Reviewed-by: Animesh Manna <animesh.manna@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20250213064804.2077127-7-jouni.hogander@intel.com
drivers/gpu/drm/i915/display/intel_display.c
drivers/gpu/drm/i915/display/intel_psr.c
drivers/gpu/drm/i915/display/intel_psr.h

index bb6e4f3b584a444af734f87911c94f6082730418..a5a0b4e60a7c0cad105104b5df0b050e8e078c3c 100644 (file)
@@ -7151,7 +7151,7 @@ static void commit_pipe_pre_planes(struct intel_atomic_state *state,
                        intel_pipe_fastset(old_crtc_state, new_crtc_state);
        }
 
-       intel_psr2_program_trans_man_trk_ctl(new_crtc_state);
+       intel_psr2_program_trans_man_trk_ctl(NULL, new_crtc_state);
 
        intel_atomic_update_watermarks(state, crtc);
 }
index b5292f68d1009e34da473988b810c5f9f5144b46..c805ff82e7002c49c8f855a868f6dcc5f68201b8 100644 (file)
@@ -2344,7 +2344,8 @@ static void intel_psr_force_update(struct intel_dp *intel_dp)
        intel_de_write(display, CURSURFLIVE(display, intel_dp->psr.pipe), 0);
 }
 
-void intel_psr2_program_trans_man_trk_ctl(const struct intel_crtc_state *crtc_state)
+void intel_psr2_program_trans_man_trk_ctl(struct intel_dsb *dsb,
+                                         const struct intel_crtc_state *crtc_state)
 {
        struct intel_display *display = to_intel_display(crtc_state);
        struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
@@ -2358,20 +2359,23 @@ void intel_psr2_program_trans_man_trk_ctl(const struct intel_crtc_state *crtc_st
                                             crtc_state->uapi.encoder_mask) {
                struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
 
-               lockdep_assert_held(&intel_dp->psr.lock);
+               if (!dsb)
+                       lockdep_assert_held(&intel_dp->psr.lock);
+
                if (DISPLAY_VER(display) < 20 && intel_dp->psr.psr2_sel_fetch_cff_enabled)
                        return;
                break;
        }
 
-       intel_de_write(display, PSR2_MAN_TRK_CTL(display, cpu_transcoder),
-                      crtc_state->psr2_man_track_ctl);
+       intel_de_write_dsb(display, dsb,
+                          PSR2_MAN_TRK_CTL(display, cpu_transcoder),
+                          crtc_state->psr2_man_track_ctl);
 
        if (!crtc_state->enable_psr2_su_region_et)
                return;
 
-       intel_de_write(display, PIPE_SRCSZ_ERLY_TPT(crtc->pipe),
-                      crtc_state->pipe_srcsz_early_tpt);
+       intel_de_write_dsb(display, dsb, PIPE_SRCSZ_ERLY_TPT(crtc->pipe),
+                          crtc_state->pipe_srcsz_early_tpt);
 }
 
 static void psr2_man_trk_ctl_calc(struct intel_crtc_state *crtc_state,
index 5f1671d02d7652ab920c21c1f302445d94c61fdd..e6eba6633a92bb7391ea510f03913db0af94a4b3 100644 (file)
@@ -17,6 +17,7 @@ struct intel_crtc;
 struct intel_crtc_state;
 struct intel_display;
 struct intel_dp;
+struct intel_dsb;
 struct intel_encoder;
 struct intel_plane;
 struct intel_plane_state;
@@ -54,7 +55,8 @@ void intel_psr_wait_for_idle_locked(const struct intel_crtc_state *new_crtc_stat
 bool intel_psr_enabled(struct intel_dp *intel_dp);
 int intel_psr2_sel_fetch_update(struct intel_atomic_state *state,
                                struct intel_crtc *crtc);
-void intel_psr2_program_trans_man_trk_ctl(const struct intel_crtc_state *crtc_state);
+void intel_psr2_program_trans_man_trk_ctl(struct intel_dsb *dsb,
+                                         const struct intel_crtc_state *crtc_state);
 void intel_psr_pause(struct intel_dp *intel_dp);
 void intel_psr_resume(struct intel_dp *intel_dp);
 bool intel_psr_needs_block_dc_vblank(const struct intel_crtc_state *crtc_state);