drm/i915/ilk: Move register read under spinlock
authorTvrtko Ursulin <tvrtko.ursulin@intel.com>
Thu, 11 Feb 2016 10:27:32 +0000 (10:27 +0000)
committerTvrtko Ursulin <tvrtko.ursulin@intel.com>
Mon, 15 Feb 2016 16:10:19 +0000 (16:10 +0000)
Code does read-modify-write but the read was outside the lock.

It is fine since the caller holds struct mutex, but if we
correct this we open up the opportunity for decreasing the
mutex duration time since the call to ironlake_enable_drps
does not need it any longer since it is covered by the
mchdev_lock lock.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: http://patchwork.freedesktop.org/patch/msgid/1455186452-13691-2-git-send-email-tvrtko.ursulin@linux.intel.com
drivers/gpu/drm/i915/intel_pm.c

index 8e869f183404093f8eca597aba5fefcb76fba863..b63cdb23b222f811f3a1153d2377e31dd7917756 100644 (file)
@@ -4116,11 +4116,13 @@ bool ironlake_set_drps(struct drm_device *dev, u8 val)
 static void ironlake_enable_drps(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       u32 rgvmodectl = I915_READ(MEMMODECTL);
+       u32 rgvmodectl;
        u8 fmax, fmin, fstart, vstart;
 
        spin_lock_irq(&mchdev_lock);
 
+       rgvmodectl = I915_READ(MEMMODECTL);
+
        /* Enable temp reporting */
        I915_WRITE16(PMMISC, I915_READ(PMMISC) | MCPPCE_EN);
        I915_WRITE16(TSC1, I915_READ(TSC1) | TSE);
@@ -6240,8 +6242,8 @@ void intel_enable_gt_powersave(struct drm_device *dev)
                return;
 
        if (IS_IRONLAKE_M(dev)) {
-               mutex_lock(&dev->struct_mutex);
                ironlake_enable_drps(dev);
+               mutex_lock(&dev->struct_mutex);
                intel_init_emon(dev);
                mutex_unlock(&dev->struct_mutex);
        } else if (INTEL_INFO(dev)->gen >= 6) {