Commit 1d1689ab authored by Jouni Högander's avatar Jouni Högander
Browse files

drm/i915/psr: Allow writing PSR2_MAN_TRK_CTL using DSB



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: default avatarJouni Högander <jouni.hogander@intel.com>
Reviewed-by: default avatarAnimesh Manna <animesh.manna@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20250213064804.2077127-7-jouni.hogander@intel.com
parent 411ad638
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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);
}
+10 −6
Original line number Diff line number Diff line
@@ -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,19 +2359,22 @@ 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);

		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),
	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),
	intel_de_write_dsb(display, dsb, PIPE_SRCSZ_ERLY_TPT(crtc->pipe),
			   crtc_state->pipe_srcsz_early_tpt);
}

+3 −1
Original line number Diff line number Diff line
@@ -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);