From: Ville Syrjälä <ville.syrj...@linux.intel.com>

Advertize more suitable cursor sizes via the new SIZE_HINTS
plane property.

Here are some examples on various platforms:
ivb+:
            31 SIZE_HINTS:
                    flags: immutable blob
                    blobs:

                    value:
                            4000080000010001ff6f0200
                    size_hints blob decoded:
                            min: 64x8
                            max: 256x256
                            bitmap[0]: 0b100110111111111111
                                    64  128  256
                               8     *    *    *
                              16     *    *    *
                              32     *    *    *
                              64     *    *    *
                             128          *    *
                             256               *
i945+:
            31 SIZE_HINTS:
                    flags: immutable blob
                    blobs:

                    value:
                            400040000001000111010000
                    size_hints blob decoded:
                            min: 64x64
                            max: 256x256
                            bitmap[0]: 0b100010001
                                    64  128  256
                              64     *
                             128          *
                             256               *
i865:
            31 SIZE_HINTS:
                    flags: immutable blob
                    blobs:

                    value:
                            400001000002ff03ffffffffff0f0000
                    size_hints blob decoded:
                            min: 64x1
                            max: 512x1023
                            bitmap[0]: 0b11111111111111111111111111111111
                            bitmap[1]: 0b111111111111
                                    64  128  256  512
                               1     *    *    *    *
                               2     *    *    *    *
                               4     *    *    *    *
                               8     *    *    *    *
                              16     *    *    *    *
                              32     *    *    *    *
                              64     *    *    *    *
                             128     *    *    *    *
                             256     *    *    *    *
                             512     *    *    *    *
                            1023     *    *    *    *

Cc: Simon Ser <cont...@emersion.fr>
Cc: Jonas Ådahl <jad...@redhat.com>
Cc: Daniel Stone <dan...@fooishbar.org>
Cc: Pekka Paalanen <pekka.paala...@collabora.com>
Signed-off-by: Ville Syrjälä <ville.syrj...@linux.intel.com>
---
 drivers/gpu/drm/i915/display/intel_cursor.c | 43 ++++++++++++++++++---
 1 file changed, 38 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_cursor.c 
b/drivers/gpu/drm/i915/display/intel_cursor.c
index edeeb5f9f795..449860342aea 100644
--- a/drivers/gpu/drm/i915/display/intel_cursor.c
+++ b/drivers/gpu/drm/i915/display/intel_cursor.c
@@ -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);
 
-- 
2.39.2

Reply via email to