From: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
To: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Cc: intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org,
jouni.hogander@intel.com, animesh.manna@intel.com
Subject: Re: [PATCH 09/11] drm/i915/dp: Split AS SDP computation between compute_config and compute_config_late
Date: Fri, 22 May 2026 18:24:27 +0300 [thread overview]
Message-ID: <ahB1K077Y6yigOIb@intel.com> (raw)
In-Reply-To: <20260518035502.2909359-10-ankit.k.nautiyal@intel.com>
On Mon, May 18, 2026 at 09:24:59AM +0530, Ankit Nautiyal wrote:
> Currently we enable AS SDP only when VRR is enabled. As we start using
> AS SDP for other features, this becomes a problem. The AS SDP
> configuration can change dynamically based on VRR, CMRR, PR, ALPM, etc.
> Since these features may be enabled or disabled after the initial
> configuration, the AS SDP parameters need to be computed later in the
> pipeline.
>
> However, not all of the AS SDP logic can be moved to the late stage:
> the VRR guardband optimization depends on knowing early whether AS SDP
> can be used. Without this, we would end up accounting for AS SDP on all
> platforms that support it, even for panels that do not support AS SDP.
> Therefore we set the infoframe enable bit for AS SDP during
> compute_config(), before the guardband is computed.
>
> To handle these constraints, split the AS SDP programming into two
> phases:
>
> - intel_dp_compute_as_sdp()
> Runs during compute_config().
> Sets only the infoframe enable bit so that the guardband logic can
> account for AS SDP requirements.
>
> - intel_dp_as_sdp_compute_config_late()
> Runs during compute_config_late().
> Computes all remaining AS SDP fields based on the features that need
> it.
>
> The late-stage computation is called from
> intel_dp_sdp_compute_config_late(), before computing the minimum guardband
> for SDPs.
>
> This is a preparatory change. A subsequent patches will compute PR related
> AS SDP fields and enable AS SDP not only for VRR but for other features
> as well.
I don't think we actually need this. Based on what I see in the spec it
should be perfectly fine to always provide the coasting vtotal whenever
the sink supports panel replay.
Also I don't think we support the "suspend AS SDP during PR active" mode
yet, so for the moment the sink should never even use the coasting
vtotal value we provide.
>
> Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_dp.c | 66 ++++++++++++++++---------
> 1 file changed, 43 insertions(+), 23 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> index 8d0d04f306a7..c1c6f394eb0b 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -3187,10 +3187,6 @@ static bool intel_dp_needs_as_sdp(struct intel_dp *intel_dp,
> static void intel_dp_compute_as_sdp(struct intel_dp *intel_dp,
> struct intel_crtc_state *crtc_state)
> {
> - struct drm_dp_as_sdp *as_sdp = &crtc_state->infoframes.as_sdp;
> - const struct drm_display_mode *adjusted_mode =
> - &crtc_state->hw.adjusted_mode;
> -
> /*
> * #FIXME: SDP/infoframe updates aren’t truly atomic, and with the new
> * cdclk->tc clock crossing we may transiently send a corrupted packet
> @@ -3199,23 +3195,13 @@ static void intel_dp_compute_as_sdp(struct intel_dp *intel_dp,
> if (!intel_dp_needs_as_sdp(intel_dp, crtc_state))
> return;
>
> + /*
> + * Only set the infoframes.enable flag here. The remaining AS SDP fields
> + * are programmed in the compute_config_late() phase. We need this flag
> + * early so that the VRR guardband calculation can properly account for
> + * AS SDP requirements.
> + */
> crtc_state->infoframes.enable |= intel_hdmi_infoframe_enable(DP_SDP_ADAPTIVE_SYNC);
> -
> - as_sdp->sdp_type = DP_SDP_ADAPTIVE_SYNC;
> - as_sdp->length = 0x9;
> - as_sdp->duration_incr_ms = 0;
> - as_sdp->revision = 0x2;
> - as_sdp->vtotal = intel_vrr_vmin_vtotal(crtc_state);
> -
> - if (crtc_state->cmrr.enable) {
> - as_sdp->mode = DP_AS_SDP_FAVT_TRR_REACHED;
> - as_sdp->target_rr = drm_mode_vrefresh(adjusted_mode);
> - as_sdp->target_rr_divider = true;
> - } else if (crtc_state->vrr.enable) {
> - as_sdp->mode = DP_AS_SDP_AVT_DYNAMIC_VTOTAL;
> - } else {
> - as_sdp->mode = DP_AS_SDP_AVT_FIXED_VTOTAL;
> - }
> }
>
> static void intel_dp_compute_vsc_sdp(struct intel_dp *intel_dp,
> @@ -7459,11 +7445,45 @@ void intel_dp_mst_resume(struct intel_display *display)
> }
>
> static
> -int intel_dp_sdp_compute_config_late(struct intel_crtc_state *crtc_state)
> +void intel_dp_as_sdp_compute_config_late(struct intel_dp *intel_dp,
> + struct intel_crtc_state *crtc_state)
> +{
> + struct drm_dp_as_sdp *as_sdp = &crtc_state->infoframes.as_sdp;
> + const struct drm_display_mode *adjusted_mode =
> + &crtc_state->hw.adjusted_mode;
> +
> + if ((crtc_state->infoframes.enable &
> + intel_hdmi_infoframe_enable(DP_SDP_ADAPTIVE_SYNC)) == 0)
> + return;
> +
> + as_sdp->sdp_type = DP_SDP_ADAPTIVE_SYNC;
> + as_sdp->length = 0x9;
> + as_sdp->duration_incr_ms = 0;
> + as_sdp->revision = 0x2;
> + as_sdp->vtotal = intel_vrr_vmin_vtotal(crtc_state);
> +
> + if (crtc_state->cmrr.enable) {
> + as_sdp->mode = DP_AS_SDP_FAVT_TRR_REACHED;
> + as_sdp->target_rr = drm_mode_vrefresh(adjusted_mode);
> + as_sdp->target_rr_divider = true;
> + } else if (crtc_state->vrr.enable) {
> + as_sdp->mode = DP_AS_SDP_AVT_DYNAMIC_VTOTAL;
> + } else {
> + as_sdp->mode = DP_AS_SDP_AVT_FIXED_VTOTAL;
> + }
> +}
> +
> +static
> +int intel_dp_sdp_compute_config_late(struct intel_dp *intel_dp,
> + struct intel_crtc_state *crtc_state)
> {
> struct intel_display *display = to_intel_display(crtc_state);
> int guardband = intel_crtc_vblank_length(crtc_state);
> - int min_sdp_guardband = intel_dp_sdp_min_guardband(crtc_state, false);
> + int min_sdp_guardband;
> +
> + intel_dp_as_sdp_compute_config_late(intel_dp, crtc_state);
> +
> + min_sdp_guardband = intel_dp_sdp_min_guardband(crtc_state, false);
>
> if (guardband < min_sdp_guardband) {
> drm_dbg_kms(display->drm, "guardband %d < min sdp guardband %d\n",
> @@ -7483,7 +7503,7 @@ int intel_dp_compute_config_late(struct intel_encoder *encoder,
>
> intel_psr_compute_config_late(intel_dp, crtc_state);
>
> - ret = intel_dp_sdp_compute_config_late(crtc_state);
> + ret = intel_dp_sdp_compute_config_late(intel_dp, crtc_state);
> if (ret)
> return ret;
>
> --
> 2.45.2
--
Ville Syrjälä
Intel
next prev parent reply other threads:[~2026-05-22 15:24 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-18 3:54 [PATCH 00/11] Fix Adaptive-Sync SDP for PR with Link ON + Auxless-ALPM Ankit Nautiyal
2026-05-18 3:54 ` [PATCH 01/11] drm/i915/psr: Add helper to get Async Video timing support in PR active Ankit Nautiyal
2026-05-22 14:06 ` Ville Syrjälä
2026-05-18 3:54 ` [PATCH 02/11] drm/i915/dp: Add member to intel_dp to store AS SDP v2 support Ankit Nautiyal
2026-05-22 14:08 ` Ville Syrjälä
2026-05-18 3:54 ` [PATCH 03/11] drm/i915/dp: Allow AS SDP only if v2 is supported Ankit Nautiyal
2026-05-22 14:10 ` Ville Syrjälä
2026-05-18 3:54 ` [PATCH 04/11] drm/i915/psr: Write the PR config DPCDs in burst mode Ankit Nautiyal
2026-05-18 3:54 ` [PATCH 05/11] drm/i915/display: Add helper for AS SDP transmission time selection Ankit Nautiyal
2026-05-18 3:54 ` [PATCH 06/11] drm/i915/psr: Program Panel Replay CONFIG3 using AS SDP transmission time Ankit Nautiyal
2026-05-18 3:54 ` [PATCH 07/11] drm/i915/dp: Set relevant Downspread Ctrl DPCD bits for PR + Auxless ALPM Ankit Nautiyal
2026-05-22 15:08 ` Ville Syrjälä
2026-05-18 3:54 ` [PATCH 08/11] drm/i915/dp: Program AS SDP DB[1:0] for PR with Link off Ankit Nautiyal
2026-05-18 3:54 ` [PATCH 09/11] drm/i915/dp: Split AS SDP computation between compute_config and compute_config_late Ankit Nautiyal
2026-05-22 15:24 ` Ville Syrjälä [this message]
2026-05-23 4:27 ` Nautiyal, Ankit K
2026-05-18 3:55 ` [PATCH 10/11] drm/i915/dp: Compute and include coasting vtotal for AS SDP Ankit Nautiyal
2026-05-23 4:34 ` Nautiyal, Ankit K
2026-05-18 3:55 ` [PATCH 11/11] drm/i915/dp: Always enable AS SDP if supported by source + sink Ankit Nautiyal
2026-05-22 15:25 ` Ville Syrjälä
2026-05-23 4:29 ` Nautiyal, Ankit K
2026-05-18 4:16 ` ✓ CI.KUnit: success for Fix Adaptive-Sync SDP for PR with Link ON + Auxless-ALPM (rev2) Patchwork
2026-05-18 4:54 ` ✓ Xe.CI.BAT: " Patchwork
2026-05-18 5:44 ` ✓ i915.CI.BAT: " Patchwork
2026-05-18 6:47 ` ✗ Xe.CI.FULL: failure " Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ahB1K077Y6yigOIb@intel.com \
--to=ville.syrjala@linux.intel.com \
--cc=animesh.manna@intel.com \
--cc=ankit.k.nautiyal@intel.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=intel-xe@lists.freedesktop.org \
--cc=jouni.hogander@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.