The Windows driver is rejecting non-monotonic ranges latency values for Xe3. Let's make sure that we do not call make_wm_latency_monotonic() for Xe3 and beyond.
Also, because of that, let's add a check at the end of adjust_wm_latency() to ensure we raise a warning if the final list of latency values is not monotonic. Cc: Ville Syrjälä <[email protected]> Suggested-by: Ville Syrjälä <[email protected]> Signed-off-by: Gustavo Sousa <[email protected]> --- drivers/gpu/drm/i915/display/skl_watermark.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/i915/display/skl_watermark.c b/drivers/gpu/drm/i915/display/skl_watermark.c index d20c88ebe919..e13324af7afb 100644 --- a/drivers/gpu/drm/i915/display/skl_watermark.c +++ b/drivers/gpu/drm/i915/display/skl_watermark.c @@ -3211,6 +3211,18 @@ static void make_wm_latency_monotonic(struct intel_display *display) } } +static bool is_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] < wm[level - 1]) + return false; + + return true; +} + static void adjust_wm_latency(struct intel_display *display) { @@ -3221,7 +3233,8 @@ adjust_wm_latency(struct intel_display *display) sanitize_wm_latency(display); - make_wm_latency_monotonic(display); + if (DISPLAY_VER(display) < 30) + make_wm_latency_monotonic(display); /* * WaWmMemoryReadLatency @@ -3241,6 +3254,8 @@ adjust_wm_latency(struct intel_display *display) */ if (need_16gb_dimm_wa(display)) increase_wm_latency(display, 1); + + drm_WARN_ON(display->drm, !is_wm_latency_monotonic(display)); } static void mtl_read_wm_latency(struct intel_display *display) -- 2.51.0
