drm/plane-helper: Add a drm_plane_helper_atomic_check() helper
authorJavier Martinez Canillas <javierm@redhat.com>
Tue, 13 Sep 2022 16:23:07 +0000 (18:23 +0200)
committerJavier Martinez Canillas <javierm@redhat.com>
Fri, 16 Sep 2022 21:33:52 +0000 (23:33 +0200)
Provides a default plane state check handler for primary planes that are a
fullscreen scanout buffer and whose state scale and position can't change.

There are some drivers that duplicate this logic in their helpers, such as
simpledrm and ssd130x. Factor out this common code into a plane helper and
make drivers use it.

Suggested-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Link: https://patchwork.freedesktop.org/patch/msgid/20220913162307.121503-1-javierm@redhat.com
drivers/gpu/drm/drm_plane_helper.c
drivers/gpu/drm/solomon/ssd130x.c
drivers/gpu/drm/tiny/simpledrm.c
include/drm/drm_plane_helper.h

index c7785967f5bf7d5e2e65695b0be5628d09d01ca0..db04d9a32ce83a4818c6db2feb93a361995dbc0f 100644 (file)
@@ -278,3 +278,33 @@ void drm_plane_helper_destroy(struct drm_plane *plane)
        kfree(plane);
 }
 EXPORT_SYMBOL(drm_plane_helper_destroy);
+
+/**
+ * drm_plane_helper_atomic_check() - Helper to check plane atomic-state
+ * @plane: plane to check
+ * @state: atomic state object
+ *
+ * Provides a default plane-state check handler for planes whose atomic-state
+ * scale and positioning are not expected to change since the plane is always
+ * a fullscreen scanout buffer.
+ *
+ * This is often the case for the primary plane of simple framebuffers.
+ *
+ * RETURNS:
+ * Zero on success, or an errno code otherwise.
+ */
+int drm_plane_helper_atomic_check(struct drm_plane *plane, struct drm_atomic_state *state)
+{
+       struct drm_plane_state *new_plane_state = drm_atomic_get_new_plane_state(state, plane);
+       struct drm_crtc *new_crtc = new_plane_state->crtc;
+       struct drm_crtc_state *new_crtc_state = NULL;
+
+       if (new_crtc)
+               new_crtc_state = drm_atomic_get_new_crtc_state(state, new_crtc);
+
+       return drm_atomic_helper_check_plane_state(new_plane_state, new_crtc_state,
+                                                  DRM_PLANE_NO_SCALING,
+                                                  DRM_PLANE_NO_SCALING,
+                                                  false, false);
+}
+EXPORT_SYMBOL(drm_plane_helper_atomic_check);
index c95221fff474f817056d1b2085eb08891699cc6c..7fae9480aa116287faa24dccf7feefaa3c6b8bf3 100644 (file)
@@ -565,22 +565,6 @@ static int ssd130x_fb_blit_rect(struct drm_framebuffer *fb, const struct iosys_m
        return ret;
 }
 
-static int ssd130x_primary_plane_helper_atomic_check(struct drm_plane *plane,
-                                                    struct drm_atomic_state *new_state)
-{
-       struct drm_plane_state *new_plane_state = drm_atomic_get_new_plane_state(new_state, plane);
-       struct drm_crtc *new_crtc = new_plane_state->crtc;
-       struct drm_crtc_state *new_crtc_state = NULL;
-
-       if (new_crtc)
-               new_crtc_state = drm_atomic_get_new_crtc_state(new_state, new_crtc);
-
-       return drm_atomic_helper_check_plane_state(new_plane_state, new_crtc_state,
-                                                  DRM_PLANE_NO_SCALING,
-                                                  DRM_PLANE_NO_SCALING,
-                                                  false, false);
-}
-
 static void ssd130x_primary_plane_helper_atomic_update(struct drm_plane *plane,
                                                       struct drm_atomic_state *old_state)
 {
@@ -623,7 +607,7 @@ static void ssd130x_primary_plane_helper_atomic_disable(struct drm_plane *plane,
 
 static const struct drm_plane_helper_funcs ssd130x_primary_plane_helper_funcs = {
        DRM_GEM_SHADOW_PLANE_HELPER_FUNCS,
-       .atomic_check = ssd130x_primary_plane_helper_atomic_check,
+       .atomic_check = drm_plane_helper_atomic_check,
        .atomic_update = ssd130x_primary_plane_helper_atomic_update,
        .atomic_disable = ssd130x_primary_plane_helper_atomic_disable,
 };
index 777ccd250871749744d1dc80e339e10c19c8232c..ea5b3239a65918fc079c30946ee5ce188607bf2a 100644 (file)
@@ -469,29 +469,6 @@ static const uint64_t simpledrm_primary_plane_format_modifiers[] = {
        DRM_FORMAT_MOD_INVALID
 };
 
-static int simpledrm_primary_plane_helper_atomic_check(struct drm_plane *plane,
-                                                      struct drm_atomic_state *new_state)
-{
-       struct drm_plane_state *new_plane_state = drm_atomic_get_new_plane_state(new_state, plane);
-       struct drm_crtc *new_crtc = new_plane_state->crtc;
-       struct drm_crtc_state *new_crtc_state = NULL;
-       int ret;
-
-       if (new_crtc)
-               new_crtc_state = drm_atomic_get_new_crtc_state(new_state, new_crtc);
-
-       ret = drm_atomic_helper_check_plane_state(new_plane_state, new_crtc_state,
-                                                 DRM_PLANE_NO_SCALING,
-                                                 DRM_PLANE_NO_SCALING,
-                                                 false, false);
-       if (ret)
-               return ret;
-       else if (!new_plane_state->visible)
-               return 0;
-
-       return 0;
-}
-
 static void simpledrm_primary_plane_helper_atomic_update(struct drm_plane *plane,
                                                         struct drm_atomic_state *old_state)
 {
@@ -543,7 +520,7 @@ static void simpledrm_primary_plane_helper_atomic_disable(struct drm_plane *plan
 
 static const struct drm_plane_helper_funcs simpledrm_primary_plane_helper_funcs = {
        DRM_GEM_SHADOW_PLANE_HELPER_FUNCS,
-       .atomic_check = simpledrm_primary_plane_helper_atomic_check,
+       .atomic_check = drm_plane_helper_atomic_check,
        .atomic_update = simpledrm_primary_plane_helper_atomic_update,
        .atomic_disable = simpledrm_primary_plane_helper_atomic_disable,
 };
index 1781fab24dd69177e5891e110fb108822e827bee..7760b27b0323cd017f844eecb2c989c6420da3dc 100644 (file)
@@ -41,5 +41,6 @@ int drm_plane_helper_update_primary(struct drm_plane *plane, struct drm_crtc *cr
 int drm_plane_helper_disable_primary(struct drm_plane *plane,
                                     struct drm_modeset_acquire_ctx *ctx);
 void drm_plane_helper_destroy(struct drm_plane *plane);
+int drm_plane_helper_atomic_check(struct drm_plane *plane, struct drm_atomic_state *state);
 
 #endif