@@ -8945,9 +8945,7 @@ void intel_modeset_init_hw(struct drm_device *dev)
intel_init_clock_gating(dev);
- mutex_lock(&dev->struct_mutex);
intel_enable_gt_powersave(dev);
- mutex_unlock(&dev->struct_mutex);
}
void intel_modeset_init(struct drm_device *dev)
@@ -2715,6 +2715,8 @@ void ironlake_teardown_rc6(struct drm_device *dev)
{
struct drm_i915_private *dev_priv = dev->dev_private;
+ WARN_ON(!mutex_is_locked(&dev->struct_mutex));
+
if (dev_priv->ips.renderctx) {
i915_gem_object_unpin(dev_priv->ips.renderctx);
drm_gem_object_unreference(&dev_priv->ips.renderctx->base);
@@ -2778,11 +2780,11 @@ static void ironlake_enable_rc6(struct drm_device *dev)
if (!intel_enable_rc6(dev))
return;
- WARN_ON(!mutex_is_locked(&dev->struct_mutex));
+ mutex_lock(&dev->struct_mutex);
ret = ironlake_setup_rc6(dev);
if (ret)
- return;
+ goto unlock;
was_interruptible = dev_priv->mm.interruptible;
dev_priv->mm.interruptible = false;
@@ -2795,7 +2797,7 @@ static void ironlake_enable_rc6(struct drm_device *dev)
if (ret) {
ironlake_teardown_rc6(dev);
dev_priv->mm.interruptible = was_interruptible;
- return;
+ goto unlock;
}
intel_ring_emit(ring, MI_SUSPEND_FLUSH | MI_SUSPEND_FLUSH_EN);
@@ -2820,11 +2822,14 @@ static void ironlake_enable_rc6(struct drm_device *dev)
if (ret) {
DRM_ERROR("failed to enable ironlake power power savings\n");
ironlake_teardown_rc6(dev);
- return;
+ goto unlock;
}
I915_WRITE(PWRCTXA, dev_priv->ips.pwrctx->gtt_offset | PWRCTX_EN);
I915_WRITE(RSTDBYCTL, I915_READ(RSTDBYCTL) & ~RCX_SW_EXIT);
+
+unlock:
+ mutex_lock(&dev->struct_mutex);
}
static unsigned long intel_pxfreq(u32 vidfreq)
Originally dev->struct_mutex protected all kinds of things for rps/ips (debugfs access, driver state, ...). Nowadays we have dev_priv->rps.lock for this, so only the ilk ips code needs it really. Push the locking down. I haven't yet changed the cleanup side since there we lock large parts of the code with struct_mutex. Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> --- drivers/gpu/drm/i915/intel_display.c | 2 -- drivers/gpu/drm/i915/intel_pm.c | 13 +++++++++---- 2 files changed, 9 insertions(+), 6 deletions(-)