aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_pm.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/intel_pm.c')
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c43
1 files changed, 34 insertions, 9 deletions
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. */