From: "Nautiyal, Ankit K" <ankit.k.nautiyal@intel.com>
To: "Golani,
Mitulkumar Ajitkumar" <mitulkumar.ajitkumar.golani@intel.com>,
"intel-gfx@lists.freedesktop.org"
<intel-gfx@lists.freedesktop.org>,
"intel-xe@lists.freedesktop.org" <intel-xe@lists.freedesktop.org>
Cc: "ville.syrjala@linux.intel.com" <ville.syrjala@linux.intel.com>,
"jani.nikula@linux.intel.com" <jani.nikula@linux.intel.com>
Subject: Re: [PATCH 04/12] drm/i915/display: Extract helpers to set dsc/scaler prefill latencies
Date: Mon, 18 Aug 2025 11:39:09 +0530 [thread overview]
Message-ID: <5bf4ef6e-cafe-4f7f-aa9b-5deb80fab6ba@intel.com> (raw)
In-Reply-To: <IA1PR11MB63482583ED9773132E155F73B228A@IA1PR11MB6348.namprd11.prod.outlook.com>
On 8/11/2025 11:46 AM, Golani, Mitulkumar Ajitkumar wrote:
>
>> -----Original Message-----
>> From: Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>
>> Sent: 07 August 2025 16:46
>> To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
>> Cc: ville.syrjala@linux.intel.com; jani.nikula@linux.intel.com; Golani,
>> Mitulkumar Ajitkumar <mitulkumar.ajitkumar.golani@intel.com>; Nautiyal,
>> Ankit K <ankit.k.nautiyal@intel.com>
>> Subject: [PATCH 04/12] drm/i915/display: Extract helpers to set dsc/scaler
>> prefill latencies
>>
>> 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.
>>
>> Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
>> ---
>> drivers/gpu/drm/i915/display/intel_display.c | 34 +++++++++++++++
>> drivers/gpu/drm/i915/display/intel_display.h | 8 ++++
>> drivers/gpu/drm/i915/display/skl_watermark.c | 46 +++++++++-----------
>> 3 files changed, 63 insertions(+), 25 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/display/intel_display.c
>> b/drivers/gpu/drm/i915/display/intel_display.c
>> index c1a3a95c65f0..af4d54672d0d 100644
>> --- a/drivers/gpu/drm/i915/display/intel_display.c
>> +++ b/drivers/gpu/drm/i915/display/intel_display.c
>> @@ -8328,3 +8328,37 @@ bool intel_scanout_needs_vtd_wa(struct
>> intel_display *display)
>>
>> return IS_DISPLAY_VER(display, 6, 11) && i915_vtd_active(i915); }
>> +
>> +int intel_display_scaler_prefill_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;
>> + if (num_scaler_users > 1)
>> + scaler_prefill_latency += DIV_ROUND_UP_ULL((4 * linetime *
>> hscale * vscale *
>> +
>> chroma_downscaling_factor), 1000000);
>> +
>> + scaler_prefill_latency *= cdclk_prefill_adjustment;
>> +
>> + return scaler_prefill_latency;
>> +}
>> +
>> +int intel_display_dsc_prefill_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_display.h
>> b/drivers/gpu/drm/i915/display/intel_display.h
>> index 37e2ab301a80..8d094b0a8c6b 100644
>> --- a/drivers/gpu/drm/i915/display/intel_display.h
>> +++ b/drivers/gpu/drm/i915/display/intel_display.h
>> @@ -559,5 +559,13 @@ bool assert_port_valid(struct intel_display *display,
>> enum port port);
>>
>> bool intel_scanout_needs_vtd_wa(struct intel_display *display); int
>> intel_crtc_num_joined_pipes(const struct intel_crtc_state *crtc_state);
>> +int intel_display_scaler_prefill_latency(int num_scaler_users, u64 hscale, u64
>> vscale,
>> + int chroma_downscaling_factor,
>> + int cdclk_prefill_adjustment,
>> + int linetime);
>> +int intel_display_dsc_prefill_latency(int num_scaler_users, u64 *hscale, u64
>> *vscale,
>> + int chroma_downscaling_factor,
>> + int cdclk_prefill_adjustment,
>> + int linetime);
>>
>> #endif
>> diff --git a/drivers/gpu/drm/i915/display/skl_watermark.c
>> b/drivers/gpu/drm/i915/display/skl_watermark.c
>> index 97b42bbf5642..4474f987de06 100644
>> --- a/drivers/gpu/drm/i915/display/skl_watermark.c
>> +++ b/drivers/gpu/drm/i915/display/skl_watermark.c
>> @@ -2179,11 +2179,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 +2192,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_display_dsc_prefill_latency(num_scaler_users, hscale_k,
>> vscale_k,
>> + chroma_downscaling_factor,
>> +
>> cdclk_prefill_adjustment(crtc_state),
>> + linetime);
>>
>> return dsc_prefill_latency;
>> }
>> @@ -2210,28 +2209,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 = 1000, vscale_k = 1000;
> This could be initialized to 0 ?
>
> As further going, you are already assigning to max 1000 when even 1 scaler is being used, also intel_display_scaler_prefill_latency we are again redundantly check for number scaler presence
>
> this could be avoided if initialised to 0 and assigning to max when scaler users presence is found ?
Makes sense. Will change this in the next version.
Regards,
Ankit
>
> also in
>> 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_display_scaler_prefill_latency(num_scaler_users,
>> hscale_k, vscale_k,
>> +
>> chroma_downscaling_factor,
>> +
>> cdclk_prefill_adjustment(crtc_state),
>> + linetime);
>>
>> return scaler_prefill_latency;
>> }
>> --
>> 2.45.2
next prev parent reply other threads:[~2025-08-18 6:09 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-07 11:15 [PATCH 00/12] Optimize vrr.guardband and fix LRR Ankit Nautiyal
2025-08-07 11:15 ` [PATCH 01/12] drm/i915/skl_watermark: Fix the scaling factor for chroma subsampling Ankit Nautiyal
2025-08-07 15:26 ` Golani, Mitulkumar Ajitkumar
2025-08-07 11:15 ` [PATCH 02/12] drm/i915/skl_watermark: Pass linetime as argument to latency helpers Ankit Nautiyal
2025-08-07 16:19 ` Golani, Mitulkumar Ajitkumar
2025-08-07 11:15 ` [PATCH 03/12] drm/i915/skl_scaler: Introduce helper for chroma downscale factor Ankit Nautiyal
2025-08-07 16:29 ` Golani, Mitulkumar Ajitkumar
2025-08-07 11:15 ` [PATCH 04/12] drm/i915/display: Extract helpers to set dsc/scaler prefill latencies Ankit Nautiyal
2025-08-11 6:16 ` Golani, Mitulkumar Ajitkumar
2025-08-18 6:09 ` Nautiyal, Ankit K [this message]
2025-08-07 11:15 ` [PATCH 05/12] drm/i915/dp: Add SDP latency computation helper Ankit Nautiyal
2025-08-07 11:15 ` [PATCH 06/12] drm/i915/alpm: Add function to compute max link-wake latency Ankit Nautiyal
2025-08-07 11:15 ` [PATCH 07/12] drm/i915/vrr: Use vrr.sync_start for getting vtotal Ankit Nautiyal
2025-08-07 17:01 ` Golani, Mitulkumar Ajitkumar
2025-08-07 11:15 ` [PATCH 08/12] drm/i915/display: Add guardband check for feature latencies Ankit Nautiyal
2025-08-11 9:11 ` Golani, Mitulkumar Ajitkumar
2025-08-18 6:01 ` Nautiyal, Ankit K
2025-08-11 9:59 ` Golani, Mitulkumar Ajitkumar
2025-08-18 6:00 ` Nautiyal, Ankit K
2025-08-11 15:14 ` Jani Nikula
2025-08-18 6:02 ` Nautiyal, Ankit K
2025-08-07 11:15 ` [PATCH 09/12] drm/i915/skl_watermark: Remove redundant latency checks from vblank validation Ankit Nautiyal
2025-08-07 17:03 ` Golani, Mitulkumar Ajitkumar
2025-08-07 11:15 ` [PATCH 10/12] drm/i915/vrr: Use static guardband to support seamless LRR switching Ankit Nautiyal
2025-08-07 11:15 ` [PATCH 11/12] drm/i915/panel: Add helper to get highest fixed mode Ankit Nautiyal
2025-08-11 15:22 ` Jani Nikula
2025-08-18 6:15 ` Nautiyal, Ankit K
2025-08-07 11:15 ` [PATCH 12/12] drm/i915/vrr: Fix seamless_mn drrs for PTL Ankit Nautiyal
2025-08-07 12:22 ` ✓ i915.CI.BAT: success for Optimize vrr.guardband and fix LRR (rev4) Patchwork
2025-08-07 12:25 ` ✓ CI.KUnit: " Patchwork
2025-08-07 13:01 ` ✓ Xe.CI.BAT: " Patchwork
2025-08-07 14:10 ` ✗ Xe.CI.Full: failure " Patchwork
2025-08-07 16:31 ` ✓ i915.CI.Full: success " Patchwork
-- strict thread matches above, loose matches on Subject: below --
2025-08-18 7:31 [PATCH 00/12] Optimize vrr.guardband and fix LRR Ankit Nautiyal
2025-08-18 7:31 ` [PATCH 04/12] drm/i915/display: Extract helpers to set dsc/scaler prefill latencies Ankit Nautiyal
2025-08-18 10:37 ` Golani, Mitulkumar Ajitkumar
2025-08-20 8:04 [PATCH 00/12] Optimize vrr.guardband and fix LRR Ankit Nautiyal
2025-08-20 8:04 ` [PATCH 04/12] drm/i915/display: Extract helpers to set dsc/scaler prefill latencies Ankit Nautiyal
2025-08-22 11:23 ` Jani Nikula
2025-08-24 4:36 ` Nautiyal, Ankit K
2025-08-25 12:55 ` Nautiyal, Ankit K
2025-08-25 12:35 [PATCH 00/12] Optimize vrr.guardband and fix LRR Ankit Nautiyal
2025-08-25 12:35 ` [PATCH 04/12] 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=5bf4ef6e-cafe-4f7f-aa9b-5deb80fab6ba@intel.com \
--to=ankit.k.nautiyal@intel.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=intel-xe@lists.freedesktop.org \
--cc=jani.nikula@linux.intel.com \
--cc=mitulkumar.ajitkumar.golani@intel.com \
--cc=ville.syrjala@linux.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.