On 26/11/2025 10:40, Thomas Zimmermann wrote:
Move the format conversion of the cursor framebuffer into the new
helper ast_cursor_plane_get_argb4444(). It returns a buffer in system
memory, which the atomic_update handler copies to video memory.

The returned buffer is either the GEM buffer itself, or a temporary
copy within the plane in ARGB4444 format.

As a small change, list supported formats explicitly in the switch
statement. Do not assume ARGB8888 input by default. The cursor
framebuffer knows its format, so should we.


Thanks, it looks good to me.

Reviewed-by: Jocelyn Falempe <[email protected]>

Signed-off-by: Thomas Zimmermann <[email protected]>
---
  drivers/gpu/drm/ast/ast_cursor.c | 62 ++++++++++++++++++++------------
  1 file changed, 39 insertions(+), 23 deletions(-)

diff --git a/drivers/gpu/drm/ast/ast_cursor.c b/drivers/gpu/drm/ast/ast_cursor.c
index 2d3ad7610c2e..24d696df8fcd 100644
--- a/drivers/gpu/drm/ast/ast_cursor.c
+++ b/drivers/gpu/drm/ast/ast_cursor.c
@@ -181,6 +181,38 @@ static int ast_cursor_plane_helper_atomic_check(struct 
drm_plane *plane,
        return 0;
  }
+static const u8 *ast_cursor_plane_get_argb4444(struct ast_cursor_plane *ast_cursor_plane,
+                                              struct drm_shadow_plane_state 
*shadow_plane_state,
+                                              const struct drm_rect *clip)
+{
+       struct drm_plane_state *plane_state = &shadow_plane_state->base;
+       struct drm_framebuffer *fb = plane_state->fb;
+       u8 *argb4444 = NULL;
+
+       switch (fb->format->format) {
+       case DRM_FORMAT_ARGB4444:
+               argb4444 = shadow_plane_state->data[0].vaddr;
+               break;
+       case DRM_FORMAT_ARGB8888:
+               {
+                       struct iosys_map argb4444_dst[DRM_FORMAT_MAX_PLANES] = {
+                               
IOSYS_MAP_INIT_VADDR(ast_cursor_plane->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, clip,
+                                                   
&shadow_plane_state->fmtcnv_state);
+                       argb4444 = argb4444_dst[0].vaddr;
+               }
+               break;
+       }
+
+       return argb4444;
+}
+
  static void ast_cursor_plane_helper_atomic_update(struct drm_plane *plane,
                                                  struct drm_atomic_state 
*state)
  {
@@ -205,29 +237,13 @@ 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;
-
-               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);
+               const u8 *argb4444 = 
ast_cursor_plane_get_argb4444(ast_cursor_plane,
+                                                                  
shadow_plane_state,
+                                                                  &damage);
+
+               if (argb4444)
+                       ast_set_cursor_image(ast, argb4444, fb->width, 
fb->height);
+
                ast_set_cursor_base(ast, dst_off);
        }

Reply via email to