static bool gen5_rps_enable(struct intel_rps *rps)
 {
+       struct drm_i915_private *i915 = rps_to_i915(rps);
        struct intel_uncore *uncore = rps_to_uncore(rps);
        u8 fstart, vstart;
        u32 rgvmodectl;
        rps->ips.last_count2 = intel_uncore_read(uncore, GFXEC);
        rps->ips.last_time2 = ktime_get_raw_ns();
 
+       spin_lock(&i915->irq_lock);
+       ilk_enable_display_irq(i915, DE_PCU_EVENT);
+       spin_unlock(&i915->irq_lock);
+
        spin_unlock_irq(&mchdev_lock);
 
        rps->ips.corr = init_emon(uncore);
 
 static void gen5_rps_disable(struct intel_rps *rps)
 {
+       struct drm_i915_private *i915 = rps_to_i915(rps);
        struct intel_uncore *uncore = rps_to_uncore(rps);
        u16 rgvswctl;
 
        spin_lock_irq(&mchdev_lock);
 
+       spin_lock(&i915->irq_lock);
+       ilk_disable_display_irq(i915, DE_PCU_EVENT);
+       spin_unlock(&i915->irq_lock);
+
        rgvswctl = intel_uncore_read16(uncore, MEMSWCTL);
 
        /* Ack interrupts, disable EFC interrupt */
                           intel_uncore_read(uncore, MEMINTREN) &
                           ~MEMINT_EVAL_CHG_EN);
        intel_uncore_write(uncore, MEMINTRSTS, MEMINT_EVAL_CHG);
-       intel_uncore_write(uncore, DEIER,
-                          intel_uncore_read(uncore, DEIER) & ~DE_PCU_EVENT);
-       intel_uncore_write(uncore, DEIIR, DE_PCU_EVENT);
-       intel_uncore_write(uncore, DEIMR,
-                          intel_uncore_read(uncore, DEIMR) | DE_PCU_EVENT);
 
        /* Go back to the starting frequency */
        gen5_rps_set(rps, rps->idle_freq);
 
                display_mask = (DE_MASTER_IRQ_CONTROL | DE_GSE | DE_PCH_EVENT |
                                DE_AUX_CHANNEL_A | DE_PIPEB_CRC_DONE |
                                DE_PIPEA_CRC_DONE | DE_POISON);
-               extra_mask = (DE_PIPEA_VBLANK | DE_PIPEB_VBLANK | DE_PCU_EVENT |
+               extra_mask = (DE_PIPEA_VBLANK | DE_PIPEB_VBLANK |
                              DE_PIPEB_FIFO_UNDERRUN | DE_PIPEA_FIFO_UNDERRUN |
                              DE_DP_A_HOTPLUG);
        }
                display_mask |= DE_EDP_PSR_INT_HSW;
        }
 
+       if (IS_IRONLAKE_M(dev_priv))
+               extra_mask |= DE_PCU_EVENT;
+
        dev_priv->irq_mask = ~display_mask;
 
        ibx_irq_pre_postinstall(dev_priv);
        ilk_hpd_detection_setup(dev_priv);
 
        ibx_irq_postinstall(dev_priv);
-
-       if (IS_IRONLAKE_M(dev_priv)) {
-               /* Enable PCU event interrupts
-                *
-                * spinlocking not required here for correctness since interrupt
-                * setup is guaranteed to run in single-threaded context. But we
-                * need it to make the assert_spin_locked happy. */
-               spin_lock_irq(&dev_priv->irq_lock);
-               ilk_enable_display_irq(dev_priv, DE_PCU_EVENT);
-               spin_unlock_irq(&dev_priv->irq_lock);
-       }
 }
 
 void valleyview_enable_display_irqs(struct drm_i915_private *dev_priv)