|
@@ -267,23 +267,17 @@ static void hsw_psr_enable_source(struct intel_dp *intel_dp)
|
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
|
|
|
|
uint32_t max_sleep_time = 0x1f;
|
|
|
- /* Lately it was identified that depending on panel idle frame count
|
|
|
- * calculated at HW can be off by 1. So let's use what came
|
|
|
- * from VBT + 1.
|
|
|
- * There are also other cases where panel demands at least 4
|
|
|
- * but VBT is not being set. To cover these 2 cases lets use
|
|
|
- * at least 5 when VBT isn't set to be on the safest side.
|
|
|
+ /*
|
|
|
+ * Let's respect VBT in case VBT asks a higher idle_frame value.
|
|
|
+ * Let's use 6 as the minimum to cover all known cases including
|
|
|
+ * the off-by-one issue that HW has in some cases. Also there are
|
|
|
+ * cases where sink should be able to train
|
|
|
+ * with the 5 or 6 idle patterns.
|
|
|
*/
|
|
|
- uint32_t idle_frames = dev_priv->vbt.psr.idle_frames ?
|
|
|
- dev_priv->vbt.psr.idle_frames + 1 : 5;
|
|
|
+ uint32_t idle_frames = max(6, dev_priv->vbt.psr.idle_frames);
|
|
|
uint32_t val = 0x0;
|
|
|
const uint32_t link_entry_time = EDP_PSR_MIN_LINK_ENTRY_TIME_8_LINES;
|
|
|
|
|
|
- if (intel_dp->psr_dpcd[1] & DP_PSR_NO_TRAIN_ON_EXIT) {
|
|
|
- /* Sink should be able to train with the 5 or 6 idle patterns */
|
|
|
- idle_frames += 4;
|
|
|
- }
|
|
|
-
|
|
|
I915_WRITE(EDP_PSR_CTL, val |
|
|
|
(IS_BROADWELL(dev) ? 0 : link_entry_time) |
|
|
|
max_sleep_time << EDP_PSR_MAX_SLEEP_TIME_SHIFT |
|