diff options
-rw-r--r-- | drivers/gpu/drm/i915/intel_drv.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 43 |
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); |
765 | extern void intel_init_power_well(struct drm_device *dev); | 765 | extern void intel_init_power_well(struct drm_device *dev); |
766 | extern void intel_set_power_well(struct drm_device *dev, bool enable); | 766 | extern void intel_set_power_well(struct drm_device *dev, bool enable); |
767 | extern void intel_resume_power_well(struct drm_device *dev); | ||
767 | extern void intel_enable_gt_powersave(struct drm_device *dev); | 768 | extern void intel_enable_gt_powersave(struct drm_device *dev); |
768 | extern void intel_disable_gt_powersave(struct drm_device *dev); | 769 | extern void intel_disable_gt_powersave(struct drm_device *dev); |
769 | extern void ironlake_teardown_rc6(struct drm_device *dev); | 770 | extern 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 | |||
5432 | void 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. */ |