Commit 1e1bb871 authored by Ville Syrjälä's avatar Ville Syrjälä

drm/i915: Use fb->pitches[0] in cursor code

The cursor code currently ignores fb->pitches[0] (except when creating
the fb itself), and just uses the cursor_width*4 as the stride. Let's
make sure fb->pitches[0] actually matches what we expect it to be.

We can also relax the stride vs. cursor width relationship on 845/865
since the stride is programmed separately. The only constraint is that
width*cpp doesn't exceed the stride, and that's already been checked
by the core since it makes sure the entire plane fits within the fb.

We can also drop the bo size check as that's already checked when
we create the fb. That is the fb is guaranteed to fit within the bo.

v2: Rebase due to i845_cursor_ctl() and i9xx_cursor_ctl()
Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> #v1
Link: http://patchwork.freedesktop.org/patch/msgid/20170327185546.2977-11-ville.syrjala@linux.intel.com
parent 3637ecf0
...@@ -9217,26 +9217,12 @@ static int intel_check_cursor(struct intel_crtc_state *crtc_state, ...@@ -9217,26 +9217,12 @@ static int intel_check_cursor(struct intel_crtc_state *crtc_state,
static u32 i845_cursor_ctl(const struct intel_crtc_state *crtc_state, static u32 i845_cursor_ctl(const struct intel_crtc_state *crtc_state,
const struct intel_plane_state *plane_state) const struct intel_plane_state *plane_state)
{ {
unsigned int width = plane_state->base.crtc_w; const struct drm_framebuffer *fb = plane_state->base.fb;
unsigned int stride = roundup_pow_of_two(width) * 4;
switch (stride) {
default:
WARN_ONCE(1, "Invalid cursor width/stride, width=%u, stride=%u\n",
width, stride);
stride = 256;
/* fallthrough */
case 256:
case 512:
case 1024:
case 2048:
break;
}
return CURSOR_ENABLE | return CURSOR_ENABLE |
CURSOR_GAMMA_ENABLE | CURSOR_GAMMA_ENABLE |
CURSOR_FORMAT_ARGB | CURSOR_FORMAT_ARGB |
CURSOR_STRIDE(stride); CURSOR_STRIDE(fb->pitches[0]);
} }
static bool i845_cursor_size_ok(const struct intel_plane_state *plane_state) static bool i845_cursor_size_ok(const struct intel_plane_state *plane_state)
...@@ -9255,8 +9241,6 @@ static int i845_check_cursor(struct intel_plane *plane, ...@@ -9255,8 +9241,6 @@ static int i845_check_cursor(struct intel_plane *plane,
struct intel_plane_state *plane_state) struct intel_plane_state *plane_state)
{ {
const struct drm_framebuffer *fb = plane_state->base.fb; const struct drm_framebuffer *fb = plane_state->base.fb;
const struct drm_i915_gem_object *obj = intel_fb_obj(fb);
unsigned int stride;
int ret; int ret;
ret = intel_check_cursor(crtc_state, plane_state); ret = intel_check_cursor(crtc_state, plane_state);
...@@ -9264,7 +9248,7 @@ static int i845_check_cursor(struct intel_plane *plane, ...@@ -9264,7 +9248,7 @@ static int i845_check_cursor(struct intel_plane *plane,
return ret; return ret;
/* if we want to turn off the cursor ignore width and height */ /* if we want to turn off the cursor ignore width and height */
if (!obj) if (!fb)
return 0; return 0;
/* Check for which cursor types we support */ /* Check for which cursor types we support */
...@@ -9275,10 +9259,16 @@ static int i845_check_cursor(struct intel_plane *plane, ...@@ -9275,10 +9259,16 @@ static int i845_check_cursor(struct intel_plane *plane,
return -EINVAL; return -EINVAL;
} }
stride = roundup_pow_of_two(plane_state->base.crtc_w) * 4; switch (fb->pitches[0]) {
if (obj->base.size < stride * plane_state->base.crtc_h) { case 256:
DRM_DEBUG_KMS("buffer is too small\n"); case 512:
return -ENOMEM; case 1024:
case 2048:
break;
default:
DRM_DEBUG_KMS("Invalid cursor stride (%u)\n",
fb->pitches[0]);
return -EINVAL;
} }
plane_state->ctl = i845_cursor_ctl(crtc_state, plane_state); plane_state->ctl = i845_cursor_ctl(crtc_state, plane_state);
...@@ -9411,9 +9401,7 @@ static int i9xx_check_cursor(struct intel_plane *plane, ...@@ -9411,9 +9401,7 @@ static int i9xx_check_cursor(struct intel_plane *plane,
{ {
struct drm_i915_private *dev_priv = to_i915(plane->base.dev); struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
const struct drm_framebuffer *fb = plane_state->base.fb; const struct drm_framebuffer *fb = plane_state->base.fb;
const struct drm_i915_gem_object *obj = intel_fb_obj(fb);
enum pipe pipe = plane->pipe; enum pipe pipe = plane->pipe;
unsigned int stride;
int ret; int ret;
ret = intel_check_cursor(crtc_state, plane_state); ret = intel_check_cursor(crtc_state, plane_state);
...@@ -9421,7 +9409,7 @@ static int i9xx_check_cursor(struct intel_plane *plane, ...@@ -9421,7 +9409,7 @@ static int i9xx_check_cursor(struct intel_plane *plane,
return ret; return ret;
/* if we want to turn off the cursor ignore width and height */ /* if we want to turn off the cursor ignore width and height */
if (!obj) if (!fb)
return 0; return 0;
/* Check for which cursor types we support */ /* Check for which cursor types we support */
...@@ -9432,10 +9420,10 @@ static int i9xx_check_cursor(struct intel_plane *plane, ...@@ -9432,10 +9420,10 @@ static int i9xx_check_cursor(struct intel_plane *plane,
return -EINVAL; return -EINVAL;
} }
stride = roundup_pow_of_two(plane_state->base.crtc_w) * 4; if (fb->pitches[0] != plane_state->base.crtc_w * fb->format->cpp[0]) {
if (obj->base.size < stride * plane_state->base.crtc_h) { DRM_DEBUG_KMS("Invalid cursor stride (%u) (cursor width %d)\n",
DRM_DEBUG_KMS("buffer is too small\n"); fb->pitches[0], plane_state->base.crtc_w);
return -ENOMEM; return -EINVAL;
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment