aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2013-09-16 10:38:27 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-09-20 17:48:44 -0400
commit9cdb826c1452eeef1dfb5ebe64c27e7fa8616c49 (patch)
tree6237601982eeff0f0e3a0e4523803524157658f0
parent81c12f6e78c535533e9258bd9476b5d7419d3cce (diff)
drm/i915: Change i915_request power well handling
Reorganize the internal i915_request power well handling to use the reference count just like everyone else. This way all we need to do is check the reference count and we know whether the power well needs to be enabled of disabled. v2: Split he intel_display_power_{get,put} change to another patch. Add intel_resume_power_well() to make sure we enable the power well on resume Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Paulo Zanoni <paulo.r.zanoni@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h1
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c43
2 files changed, 35 insertions, 9 deletions
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index b85354f9440b..f1f11d10e485 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -764,6 +764,7 @@ extern bool intel_display_power_enabled(struct drm_device *dev,
764 enum intel_display_power_domain domain); 764 enum intel_display_power_domain domain);
765extern void intel_init_power_well(struct drm_device *dev); 765extern void intel_init_power_well(struct drm_device *dev);
766extern void intel_set_power_well(struct drm_device *dev, bool enable); 766extern void intel_set_power_well(struct drm_device *dev, bool enable);
767extern void intel_resume_power_well(struct drm_device *dev);
767extern void intel_enable_gt_powersave(struct drm_device *dev); 768extern void intel_enable_gt_powersave(struct drm_device *dev);
768extern void intel_disable_gt_powersave(struct drm_device *dev); 769extern void intel_disable_gt_powersave(struct drm_device *dev);
769extern void ironlake_teardown_rc6(struct drm_device *dev); 770extern void ironlake_teardown_rc6(struct drm_device *dev);
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 0d7e2d324f1b..609c936d1dfe 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -5354,8 +5354,7 @@ void i915_request_power_well(void)
5354 return; 5354 return;
5355 5355
5356 spin_lock_irq(&hsw_pwr->lock); 5356 spin_lock_irq(&hsw_pwr->lock);
5357 if (!hsw_pwr->count++ && 5357 if (!hsw_pwr->count++)
5358 !hsw_pwr->i915_request)
5359 __intel_set_power_well(hsw_pwr->device, true); 5358 __intel_set_power_well(hsw_pwr->device, true);
5360 spin_unlock_irq(&hsw_pwr->lock); 5359 spin_unlock_irq(&hsw_pwr->lock);
5361} 5360}
@@ -5369,8 +5368,7 @@ void i915_release_power_well(void)
5369 5368
5370 spin_lock_irq(&hsw_pwr->lock); 5369 spin_lock_irq(&hsw_pwr->lock);
5371 WARN_ON(!hsw_pwr->count); 5370 WARN_ON(!hsw_pwr->count);
5372 if (!--hsw_pwr->count && 5371 if (!--hsw_pwr->count)
5373 !hsw_pwr->i915_request)
5374 __intel_set_power_well(hsw_pwr->device, false); 5372 __intel_set_power_well(hsw_pwr->device, false);
5375 spin_unlock_irq(&hsw_pwr->lock); 5373 spin_unlock_irq(&hsw_pwr->lock);
5376} 5374}
@@ -5406,15 +5404,41 @@ void intel_set_power_well(struct drm_device *dev, bool enable)
5406 return; 5404 return;
5407 5405
5408 spin_lock_irq(&power_well->lock); 5406 spin_lock_irq(&power_well->lock);
5407
5408 /*
5409 * This function will only ever contribute one
5410 * to the power well reference count. i915_request
5411 * is what tracks whether we have or have not
5412 * added the one to the reference count.
5413 */
5414 if (power_well->i915_request == enable)
5415 goto out;
5416
5409 power_well->i915_request = enable; 5417 power_well->i915_request = enable;
5410 5418
5411 /* only reject "disable" power well request */ 5419 if (enable) {
5412 if (power_well->count && !enable) { 5420 if (!power_well->count++)
5413 spin_unlock_irq(&power_well->lock); 5421 __intel_set_power_well(dev, true);
5414 return; 5422 } else {
5423 WARN_ON(!power_well->count);
5424 if (!--power_well->count)
5425 __intel_set_power_well(dev, false);
5415 } 5426 }
5416 5427
5417 __intel_set_power_well(dev, enable); 5428 out:
5429 spin_unlock_irq(&power_well->lock);
5430}
5431
5432void intel_resume_power_well(struct drm_device *dev)
5433{
5434 struct drm_i915_private *dev_priv = dev->dev_private;
5435 struct i915_power_well *power_well = &dev_priv->power_well;
5436
5437 if (!HAS_POWER_WELL(dev))
5438 return;
5439
5440 spin_lock_irq(&power_well->lock);
5441 __intel_set_power_well(dev, power_well->count > 0);
5418 spin_unlock_irq(&power_well->lock); 5442 spin_unlock_irq(&power_well->lock);
5419} 5443}
5420 5444
@@ -5433,6 +5457,7 @@ void intel_init_power_well(struct drm_device *dev)
5433 5457
5434 /* For now, we need the power well to be always enabled. */ 5458 /* For now, we need the power well to be always enabled. */
5435 intel_set_power_well(dev, true); 5459 intel_set_power_well(dev, true);
5460 intel_resume_power_well(dev);
5436 5461
5437 /* We're taking over the BIOS, so clear any requests made by it since 5462 /* We're taking over the BIOS, so clear any requests made by it since
5438 * the driver is in charge now. */ 5463 * the driver is in charge now. */