On Fri, 2025-09-19 at 22:29 +0300, Ville Syrjala wrote:
> From: Ville Syrjälä <[email protected]>
> 
> Some systems (eg. LNL Lenovo Thinkapd X1 Carbon) declare
> semi-bogus non-monotonic WM latency values:
>  WM0 latency not provided
>  WM1 latency 100 usec
>  WM2 latency 100 usec
>  WM3 latency 100 usec
>  WM4 latency 93 usec
>  WM5 latency 100 usec
> 
> Apparently Windows just papers over the issue by bumping the
> latencies for the higher watermark levels to make them monotonic
> again. Do the same.
> 
> Cc: Luca Coelho <[email protected]>
> Signed-off-by: Ville Syrjälä <[email protected]>
> ---

Reviewed-by: Luca Coelho <[email protected]>

--
Cheers,
Luca.

>  drivers/gpu/drm/i915/display/skl_watermark.c | 15 +++++++++++++++
>  1 file changed, 15 insertions(+)
> 
> diff --git a/drivers/gpu/drm/i915/display/skl_watermark.c 
> b/drivers/gpu/drm/i915/display/skl_watermark.c
> index d83772c6ea9a..2a40c135cb96 100644
> --- a/drivers/gpu/drm/i915/display/skl_watermark.c
> +++ b/drivers/gpu/drm/i915/display/skl_watermark.c
> @@ -3236,6 +3236,19 @@ static void sanitize_wm_latency(struct intel_display 
> *display)
>               wm[level] = 0;
>  }
>  
> +static void make_wm_latency_monotonic(struct intel_display *display)
> +{
> +     u16 *wm = display->wm.skl_latency;
> +     int level, num_levels = display->wm.num_levels;
> +
> +     for (level = 1; level < num_levels; level++) {
> +             if (wm[level] == 0)
> +                     break;
> +
> +             wm[level] = max(wm[level], wm[level-1]);
> +     }
> +}
> +
>  static void
>  adjust_wm_latency(struct intel_display *display)
>  {
> @@ -3246,6 +3259,8 @@ adjust_wm_latency(struct intel_display *display)
>  
>       sanitize_wm_latency(display);
>  
> +     make_wm_latency_monotonic(display);
> +
>       /*
>        * WaWmMemoryReadLatency
>        *

Reply via email to