unsigned int rotation = plane_state->base.rotation;
        int x = plane_state->base.src.x1 >> 16;
        int y = plane_state->base.src.y1 >> 16;
+       unsigned long irqflags;
 
        dspcntr = DISPPLANE_GAMMA_ENABLE;
 
        intel_crtc->adjusted_x = x;
        intel_crtc->adjusted_y = y;
 
+       spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
+
        if (INTEL_GEN(dev_priv) < 4) {
                /* pipesrc and dspsize control the size that is scaled from,
                 * which should always be the user's requested size.
                 */
-               I915_WRITE(DSPSIZE(plane),
-                          ((crtc_state->pipe_src_h - 1) << 16) |
-                          (crtc_state->pipe_src_w - 1));
-               I915_WRITE(DSPPOS(plane), 0);
+               I915_WRITE_FW(DSPSIZE(plane),
+                             ((crtc_state->pipe_src_h - 1) << 16) |
+                             (crtc_state->pipe_src_w - 1));
+               I915_WRITE_FW(DSPPOS(plane), 0);
        } else if (IS_CHERRYVIEW(dev_priv) && plane == PLANE_B) {
-               I915_WRITE(PRIMSIZE(plane),
-                          ((crtc_state->pipe_src_h - 1) << 16) |
-                          (crtc_state->pipe_src_w - 1));
-               I915_WRITE(PRIMPOS(plane), 0);
-               I915_WRITE(PRIMCNSTALPHA(plane), 0);
+               I915_WRITE_FW(PRIMSIZE(plane),
+                             ((crtc_state->pipe_src_h - 1) << 16) |
+                             (crtc_state->pipe_src_w - 1));
+               I915_WRITE_FW(PRIMPOS(plane), 0);
+               I915_WRITE_FW(PRIMCNSTALPHA(plane), 0);
        }
 
-       I915_WRITE(reg, dspcntr);
+       I915_WRITE_FW(reg, dspcntr);
 
-       I915_WRITE(DSPSTRIDE(plane), fb->pitches[0]);
+       I915_WRITE_FW(DSPSTRIDE(plane), fb->pitches[0]);
        if (INTEL_GEN(dev_priv) >= 4) {
-               I915_WRITE(DSPSURF(plane),
-                          intel_plane_ggtt_offset(plane_state) +
-                          intel_crtc->dspaddr_offset);
-               I915_WRITE(DSPTILEOFF(plane), (y << 16) | x);
-               I915_WRITE(DSPLINOFF(plane), linear_offset);
+               I915_WRITE_FW(DSPSURF(plane),
+                             intel_plane_ggtt_offset(plane_state) +
+                             intel_crtc->dspaddr_offset);
+               I915_WRITE_FW(DSPTILEOFF(plane), (y << 16) | x);
+               I915_WRITE_FW(DSPLINOFF(plane), linear_offset);
        } else {
-               I915_WRITE(DSPADDR(plane),
-                          intel_plane_ggtt_offset(plane_state) +
-                          intel_crtc->dspaddr_offset);
+               I915_WRITE_FW(DSPADDR(plane),
+                             intel_plane_ggtt_offset(plane_state) +
+                             intel_crtc->dspaddr_offset);
        }
-       POSTING_READ(reg);
+       POSTING_READ_FW(reg);
+
+       spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
 }
 
 static void i9xx_disable_primary_plane(struct drm_plane *primary,
        struct drm_i915_private *dev_priv = to_i915(dev);
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        int plane = intel_crtc->plane;
+       unsigned long irqflags;
 
-       I915_WRITE(DSPCNTR(plane), 0);
+       spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
+
+       I915_WRITE_FW(DSPCNTR(plane), 0);
        if (INTEL_INFO(dev_priv)->gen >= 4)
-               I915_WRITE(DSPSURF(plane), 0);
+               I915_WRITE_FW(DSPSURF(plane), 0);
        else
-               I915_WRITE(DSPADDR(plane), 0);
-       POSTING_READ(DSPCNTR(plane));
+               I915_WRITE_FW(DSPADDR(plane), 0);
+       POSTING_READ_FW(DSPCNTR(plane));
+
+       spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
 }
 
 static void ironlake_update_primary_plane(struct drm_plane *primary,
        unsigned int rotation = plane_state->base.rotation;
        int x = plane_state->base.src.x1 >> 16;
        int y = plane_state->base.src.y1 >> 16;
+       unsigned long irqflags;
 
        dspcntr = DISPPLANE_GAMMA_ENABLE;
        dspcntr |= DISPLAY_PLANE_ENABLE;
        intel_crtc->adjusted_x = x;
        intel_crtc->adjusted_y = y;
 
-       I915_WRITE(reg, dspcntr);
+       spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
+
+       I915_WRITE_FW(reg, dspcntr);
 
-       I915_WRITE(DSPSTRIDE(plane), fb->pitches[0]);
-       I915_WRITE(DSPSURF(plane),
-                  intel_plane_ggtt_offset(plane_state) +
-                  intel_crtc->dspaddr_offset);
+       I915_WRITE_FW(DSPSTRIDE(plane), fb->pitches[0]);
+       I915_WRITE_FW(DSPSURF(plane),
+                     intel_plane_ggtt_offset(plane_state) +
+                     intel_crtc->dspaddr_offset);
        if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) {
-               I915_WRITE(DSPOFFSET(plane), (y << 16) | x);
+               I915_WRITE_FW(DSPOFFSET(plane), (y << 16) | x);
        } else {
-               I915_WRITE(DSPTILEOFF(plane), (y << 16) | x);
-               I915_WRITE(DSPLINOFF(plane), linear_offset);
+               I915_WRITE_FW(DSPTILEOFF(plane), (y << 16) | x);
+               I915_WRITE_FW(DSPLINOFF(plane), linear_offset);
        }
-       POSTING_READ(reg);
+       POSTING_READ_FW(reg);
+
+       spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
 }
 
 static u32
        int dst_y = plane_state->base.dst.y1;
        int dst_w = drm_rect_width(&plane_state->base.dst);
        int dst_h = drm_rect_height(&plane_state->base.dst);
+       unsigned long irqflags;
 
        plane_ctl = PLANE_CTL_ENABLE;
 
        intel_crtc->adjusted_x = src_x;
        intel_crtc->adjusted_y = src_y;
 
+       spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
+
        if (IS_GEMINILAKE(dev_priv)) {
-               I915_WRITE(PLANE_COLOR_CTL(pipe, plane_id),
-                          PLANE_COLOR_PIPE_GAMMA_ENABLE |
-                          PLANE_COLOR_PIPE_CSC_ENABLE |
-                          PLANE_COLOR_PLANE_GAMMA_DISABLE);
+               I915_WRITE_FW(PLANE_COLOR_CTL(pipe, plane_id),
+                             PLANE_COLOR_PIPE_GAMMA_ENABLE |
+                             PLANE_COLOR_PIPE_CSC_ENABLE |
+                             PLANE_COLOR_PLANE_GAMMA_DISABLE);
        }
 
-       I915_WRITE(PLANE_CTL(pipe, plane_id), plane_ctl);
-       I915_WRITE(PLANE_OFFSET(pipe, plane_id), (src_y << 16) | src_x);
-       I915_WRITE(PLANE_STRIDE(pipe, plane_id), stride);
-       I915_WRITE(PLANE_SIZE(pipe, plane_id), (src_h << 16) | src_w);
+       I915_WRITE_FW(PLANE_CTL(pipe, plane_id), plane_ctl);
+       I915_WRITE_FW(PLANE_OFFSET(pipe, plane_id), (src_y << 16) | src_x);
+       I915_WRITE_FW(PLANE_STRIDE(pipe, plane_id), stride);
+       I915_WRITE_FW(PLANE_SIZE(pipe, plane_id), (src_h << 16) | src_w);
 
        if (scaler_id >= 0) {
                uint32_t ps_ctrl = 0;
                WARN_ON(!dst_w || !dst_h);
                ps_ctrl = PS_SCALER_EN | PS_PLANE_SEL(plane_id) |
                        crtc_state->scaler_state.scalers[scaler_id].mode;
-               I915_WRITE(SKL_PS_CTRL(pipe, scaler_id), ps_ctrl);
-               I915_WRITE(SKL_PS_PWR_GATE(pipe, scaler_id), 0);
-               I915_WRITE(SKL_PS_WIN_POS(pipe, scaler_id), (dst_x << 16) | dst_y);
-               I915_WRITE(SKL_PS_WIN_SZ(pipe, scaler_id), (dst_w << 16) | dst_h);
-               I915_WRITE(PLANE_POS(pipe, plane_id), 0);
+               I915_WRITE_FW(SKL_PS_CTRL(pipe, scaler_id), ps_ctrl);
+               I915_WRITE_FW(SKL_PS_PWR_GATE(pipe, scaler_id), 0);
+               I915_WRITE_FW(SKL_PS_WIN_POS(pipe, scaler_id), (dst_x << 16) | dst_y);
+               I915_WRITE_FW(SKL_PS_WIN_SZ(pipe, scaler_id), (dst_w << 16) | dst_h);
+               I915_WRITE_FW(PLANE_POS(pipe, plane_id), 0);
        } else {
-               I915_WRITE(PLANE_POS(pipe, plane_id), (dst_y << 16) | dst_x);
+               I915_WRITE_FW(PLANE_POS(pipe, plane_id), (dst_y << 16) | dst_x);
        }
 
-       I915_WRITE(PLANE_SURF(pipe, plane_id),
-                  intel_plane_ggtt_offset(plane_state) + surf_addr);
+       I915_WRITE_FW(PLANE_SURF(pipe, plane_id),
+                     intel_plane_ggtt_offset(plane_state) + surf_addr);
+
+       POSTING_READ_FW(PLANE_SURF(pipe, plane_id));
 
-       POSTING_READ(PLANE_SURF(pipe, plane_id));
+       spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
 }
 
 static void skylake_disable_primary_plane(struct drm_plane *primary,
        struct drm_i915_private *dev_priv = to_i915(dev);
        enum plane_id plane_id = to_intel_plane(primary)->id;
        enum pipe pipe = to_intel_plane(primary)->pipe;
+       unsigned long irqflags;
 
-       I915_WRITE(PLANE_CTL(pipe, plane_id), 0);
-       I915_WRITE(PLANE_SURF(pipe, plane_id), 0);
-       POSTING_READ(PLANE_SURF(pipe, plane_id));
+       spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
+
+       I915_WRITE_FW(PLANE_CTL(pipe, plane_id), 0);
+       I915_WRITE_FW(PLANE_SURF(pipe, plane_id), 0);
+       POSTING_READ_FW(PLANE_SURF(pipe, plane_id));
+
+       spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
 }
 
 /* Assume fb object is pinned & idle & fenced and just update base pointers */
                /* On these chipsets we can only modify the base/size/stride
                 * whilst the cursor is disabled.
                 */
-               I915_WRITE(CURCNTR(PIPE_A), 0);
-               POSTING_READ(CURCNTR(PIPE_A));
+               I915_WRITE_FW(CURCNTR(PIPE_A), 0);
+               POSTING_READ_FW(CURCNTR(PIPE_A));
                intel_crtc->cursor_cntl = 0;
        }
 
        if (intel_crtc->cursor_base != base) {
-               I915_WRITE(CURBASE(PIPE_A), base);
+               I915_WRITE_FW(CURBASE(PIPE_A), base);
                intel_crtc->cursor_base = base;
        }
 
        if (intel_crtc->cursor_size != size) {
-               I915_WRITE(CURSIZE, size);
+               I915_WRITE_FW(CURSIZE, size);
                intel_crtc->cursor_size = size;
        }
 
        if (intel_crtc->cursor_cntl != cntl) {
-               I915_WRITE(CURCNTR(PIPE_A), cntl);
-               POSTING_READ(CURCNTR(PIPE_A));
+               I915_WRITE_FW(CURCNTR(PIPE_A), cntl);
+               POSTING_READ_FW(CURCNTR(PIPE_A));
                intel_crtc->cursor_cntl = cntl;
        }
 }
        }
 
        if (intel_crtc->cursor_cntl != cntl) {
-               I915_WRITE(CURCNTR(pipe), cntl);
-               POSTING_READ(CURCNTR(pipe));
+               I915_WRITE_FW(CURCNTR(pipe), cntl);
+               POSTING_READ_FW(CURCNTR(pipe));
                intel_crtc->cursor_cntl = cntl;
        }
 
        /* and commit changes on next vblank */
-       I915_WRITE(CURBASE(pipe), base);
-       POSTING_READ(CURBASE(pipe));
+       I915_WRITE_FW(CURBASE(pipe), base);
+       POSTING_READ_FW(CURBASE(pipe));
 
        intel_crtc->cursor_base = base;
 }
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        int pipe = intel_crtc->pipe;
        u32 base = intel_crtc->cursor_addr;
+       unsigned long irqflags;
        u32 pos = 0;
 
        if (plane_state) {
                }
        }
 
-       I915_WRITE(CURPOS(pipe), pos);
+       spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
+
+       I915_WRITE_FW(CURPOS(pipe), pos);
 
        if (IS_I845G(dev_priv) || IS_I865G(dev_priv))
                i845_update_cursor(crtc, base, plane_state);
        else
                i9xx_update_cursor(crtc, base, plane_state);
+
+       spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
 }
 
 static bool cursor_size_ok(struct drm_i915_private *dev_priv,
 
        uint32_t y = plane_state->main.y;
        uint32_t src_w = drm_rect_width(&plane_state->base.src) >> 16;
        uint32_t src_h = drm_rect_height(&plane_state->base.src) >> 16;
+       unsigned long irqflags;
 
        plane_ctl = PLANE_CTL_ENABLE;
 
        crtc_w--;
        crtc_h--;
 
+       spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
+
        if (IS_GEMINILAKE(dev_priv)) {
-               I915_WRITE(PLANE_COLOR_CTL(pipe, plane_id),
-                          PLANE_COLOR_PIPE_GAMMA_ENABLE |
-                          PLANE_COLOR_PIPE_CSC_ENABLE |
-                          PLANE_COLOR_PLANE_GAMMA_DISABLE);
+               I915_WRITE_FW(PLANE_COLOR_CTL(pipe, plane_id),
+                             PLANE_COLOR_PIPE_GAMMA_ENABLE |
+                             PLANE_COLOR_PIPE_CSC_ENABLE |
+                             PLANE_COLOR_PLANE_GAMMA_DISABLE);
        }
 
        if (key->flags) {
-               I915_WRITE(PLANE_KEYVAL(pipe, plane_id), key->min_value);
-               I915_WRITE(PLANE_KEYMAX(pipe, plane_id), key->max_value);
-               I915_WRITE(PLANE_KEYMSK(pipe, plane_id), key->channel_mask);
+               I915_WRITE_FW(PLANE_KEYVAL(pipe, plane_id), key->min_value);
+               I915_WRITE_FW(PLANE_KEYMAX(pipe, plane_id), key->max_value);
+               I915_WRITE_FW(PLANE_KEYMSK(pipe, plane_id), key->channel_mask);
        }
 
-       I915_WRITE(PLANE_OFFSET(pipe, plane_id), (y << 16) | x);
-       I915_WRITE(PLANE_STRIDE(pipe, plane_id), stride);
-       I915_WRITE(PLANE_SIZE(pipe, plane_id), (src_h << 16) | src_w);
+       I915_WRITE_FW(PLANE_OFFSET(pipe, plane_id), (y << 16) | x);
+       I915_WRITE_FW(PLANE_STRIDE(pipe, plane_id), stride);
+       I915_WRITE_FW(PLANE_SIZE(pipe, plane_id), (src_h << 16) | src_w);
 
        /* program plane scaler */
        if (plane_state->scaler_id >= 0) {
 
                scaler = &crtc_state->scaler_state.scalers[scaler_id];
 
-               I915_WRITE(SKL_PS_CTRL(pipe, scaler_id),
-                          PS_SCALER_EN | PS_PLANE_SEL(plane_id) | scaler->mode);
-               I915_WRITE(SKL_PS_PWR_GATE(pipe, scaler_id), 0);
-               I915_WRITE(SKL_PS_WIN_POS(pipe, scaler_id), (crtc_x << 16) | crtc_y);
-               I915_WRITE(SKL_PS_WIN_SZ(pipe, scaler_id),
-                       ((crtc_w + 1) << 16)|(crtc_h + 1));
+               I915_WRITE_FW(SKL_PS_CTRL(pipe, scaler_id),
+                             PS_SCALER_EN | PS_PLANE_SEL(plane_id) | scaler->mode);
+               I915_WRITE_FW(SKL_PS_PWR_GATE(pipe, scaler_id), 0);
+               I915_WRITE_FW(SKL_PS_WIN_POS(pipe, scaler_id), (crtc_x << 16) | crtc_y);
+               I915_WRITE_FW(SKL_PS_WIN_SZ(pipe, scaler_id),
+                             ((crtc_w + 1) << 16)|(crtc_h + 1));
 
-               I915_WRITE(PLANE_POS(pipe, plane_id), 0);
+               I915_WRITE_FW(PLANE_POS(pipe, plane_id), 0);
        } else {
-               I915_WRITE(PLANE_POS(pipe, plane_id), (crtc_y << 16) | crtc_x);
+               I915_WRITE_FW(PLANE_POS(pipe, plane_id), (crtc_y << 16) | crtc_x);
        }
 
-       I915_WRITE(PLANE_CTL(pipe, plane_id), plane_ctl);
-       I915_WRITE(PLANE_SURF(pipe, plane_id),
-                  intel_plane_ggtt_offset(plane_state) + surf_addr);
-       POSTING_READ(PLANE_SURF(pipe, plane_id));
+       I915_WRITE_FW(PLANE_CTL(pipe, plane_id), plane_ctl);
+       I915_WRITE_FW(PLANE_SURF(pipe, plane_id),
+                     intel_plane_ggtt_offset(plane_state) + surf_addr);
+       POSTING_READ_FW(PLANE_SURF(pipe, plane_id));
+
+       spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
 }
 
 static void
        struct intel_plane *intel_plane = to_intel_plane(dplane);
        enum plane_id plane_id = intel_plane->id;
        enum pipe pipe = intel_plane->pipe;
+       unsigned long irqflags;
+
+       spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
 
-       I915_WRITE(PLANE_CTL(pipe, plane_id), 0);
+       I915_WRITE_FW(PLANE_CTL(pipe, plane_id), 0);
 
-       I915_WRITE(PLANE_SURF(pipe, plane_id), 0);
-       POSTING_READ(PLANE_SURF(pipe, plane_id));
+       I915_WRITE_FW(PLANE_SURF(pipe, plane_id), 0);
+       POSTING_READ_FW(PLANE_SURF(pipe, plane_id));
+
+       spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
 }
 
 static void
         * Cb and Cr apparently come in as signed already, so no
         * need for any offset. For Y we need to remove the offset.
         */
-       I915_WRITE(SPCSCYGOFF(plane_id), SPCSC_OOFF(0) | SPCSC_IOFF(-64));
-       I915_WRITE(SPCSCCBOFF(plane_id), SPCSC_OOFF(0) | SPCSC_IOFF(0));
-       I915_WRITE(SPCSCCROFF(plane_id), SPCSC_OOFF(0) | SPCSC_IOFF(0));
-
-       I915_WRITE(SPCSCC01(plane_id), SPCSC_C1(4769) | SPCSC_C0(6537));
-       I915_WRITE(SPCSCC23(plane_id), SPCSC_C1(-3330) | SPCSC_C0(0));
-       I915_WRITE(SPCSCC45(plane_id), SPCSC_C1(-1605) | SPCSC_C0(4769));
-       I915_WRITE(SPCSCC67(plane_id), SPCSC_C1(4769) | SPCSC_C0(0));
-       I915_WRITE(SPCSCC8(plane_id), SPCSC_C0(8263));
-
-       I915_WRITE(SPCSCYGICLAMP(plane_id), SPCSC_IMAX(940) | SPCSC_IMIN(64));
-       I915_WRITE(SPCSCCBICLAMP(plane_id), SPCSC_IMAX(448) | SPCSC_IMIN(-448));
-       I915_WRITE(SPCSCCRICLAMP(plane_id), SPCSC_IMAX(448) | SPCSC_IMIN(-448));
-
-       I915_WRITE(SPCSCYGOCLAMP(plane_id), SPCSC_OMAX(1023) | SPCSC_OMIN(0));
-       I915_WRITE(SPCSCCBOCLAMP(plane_id), SPCSC_OMAX(1023) | SPCSC_OMIN(0));
-       I915_WRITE(SPCSCCROCLAMP(plane_id), SPCSC_OMAX(1023) | SPCSC_OMIN(0));
+       I915_WRITE_FW(SPCSCYGOFF(plane_id), SPCSC_OOFF(0) | SPCSC_IOFF(-64));
+       I915_WRITE_FW(SPCSCCBOFF(plane_id), SPCSC_OOFF(0) | SPCSC_IOFF(0));
+       I915_WRITE_FW(SPCSCCROFF(plane_id), SPCSC_OOFF(0) | SPCSC_IOFF(0));
+
+       I915_WRITE_FW(SPCSCC01(plane_id), SPCSC_C1(4769) | SPCSC_C0(6537));
+       I915_WRITE_FW(SPCSCC23(plane_id), SPCSC_C1(-3330) | SPCSC_C0(0));
+       I915_WRITE_FW(SPCSCC45(plane_id), SPCSC_C1(-1605) | SPCSC_C0(4769));
+       I915_WRITE_FW(SPCSCC67(plane_id), SPCSC_C1(4769) | SPCSC_C0(0));
+       I915_WRITE_FW(SPCSCC8(plane_id), SPCSC_C0(8263));
+
+       I915_WRITE_FW(SPCSCYGICLAMP(plane_id), SPCSC_IMAX(940) | SPCSC_IMIN(64));
+       I915_WRITE_FW(SPCSCCBICLAMP(plane_id), SPCSC_IMAX(448) | SPCSC_IMIN(-448));
+       I915_WRITE_FW(SPCSCCRICLAMP(plane_id), SPCSC_IMAX(448) | SPCSC_IMIN(-448));
+
+       I915_WRITE_FW(SPCSCYGOCLAMP(plane_id), SPCSC_OMAX(1023) | SPCSC_OMIN(0));
+       I915_WRITE_FW(SPCSCCBOCLAMP(plane_id), SPCSC_OMAX(1023) | SPCSC_OMIN(0));
+       I915_WRITE_FW(SPCSCCROCLAMP(plane_id), SPCSC_OMAX(1023) | SPCSC_OMIN(0));
 }
 
 static void
        uint32_t y = plane_state->base.src.y1 >> 16;
        uint32_t src_w = drm_rect_width(&plane_state->base.src) >> 16;
        uint32_t src_h = drm_rect_height(&plane_state->base.src) >> 16;
+       unsigned long irqflags;
 
        sprctl = SP_ENABLE;
 
 
        linear_offset = intel_fb_xy_to_linear(x, y, plane_state, 0);
 
+       spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
+
        if (IS_CHERRYVIEW(dev_priv) && pipe == PIPE_B)
                chv_update_csc(intel_plane, fb->format->format);
 
        if (key->flags) {
-               I915_WRITE(SPKEYMINVAL(pipe, plane_id), key->min_value);
-               I915_WRITE(SPKEYMAXVAL(pipe, plane_id), key->max_value);
-               I915_WRITE(SPKEYMSK(pipe, plane_id), key->channel_mask);
+               I915_WRITE_FW(SPKEYMINVAL(pipe, plane_id), key->min_value);
+               I915_WRITE_FW(SPKEYMAXVAL(pipe, plane_id), key->max_value);
+               I915_WRITE_FW(SPKEYMSK(pipe, plane_id), key->channel_mask);
        }
-       I915_WRITE(SPSTRIDE(pipe, plane_id), fb->pitches[0]);
-       I915_WRITE(SPPOS(pipe, plane_id), (crtc_y << 16) | crtc_x);
+       I915_WRITE_FW(SPSTRIDE(pipe, plane_id), fb->pitches[0]);
+       I915_WRITE_FW(SPPOS(pipe, plane_id), (crtc_y << 16) | crtc_x);
 
        if (fb->modifier == I915_FORMAT_MOD_X_TILED)
-               I915_WRITE(SPTILEOFF(pipe, plane_id), (y << 16) | x);
+               I915_WRITE_FW(SPTILEOFF(pipe, plane_id), (y << 16) | x);
        else
-               I915_WRITE(SPLINOFF(pipe, plane_id), linear_offset);
+               I915_WRITE_FW(SPLINOFF(pipe, plane_id), linear_offset);
 
-       I915_WRITE(SPCONSTALPHA(pipe, plane_id), 0);
+       I915_WRITE_FW(SPCONSTALPHA(pipe, plane_id), 0);
 
-       I915_WRITE(SPSIZE(pipe, plane_id), (crtc_h << 16) | crtc_w);
-       I915_WRITE(SPCNTR(pipe, plane_id), sprctl);
-       I915_WRITE(SPSURF(pipe, plane_id),
-                  intel_plane_ggtt_offset(plane_state) + sprsurf_offset);
-       POSTING_READ(SPSURF(pipe, plane_id));
+       I915_WRITE_FW(SPSIZE(pipe, plane_id), (crtc_h << 16) | crtc_w);
+       I915_WRITE_FW(SPCNTR(pipe, plane_id), sprctl);
+       I915_WRITE_FW(SPSURF(pipe, plane_id),
+                     intel_plane_ggtt_offset(plane_state) + sprsurf_offset);
+       POSTING_READ_FW(SPSURF(pipe, plane_id));
+
+       spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
 }
 
 static void
        struct intel_plane *intel_plane = to_intel_plane(dplane);
        enum pipe pipe = intel_plane->pipe;
        enum plane_id plane_id = intel_plane->id;
+       unsigned long irqflags;
+
+       spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
 
-       I915_WRITE(SPCNTR(pipe, plane_id), 0);
+       I915_WRITE_FW(SPCNTR(pipe, plane_id), 0);
 
-       I915_WRITE(SPSURF(pipe, plane_id), 0);
-       POSTING_READ(SPSURF(pipe, plane_id));
+       I915_WRITE_FW(SPSURF(pipe, plane_id), 0);
+       POSTING_READ_FW(SPSURF(pipe, plane_id));
+
+       spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
 }
 
 static void
        uint32_t y = plane_state->base.src.y1 >> 16;
        uint32_t src_w = drm_rect_width(&plane_state->base.src) >> 16;
        uint32_t src_h = drm_rect_height(&plane_state->base.src) >> 16;
+       unsigned long irqflags;
 
        sprctl = SPRITE_ENABLE;
 
 
        linear_offset = intel_fb_xy_to_linear(x, y, plane_state, 0);
 
+       spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
+
        if (key->flags) {
-               I915_WRITE(SPRKEYVAL(pipe), key->min_value);
-               I915_WRITE(SPRKEYMAX(pipe), key->max_value);
-               I915_WRITE(SPRKEYMSK(pipe), key->channel_mask);
+               I915_WRITE_FW(SPRKEYVAL(pipe), key->min_value);
+               I915_WRITE_FW(SPRKEYMAX(pipe), key->max_value);
+               I915_WRITE_FW(SPRKEYMSK(pipe), key->channel_mask);
        }
 
-       I915_WRITE(SPRSTRIDE(pipe), fb->pitches[0]);
-       I915_WRITE(SPRPOS(pipe), (crtc_y << 16) | crtc_x);
+       I915_WRITE_FW(SPRSTRIDE(pipe), fb->pitches[0]);
+       I915_WRITE_FW(SPRPOS(pipe), (crtc_y << 16) | crtc_x);
 
        /* HSW consolidates SPRTILEOFF and SPRLINOFF into a single SPROFFSET
         * register */
        if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
-               I915_WRITE(SPROFFSET(pipe), (y << 16) | x);
+               I915_WRITE_FW(SPROFFSET(pipe), (y << 16) | x);
        else if (fb->modifier == I915_FORMAT_MOD_X_TILED)
-               I915_WRITE(SPRTILEOFF(pipe), (y << 16) | x);
+               I915_WRITE_FW(SPRTILEOFF(pipe), (y << 16) | x);
        else
-               I915_WRITE(SPRLINOFF(pipe), linear_offset);
+               I915_WRITE_FW(SPRLINOFF(pipe), linear_offset);
 
-       I915_WRITE(SPRSIZE(pipe), (crtc_h << 16) | crtc_w);
+       I915_WRITE_FW(SPRSIZE(pipe), (crtc_h << 16) | crtc_w);
        if (intel_plane->can_scale)
-               I915_WRITE(SPRSCALE(pipe), sprscale);
-       I915_WRITE(SPRCTL(pipe), sprctl);
-       I915_WRITE(SPRSURF(pipe),
-                  intel_plane_ggtt_offset(plane_state) + sprsurf_offset);
-       POSTING_READ(SPRSURF(pipe));
+               I915_WRITE_FW(SPRSCALE(pipe), sprscale);
+       I915_WRITE_FW(SPRCTL(pipe), sprctl);
+       I915_WRITE_FW(SPRSURF(pipe),
+                     intel_plane_ggtt_offset(plane_state) + sprsurf_offset);
+       POSTING_READ_FW(SPRSURF(pipe));
+
+       spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
 }
 
 static void
        struct drm_i915_private *dev_priv = to_i915(dev);
        struct intel_plane *intel_plane = to_intel_plane(plane);
        int pipe = intel_plane->pipe;
+       unsigned long irqflags;
+
+       spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
 
-       I915_WRITE(SPRCTL(pipe), 0);
+       I915_WRITE_FW(SPRCTL(pipe), 0);
        /* Can't leave the scaler enabled... */
        if (intel_plane->can_scale)
-               I915_WRITE(SPRSCALE(pipe), 0);
+               I915_WRITE_FW(SPRSCALE(pipe), 0);
 
-       I915_WRITE(SPRSURF(pipe), 0);
-       POSTING_READ(SPRSURF(pipe));
+       I915_WRITE_FW(SPRSURF(pipe), 0);
+       POSTING_READ_FW(SPRSURF(pipe));
+
+       spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
 }
 
 static void
        uint32_t y = plane_state->base.src.y1 >> 16;
        uint32_t src_w = drm_rect_width(&plane_state->base.src) >> 16;
        uint32_t src_h = drm_rect_height(&plane_state->base.src) >> 16;
+       unsigned long irqflags;
 
        dvscntr = DVS_ENABLE;
 
 
        linear_offset = intel_fb_xy_to_linear(x, y, plane_state, 0);
 
+       spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
+
        if (key->flags) {
-               I915_WRITE(DVSKEYVAL(pipe), key->min_value);
-               I915_WRITE(DVSKEYMAX(pipe), key->max_value);
-               I915_WRITE(DVSKEYMSK(pipe), key->channel_mask);
+               I915_WRITE_FW(DVSKEYVAL(pipe), key->min_value);
+               I915_WRITE_FW(DVSKEYMAX(pipe), key->max_value);
+               I915_WRITE_FW(DVSKEYMSK(pipe), key->channel_mask);
        }
 
-       I915_WRITE(DVSSTRIDE(pipe), fb->pitches[0]);
-       I915_WRITE(DVSPOS(pipe), (crtc_y << 16) | crtc_x);
+       I915_WRITE_FW(DVSSTRIDE(pipe), fb->pitches[0]);
+       I915_WRITE_FW(DVSPOS(pipe), (crtc_y << 16) | crtc_x);
 
        if (fb->modifier == I915_FORMAT_MOD_X_TILED)
-               I915_WRITE(DVSTILEOFF(pipe), (y << 16) | x);
+               I915_WRITE_FW(DVSTILEOFF(pipe), (y << 16) | x);
        else
-               I915_WRITE(DVSLINOFF(pipe), linear_offset);
-
-       I915_WRITE(DVSSIZE(pipe), (crtc_h << 16) | crtc_w);
-       I915_WRITE(DVSSCALE(pipe), dvsscale);
-       I915_WRITE(DVSCNTR(pipe), dvscntr);
-       I915_WRITE(DVSSURF(pipe),
-                  intel_plane_ggtt_offset(plane_state) + dvssurf_offset);
-       POSTING_READ(DVSSURF(pipe));
+               I915_WRITE_FW(DVSLINOFF(pipe), linear_offset);
+
+       I915_WRITE_FW(DVSSIZE(pipe), (crtc_h << 16) | crtc_w);
+       I915_WRITE_FW(DVSSCALE(pipe), dvsscale);
+       I915_WRITE_FW(DVSCNTR(pipe), dvscntr);
+       I915_WRITE_FW(DVSSURF(pipe),
+                     intel_plane_ggtt_offset(plane_state) + dvssurf_offset);
+       POSTING_READ_FW(DVSSURF(pipe));
+
+       spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
 }
 
 static void
        struct drm_i915_private *dev_priv = to_i915(dev);
        struct intel_plane *intel_plane = to_intel_plane(plane);
        int pipe = intel_plane->pipe;
+       unsigned long irqflags;
 
-       I915_WRITE(DVSCNTR(pipe), 0);
+       spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
+
+       I915_WRITE_FW(DVSCNTR(pipe), 0);
        /* Disable the scaler */
-       I915_WRITE(DVSSCALE(pipe), 0);
+       I915_WRITE_FW(DVSSCALE(pipe), 0);
+
+       I915_WRITE_FW(DVSSURF(pipe), 0);
+       POSTING_READ_FW(DVSSURF(pipe));
 
-       I915_WRITE(DVSSURF(pipe), 0);
-       POSTING_READ(DVSSURF(pipe));
+       spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
 }
 
 static int