If we try to scan a sprite outside of the parent CRTC area, the display
engine will underflow and potentially blank the framebuffer.  So clamp
the position + size to the viewable area.

Signed-off-by: Jesse Barnes <jbar...@virtuousgeek.org>
---
 drivers/gpu/drm/i915/intel_overlay2.c |   12 +++++++++++-
 1 files changed, 11 insertions(+), 1 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_overlay2.c 
b/drivers/gpu/drm/i915/intel_overlay2.c
index 8876857..90c4f59 100644
--- a/drivers/gpu/drm/i915/intel_overlay2.c
+++ b/drivers/gpu/drm/i915/intel_overlay2.c
@@ -173,6 +173,7 @@ snb_update_plane(struct drm_plane *plane, struct drm_crtc 
*crtc,
        u32 reg = DVSCNTR(pipe);
        int ret = 0;
        int x = src_x >> 16, y = src_y >> 16;
+       int active_w = crtc->mode.hdisplay, active_h = crtc->mode.vdisplay;
 
        assert_pipe_enabled(dev_priv, pipe);
 
@@ -181,6 +182,15 @@ snb_update_plane(struct drm_plane *plane, struct drm_crtc 
*crtc,
 
        old_obj = intel_plane->obj;
 
+       if (crtc_x >= active_w || crtc_y >= active_h)
+               return -EINVAL;
+
+       /* Clamp the width & height into the visible area */
+       if (crtc_x + crtc_w > active_w)
+               crtc_w = active_w - crtc_x - 1;
+       if (crtc_y + crtc_h > active_h)
+               crtc_h = active_h - crtc_y - 1;
+
        mutex_lock(&dev->struct_mutex);
 
        dvscntr = I915_READ(reg);
@@ -242,7 +252,7 @@ snb_update_plane(struct drm_plane *plane, struct drm_crtc 
*crtc,
        I915_WRITE(DVSSTRIDE(pipe), fb->pitch);
        I915_WRITE(DVSPOS(pipe), (crtc_y << 16) | crtc_x);
        I915_WRITE(DVSTILEOFF(pipe), (y << 16) | x);
-       I915_WRITE(DVSSIZE(pipe), (fb->height << 16) | fb->width);
+       I915_WRITE(DVSSIZE(pipe), (crtc_h << 16) | crtc_w);
        I915_WRITE(DVSSCALE(pipe), 0);
        I915_WRITE(reg, dvscntr);
        I915_WRITE(DVSSURF(pipe), start);
-- 
1.7.4.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to