Patch "drm/i915: Disable LP3 watermarks on all SNB machines" has been added to the 4.14-stable tree

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

 



This is a note to let you know that I've just added the patch titled

    drm/i915: Disable LP3 watermarks on all SNB machines

to the 4.14-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     drm-i915-disable-lp3-watermarks-on-all-snb-machines.patch
and it can be found in the queue-4.14 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit ac7e5af49d6b2ca5128df025c4020b3ea372de51
Author: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx>
Date:   Wed Nov 14 19:34:40 2018 +0200

    drm/i915: Disable LP3 watermarks on all SNB machines
    
    [ Upstream commit 03981c6ebec4fc7056b9b45f847393aeac90d060 ]
    
    I have a Thinkpad X220 Tablet in my hands that is losing vblank
    interrupts whenever LP3 watermarks are used.
    
    If I nudge the latency value written to the WM3 register just
    by one in either direction the problem disappears. That to me
    suggests that the punit will not enter the corrsponding
    powersave mode (MPLL shutdown IIRC) unless the latency value
    in the register matches exactly what we read from SSKPD. Ie.
    it's not really a latency value but rather just a cookie
    by which the punit can identify the desired power saving state.
    On HSW/BDW this was changed such that we actually just write
    the WM level number into those bits, which makes much more
    sense given the observed behaviour.
    
    We could try to handle this by disallowing LP3 watermarks
    only when vblank interrupts are enabled but we'd first have
    to prove that only vblank interrupts are affected, which
    seems unlikely. Also we can't grab the wm mutex from the
    vblank enable/disable hooks because those are called with
    various spinlocks held. Thus we'd have to redesigne the
    watermark locking. So to play it safe and keep the code
    simple we simply disable LP3 watermarks on all SNB machines.
    
    To do that we simply zero out the latency values for
    watermark level 3, and we adjust the watermark computation
    to check for that. The behaviour now matches that of the
    g4x/vlv/skl wm code in the presence of a zeroed latency
    value.
    
    v2: s/USHRT_MAX/U32_MAX/ for consistency with the types (Chris)
    
    Cc: stable@xxxxxxxxxxxxxxx
    Cc: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx>
    Acked-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx>
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=101269
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=103713
    Signed-off-by: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx>
    Link: https://patchwork.freedesktop.org/patch/msgid/20181114173440.6730-1-ville.syrjala@xxxxxxxxxxxxxxx
    Signed-off-by: Sasha Levin <alexander.levin@xxxxxxxxxxxxx>

diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 87cccb5f8c5da..96a5237741e0c 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -2471,6 +2471,9 @@ static uint32_t ilk_compute_pri_wm(const struct intel_crtc_state *cstate,
 	uint32_t method1, method2;
 	int cpp;
 
+	if (mem_value == 0)
+		return U32_MAX;
+
 	if (!intel_wm_plane_visible(cstate, pstate))
 		return 0;
 
@@ -2500,6 +2503,9 @@ static uint32_t ilk_compute_spr_wm(const struct intel_crtc_state *cstate,
 	uint32_t method1, method2;
 	int cpp;
 
+	if (mem_value == 0)
+		return U32_MAX;
+
 	if (!intel_wm_plane_visible(cstate, pstate))
 		return 0;
 
@@ -2523,6 +2529,9 @@ static uint32_t ilk_compute_cur_wm(const struct intel_crtc_state *cstate,
 {
 	int cpp;
 
+	if (mem_value == 0)
+		return U32_MAX;
+
 	if (!intel_wm_plane_visible(cstate, pstate))
 		return 0;
 
@@ -2981,6 +2990,34 @@ static void snb_wm_latency_quirk(struct drm_i915_private *dev_priv)
 	intel_print_wm_latency(dev_priv, "Cursor", dev_priv->wm.cur_latency);
 }
 
+static void snb_wm_lp3_irq_quirk(struct drm_i915_private *dev_priv)
+{
+	/*
+	 * On some SNB machines (Thinkpad X220 Tablet at least)
+	 * LP3 usage can cause vblank interrupts to be lost.
+	 * The DEIIR bit will go high but it looks like the CPU
+	 * never gets interrupted.
+	 *
+	 * It's not clear whether other interrupt source could
+	 * be affected or if this is somehow limited to vblank
+	 * interrupts only. To play it safe we disable LP3
+	 * watermarks entirely.
+	 */
+	if (dev_priv->wm.pri_latency[3] == 0 &&
+	    dev_priv->wm.spr_latency[3] == 0 &&
+	    dev_priv->wm.cur_latency[3] == 0)
+		return;
+
+	dev_priv->wm.pri_latency[3] = 0;
+	dev_priv->wm.spr_latency[3] = 0;
+	dev_priv->wm.cur_latency[3] = 0;
+
+	DRM_DEBUG_KMS("LP3 watermarks disabled due to potential for lost interrupts\n");
+	intel_print_wm_latency(dev_priv, "Primary", dev_priv->wm.pri_latency);
+	intel_print_wm_latency(dev_priv, "Sprite", dev_priv->wm.spr_latency);
+	intel_print_wm_latency(dev_priv, "Cursor", dev_priv->wm.cur_latency);
+}
+
 static void ilk_setup_wm_latency(struct drm_i915_private *dev_priv)
 {
 	intel_read_wm_latency(dev_priv, dev_priv->wm.pri_latency);
@@ -2997,8 +3034,10 @@ static void ilk_setup_wm_latency(struct drm_i915_private *dev_priv)
 	intel_print_wm_latency(dev_priv, "Sprite", dev_priv->wm.spr_latency);
 	intel_print_wm_latency(dev_priv, "Cursor", dev_priv->wm.cur_latency);
 
-	if (IS_GEN6(dev_priv))
+	if (IS_GEN6(dev_priv)) {
 		snb_wm_latency_quirk(dev_priv);
+		snb_wm_lp3_irq_quirk(dev_priv);
+	}
 }
 
 static void skl_setup_wm_latency(struct drm_i915_private *dev_priv)



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux