aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRodrigo Vivi <rodrigo.vivi@intel.com>2014-09-24 18:16:58 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2014-09-29 08:21:49 -0400
commit8d7f4fe9f561f4e3253478332192d88f6f135c41 (patch)
treec9ff9989c8d274cded0ad80e806f4ea46923343d
parent1d73c2a8f218be3e8b6aa884740fc67110660b54 (diff)
drm/i915: Make sure PSR is ready for been re-enabled.
Let's make sure PSR is propperly disabled before to re-enabled it. According to Spec, after disabled PSR CTL, the Idle state might occur up to 24ms, that is one full frame time (1/refresh rate), plus SRD exit training time (max of 6ms), plus SRD aux channel handshake (max of 1.5ms). So if something went wrong PSR will be disabled until next full enable/disable setup. v2: The 24ms above takes in account 16ms for refresh rate on 60Hz mode. However on low frequency modes this can take longer. So let's use 50ms for safeness. v3: Move wait out of psr.lock critical area. Cc: Daniel Vetter <daniel.vetter@ffwll.ch> Cc: Paulo Zanoni <paulo.r.zanoni@intel.com> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com> Reviewed-by: Paulo Zanoni <paulo.r.zanoni@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index c5ec821fa5fb..6f42d9568049 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -2204,6 +2204,17 @@ static void intel_edp_psr_work(struct work_struct *work)
2204 container_of(work, typeof(*dev_priv), psr.work.work); 2204 container_of(work, typeof(*dev_priv), psr.work.work);
2205 struct intel_dp *intel_dp = dev_priv->psr.enabled; 2205 struct intel_dp *intel_dp = dev_priv->psr.enabled;
2206 2206
2207 /* We have to make sure PSR is ready for re-enable
2208 * otherwise it keeps disabled until next full enable/disable cycle.
2209 * PSR might take some time to get fully disabled
2210 * and be ready for re-enable.
2211 */
2212 if (wait_for((I915_READ(EDP_PSR_STATUS_CTL(dev_priv->dev)) &
2213 EDP_PSR_STATUS_STATE_MASK) == 0, 50)) {
2214 DRM_ERROR("Timed out waiting for PSR Idle for re-enable\n");
2215 return;
2216 }
2217
2207 mutex_lock(&dev_priv->psr.lock); 2218 mutex_lock(&dev_priv->psr.lock);
2208 intel_dp = dev_priv->psr.enabled; 2219 intel_dp = dev_priv->psr.enabled;
2209 2220