aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
authorBorun Fu <borun.fu@intel.com>2014-07-12 00:32:27 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2014-07-23 01:04:54 -0400
commitb04c5bd6fda54703e56f29569e4bca489d6c5a5c (patch)
tree85e14146da8f4e50bf4f961c26312c190bee217d /drivers/gpu/drm
parentb55dd64720919ba8d6830fbaec9e779e4bdb0ae0 (diff)
drm/i915: Power gating display wells during i915_pm_suspend
On VLV, after i915_pm_suspend display power wells are staying power ungated. So, after initiating mem sleep "echo mem > /sys/power/state" Display is staing D0 State. There might be better way/place to power gate these wells. Also, we need to make sure that if wells are power gated due to DPMS OFF sequence, they need not be turned off by i915_pm_suspend again. v2: Extracted helper for intel_crtc_disable and power gating CRTC power wells. [Daniel] Cc: Imre Deak <imre.deak@intel.com> Cc: Paulo Zanoni <paulo.r.zanoni@intel.com> Cc: Daniel Vetter <daniel.vetter@ffwll.ch> Cc: Jani Nikula <jani.nikula@linux.intel.com> Change-Id: I34c80da66aa24c423a5576c68aa1f3a8d0f43848 Signed-off-by: Borun Fu <borun.fu@intel.com> Signed-off-by: Sagar Kamble <sagar.a.kamble@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r--drivers/gpu/drm/i915/i915_drv.c7
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h4
-rw-r--r--drivers/gpu/drm/i915/intel_display.c30
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h1
4 files changed, 25 insertions, 17 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 23139aaa9431..de7d9a73eb2b 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -525,12 +525,11 @@ static int i915_drm_freeze(struct drm_device *dev)
525 525
526 /* 526 /*
527 * Disable CRTCs directly since we want to preserve sw state 527 * Disable CRTCs directly since we want to preserve sw state
528 * for _thaw. 528 * for _thaw. Also, power gate the CRTC power wells.
529 */ 529 */
530 drm_modeset_lock_all(dev); 530 drm_modeset_lock_all(dev);
531 for_each_crtc(dev, crtc) { 531 for_each_crtc(dev, crtc)
532 dev_priv->display.crtc_disable(crtc); 532 intel_crtc_control(crtc, false);
533 }
534 drm_modeset_unlock_all(dev); 533 drm_modeset_unlock_all(dev);
535 534
536 intel_modeset_suspend_hw(dev); 535 intel_modeset_suspend_hw(dev);
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 8620ea91e108..1c6640118a70 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -179,6 +179,10 @@ enum hpd_pin {
179 list_for_each_entry((intel_connector), &(dev)->mode_config.connector_list, base.head) \ 179 list_for_each_entry((intel_connector), &(dev)->mode_config.connector_list, base.head) \
180 if ((intel_connector)->base.encoder == (__encoder)) 180 if ((intel_connector)->base.encoder == (__encoder))
181 181
182#define for_each_power_domain(domain, mask) \
183 for ((domain) = 0; (domain) < POWER_DOMAIN_NUM; (domain)++) \
184 if ((1 << (domain)) & (mask))
185
182struct drm_i915_private; 186struct drm_i915_private;
183struct i915_mmu_object; 187struct i915_mmu_object;
184 188
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index d2b752dd0aaf..7e0dc46ec505 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -4300,10 +4300,6 @@ static void i9xx_pfit_enable(struct intel_crtc *crtc)
4300 I915_WRITE(BCLRPAT(crtc->pipe), 0); 4300 I915_WRITE(BCLRPAT(crtc->pipe), 0);
4301} 4301}
4302 4302
4303#define for_each_power_domain(domain, mask) \
4304 for ((domain) = 0; (domain) < POWER_DOMAIN_NUM; (domain)++) \
4305 if ((1 << (domain)) & (mask))
4306
4307enum intel_display_power_domain 4303enum intel_display_power_domain
4308intel_display_port_power_domain(struct intel_encoder *intel_encoder) 4304intel_display_port_power_domain(struct intel_encoder *intel_encoder)
4309{ 4305{
@@ -4872,21 +4868,14 @@ static void intel_crtc_update_sarea(struct drm_crtc *crtc,
4872 } 4868 }
4873} 4869}
4874 4870
4875/** 4871/* Master function to enable/disable CRTC and corresponding power wells */
4876 * Sets the power management mode of the pipe and plane. 4872void intel_crtc_control(struct drm_crtc *crtc, bool enable)
4877 */
4878void intel_crtc_update_dpms(struct drm_crtc *crtc)
4879{ 4873{
4880 struct drm_device *dev = crtc->dev; 4874 struct drm_device *dev = crtc->dev;
4881 struct drm_i915_private *dev_priv = dev->dev_private; 4875 struct drm_i915_private *dev_priv = dev->dev_private;
4882 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 4876 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
4883 struct intel_encoder *intel_encoder;
4884 enum intel_display_power_domain domain; 4877 enum intel_display_power_domain domain;
4885 unsigned long domains; 4878 unsigned long domains;
4886 bool enable = false;
4887
4888 for_each_encoder_on_crtc(dev, crtc, intel_encoder)
4889 enable |= intel_encoder->connectors_active;
4890 4879
4891 if (enable) { 4880 if (enable) {
4892 if (!intel_crtc->active) { 4881 if (!intel_crtc->active) {
@@ -4907,6 +4896,21 @@ void intel_crtc_update_dpms(struct drm_crtc *crtc)
4907 intel_crtc->enabled_power_domains = 0; 4896 intel_crtc->enabled_power_domains = 0;
4908 } 4897 }
4909 } 4898 }
4899}
4900
4901/**
4902 * Sets the power management mode of the pipe and plane.
4903 */
4904void intel_crtc_update_dpms(struct drm_crtc *crtc)
4905{
4906 struct drm_device *dev = crtc->dev;
4907 struct intel_encoder *intel_encoder;
4908 bool enable = false;
4909
4910 for_each_encoder_on_crtc(dev, crtc, intel_encoder)
4911 enable |= intel_encoder->connectors_active;
4912
4913 intel_crtc_control(crtc, enable);
4910 4914
4911 intel_crtc_update_sarea(crtc, enable); 4915 intel_crtc_update_sarea(crtc, enable);
4912} 4916}
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index fa19744ed6c0..b9540c01bab3 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -753,6 +753,7 @@ void intel_frontbuffer_flip(struct drm_device *dev,
753void intel_fb_obj_flush(struct drm_i915_gem_object *obj, bool retire); 753void intel_fb_obj_flush(struct drm_i915_gem_object *obj, bool retire);
754void intel_mark_idle(struct drm_device *dev); 754void intel_mark_idle(struct drm_device *dev);
755void intel_crtc_restore_mode(struct drm_crtc *crtc); 755void intel_crtc_restore_mode(struct drm_crtc *crtc);
756void intel_crtc_control(struct drm_crtc *crtc, bool enable);
756void intel_crtc_update_dpms(struct drm_crtc *crtc); 757void intel_crtc_update_dpms(struct drm_crtc *crtc);
757void intel_encoder_destroy(struct drm_encoder *encoder); 758void intel_encoder_destroy(struct drm_encoder *encoder);
758void intel_connector_dpms(struct drm_connector *, int mode); 759void intel_connector_dpms(struct drm_connector *, int mode);