aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorImre Deak <imre.deak@intel.com>2014-03-04 12:23:06 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2014-03-07 16:36:56 -0500
commit25eaa003bd186e415d94bf0191152f1cd7252d9a (patch)
tree5acadb0d3ddc2ceb2b42a7be293c0b92894a2253
parentdd7c0b66e5414c54a9af8f100cc904240bab5102 (diff)
drm/i915: sanity check power well sw state against hw state
Suggested by Daniel. v2: - sanitize the state checking condition, the original was rather confusing (partly due to the unfortunate naming of i915.disable_power_well) (Ville) - simpler message+backtrace generation by using WARN instead of WARN_ON (Ville) - check if always-on power wells are truly on all the time Signed-off-by: Imre Deak <imre.deak@intel.com> Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c38
1 files changed, 35 insertions, 3 deletions
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 19591488fd2a..5b039ca13927 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -5411,6 +5411,29 @@ static bool i9xx_always_on_power_well_enabled(struct drm_i915_private *dev_priv,
5411 return true; 5411 return true;
5412} 5412}
5413 5413
5414static void check_power_well_state(struct drm_i915_private *dev_priv,
5415 struct i915_power_well *power_well)
5416{
5417 bool enabled = power_well->ops->is_enabled(dev_priv, power_well);
5418
5419 if (power_well->always_on || !i915.disable_power_well) {
5420 if (!enabled)
5421 goto mismatch;
5422
5423 return;
5424 }
5425
5426 if (enabled != (power_well->count > 0))
5427 goto mismatch;
5428
5429 return;
5430
5431mismatch:
5432 WARN(1, "state mismatch for '%s' (always_on %d hw state %d use-count %d disable_power_well %d\n",
5433 power_well->name, power_well->always_on, enabled,
5434 power_well->count, i915.disable_power_well);
5435}
5436
5414void intel_display_power_get(struct drm_i915_private *dev_priv, 5437void intel_display_power_get(struct drm_i915_private *dev_priv,
5415 enum intel_display_power_domain domain) 5438 enum intel_display_power_domain domain)
5416{ 5439{
@@ -5422,9 +5445,14 @@ void intel_display_power_get(struct drm_i915_private *dev_priv,
5422 5445
5423 mutex_lock(&power_domains->lock); 5446 mutex_lock(&power_domains->lock);
5424 5447
5425 for_each_power_well(i, power_well, BIT(domain), power_domains) 5448 for_each_power_well(i, power_well, BIT(domain), power_domains) {
5426 if (!power_well->count++) 5449 if (!power_well->count++) {
5450 DRM_DEBUG_KMS("enabling %s\n", power_well->name);
5427 power_well->ops->enable(dev_priv, power_well); 5451 power_well->ops->enable(dev_priv, power_well);
5452 }
5453
5454 check_power_well_state(dev_priv, power_well);
5455 }
5428 5456
5429 power_domains->domain_use_count[domain]++; 5457 power_domains->domain_use_count[domain]++;
5430 5458
@@ -5448,8 +5476,12 @@ void intel_display_power_put(struct drm_i915_private *dev_priv,
5448 for_each_power_well_rev(i, power_well, BIT(domain), power_domains) { 5476 for_each_power_well_rev(i, power_well, BIT(domain), power_domains) {
5449 WARN_ON(!power_well->count); 5477 WARN_ON(!power_well->count);
5450 5478
5451 if (!--power_well->count && i915.disable_power_well) 5479 if (!--power_well->count && i915.disable_power_well) {
5480 DRM_DEBUG_KMS("disabling %s\n", power_well->name);
5452 power_well->ops->disable(dev_priv, power_well); 5481 power_well->ops->disable(dev_priv, power_well);
5482 }
5483
5484 check_power_well_state(dev_priv, power_well);
5453 } 5485 }
5454 5486
5455 mutex_unlock(&power_domains->lock); 5487 mutex_unlock(&power_domains->lock);