aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2014-07-11 13:30:11 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2014-07-23 01:05:16 -0400
commit2807cf69df89defb024ac74708b6e43c231d0d47 (patch)
tree10891c4b6192c366960fb892ba45c9e9fef67807
parent1fcc9d1cf3c72ec7c7a3253b50b8e44f95f3f616 (diff)
drm/i915: Track the psr dp connector in dev_priv->psr.enabled
Trying to fish that one out through looping is a bit a locking nightmare. So just set it and use it in the work struct. v2: - Don't Oops in psr_work, spotted by Rodrigo. - Fix compile warning. Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/i915_debugfs.c2
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h3
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c22
3 files changed, 12 insertions, 15 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index 981ca4243bd3..62ea6198a092 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -1894,7 +1894,7 @@ static int i915_edp_psr_status(struct seq_file *m, void *data)
1894 1894
1895 seq_printf(m, "Sink_Support: %s\n", yesno(dev_priv->psr.sink_support)); 1895 seq_printf(m, "Sink_Support: %s\n", yesno(dev_priv->psr.sink_support));
1896 seq_printf(m, "Source_OK: %s\n", yesno(dev_priv->psr.source_ok)); 1896 seq_printf(m, "Source_OK: %s\n", yesno(dev_priv->psr.source_ok));
1897 seq_printf(m, "Enabled: %s\n", yesno(dev_priv->psr.enabled)); 1897 seq_printf(m, "Enabled: %s\n", yesno((bool)dev_priv->psr.enabled));
1898 seq_printf(m, "Active: %s\n", yesno(dev_priv->psr.active)); 1898 seq_printf(m, "Active: %s\n", yesno(dev_priv->psr.active));
1899 1899
1900 enabled = HAS_PSR(dev) && 1900 enabled = HAS_PSR(dev) &&
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index c5d157becc4f..d8115c3cc7a3 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -658,10 +658,11 @@ struct i915_drrs {
658 struct intel_connector *connector; 658 struct intel_connector *connector;
659}; 659};
660 660
661struct intel_dp;
661struct i915_psr { 662struct i915_psr {
662 bool sink_support; 663 bool sink_support;
663 bool source_ok; 664 bool source_ok;
664 bool enabled; 665 struct intel_dp *enabled;
665 bool active; 666 bool active;
666 struct delayed_work work; 667 struct delayed_work work;
667}; 668};
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 4017406b810d..457bd82373d7 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -1843,7 +1843,7 @@ static void intel_edp_psr_do_enable(struct intel_dp *intel_dp)
1843 /* Enable PSR on the host */ 1843 /* Enable PSR on the host */
1844 intel_edp_psr_enable_source(intel_dp); 1844 intel_edp_psr_enable_source(intel_dp);
1845 1845
1846 dev_priv->psr.enabled = true; 1846 dev_priv->psr.enabled = intel_dp;
1847 dev_priv->psr.active = true; 1847 dev_priv->psr.active = true;
1848} 1848}
1849 1849
@@ -1884,26 +1884,22 @@ void intel_edp_psr_disable(struct intel_dp *intel_dp)
1884 EDP_PSR_STATUS_STATE_MASK) == 0, 2000, 10)) 1884 EDP_PSR_STATUS_STATE_MASK) == 0, 2000, 10))
1885 DRM_ERROR("Timed out waiting for PSR Idle State\n"); 1885 DRM_ERROR("Timed out waiting for PSR Idle State\n");
1886 1886
1887 dev_priv->psr.enabled = false; 1887 dev_priv->psr.enabled = NULL;
1888} 1888}
1889 1889
1890static void intel_edp_psr_work(struct work_struct *work) 1890static void intel_edp_psr_work(struct work_struct *work)
1891{ 1891{
1892 struct drm_i915_private *dev_priv = 1892 struct drm_i915_private *dev_priv =
1893 container_of(work, typeof(*dev_priv), psr.work.work); 1893 container_of(work, typeof(*dev_priv), psr.work.work);
1894 struct drm_device *dev = dev_priv->dev; 1894 struct intel_dp *intel_dp = dev_priv->psr.enabled;
1895 struct intel_encoder *encoder;
1896 struct intel_dp *intel_dp = NULL;
1897 1895
1898 list_for_each_entry(encoder, &dev->mode_config.encoder_list, base.head) 1896 if (!intel_dp)
1899 if (encoder->type == INTEL_OUTPUT_EDP) { 1897 return;
1900 intel_dp = enc_to_intel_dp(&encoder->base);
1901 1898
1902 if (!intel_edp_psr_match_conditions(intel_dp)) 1899 if (!intel_edp_psr_match_conditions(intel_dp))
1903 intel_edp_psr_disable(intel_dp); 1900 intel_edp_psr_disable(intel_dp);
1904 else 1901 else
1905 intel_edp_psr_do_enable(intel_dp); 1902 intel_edp_psr_do_enable(intel_dp);
1906 }
1907} 1903}
1908 1904
1909static void intel_edp_psr_inactivate(struct drm_device *dev) 1905static void intel_edp_psr_inactivate(struct drm_device *dev)