[PATCH] Watermark level workaround for i830

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Daniel, hi intel experts,

please find a patch attached concerning the watermark levels on the i830 chipsets.

I did a couple of experiments this morning and found that the watermark on i830 may neither be too small (i.e. the FW_BLC register values may not be too high) as otherwise the FIFO runs try, but for some strange reasons, the watermark may neither be too high (the FW_BLC register must not be too small) as otherwise the display flickers. Reasons for this are unclear at this moment, though the attached patch seems to remove flickering quite reliably on linear and tiled displays.

What I should probably also report is that the watermark is set quite too low (i.e. much too conservative) on the R31. The computed values are 1 and 5 (for VGA and LVDS, respectively), though the minimum
required levels are much higher, somewhere in the ballpark of 32.

Greetings,
    Thomas

>From f535e532f3279e43a7f20bc96d4e62b24a9af684 Mon Sep 17 00:00:00 2001
From: Thomas Richter <thor@xxxxxxxxxxxxxxxxx>
Date: Mon, 18 Nov 2013 10:38:27 +0100
Subject: [PATCH 3/3] Watermark configuration workaround for i830 chipsets.

For unclear reasons, the watermark level on i830 and related
chipsets must not grow above 6 as otherwise display flickering
will occurr, specifically on panning.

Signed-off-by: Thomas Richter <thor@xxxxxxxxxxxxxxxxx>
---
 drivers/gpu/drm/i915/intel_pm.c |   25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 365545f..43c65f0 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -1648,6 +1648,21 @@ static void i9xx_update_wm(struct drm_crtc *unused_crtc)
 			I915_WRITE(FW_BLC_SELF, srwm & 0x3f);
 	}
 
+	if (IS_I830(dev)) {
+		/* For unknown reasons, i830 chipsets run havok
+		 * on panning if the watermark is below 6,
+		 * thus adjust it accordingly.
+		 */
+		if (planea_wm < 6) {
+			planea_wm = 6;
+			DRM_DEBUG_KMS("i9xx plane A wm workaround enabled\n");
+		}
+		if (planeb_wm < 6) {
+			planeb_wm = 6;
+			DRM_DEBUG_KMS("i9xx plane B wm workaround enabled\n");
+		}
+	}
+
 	DRM_DEBUG_KMS("Setting FIFO watermarks - A: %d, B: %d, C: %d, SR %d\n",
 		      planea_wm, planeb_wm, cwm, srwm);
 
@@ -1692,6 +1707,16 @@ static void i830_update_wm(struct drm_crtc *unused_crtc)
 				       &i830_wm_info,
 				       dev_priv->display.get_fifo_size(dev, 0),
 				       4, latency_ns);
+
+	/* For unknown reasons, i830 chipsets run havok
+	 * on panning if the watermark is below 6,
+	 * thus adjust it accordingly.
+	 */
+	if (planea_wm < 6) {
+		planea_wm = 6;
+		DRM_DEBUG_KMS("i830 plane A wm workaround enabled\n");
+	}
+
 	fwater_lo = I915_READ(FW_BLC) & ~0xfff;
 	fwater_lo |= (3<<8) | planea_wm;
 
-- 
1.7.10.4

_______________________________________________
Intel-gfx mailing list
Intel-gfx@xxxxxxxxxxxxxxxxxxxxx
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux