[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