Re: [PATCH 13/19] drm/i915/psr: Write the PR config DPCDs in burst mode

Ville Syrjälä
2026-03-30T18:44:34Z

On Mon, Mar 30, 2026 at 09:36:50AM +0530, Ankit Nautiyal wrote:
> Replace the consecutive single-byte writes to PANEL_REPLAY_CONFIG and
> CONFIG2 with one drm_dp_dpcd_write() burst starting at PANEL_REPLAY_CONFIG,
> reducing AUX transactions.
>
> v2: Drop extra conditions, and optimize variables. (Ville)
>
> Suggested-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_psr.c | 29 ++++++++++++++----------
> 1 file changed, 17 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_psr.c b/drivers/gpu/drm/i915/display/intel_psr.c
> index 2f1b48cd8efd..ca054135ca30 100644
> --- a/drivers/gpu/drm/i915/display/intel_psr.c
> +++ b/drivers/gpu/drm/i915/display/intel_psr.c
> @@ -782,27 +782,32 @@ static bool psr2_su_region_et_valid(struct intel_connector *connector, bool pane
> static void _panel_replay_enable_sink(struct intel_dp *intel_dp,
> const struct intel_crtc_state *crtc_state)
> {
> - u8 val = DP_PANEL_REPLAY_ENABLE |
> - DP_PANEL_REPLAY_VSC_SDP_CRC_EN |
> - DP_PANEL_REPLAY_UNRECOVERABLE_ERROR_EN |
> - DP_PANEL_REPLAY_RFB_STORAGE_ERROR_EN |
> - DP_PANEL_REPLAY_ACTIVE_FRAME_CRC_ERROR_EN;
> - u8 panel_replay_config2 = DP_PANEL_REPLAY_CRC_VERIFICATION;
> + struct intel_display *display = to_intel_display(intel_dp);
> + u8 panel_replay_config[2];
> + int ret;
> +
> + panel_replay_config[0] = DP_PANEL_REPLAY_ENABLE |
> + DP_PANEL_REPLAY_VSC_SDP_CRC_EN |
> + DP_PANEL_REPLAY_UNRECOVERABLE_ERROR_EN |
> + DP_PANEL_REPLAY_RFB_STORAGE_ERROR_EN |
> + DP_PANEL_REPLAY_ACTIVE_FRAME_CRC_ERROR_EN;
> + panel_replay_config[1] = DP_PANEL_REPLAY_CRC_VERIFICATION;
>
> if (crtc_state->has_sel_update)
> - val |= DP_PANEL_REPLAY_SU_ENABLE;
> + panel_replay_config[0] |= DP_PANEL_REPLAY_SU_ENABLE;
>
> if (crtc_state->enable_psr2_su_region_et)
> - val |= DP_PANEL_REPLAY_ENABLE_SU_REGION_ET;
> + panel_replay_config[0] |= DP_PANEL_REPLAY_ENABLE_SU_REGION_ET;
>
> if (crtc_state->req_psr2_sdp_prior_scanline)
> - panel_replay_config2 |=
> + panel_replay_config[1] |=
> DP_PANEL_REPLAY_SU_REGION_SCANLINE_CAPTURE;
>
> - drm_dp_dpcd_writeb(&intel_dp->aux, PANEL_REPLAY_CONFIG, val);
> + ret = drm_dp_dpcd_write(&intel_dp->aux, PANEL_REPLAY_CONFIG,
> + panel_replay_config, sizeof(panel_replay_config));
>
> - drm_dp_dpcd_writeb(&intel_dp->aux, PANEL_REPLAY_CONFIG2,
> - panel_replay_config2);
> + if (ret != sizeof(panel_replay_config))
> + drm_dbg_kms(display->drm, "Failed to write Panel Replay Configs\n");

Looks like we don't actually check for errors on any of the
other DPCD accesses here. So I'd probably drop it here as well.

Either way
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>

> }
>
> static void _psr_enable_sink(struct intel_dp *intel_dp,
> --
> 2.45.2

--
Ville Syrjälä
Intel