[Intel-gfx] [PATCH 1/4] drm/i915: Disable LP1+ watermarks on Lenovo Thinkpad T431s

Jani Nikula jani.nikula at linux.intel.com
Mon Feb 25 13:19:52 UTC 2019


On Fri, 22 Feb 2019, Ville Syrjala <ville.syrjala at linux.intel.com> wrote:
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
>
> Lenovo Thinkpad T431s (ivb) apparently can't handle LP1+ watermarks
> being enabled. It underruns severly enough that the screen is
> unusable. The latency values and watemarks look as expected.
> And sadly updating the BIOS to the latest version (BIOS GHET41WW
> (1.26 ) 11/21/2018) did not help.
>
> One glimmer of hope I had was the VBT. It seems to have some sort
> of flag for "self refresh = yes/no", but when I looked at a bunch
> of VBTs I had lying around most of them had that field set to "no".
> So if we used that we'd end up disabling LP1+ on most machines.
> That seems a bit harsh since we know LP1+ works just fine on
> most machines.
>
> Since I have no better ideas let's just disable LP1+ watermarks
> on this particular machine via a quirk.
>
> Cc: stable at vger.kernel.org
> Cc: Andrea <andreatclist at gmail.com>
> Reported-by: Andrea <andreatclist at gmail.com>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=109477
> Fixes: a46a7350b1e8 ("drm/i915: Fix ilk+ watermarks when disabling pipes")
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>

Does what it says on the box, though I'm saddened we have to resort to a
quirk.

Reviewed-by: Jani Nikula <jani.nikula at intel.com>


> ---
>  drivers/gpu/drm/i915/intel_pm.c | 51 +++++++++++++++++++++++++--------
>  1 file changed, 39 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
> index 4c0e43caa5cd..75dceac19950 100644
> --- a/drivers/gpu/drm/i915/intel_pm.c
> +++ b/drivers/gpu/drm/i915/intel_pm.c
> @@ -3015,6 +3015,29 @@ 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 ilk_wm_disable_quirk(struct drm_i915_private *dev_priv,
> +				 int level)
> +{
> +	int max_level = ilk_wm_max_level(dev_priv);
> +
> +	if (dev_priv->wm.pri_latency[level] == 0 &&
> +	    dev_priv->wm.spr_latency[level] == 0 &&
> +	    dev_priv->wm.cur_latency[level] == 0)
> +		return;
> +
> +	DRM_DEBUG_KMS("LP%d+ watermarks disabled by quirk\n", level);
> +
> +	for (; level <= max_level; level++) {
> +		dev_priv->wm.pri_latency[level] = 0;
> +		dev_priv->wm.spr_latency[level] = 0;
> +		dev_priv->wm.cur_latency[level] = 0;
> +	}
> +
> +	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 snb_wm_lp3_irq_quirk(struct drm_i915_private *dev_priv)
>  {
>  	/*
> @@ -3028,23 +3051,18 @@ static void snb_wm_lp3_irq_quirk(struct drm_i915_private *dev_priv)
>  	 * 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;
> +	ilk_wm_disable_quirk(dev_priv, 3);
> +}
>  
> -	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_wm_disable_lp1_quirk(struct drm_i915_private *dev_priv)
> +{
> +	ilk_wm_disable_quirk(dev_priv, 1);
>  }
>  
>  static void ilk_setup_wm_latency(struct drm_i915_private *dev_priv)
>  {
> +	struct pci_dev *pdev = dev_priv->drm.pdev;
> +
>  	intel_read_wm_latency(dev_priv, dev_priv->wm.pri_latency);
>  
>  	memcpy(dev_priv->wm.spr_latency, dev_priv->wm.pri_latency,
> @@ -3063,6 +3081,15 @@ static void ilk_setup_wm_latency(struct drm_i915_private *dev_priv)
>  		snb_wm_latency_quirk(dev_priv);
>  		snb_wm_lp3_irq_quirk(dev_priv);
>  	}
> +
> +	/*
> +	 * Lenovo Thinkpad T431s (ivb)
> +	 * Massive underruns.
> +	 */
> +	if (pdev->device == 0x0166 &&
> +	    pdev->subsystem_vendor == 0x17aa &&
> +	    pdev->subsystem_device == 0x2208)
> +		ilk_wm_disable_lp1_quirk(dev_priv);
>  }
>  
>  static void skl_setup_wm_latency(struct drm_i915_private *dev_priv)

-- 
Jani Nikula, Intel Open Source Graphics Center


More information about the Intel-gfx mailing list