On Wed, 21 Jan 2026, Juasheem Sultan <[email protected]> wrote:
> When attempting the initial commit, there is a mismatch between
> the new crtc_state and the old crtc_state. This causes us to fail the
> pipe_config comparison and force a modeset. In the case where we are
> inheriting an initialized state, we can sync the new and the old state
> to pass the comparison and allow us to do a fastset and achieve an
> uninterrupted handoff to userspace.
>
> Signed-off-by: Juasheem Sultan <[email protected]>
> ---
> drivers/gpu/drm/i915/display/intel_display.c | 19 +++++++++++++++++++
> 1 file changed, 19 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display.c
> b/drivers/gpu/drm/i915/display/intel_display.c
> index 0d527cf22866..6eef4bd2e251 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -5736,6 +5736,25 @@ static void intel_crtc_check_fastset(const struct
> intel_crtc_state *old_crtc_sta
> if (old_crtc_state->vrr.in_range != new_crtc_state->vrr.in_range)
> new_crtc_state->update_lrr = false;
>
> + /* Copying crtc state if inheriting an old state for commit */
> + if (old_crtc_state->inherited) {
> + new_crtc_state->hw = old_crtc_state->hw;
> +
> + new_crtc_state->port_clock = old_crtc_state->port_clock;
> + new_crtc_state->pipe_bpp = old_crtc_state->pipe_bpp;
> + new_crtc_state->cpu_transcoder = old_crtc_state->cpu_transcoder;
> + new_crtc_state->lane_count = old_crtc_state->lane_count;
> + new_crtc_state->output_types = old_crtc_state->output_types;
> + new_crtc_state->dp_m_n = old_crtc_state->dp_m_n;
> + new_crtc_state->framestart_delay =
> old_crtc_state->framestart_delay;
> + new_crtc_state->pixel_multiplier =
> old_crtc_state->pixel_multiplier;
> + new_crtc_state->pixel_rate = old_crtc_state->pixel_rate;
> + new_crtc_state->enhanced_framing =
> old_crtc_state->enhanced_framing;
> + new_crtc_state->dpll_hw_state = old_crtc_state->dpll_hw_state;
> + new_crtc_state->intel_dpll = old_crtc_state->intel_dpll;
> + new_crtc_state->vrr.guardband = old_crtc_state->vrr.guardband;
I'd like to see logs of what the differences are.
BR,
Jani.
> + }
> +
> if (!intel_pipe_config_compare(old_crtc_state, new_crtc_state, true)) {
> drm_dbg_kms(display->drm, "[CRTC:%d:%s] fastset requirement not
> met, forcing full modeset\n",
> crtc->base.base.id, crtc->base.name);
--
Jani Nikula, Intel