Thanks Jausheem for the revision, this definitely simplifies the hardcoding
of the crtc state values and just make sure the new_crtc_state is inherited
from old_crtc_state.
The logic looks good to me.

You could try and move the new_crtc_state = old_crtc_state assignments to a
separate function and call them from intel_ctomic_check()at the top which
ends up calling intel_crtc_check_fastset() , in which case then this will
return true and no modeset would be required.

Other than that it looks good to me.
@Jani Nikula <[email protected]>  let me know what you think, look
forward to your feedback on this new revision and if it looks okay with the
fastset approach.

Manasi

On Wed, Jan 21, 2026 at 12:47 PM 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;
> +       }
> +
>         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);
> --
> 2.52.0.457.g6b5491de43-goog
>
>

Reply via email to