]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
drm/i915: Try to suppress more spurious PCH underruns on ILK-IVB
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Thu, 24 May 2018 19:04:05 +0000 (22:04 +0300)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Fri, 25 May 2018 15:00:26 +0000 (18:00 +0300)
My ILK seems to generate a spurious PCH underrun with most interlaced
HDMI modes. Add a second vblank wait to avoid it.

We have seen some spurious PCH underruns still in CI as well, some
of which seem to be progressive DP. The logs also point towards some
spurious underrins with progressive HDMI on SNB. While I don't have
a solid explanation for those let's try to kill all the birds with one
stone and always do the double wait.

Buzilla: https://bugs.freedesktop.org/show_bug.cgi?id=106387
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180524190406.2973-1-ville.syrjala@linux.intel.com
Acked-by: Chris Wilson <chris@chris-wilson.co.uk>
drivers/gpu/drm/i915/intel_display.c

index b0e8e306163115119297406e68d9221581d55b17..90a6ff00c79db1b403492d5f4f0f76f3a7f74f4b 100644 (file)
@@ -5528,9 +5528,16 @@ static void ironlake_crtc_enable(struct intel_crtc_state *pipe_config,
        if (HAS_PCH_CPT(dev_priv))
                cpt_verify_modeset(dev, intel_crtc->pipe);
 
-       /* Must wait for vblank to avoid spurious PCH FIFO underruns */
-       if (intel_crtc->config->has_pch_encoder)
+       /*
+        * Must wait for vblank to avoid spurious PCH FIFO underruns.
+        * And a second vblank wait is needed at least on ILK with
+        * some interlaced HDMI modes. Let's do the double wait always
+        * in case there are more corner cases we don't know about.
+        */
+       if (intel_crtc->config->has_pch_encoder) {
+               intel_wait_for_vblank(dev_priv, pipe);
                intel_wait_for_vblank(dev_priv, pipe);
+       }
        intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, true);
        intel_set_pch_fifo_underrun_reporting(dev_priv, pipe, true);
 }