[PATCH 11/14] wip: i915/drm: Do not retrain link while PSR keep link off

José Roberto de Souza jose.souza at intel.com
Tue Sep 18 19:08:28 UTC 2018


By default PSR turn off the main link to save even more power, just
for a few panels the link is kept on.
Any attempt to train main link while PSR keep link off will fail, so
here skiping the training.
Two paths can trigger it:
- a long pulse from sink by unknow reasons
- a call from userspace

Cc: Dhinakaran Pandiyan <dhinakaran.pandiyan at intel.com>
Signed-off-by: José Roberto de Souza <jose.souza at intel.com>
---
 drivers/gpu/drm/i915/intel_dp.c  |  5 +++++
 drivers/gpu/drm/i915/intel_drv.h |  1 +
 drivers/gpu/drm/i915/intel_psr.c | 26 ++++++++++++++++++++++++++
 3 files changed, 32 insertions(+)

diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 436c22de33b6..4c627751e838 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -4371,6 +4371,11 @@ int intel_dp_retrain_link(struct intel_encoder *encoder,
 	if (!intel_dp_needs_link_retrain(intel_dp))
 		return 0;
 
+	if (intel_psr_turned_link_off(intel_dp)) {
+		DRM_DEBUG_KMS("Link is off because of PSR, retrain will happen when exiting PSR\n");
+		return 0;
+	}
+
 	/* Suppress underruns caused by re-training */
 	intel_set_cpu_fifo_underrun_reporting(dev_priv, crtc->pipe, false);
 	if (crtc->config->has_pch_encoder)
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 76d158024192..3bc49e6c95d8 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -1961,6 +1961,7 @@ void intel_psr_irq_handler(struct drm_i915_private *dev_priv, u32 psr_iir);
 void intel_psr_short_pulse(struct intel_dp *intel_dp);
 int intel_psr_wait_for_idle(const struct intel_crtc_state *new_crtc_state,
 			    u32 *out_value);
+bool intel_psr_turned_link_off(struct intel_dp *intel_dp);
 
 /* intel_runtime_pm.c */
 int intel_power_domains_init(struct drm_i915_private *);
diff --git a/drivers/gpu/drm/i915/intel_psr.c b/drivers/gpu/drm/i915/intel_psr.c
index ce279ae1a71a..f897271345a3 100644
--- a/drivers/gpu/drm/i915/intel_psr.c
+++ b/drivers/gpu/drm/i915/intel_psr.c
@@ -1144,3 +1144,29 @@ void intel_psr_short_pulse(struct intel_dp *intel_dp)
 exit:
 	mutex_unlock(&psr->lock);
 }
+
+bool intel_psr_turned_link_off(struct intel_dp *intel_dp)
+
+{
+	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
+	struct i915_psr *psr = &dev_priv->psr;
+	bool ret = false;
+
+	if (!CAN_PSR(dev_priv) || !intel_dp_is_edp(intel_dp))
+		return ret;
+
+	mutex_lock(&psr->lock);
+
+	if (psr->dp != intel_dp || !psr->active)
+		goto exit;
+
+	if (psr->psr2_enabled)
+		ret = true;
+	else
+		ret = !psr->link_standby;
+
+exit:
+	mutex_unlock(&psr->lock);
+
+	return ret;
+}
-- 
2.19.0



More information about the Intel-gfx-trybot mailing list