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.

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);
        }
 
-- 
2.51.1

Reply via email to