]> git.hungrycats.org Git - linux/commitdiff
drm/i915/psr: Try to program link training times correctly
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Wed, 18 May 2016 16:47:11 +0000 (18:47 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 8 Jun 2016 01:18:52 +0000 (18:18 -0700)
commit 03b7b5f983091bca17e9c163832fcde56971d7d1 upstream.

The default of 0 is 500us of link training, but that's not enough for
some platforms. Decoding this correctly means we're using 2.5ms of
link training on these platforms, which fixes flickering issues
associated with enabling PSR.

v2: Unbotch the math a bit.

v3: Drop debug hunk.

v4: Improve commit message.

Tested-by: Lyude <cpaul@redhat.com>
Cc: Lyude <cpaul@redhat.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=95176
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: Sonika Jindal <sonika.jindal@intel.com>
Cc: Durgadoss R <durgadoss.r@intel.com>
Cc: "Pandiyan, Dhinakaran" <dhinakaran.pandiyan@intel.com>
Tested-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Tested-by: fritsch@kodi.tv
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1463590036-17824-2-git-send-email-daniel.vetter@ffwll.ch
(cherry picked from commit 50db139018f9c94376d5f4db94a3bae65fdfac14)
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/gpu/drm/i915/intel_psr.c

index 9ccff3011523378d59338253f61c96bc7b944648..ab0e4b69ce2149b26ce915a97f40fdbc918a3254 100644 (file)
@@ -275,19 +275,58 @@ static void hsw_psr_enable_source(struct intel_dp *intel_dp)
         * with the 5 or 6 idle patterns.
         */
        uint32_t idle_frames = max(6, dev_priv->vbt.psr.idle_frames);
-       uint32_t val = 0x0;
+       uint32_t val = EDP_PSR_ENABLE;
+
+       val |= max_sleep_time << EDP_PSR_MAX_SLEEP_TIME_SHIFT;
+       val |= idle_frames << EDP_PSR_IDLE_FRAME_SHIFT;
 
        if (IS_HASWELL(dev))
                val |= EDP_PSR_MIN_LINK_ENTRY_TIME_8_LINES;
 
-       I915_WRITE(EDP_PSR_CTL, val |
-                  max_sleep_time << EDP_PSR_MAX_SLEEP_TIME_SHIFT |
-                  idle_frames << EDP_PSR_IDLE_FRAME_SHIFT |
-                  EDP_PSR_ENABLE);
+       if (dev_priv->vbt.psr.tp1_wakeup_time > 5)
+               val |= EDP_PSR_TP1_TIME_2500us;
+       else if (dev_priv->vbt.psr.tp1_wakeup_time > 1)
+               val |= EDP_PSR_TP1_TIME_500us;
+       else if (dev_priv->vbt.psr.tp1_wakeup_time > 0)
+               val |= EDP_PSR_TP1_TIME_100us;
+       else
+               val |= EDP_PSR_TP1_TIME_0us;
+
+       if (dev_priv->vbt.psr.tp2_tp3_wakeup_time > 5)
+               val |= EDP_PSR_TP2_TP3_TIME_2500us;
+       else if (dev_priv->vbt.psr.tp2_tp3_wakeup_time > 1)
+               val |= EDP_PSR_TP2_TP3_TIME_500us;
+       else if (dev_priv->vbt.psr.tp2_tp3_wakeup_time > 0)
+               val |= EDP_PSR_TP2_TP3_TIME_100us;
+       else
+               val |= EDP_PSR_TP2_TP3_TIME_0us;
+
+       if (intel_dp_source_supports_hbr2(intel_dp) &&
+           drm_dp_tps3_supported(intel_dp->dpcd))
+               val |= EDP_PSR_TP1_TP3_SEL;
+       else
+               val |= EDP_PSR_TP1_TP2_SEL;
+
+       I915_WRITE(EDP_PSR_CTL, val);
+
+       if (!dev_priv->psr.psr2_support)
+               return;
+
+       /* FIXME: selective update is probably totally broken because it doesn't
+        * mesh at all with our frontbuffer tracking. And the hw alone isn't
+        * good enough. */
+       val = EDP_PSR2_ENABLE | EDP_SU_TRACK_ENABLE;
+
+       if (dev_priv->vbt.psr.tp2_tp3_wakeup_time > 5)
+               val |= EDP_PSR2_TP2_TIME_2500;
+       else if (dev_priv->vbt.psr.tp2_tp3_wakeup_time > 1)
+               val |= EDP_PSR2_TP2_TIME_500;
+       else if (dev_priv->vbt.psr.tp2_tp3_wakeup_time > 0)
+               val |= EDP_PSR2_TP2_TIME_100;
+       else
+               val |= EDP_PSR2_TP2_TIME_50;
 
-       if (dev_priv->psr.psr2_support)
-               I915_WRITE(EDP_PSR2_CTL, EDP_PSR2_ENABLE |
-                               EDP_SU_TRACK_ENABLE | EDP_PSR2_TP2_TIME_100);
+       I915_WRITE(EDP_PSR2_CTL, val);
 }
 
 static bool intel_psr_match_conditions(struct intel_dp *intel_dp)