|
@@ -14059,6 +14059,7 @@ intel_check_cursor_plane(struct drm_plane *plane,
|
|
|
struct drm_crtc *crtc = crtc_state->base.crtc;
|
|
|
struct drm_framebuffer *fb = state->base.fb;
|
|
|
struct drm_i915_gem_object *obj = intel_fb_obj(fb);
|
|
|
+ enum pipe pipe = to_intel_plane(plane)->pipe;
|
|
|
unsigned stride;
|
|
|
int ret;
|
|
|
|
|
@@ -14092,6 +14093,22 @@ intel_check_cursor_plane(struct drm_plane *plane,
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
+ /*
|
|
|
+ * There's something wrong with the cursor on CHV pipe C.
|
|
|
+ * If it straddles the left edge of the screen then
|
|
|
+ * moving it away from the edge or disabling it often
|
|
|
+ * results in a pipe underrun, and often that can lead to
|
|
|
+ * dead pipe (constant underrun reported, and it scans
|
|
|
+ * out just a solid color). To recover from that, the
|
|
|
+ * display power well must be turned off and on again.
|
|
|
+ * Refuse the put the cursor into that compromised position.
|
|
|
+ */
|
|
|
+ if (IS_CHERRYVIEW(plane->dev) && pipe == PIPE_C &&
|
|
|
+ state->visible && state->base.crtc_x < 0) {
|
|
|
+ DRM_DEBUG_KMS("CHV cursor C not allowed to straddle the left screen edge\n");
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|