@@ -388,9 +388,9 @@ static u32 i9xx_cursor_ctl(const struct intel_crtc_state *crtc_state,
return cntl;
}
-static bool i9xx_cursor_size_ok(struct drm_plane *plane,
- int width, int height,
- unsigned int rotation)
+static bool _i9xx_cursor_size_ok(struct drm_plane *plane,
+ int width, int height,
+ unsigned int rotation)
{
struct drm_i915_private *i915 = to_i915(plane->dev);
@@ -424,6 +424,12 @@ static bool i9xx_cursor_size_ok(struct drm_plane *plane,
return true;
}
+static bool i9xx_cursor_size_ok(struct drm_plane *plane,
+ int width, int height)
+{
+ return _i9xx_cursor_size_ok(plane, width, height, DRM_MODE_ROTATE_0);
+}
+
static int i9xx_check_cursor(struct intel_crtc_state *crtc_state,
struct intel_plane_state *plane_state)
{
@@ -445,8 +451,8 @@ static int i9xx_check_cursor(struct intel_crtc_state *crtc_state,
height = drm_rect_height(&plane_state->uapi.dst);
/* Check for which cursor types we support */
- if (!i9xx_cursor_size_ok(&plane->base, width, height,
- plane_state->hw.rotation)) {
+ 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);
@@ -757,6 +763,31 @@ static const struct drm_plane_funcs intel_cursor_plane_funcs = {
.format_mod_supported = intel_cursor_format_mod_supported,
};
+static void intel_cursor_add_size_hints_property(struct intel_plane *plane)
+{
+ struct drm_i915_private *i915 = to_i915(plane->base.dev);
+ const struct drm_mode_config *config = &i915->drm.mode_config;
+
+ if (IS_I845G(i915) || IS_I865G(i915))
+ drm_plane_add_size_hints_property(&plane->base,
+ 64, 1,
+ config->cursor_width,
+ config->cursor_height,
+ i845_cursor_size_ok);
+ else if (HAS_CUR_FBC(i915))
+ drm_plane_add_size_hints_property(&plane->base,
+ 64, 8,
+ config->cursor_width,
+ config->cursor_height,
+ i9xx_cursor_size_ok);
+ else
+ drm_plane_add_size_hints_property(&plane->base,
+ 64, 64,
+ config->cursor_width,
+ config->cursor_height,
+ i9xx_cursor_size_ok);
+}
+
struct intel_plane *
intel_cursor_plane_create(struct drm_i915_private *dev_priv,
enum pipe pipe)
@@ -815,6 +846,8 @@ intel_cursor_plane_create(struct drm_i915_private *dev_priv,
DRM_MODE_ROTATE_0 |
DRM_MODE_ROTATE_180);
+ intel_cursor_add_size_hints_property(cursor);
+
zpos = RUNTIME_INFO(dev_priv)->num_sprites[pipe] + 1;
drm_plane_create_zpos_immutable_property(&cursor->base, zpos);