aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_pm.c
diff options
context:
space:
mode:
authorImre Deak <imre.deak@intel.com>2013-10-25 10:36:48 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-10-27 12:38:13 -0400
commitbaa707073b6f5374a917f86f4a681149cd39dc64 (patch)
treebce25b2b87eb45f28d650c8126affff881144a69 /drivers/gpu/drm/i915/intel_pm.c
parent83c00f55302219fdac1f8628e61f2b63cffc58d5 (diff)
drm/i915: use power get/put instead of set for power on after init
Currently we make sure that all power domains are enabled during driver init and turn off unneded ones only after the first modeset. Similarly during suspend we enable all power domains, which will remain on through the following resume until the first modeset. This logic is supported by intel_set_power_well() in the power domain framework. It would be nice to simplify the API, so that we only have get/put functions and make it more explicit on the higher level how this "power well on during init" logic works. This will make it also easier if in the future we want to shorten the time the power wells are on. For this add a new device private flag tracking whether we have the power wells on because of init/suspend and use only intel_display_power_get()/put(). As nothing else uses intel_set_power_well() we can remove it. This also fixes commit 6efdf354ddb186c6604d1692075421e8d2c740e9 Author: Imre Deak <imre.deak@intel.com> Date: Wed Oct 16 17:25:52 2013 +0300 drm/i915: enable only the needed power domains during modeset where removing intel_set_power_well() resulted in not releasing the reference on the power well that was taken during init and thus leaving the power well on all the time. Regression reported by Paulo. v2: - move the init_power_on flag to the power_domains struct (Daniel) v3: - add note about this being a regression fix too (Paulo) Signed-off-by: Imre Deak <imre.deak@intel.com> Reviewed-by: Paulo Zanoni <paulo.r.zanoni@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_pm.c')
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c37
1 files changed, 1 insertions, 36 deletions
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 5869482f3f69..5ae6d533ebcd 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -5679,41 +5679,6 @@ void i915_remove_power_well(struct drm_device *dev)
5679 hsw_pwr = NULL; 5679 hsw_pwr = NULL;
5680} 5680}
5681 5681
5682void intel_set_power_well(struct drm_device *dev, bool enable)
5683{
5684 struct drm_i915_private *dev_priv = dev->dev_private;
5685 struct i915_power_domains *power_domains = &dev_priv->power_domains;
5686 struct i915_power_well *power_well;
5687
5688 if (!HAS_POWER_WELL(dev))
5689 return;
5690
5691 if (!i915_disable_power_well && !enable)
5692 return;
5693
5694 mutex_lock(&power_domains->lock);
5695
5696 power_well = &power_domains->power_wells[0];
5697 /*
5698 * This function will only ever contribute one
5699 * to the power well reference count. i915_request
5700 * is what tracks whether we have or have not
5701 * added the one to the reference count.
5702 */
5703 if (power_well->i915_request == enable)
5704 goto out;
5705
5706 power_well->i915_request = enable;
5707
5708 if (enable)
5709 __intel_power_well_get(power_well);
5710 else
5711 __intel_power_well_put(power_well);
5712
5713 out:
5714 mutex_unlock(&power_domains->lock);
5715}
5716
5717static void intel_resume_power_well(struct drm_device *dev) 5682static void intel_resume_power_well(struct drm_device *dev)
5718{ 5683{
5719 struct drm_i915_private *dev_priv = dev->dev_private; 5684 struct drm_i915_private *dev_priv = dev->dev_private;
@@ -5745,7 +5710,7 @@ void intel_init_power_well(struct drm_device *dev)
5745 return; 5710 return;
5746 5711
5747 /* For now, we need the power well to be always enabled. */ 5712 /* For now, we need the power well to be always enabled. */
5748 intel_set_power_well(dev, true); 5713 intel_display_set_init_power(dev, true);
5749 intel_resume_power_well(dev); 5714 intel_resume_power_well(dev);
5750 5715
5751 /* We're taking over the BIOS, so clear any requests made by it since 5716 /* We're taking over the BIOS, so clear any requests made by it since