Commit 3e038e9d2df3167f234ff7b5730642319d590e99

Authored by Ville Syrjälä
Committed by Greg Kroah-Hartman
1 parent 65f81ccbd1

drm/i915: Kill check_power_well() calls

commit 7f1241ed1a06b4846ad7a2a57eb088b757e58e16 upstream.

pps_{lock,unlock}() call intel_display_power_{get,put}() outside
pps_mutes to avoid deadlocks with the power_domain mutex. In theory
during aux transfers we should usually have the relevant power domain
references already held by some higher level code, so this should not
result in much overhead (exception being userspace i2c-dev access).
However thanks to the check_power_well() calls in
intel_display_power_{get/put}() we end up doing a few Punit reads for
each aux transfer. Obviously doing this for each byte transferred via
i2c-over-aux is not a good idea.

I can't think of a good way to keep check_power_well() while eliminating
the overhead, so let's just remove check_power_well() entirely.

Fixes a driver init time regression introduced by:
 commit 773538e86081d146e0020435d614f4b96996c1f9
 Author: Ville Syrjälä <ville.syrjala@linux.intel.com>
 Date:   Thu Sep 4 14:54:56 2014 +0300

    drm/i915: Reset power sequencer pipe tracking when disp2d is off

Credit goes to Jani for figuring this out.

v2: Add the regression note in the commit message.

Cc: Egbert Eich <eich@suse.de>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=86201
Tested-by: Wendy Wang <wendy.wang@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
[Jani: s/intel_runtime_pm.c/intel_pm.c/g and wiggle for 3.18]
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Showing 1 changed file with 0 additions and 27 deletions Side-by-side Diff

drivers/gpu/drm/i915/intel_pm.c
... ... @@ -6520,29 +6520,6 @@
6520 6520 chv_set_pipe_power_well(dev_priv, power_well, false);
6521 6521 }
6522 6522  
6523   -static void check_power_well_state(struct drm_i915_private *dev_priv,
6524   - struct i915_power_well *power_well)
6525   -{
6526   - bool enabled = power_well->ops->is_enabled(dev_priv, power_well);
6527   -
6528   - if (power_well->always_on || !i915.disable_power_well) {
6529   - if (!enabled)
6530   - goto mismatch;
6531   -
6532   - return;
6533   - }
6534   -
6535   - if (enabled != (power_well->count > 0))
6536   - goto mismatch;
6537   -
6538   - return;
6539   -
6540   -mismatch:
6541   - WARN(1, "state mismatch for '%s' (always_on %d hw state %d use-count %d disable_power_well %d\n",
6542   - power_well->name, power_well->always_on, enabled,
6543   - power_well->count, i915.disable_power_well);
6544   -}
6545   -
6546 6523 void intel_display_power_get(struct drm_i915_private *dev_priv,
6547 6524 enum intel_display_power_domain domain)
6548 6525 {
... ... @@ -6562,8 +6539,6 @@
6562 6539 power_well->ops->enable(dev_priv, power_well);
6563 6540 power_well->hw_enabled = true;
6564 6541 }
6565   -
6566   - check_power_well_state(dev_priv, power_well);
6567 6542 }
6568 6543  
6569 6544 power_domains->domain_use_count[domain]++;
... ... @@ -6593,8 +6568,6 @@
6593 6568 power_well->hw_enabled = false;
6594 6569 power_well->ops->disable(dev_priv, power_well);
6595 6570 }
6596   -
6597   - check_power_well_state(dev_priv, power_well);
6598 6571 }
6599 6572  
6600 6573 mutex_unlock(&power_domains->lock);