diff mbox series

[3/4] drm/ast: cursor: Add support for ARGB4444

Message ID 20250213163845.118207-4-tzimmermann@suse.de (mailing list archive)
State New
Headers show
Series drm/ast: cursor: Improve format handling | expand

Commit Message

Thomas Zimmermann Feb. 13, 2025, 4:25 p.m. UTC
Add support for cursor image data in ARGB4444 format. This is the
hardware's native format and requires no conversion.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/ast/ast_mode.c | 34 +++++++++++++++++++++++-----------
 1 file changed, 23 insertions(+), 11 deletions(-)

Comments

Jocelyn Falempe Feb. 14, 2025, 10:35 a.m. UTC | #1
On 13/02/2025 17:25, Thomas Zimmermann wrote:
> Add support for cursor image data in ARGB4444 format. This is the
> hardware's native format and requires no conversion.
> 

Thanks, it looks good to me.

Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>


> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> ---
>   drivers/gpu/drm/ast/ast_mode.c | 34 +++++++++++++++++++++++-----------
>   1 file changed, 23 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
> index ed00275d6418..4beac9cdfe83 100644
> --- a/drivers/gpu/drm/ast/ast_mode.c
> +++ b/drivers/gpu/drm/ast/ast_mode.c
> @@ -718,6 +718,7 @@ static void ast_set_cursor_enabled(struct ast_device *ast, bool enabled)
>   }
>   
>   static const uint32_t ast_cursor_plane_formats[] = {
> +	DRM_FORMAT_ARGB4444,
>   	DRM_FORMAT_ARGB8888,
>   };
>   
> @@ -769,17 +770,28 @@ static void ast_cursor_plane_helper_atomic_update(struct drm_plane *plane,
>   	 */
>   
>   	if (drm_atomic_helper_damage_merged(old_plane_state, plane_state, &damage)) {
> -		u8 *argb4444 = ast_cursor_plane->argb4444;
> -		struct iosys_map argb4444_dst[DRM_FORMAT_MAX_PLANES] = {
> -			IOSYS_MAP_INIT_VADDR(argb4444),
> -		};
> -		unsigned int argb4444_dst_pitch[DRM_FORMAT_MAX_PLANES] = {
> -			AST_HWC_PITCH,
> -		};
> -
> -		drm_fb_argb8888_to_argb4444(argb4444_dst, argb4444_dst_pitch,
> -					    shadow_plane_state->data, fb, &damage,
> -					    &shadow_plane_state->fmtcnv_state);
> +		u8 *argb4444;
> +
> +		switch (fb->format->format) {
> +		case DRM_FORMAT_ARGB4444:
> +			argb4444 = shadow_plane_state->data[0].vaddr;
> +			break;
> +		default:
> +			argb4444 = ast_cursor_plane->argb4444;
> +			{
> +				struct iosys_map argb4444_dst[DRM_FORMAT_MAX_PLANES] = {
> +					IOSYS_MAP_INIT_VADDR(argb4444),
> +				};
> +				unsigned int argb4444_dst_pitch[DRM_FORMAT_MAX_PLANES] = {
> +					AST_HWC_PITCH,
> +				};
> +
> +				drm_fb_argb8888_to_argb4444(argb4444_dst, argb4444_dst_pitch,
> +							    shadow_plane_state->data, fb, &damage,
> +							    &shadow_plane_state->fmtcnv_state);
> +			}
> +			break;
> +		}
>   		ast_set_cursor_image(ast, argb4444, fb->width, fb->height);
>   		ast_set_cursor_base(ast, dst_off);
>   	}
diff mbox series

Patch

diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
index ed00275d6418..4beac9cdfe83 100644
--- a/drivers/gpu/drm/ast/ast_mode.c
+++ b/drivers/gpu/drm/ast/ast_mode.c
@@ -718,6 +718,7 @@  static void ast_set_cursor_enabled(struct ast_device *ast, bool enabled)
 }
 
 static const uint32_t ast_cursor_plane_formats[] = {
+	DRM_FORMAT_ARGB4444,
 	DRM_FORMAT_ARGB8888,
 };
 
@@ -769,17 +770,28 @@  static void ast_cursor_plane_helper_atomic_update(struct drm_plane *plane,
 	 */
 
 	if (drm_atomic_helper_damage_merged(old_plane_state, plane_state, &damage)) {
-		u8 *argb4444 = ast_cursor_plane->argb4444;
-		struct iosys_map argb4444_dst[DRM_FORMAT_MAX_PLANES] = {
-			IOSYS_MAP_INIT_VADDR(argb4444),
-		};
-		unsigned int argb4444_dst_pitch[DRM_FORMAT_MAX_PLANES] = {
-			AST_HWC_PITCH,
-		};
-
-		drm_fb_argb8888_to_argb4444(argb4444_dst, argb4444_dst_pitch,
-					    shadow_plane_state->data, fb, &damage,
-					    &shadow_plane_state->fmtcnv_state);
+		u8 *argb4444;
+
+		switch (fb->format->format) {
+		case DRM_FORMAT_ARGB4444:
+			argb4444 = shadow_plane_state->data[0].vaddr;
+			break;
+		default:
+			argb4444 = ast_cursor_plane->argb4444;
+			{
+				struct iosys_map argb4444_dst[DRM_FORMAT_MAX_PLANES] = {
+					IOSYS_MAP_INIT_VADDR(argb4444),
+				};
+				unsigned int argb4444_dst_pitch[DRM_FORMAT_MAX_PLANES] = {
+					AST_HWC_PITCH,
+				};
+
+				drm_fb_argb8888_to_argb4444(argb4444_dst, argb4444_dst_pitch,
+							    shadow_plane_state->data, fb, &damage,
+							    &shadow_plane_state->fmtcnv_state);
+			}
+			break;
+		}
 		ast_set_cursor_image(ast, argb4444, fb->width, fb->height);
 		ast_set_cursor_base(ast, dst_off);
 	}