@@ -65,12 +65,10 @@ static u32 intel_cursor_position(const struct intel_plane_state *plane_state)
return pos;
}
-static bool intel_cursor_size_ok(const struct intel_plane_state *plane_state)
+static bool intel_cursor_size_ok(struct drm_i915_private *i915,
+ int width, int height)
{
- const struct drm_mode_config *config =
- &plane_state->uapi.plane->dev->mode_config;
- int width = drm_rect_width(&plane_state->uapi.dst);
- int height = drm_rect_height(&plane_state->uapi.dst);
+ const struct drm_mode_config *config = &i915->drm.mode_config;
return width > 0 && width <= config->cursor_width &&
height > 0 && height <= config->cursor_height;
@@ -198,23 +196,25 @@ static u32 i845_cursor_ctl(const struct intel_crtc_state *crtc_state,
CURSOR_STRIDE(plane_state->view.color_plane[0].mapping_stride);
}
-static bool i845_cursor_size_ok(const struct intel_plane_state *plane_state)
+static bool i845_cursor_size_ok(struct drm_plane *plane,
+ int width, int height)
{
- int width = drm_rect_width(&plane_state->uapi.dst);
+ struct drm_i915_private *i915 = to_i915(plane->dev);
/*
* 845g/865g are only limited by the width of their cursors,
* the height is arbitrary up to the precision of the register.
*/
- return intel_cursor_size_ok(plane_state) && IS_ALIGNED(width, 64);
+ return intel_cursor_size_ok(i915, width, height) && IS_ALIGNED(width, 64);
}
static int i845_check_cursor(struct intel_crtc_state *crtc_state,
struct intel_plane_state *plane_state)
{
+ struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
+ struct drm_i915_private *i915 = to_i915(plane->base.dev);
const struct drm_framebuffer *fb = plane_state->hw.fb;
- struct drm_i915_private *i915 = to_i915(plane_state->uapi.plane->dev);
- int ret;
+ int ret, width, height;
ret = intel_check_cursor(crtc_state, plane_state);
if (ret)
@@ -224,12 +224,14 @@ static int i845_check_cursor(struct intel_crtc_state *crtc_state,
if (!fb)
return 0;
+ width = drm_rect_width(&plane_state->uapi.dst);
+ height = drm_rect_height(&plane_state->uapi.dst);
+
/* Check for which cursor types we support */
- if (!i845_cursor_size_ok(plane_state)) {
+ if (!i845_cursor_size_ok(&plane->base, width, height)) {
drm_dbg_kms(&i915->drm,
"Cursor dimension %dx%d not supported\n",
- drm_rect_width(&plane_state->uapi.dst),
- drm_rect_height(&plane_state->uapi.dst));
+ width, height);
return -EINVAL;
}
@@ -386,14 +388,13 @@ static u32 i9xx_cursor_ctl(const struct intel_crtc_state *crtc_state,
return cntl;
}
-static bool i9xx_cursor_size_ok(const struct intel_plane_state *plane_state)
+static bool i9xx_cursor_size_ok(struct drm_plane *plane,
+ int width, int height,
+ unsigned int rotation)
{
- struct drm_i915_private *dev_priv =
- to_i915(plane_state->uapi.plane->dev);
- int width = drm_rect_width(&plane_state->uapi.dst);
- int height = drm_rect_height(&plane_state->uapi.dst);
+ struct drm_i915_private *i915 = to_i915(plane->dev);
- if (!intel_cursor_size_ok(plane_state))
+ if (!intel_cursor_size_ok(i915, width, height))
return false;
/* Cursor width is limited to a few power-of-two sizes */
@@ -412,8 +413,7 @@ static bool i9xx_cursor_size_ok(const struct intel_plane_state *plane_state)
* cursor is not rotated. Everything else requires square
* cursors.
*/
- if (HAS_CUR_FBC(dev_priv) &&
- plane_state->hw.rotation & DRM_MODE_ROTATE_0) {
+ if (HAS_CUR_FBC(i915) && rotation & DRM_MODE_ROTATE_0) {
if (height < 8 || height > width)
return false;
} else {
@@ -431,7 +431,7 @@ static int i9xx_check_cursor(struct intel_crtc_state *crtc_state,
struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
const struct drm_framebuffer *fb = plane_state->hw.fb;
enum pipe pipe = plane->pipe;
- int ret;
+ int ret, width, height;
ret = intel_check_cursor(crtc_state, plane_state);
if (ret)
@@ -441,24 +441,25 @@ static int i9xx_check_cursor(struct intel_crtc_state *crtc_state,
if (!fb)
return 0;
+ width = drm_rect_width(&plane_state->uapi.dst);
+ height = drm_rect_height(&plane_state->uapi.dst);
+
/* Check for which cursor types we support */
- if (!i9xx_cursor_size_ok(plane_state)) {
- drm_dbg(&dev_priv->drm,
- "Cursor dimension %dx%d not supported\n",
- drm_rect_width(&plane_state->uapi.dst),
- drm_rect_height(&plane_state->uapi.dst));
+ if (!i9xx_cursor_size_ok(&plane->base, width, height,
+ plane_state->hw.rotation)) {
+ drm_dbg_kms(&dev_priv->drm,
+ "Cursor dimension %dx%d not supported\n",
+ width, height);
return -EINVAL;
}
drm_WARN_ON(&dev_priv->drm, plane_state->uapi.visible &&
plane_state->view.color_plane[0].mapping_stride != fb->pitches[0]);
- if (fb->pitches[0] !=
- drm_rect_width(&plane_state->uapi.dst) * fb->format->cpp[0]) {
+ if (fb->pitches[0] != width * fb->format->cpp[0]) {
drm_dbg_kms(&dev_priv->drm,
"Invalid cursor stride (%u) (cursor width %d)\n",
- fb->pitches[0],
- drm_rect_width(&plane_state->uapi.dst));
+ fb->pitches[0], width);
return -EINVAL;
}