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,
Mitul Golani <mitulkumar.ajitkumar.golani@intel.com>
Subject: Re: [PATCH 05/15] drm/i915/display: Extract helpers to set dsc/scaler prefill latencies
Date: Thu, 11 Sep 2025 17:01:18 +0300 [thread overview]
Message-ID: <aMLWLu-hemOgNkzz@intel.com> (raw)
In-Reply-To: <20250911024554.692469-6-ankit.k.nautiyal@intel.com>
On Thu, Sep 11, 2025 at 08:15:44AM +0530, Ankit Nautiyal wrote:
> Currently dsc/scaler prefill latencies are handled during watermark
> calculations. With the optimized guardband, we need to compute the
> latencies to find the minimum guardband that works for most cases.
> Extract the helpers to compute these latencies, so that they can be used
> while computing vrr guardband.
>
> While at it, put declarations in reverse xmas tree order for better
> redability.
>
> v2: Initialize {h,v}scale_k to 0, and simplify the check in
> intel_display_scaler_prefill_latency(). (Mitul)
> v3: Move helpers from intel_display.c to intel_vrr.c as they are specific
> to account for latencies to program vrr guardband. (Jani)
>
> Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> Reviewed-by: Mitul Golani <mitulkumar.ajitkumar.golani@intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_vrr.c | 33 ++++++++++++++
> drivers/gpu/drm/i915/display/intel_vrr.h | 8 ++++
> drivers/gpu/drm/i915/display/skl_watermark.c | 47 +++++++++-----------
> 3 files changed, 63 insertions(+), 25 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_vrr.c b/drivers/gpu/drm/i915/display/intel_vrr.c
> index 266cf5e1859d..fd690de5b45b 100644
> --- a/drivers/gpu/drm/i915/display/intel_vrr.c
> +++ b/drivers/gpu/drm/i915/display/intel_vrr.c
> @@ -772,3 +772,36 @@ void intel_vrr_get_config(struct intel_crtc_state *crtc_state)
> if (crtc_state->vrr.enable)
> crtc_state->mode_flags |= I915_MODE_FLAG_VRR;
> }
> +
> +int intel_vrr_guardband_scaler_latency(int num_scaler_users, u64 hscale, u64 vscale,
> + int chroma_downscaling_factor,
> + int cdclk_prefill_adjustment,
> + int linetime)
> +{
> + int scaler_prefill_latency;
> +
> + scaler_prefill_latency = 4 * linetime +
> + DIV_ROUND_UP_ULL((4 * linetime * hscale * vscale *
> + chroma_downscaling_factor), 1000000);
> +
> + scaler_prefill_latency *= cdclk_prefill_adjustment;
> +
> + return scaler_prefill_latency;
> +}
> +
> +int intel_vrr_guardband_dsc_latency(int num_scaler_users, u64 *hscale, u64 *vscale,
> + int chroma_downscaling_factor,
> + int cdclk_prefill_adjustment,
> + int linetime)
> +{
> + int dsc_prefill_latency;
> +
> + dsc_prefill_latency = DIV_ROUND_UP(15 * linetime * chroma_downscaling_factor, 10);
> +
> + for (int i = 0; i < num_scaler_users; i++)
> + dsc_prefill_latency = DIV_ROUND_UP_ULL(dsc_prefill_latency * hscale[i] * vscale[i],
> + 1000000);
> + dsc_prefill_latency *= cdclk_prefill_adjustment;
> +
> + return dsc_prefill_latency;
> +}
> diff --git a/drivers/gpu/drm/i915/display/intel_vrr.h b/drivers/gpu/drm/i915/display/intel_vrr.h
> index 38bf9996b883..950041647e47 100644
> --- a/drivers/gpu/drm/i915/display/intel_vrr.h
> +++ b/drivers/gpu/drm/i915/display/intel_vrr.h
> @@ -41,5 +41,13 @@ void intel_vrr_transcoder_enable(const struct intel_crtc_state *crtc_state);
> void intel_vrr_transcoder_disable(const struct intel_crtc_state *crtc_state);
> void intel_vrr_set_fixed_rr_timings(const struct intel_crtc_state *crtc_state);
> bool intel_vrr_always_use_vrr_tg(struct intel_display *display);
> +int intel_vrr_guardband_scaler_latency(int num_scaler_users, u64 hscale, u64 vscale,
> + int chroma_downscaling_factor,
> + int cdclk_prefill_adjustment,
> + int linetime);
> +int intel_vrr_guardband_dsc_latency(int num_scaler_users, u64 *hscale, u64 *vscale,
> + int chroma_downscaling_factor,
> + int cdclk_prefill_adjustment,
> + int linetime);
>
> #endif /* __INTEL_VRR_H__ */
> diff --git a/drivers/gpu/drm/i915/display/skl_watermark.c b/drivers/gpu/drm/i915/display/skl_watermark.c
> index 3d322c39ce21..1ff2b4d9a35e 100644
> --- a/drivers/gpu/drm/i915/display/skl_watermark.c
> +++ b/drivers/gpu/drm/i915/display/skl_watermark.c
> @@ -28,6 +28,7 @@
> #include "intel_flipq.h"
> #include "intel_pcode.h"
> #include "intel_plane.h"
> +#include "intel_vrr.h"
> #include "intel_wm.h"
> #include "skl_universal_plane_regs.h"
> #include "skl_scaler.h"
> @@ -2179,11 +2180,12 @@ cdclk_prefill_adjustment(const struct intel_crtc_state *crtc_state)
> static int
> dsc_prefill_latency(const struct intel_crtc_state *crtc_state, int linetime)
> {
> + const struct intel_crtc_scaler_state *scaler_state = &crtc_state->scaler_state;
> + int chroma_downscaling_factor = skl_scaler_chroma_downscale_factor(crtc_state);
> struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> - const struct intel_crtc_scaler_state *scaler_state =
> - &crtc_state->scaler_state;
> int num_scaler_users = hweight32(scaler_state->scaler_users);
> - int chroma_downscaling_factor = skl_scaler_chroma_downscale_factor(crtc_state);
> + u64 hscale_k[ARRAY_SIZE(scaler_state->scalers)];
> + u64 vscale_k[ARRAY_SIZE(scaler_state->scalers)];
> u32 dsc_prefill_latency = 0;
>
> if (!crtc_state->dsc.compression_enable ||
> @@ -2191,18 +2193,16 @@ dsc_prefill_latency(const struct intel_crtc_state *crtc_state, int linetime)
> num_scaler_users > crtc->num_scalers)
> return dsc_prefill_latency;
>
> - dsc_prefill_latency = DIV_ROUND_UP(15 * linetime * chroma_downscaling_factor, 10);
> -
> for (int i = 0; i < num_scaler_users; i++) {
> - u64 hscale_k, vscale_k;
> -
> - hscale_k = max(1000, mul_u32_u32(scaler_state->scalers[i].hscale, 1000) >> 16);
> - vscale_k = max(1000, mul_u32_u32(scaler_state->scalers[i].vscale, 1000) >> 16);
> - dsc_prefill_latency = DIV_ROUND_UP_ULL(dsc_prefill_latency * hscale_k * vscale_k,
> - 1000000);
> + hscale_k[i] = max(1000, mul_u32_u32(scaler_state->scalers[i].hscale, 1000) >> 16);
> + vscale_k[i] = max(1000, mul_u32_u32(scaler_state->scalers[i].vscale, 1000) >> 16);
> }
>
> - dsc_prefill_latency *= cdclk_prefill_adjustment(crtc_state);
> + dsc_prefill_latency =
> + intel_vrr_guardband_dsc_latency(num_scaler_users, hscale_k, vscale_k,
> + chroma_downscaling_factor,
> + cdclk_prefill_adjustment(crtc_state),
> + linetime);
Calling vrr stuff for non-vrr stuff feels completely backwards.
I suspect we should move these prefill latency calculations into
the relevant scaler/dsc/etc files instead.
>
> return dsc_prefill_latency;
> }
> @@ -2210,28 +2210,25 @@ dsc_prefill_latency(const struct intel_crtc_state *crtc_state, int linetime)
> static int
> scaler_prefill_latency(const struct intel_crtc_state *crtc_state, int linetime)
> {
> - const struct intel_crtc_scaler_state *scaler_state =
> - &crtc_state->scaler_state;
> + const struct intel_crtc_scaler_state *scaler_state = &crtc_state->scaler_state;
> + int chroma_downscaling_factor = skl_scaler_chroma_downscale_factor(crtc_state);
> int num_scaler_users = hweight32(scaler_state->scaler_users);
> + u64 hscale_k = 0, vscale_k = 0;
> int scaler_prefill_latency = 0;
>
> if (!num_scaler_users)
> return scaler_prefill_latency;
>
> - scaler_prefill_latency = 4 * linetime;
> -
> if (num_scaler_users > 1) {
> - u64 hscale_k = max(1000, mul_u32_u32(scaler_state->scalers[0].hscale, 1000) >> 16);
> - u64 vscale_k = max(1000, mul_u32_u32(scaler_state->scalers[0].vscale, 1000) >> 16);
> - int chroma_downscaling_factor = skl_scaler_chroma_downscale_factor(crtc_state);
> - int latency;
> -
> - latency = DIV_ROUND_UP_ULL((4 * linetime * hscale_k * vscale_k *
> - chroma_downscaling_factor), 1000000);
> - scaler_prefill_latency += latency;
> + hscale_k = max(1000, mul_u32_u32(scaler_state->scalers[0].hscale, 1000) >> 16);
> + vscale_k = max(1000, mul_u32_u32(scaler_state->scalers[0].vscale, 1000) >> 16);
> }
>
> - scaler_prefill_latency *= cdclk_prefill_adjustment(crtc_state);
> + scaler_prefill_latency =
> + intel_vrr_guardband_scaler_latency(num_scaler_users, hscale_k, vscale_k,
> + chroma_downscaling_factor,
> + cdclk_prefill_adjustment(crtc_state),
> + linetime);
>
> return scaler_prefill_latency;
> }
> --
> 2.45.2
--
Ville Syrjälä
Intel
next prev parent reply other threads:[~2025-09-11 14:01 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-11 2:45 [PATCH 00/15] Optimize vrr.guardband and fix LRR Ankit Nautiyal
2025-09-11 2:45 ` [PATCH 01/15] drm/i915/vrr: Use crtc_vsync_start/end for computing vrr.vsync_start/end Ankit Nautiyal
2025-09-11 2:45 ` [PATCH 02/15] drm/i915/skl_watermark: Fix the scaling factor for chroma subsampling Ankit Nautiyal
2025-09-11 2:45 ` [PATCH 03/15] drm/i915/skl_watermark: Pass linetime as argument to latency helpers Ankit Nautiyal
2025-09-11 13:58 ` Ville Syrjälä
2025-09-14 6:00 ` Nautiyal, Ankit K
2025-09-11 2:45 ` [PATCH 04/15] drm/i915/skl_scaler: Introduce helper for chroma downscale factor Ankit Nautiyal
2025-09-11 2:45 ` [PATCH 05/15] drm/i915/display: Extract helpers to set dsc/scaler prefill latencies Ankit Nautiyal
2025-09-11 14:01 ` Ville Syrjälä [this message]
2025-09-14 6:02 ` Nautiyal, Ankit K
2025-09-11 2:45 ` [PATCH 06/15] drm/i915/dp: Add SDP latency computation helper Ankit Nautiyal
2025-09-11 14:14 ` Ville Syrjälä
2025-09-14 6:03 ` Nautiyal, Ankit K
2025-09-11 2:45 ` [PATCH 07/15] drm/i915/alpm: Add function to compute max link-wake latency Ankit Nautiyal
2025-09-11 2:45 ` [PATCH 08/15] drm/i915/vrr: Use vrr.sync_start for getting vtotal Ankit Nautiyal
2025-09-11 2:45 ` [PATCH 09/15] drm/i915/display: Add guardband check for feature latencies Ankit Nautiyal
2025-09-11 2:45 ` [PATCH 10/15] drm/i915/skl_watermark: Remove redundant latency checks from vblank validation Ankit Nautiyal
2025-09-11 14:22 ` Ville Syrjälä
2025-09-14 6:04 ` Nautiyal, Ankit K
2025-09-11 2:45 ` [PATCH 11/15] drm/i915/display: Use vrr.guardband to derive vblank_start Ankit Nautiyal
2025-09-11 14:25 ` Ville Syrjälä
2025-09-14 5:59 ` Nautiyal, Ankit K
2025-09-15 12:32 ` Ville Syrjälä
2025-09-16 14:30 ` Nautiyal, Ankit K
2025-09-16 14:38 ` Nautiyal, Ankit K
2025-09-16 18:56 ` Ville Syrjälä
2025-09-17 10:38 ` Nautiyal, Ankit K
2025-09-17 12:36 ` Ville Syrjälä
2025-09-17 10:51 ` Ville Syrjälä
2025-09-17 12:07 ` Shankar, Uma
2025-09-17 20:51 ` Ville Syrjälä
2025-09-17 21:12 ` Ville Syrjälä
2025-09-11 2:45 ` [PATCH 12/15] drm/i915/vrr: Introduce helper to compute min static guardband Ankit Nautiyal
2025-09-11 2:45 ` [PATCH 13/15] drm/i915/display: Use optimized guardband to set vblank start Ankit Nautiyal
2025-09-11 2:45 ` [PATCH 14/15] drm/i915/panel: Refactor helper to get highest fixed mode Ankit Nautiyal
2025-09-11 14:37 ` Ville Syrjälä
2025-09-14 6:08 ` Nautiyal, Ankit K
2025-09-11 2:45 ` [PATCH 15/15] drm/i915/vrr: Fix seamless_mn drrs for PTL Ankit Nautiyal
2025-09-11 14:41 ` Ville Syrjälä
2025-09-14 6:07 ` Nautiyal, Ankit K
2025-09-15 13:25 ` Ville Syrjälä
2025-09-11 3:11 ` ✓ CI.KUnit: success for Optimize vrr.guardband and fix LRR (rev11) Patchwork
2025-09-11 3:47 ` ✓ Xe.CI.BAT: " Patchwork
2025-09-11 6:06 ` ✓ i915.CI.BAT: success for Optimize vrr.guardband and fix LRR (rev10) Patchwork
2025-09-11 9:27 ` ✓ Xe.CI.Full: success for Optimize vrr.guardband and fix LRR (rev11) Patchwork
2025-09-11 19:16 ` ✗ i915.CI.Full: failure for Optimize vrr.guardband and fix LRR (rev10) Patchwork
2025-09-12 14:03 ` [PATCH 00/15] Optimize vrr.guardband and fix LRR Ville Syrjälä
2025-09-14 6:24 ` Nautiyal, Ankit K
-- strict thread matches above, loose matches on Subject: below --
2025-09-28 7:05 Ankit Nautiyal
2025-09-28 7:05 ` [PATCH 05/15] drm/i915/display: Extract helpers to set dsc/scaler prefill latencies Ankit Nautiyal
2025-08-04 13:24 [PATCH 00/15] Optimize vrr.guardband and fix LRR Ankit Nautiyal
2025-08-04 13:24 ` [PATCH 05/15] drm/i915/display: Extract helpers to set dsc/scaler prefill latencies Ankit Nautiyal
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=aMLWLu-hemOgNkzz@intel.com \
--to=ville.syrjala@linux.intel.com \
--cc=ankit.k.nautiyal@intel.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=intel-xe@lists.freedesktop.org \
--cc=mitulkumar.ajitkumar.golani@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.