return true;
 }
 
-static int skl_check_main_surface(struct intel_plane_state *plane_state)
+static int skl_check_main_surface(const struct intel_crtc_state *crtc_state,
+                                 struct intel_plane_state *plane_state)
 {
+       struct drm_i915_private *dev_priv =
+               to_i915(plane_state->base.plane->dev);
        const struct drm_framebuffer *fb = plane_state->base.fb;
        unsigned int rotation = plane_state->base.rotation;
        int x = plane_state->base.src.x1 >> 16;
        int y = plane_state->base.src.y1 >> 16;
        int w = drm_rect_width(&plane_state->base.src) >> 16;
        int h = drm_rect_height(&plane_state->base.src) >> 16;
+       int dst_x = plane_state->base.dst.x1;
+       int pipe_src_w = crtc_state->pipe_src_w;
        int max_width = skl_max_plane_width(fb, 0, rotation);
        int max_height = 4096;
        u32 alignment, offset, aux_offset = plane_state->aux.offset;
                return -EINVAL;
        }
 
+       /*
+        * Display WA #1175: cnl,glk
+        * Planes other than the cursor may cause FIFO underflow and display
+        * corruption if starting less than 4 pixels from the right edge of
+        * the screen.
+        */
+       if ((IS_GEMINILAKE(dev_priv) || IS_CANNONLAKE(dev_priv)) &&
+           dst_x > pipe_src_w - 4) {
+               DRM_DEBUG_KMS("requested plane X start position %d invalid (valid range %d-%d)\n",
+                             dst_x,
+                             0, pipe_src_w - 4);
+               return -ERANGE;
+       }
+
        intel_add_fb_offsets(&x, &y, plane_state, 0);
        offset = intel_compute_tile_offset(&x, &y, plane_state, 0);
        alignment = intel_surf_alignment(fb, 0);
        return 0;
 }
 
-int skl_check_plane_surface(struct intel_plane_state *plane_state)
+int skl_check_plane_surface(const struct intel_crtc_state *crtc_state,
+                           struct intel_plane_state *plane_state)
 {
        const struct drm_framebuffer *fb = plane_state->base.fb;
        unsigned int rotation = plane_state->base.rotation;
                plane_state->aux.y = 0;
        }
 
-       ret = skl_check_main_surface(plane_state);
+       ret = skl_check_main_surface(crtc_state, plane_state);
        if (ret)
                return ret;
 
                return 0;
 
        if (INTEL_GEN(dev_priv) >= 9) {
-               ret = skl_check_plane_surface(state);
+               ret = skl_check_plane_surface(crtc_state, state);
                if (ret)
                        return ret;