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

Reply via email to