From patchwork Tue Mar 21 14:36:41 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?VmlsbGUgU3lyasOkbMOk?= X-Patchwork-Id: 13182847 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 5D25AC74A5B for ; Tue, 21 Mar 2023 14:38:18 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id BE13410E224; Tue, 21 Mar 2023 14:38:17 +0000 (UTC) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by gabe.freedesktop.org (Postfix) with ESMTPS id 8B95610E224; Tue, 21 Mar 2023 14:38:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1679409495; x=1710945495; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=y3R7O1caVV5ScxkYfE2dsOHf250qg7RYXap0vAmAaZo=; b=LQecx2TVNmADlrldXktzI/eeNYwYo3yQQKglSEB6v78mu5ruVhTWmlkV OM6pLJaOpOxnurCC+q/G3Uvmfe+f/YzKxq1EMc+p3gENZ3yKBaSjQr1k9 BBqzz9f5C+/h2b67Kt2a2a3u30oE69x+jYIm8JnF0ChsnmLt+OW0LYRuM B412Bghu1vvgF3y80I7QTyAs47ogljFm+hmYr9TSIpuk0iwXRhtrv5R1M x5a0ZFYjhrVlw5+E9H3sBEZWzsKFDBk972mgDYSXqDYW3K1Q0azPQMgXC OSmDSuM5scAdkkB+uQbvi5x/nQsWvWDsZEPMtK6h/G9tVQ30C1yHkqc8g w==; X-IronPort-AV: E=McAfee;i="6600,9927,10656"; a="403832763" X-IronPort-AV: E=Sophos;i="5.98,279,1673942400"; d="scan'208";a="403832763" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Mar 2023 07:36:51 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10656"; a="674851701" X-IronPort-AV: E=Sophos;i="5.98,279,1673942400"; d="scan'208";a="674851701" Received: from stinkpipe.fi.intel.com (HELO stinkbox) ([10.237.72.70]) by orsmga007.jf.intel.com with SMTP; 21 Mar 2023 07:36:48 -0700 Received: by stinkbox (sSMTP sendmail emulation); Tue, 21 Mar 2023 16:36:47 +0200 From: Ville Syrjala To: dri-devel@lists.freedesktop.org Subject: [RFC][PATCH v2 1/3] drm: Introduce plane SIZE_HINTS property Date: Tue, 21 Mar 2023 16:36:41 +0200 Message-Id: <20230321143643.26676-2-ville.syrjala@linux.intel.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230321143643.26676-1-ville.syrjala@linux.intel.com> References: <20230321143643.26676-1-ville.syrjala@linux.intel.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: intel-gfx@lists.freedesktop.org, Pekka Paalanen , =?utf-8?q?Jonas_=C3=85dahl?= Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" From: Ville Syrjälä Add a new immutable plane property by which a plane can advertise a handful of recommended plane sizes. This would be mostly exposed by cursor planes as a slightly more capable replacement for the DRM_CAP_CURSOR_WIDTH/HEIGHT caps, which can only declare a one size fits all limit for the whole device. Currently eg. amdgpu/i915/nouveau just advertize the max cursor size via the cursor size caps. But always using the max sized cursor can waste a surprising amount of power, so a better stragey is desirable. Most other drivers don't specify any cursor size at all, in which case the ioctl code just claims that 64x64 is a great choice. Whether that is actually true is debatable. A poll of various compositor developers informs us that blindly probing with setcursor/atomic ioctl to determine suitable cursor sizes is not acceptable, thus the introduction of the new property to supplant the cursor size caps. The compositor will now be free to select a more optimal cursor size from the short list of options. The blob contains explicit min and max plane sizes, as well as a 2D bitmap representing all the square and non-square power of two sizes between the min and max. Note that the reported sizes (either via the property or the caps) make no claims about things such as plane scaling. So these things should only really be consulted for simple "cursor like" use cases. v2: Try to add some docs v3: Specify that value 0 is reserved for future use (basic idea from Jonas) Drop the note about typical hardware (Pekka) v4: Total redesign to include the 2D bitmap Cc: Simon Ser Cc: Jonas Ådahl Cc: Daniel Stone Cc: Pekka Paalanen Signed-off-by: Ville Syrjälä --- drivers/gpu/drm/drm_mode_config.c | 7 +++ drivers/gpu/drm/drm_plane.c | 96 +++++++++++++++++++++++++++++++ include/drm/drm_mode_config.h | 5 ++ include/drm/drm_plane.h | 6 ++ include/uapi/drm/drm_mode.h | 29 ++++++++++ 5 files changed, 143 insertions(+) diff --git a/drivers/gpu/drm/drm_mode_config.c b/drivers/gpu/drm/drm_mode_config.c index 87eb591fe9b5..21860f94a18c 100644 --- a/drivers/gpu/drm/drm_mode_config.c +++ b/drivers/gpu/drm/drm_mode_config.c @@ -374,6 +374,13 @@ static int drm_mode_create_standard_properties(struct drm_device *dev) return -ENOMEM; dev->mode_config.modifiers_property = prop; + prop = drm_property_create(dev, + DRM_MODE_PROP_IMMUTABLE | DRM_MODE_PROP_BLOB, + "SIZE_HINTS", 0); + if (!prop) + return -ENOMEM; + dev->mode_config.size_hints_property = prop; + return 0; } diff --git a/drivers/gpu/drm/drm_plane.c b/drivers/gpu/drm/drm_plane.c index 24e7998d1731..fb9cee504767 100644 --- a/drivers/gpu/drm/drm_plane.c +++ b/drivers/gpu/drm/drm_plane.c @@ -140,6 +140,27 @@ * DRM_FORMAT_MOD_LINEAR. Before linux kernel release v5.1 there have been * various bugs in this area with inconsistencies between the capability * flag and per-plane properties. + * + * SIZE_HINTS: + * Blob property which contains the set of recommended plane size + * which can used for simple "cursor like" use cases (eg. no scaling). + * Using these hints frees userspace from extensive probing of + * supported plane sizes through atomic/setcursor ioctls. + * + * For optimal usage userspace should pick the smallest size + * that satisfies its own requirements. + * + * The blob contains explicit min/max sizes, as well as a 2D bitmap + * representign all square and non-square POT sizes between. + * + * Drivers should only attach this property to planes that + * support a very limited set of sizes. + * + * Note that property value 0 (ie. no blob) is reserved for potential + * future use. Current userspace is expected to ignore the property + * if the value is 0, and fall back to some other means (eg. + * &DRM_CAP_CURSOR_WIDTH and &DRM_CAP_CURSOR_HEIGHT) to determine + * the appropriate plane size to use. */ static unsigned int drm_num_planes(struct drm_device *dev) @@ -1582,3 +1603,78 @@ int drm_plane_create_scaling_filter_property(struct drm_plane *plane, return 0; } EXPORT_SYMBOL(drm_plane_create_scaling_filter_property); + +static int hint_dim(int x, int x0, int w, int min, int max) +{ + if (x == 0) + return min; + else if (x == w - 1) + return max; + else + return 1 << (x0 + x); +} + +/** + * drm_plane_add_size_hint_property - create a size hint property + * + * @plane: drm plane + * @min_width: minimum width + * @min_height: minimum height + * @max_width: maximum width + * @max_height: maximum height + * @cursor_size_ok: function to check if specified size is ok + * + * Create a size hints property for the plane. + * + * RETURNS: + * Zero for success or -errno + */ +int drm_plane_add_size_hints_property(struct drm_plane *plane, + int min_width, int min_height, + int max_width, int max_height, + bool (*size_ok)(struct drm_plane *plane, + int width, int height)) +{ + struct drm_device *dev = plane->dev; + struct drm_mode_config *config = &dev->mode_config; + struct drm_property_blob *blob; + struct drm_plane_size_hint *hints; + int x, y, x0, y0, w, h; + + x0 = fls(min_width) - 1; + y0 = fls(min_height) - 1; + w = fls(2 * max_width - 1) - x0; + h = fls(2 * max_height - 1) - y0; + + blob = drm_property_create_blob(dev, + struct_size(hints, bitmap, + DIV_ROUND_UP(w * h, 32)), + NULL); + if (IS_ERR(blob)) + return PTR_ERR(blob); + + hints = blob->data; + + hints->min_width = min_width; + hints->min_height = min_height; + hints->max_width = max_width; + hints->max_height = max_height; + + for (y = 0; y < h; y++) { + int height = hint_dim(y, y0, h, min_height, max_height); + + for (x = 0; x < w; x++) { + int width = hint_dim(x, x0, w, min_width, max_width); + unsigned int bit = y * w + x; + + if (size_ok(plane, width, height)) + hints->bitmap[bit/32] |= 1 << (bit & 31); + } + } + + drm_object_attach_property(&plane->base, config->size_hints_property, + blob->base.id); + + return 0; +} +EXPORT_SYMBOL(drm_plane_add_size_hints_property); diff --git a/include/drm/drm_mode_config.h b/include/drm/drm_mode_config.h index e5b053001d22..d5495c0804c5 100644 --- a/include/drm/drm_mode_config.h +++ b/include/drm/drm_mode_config.h @@ -949,6 +949,11 @@ struct drm_mode_config { */ struct drm_property *modifiers_property; + /** + * @size_hints_propertty: Plane size hints property. + */ + struct drm_property *size_hints_property; + /* cursor size */ uint32_t cursor_width, cursor_height; diff --git a/include/drm/drm_plane.h b/include/drm/drm_plane.h index 51291983ea44..6d7326f15761 100644 --- a/include/drm/drm_plane.h +++ b/include/drm/drm_plane.h @@ -32,6 +32,7 @@ #include struct drm_crtc; +struct drm_plane_size_hint; struct drm_printer; struct drm_modeset_acquire_ctx; @@ -945,5 +946,10 @@ drm_plane_get_damage_clips(const struct drm_plane_state *state); int drm_plane_create_scaling_filter_property(struct drm_plane *plane, unsigned int supported_filters); +int drm_plane_add_size_hints_property(struct drm_plane *plane, + int min_width, int min_height, + int max_width, int max_height, + bool (*size_ok)(struct drm_plane *plane, + int width, int height)); #endif diff --git a/include/uapi/drm/drm_mode.h b/include/uapi/drm/drm_mode.h index 46becedf5b2f..5a1de6bd80dd 100644 --- a/include/uapi/drm/drm_mode.h +++ b/include/uapi/drm/drm_mode.h @@ -849,6 +849,35 @@ struct drm_color_lut { __u16 reserved; }; +/** + * struct drm_plane_size_hint - Plane size hints + * + * Includes a 2D bitmap in row major order of one bit per plane + * size (WxH). The colums represent the possible plane widths as + * ,, + * the rows do the same for plane heights. The minimums and + * maximums need not be power of two themselves. The bits + * are walked in lsb->msb order. + * + * Example: + * min_width = 33, min_height = 16 + * max_width = 128, max_height = 127 + * bitmap[0] = 0b100111011001 + * 33 64 128 + * 16 * + * 32 * * + * 64 * * * + * 127 * + * + * Indicating support for 33x16,33xx32, + * 64x32,64x64,128x64,128x127 sizes. + */ +struct drm_plane_size_hint { + __u16 min_width, min_height; + __u16 max_width, max_height; + __u32 bitmap[]; +}; + /** * struct hdr_metadata_infoframe - HDR Metadata Infoframe Data. * From patchwork Tue Mar 21 14:36:42 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?VmlsbGUgU3lyasOkbMOk?= X-Patchwork-Id: 13182849 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 2A518C6FD1D for ; Tue, 21 Mar 2023 14:38:26 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 969C110E231; Tue, 21 Mar 2023 14:38:23 +0000 (UTC) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by gabe.freedesktop.org (Postfix) with ESMTPS id E6CED10E229; Tue, 21 Mar 2023 14:38:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1679409498; x=1710945498; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=r2CKFL4+f+nejrR6x7wefKGi1jukmF7XziJ+1ND/SVg=; b=X7534Xx8JnwQQObL5azZehC2RnKPSvaEAetfETgWNw8zY3zbxWye+8Xu ouUFhW2S3TxNcf8iSkqt1zaAE2ZSVWTEgPTc3x4WGnaPmr2RfuX+TepLR mU8iIXKaMnFTdZkSVo8TOwEi4S8s3ctKCT2tNwDAnjHeCuELXzTstp3yE C+NM2NcCUOf2PUcKqd0iDjtCFU/h/dQ/6O/gv2tbBoUr7S+VwT0TfgVDp E4R6vCVWHPCzP3P6rdTPQV2HRs6QUocc4iAdzOz3VSvTN+rkqVS3hXZLo n9L1H4Q7iauc6aKlXQO3cvjT60icTwWcb8sy1TUHHASZKn3vzaLScDTMi A==; X-IronPort-AV: E=McAfee;i="6600,9927,10656"; a="403832795" X-IronPort-AV: E=Sophos;i="5.98,279,1673942400"; d="scan'208";a="403832795" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Mar 2023 07:36:54 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10656"; a="674851703" X-IronPort-AV: E=Sophos;i="5.98,279,1673942400"; d="scan'208";a="674851703" Received: from stinkpipe.fi.intel.com (HELO stinkbox) ([10.237.72.70]) by orsmga007.jf.intel.com with SMTP; 21 Mar 2023 07:36:52 -0700 Received: by stinkbox (sSMTP sendmail emulation); Tue, 21 Mar 2023 16:36:51 +0200 From: Ville Syrjala To: dri-devel@lists.freedesktop.org Subject: [RFC][PATCH v2 2/3] drm/i915: Adjust cursor_size_ok() func calling convention Date: Tue, 21 Mar 2023 16:36:42 +0200 Message-Id: <20230321143643.26676-3-ville.syrjala@linux.intel.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230321143643.26676-1-ville.syrjala@linux.intel.com> References: <20230321143643.26676-1-ville.syrjala@linux.intel.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: intel-gfx@lists.freedesktop.org Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" From: Ville Syrjälä Tweak the parameters we pass to the cursor size_ok() functions in preparation for using them to populate the SIZE_HINT property. Signed-off-by: Ville Syrjälä --- drivers/gpu/drm/i915/display/intel_cursor.c | 63 +++++++++++---------- 1 file changed, 32 insertions(+), 31 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_cursor.c b/drivers/gpu/drm/i915/display/intel_cursor.c index 31bef0427377..edeeb5f9f795 100644 --- a/drivers/gpu/drm/i915/display/intel_cursor.c +++ b/drivers/gpu/drm/i915/display/intel_cursor.c @@ -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; } From patchwork Tue Mar 21 14:36:43 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?VmlsbGUgU3lyasOkbMOk?= X-Patchwork-Id: 13182848 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 04BBDC6FD1D for ; Tue, 21 Mar 2023 14:38:24 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 0FA3E10E230; Tue, 21 Mar 2023 14:38:23 +0000 (UTC) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by gabe.freedesktop.org (Postfix) with ESMTPS id C901010E229; Tue, 21 Mar 2023 14:38:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1679409499; x=1710945499; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=1i9juQG1wIe8gITmEKAWeS9272iLCNnj0vEBZaPxs98=; b=AckCa5QhR7O/BSZkKVBeGXbkc0cf3UIQyX1/h0NioX76IyC5dRHuPRsD RcFeen6PHqHwiPz98iYL+5o/PjaPe/3P16nRLRHs2ZAIZScjK8Jzi7Fey 9O5E4fRjdsZLlHb3dy2px6ti55+z/RO6wQyElkloqgJpBIWFyKAhoIK6E z+CoVeeL96vd4uIL36tYxo1rR4iGHhv+IHuzQ/Z9apE5xu14SAxGNvxW5 PAo0MhLZoHw396LP0nqk1FYwEwCn/oppgS2CE+PLwjwIAEYDpiHNAmB7e mk4PpTHZAkjpRAs+Rgcf3E9FQQPOqQjQ2K231PKd6xpa1NFD43bysySYi w==; X-IronPort-AV: E=McAfee;i="6600,9927,10656"; a="403832830" X-IronPort-AV: E=Sophos;i="5.98,279,1673942400"; d="scan'208";a="403832830" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Mar 2023 07:36:58 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10656"; a="674851705" X-IronPort-AV: E=Sophos;i="5.98,279,1673942400"; d="scan'208";a="674851705" Received: from stinkpipe.fi.intel.com (HELO stinkbox) ([10.237.72.70]) by orsmga007.jf.intel.com with SMTP; 21 Mar 2023 07:36:55 -0700 Received: by stinkbox (sSMTP sendmail emulation); Tue, 21 Mar 2023 16:36:54 +0200 From: Ville Syrjala To: dri-devel@lists.freedesktop.org Subject: [RFC][PATCH v2 3/3] drm/i915: Add SIZE_HINTS property for cursors Date: Tue, 21 Mar 2023 16:36:43 +0200 Message-Id: <20230321143643.26676-4-ville.syrjala@linux.intel.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230321143643.26676-1-ville.syrjala@linux.intel.com> References: <20230321143643.26676-1-ville.syrjala@linux.intel.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: intel-gfx@lists.freedesktop.org, Pekka Paalanen , =?utf-8?q?Jonas_=C3=85dahl?= Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" From: Ville Syrjälä 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 Cc: Jonas Ådahl Cc: Daniel Stone Cc: Pekka Paalanen Signed-off-by: Ville Syrjälä --- 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);