drm/simple-kms: Add plane-state helpers
authorThomas Zimmermann <tzimmermann@suse.de>
Mon, 8 Feb 2021 11:55:32 +0000 (12:55 +0100)
committerThomas Zimmermann <tzimmermann@suse.de>
Mon, 8 Feb 2021 11:59:59 +0000 (12:59 +0100)
Just like regular plane-state helpers, drivers can use these new
callbacks to create and destroy private plane state.

v2:
* make duplicate_state interface compatible with
  struct drm_plane_funcs

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Tested-by: Gerd Hoffmann <kraxel@redhat.com>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210208115538.6430-2-tzimmermann@suse.de
drivers/gpu/drm/drm_simple_kms_helper.c
include/drm/drm_simple_kms_helper.h

index 6ce8f5c..89675d4 100644 (file)
@@ -253,13 +253,47 @@ static const struct drm_plane_helper_funcs drm_simple_kms_plane_helper_funcs = {
        .atomic_update = drm_simple_kms_plane_atomic_update,
 };
 
+static void drm_simple_kms_plane_reset(struct drm_plane *plane)
+{
+       struct drm_simple_display_pipe *pipe;
+
+       pipe = container_of(plane, struct drm_simple_display_pipe, plane);
+       if (!pipe->funcs || !pipe->funcs->reset_plane)
+               return drm_atomic_helper_plane_reset(plane);
+
+       return pipe->funcs->reset_plane(pipe);
+}
+
+static struct drm_plane_state *drm_simple_kms_plane_duplicate_state(struct drm_plane *plane)
+{
+       struct drm_simple_display_pipe *pipe;
+
+       pipe = container_of(plane, struct drm_simple_display_pipe, plane);
+       if (!pipe->funcs || !pipe->funcs->duplicate_plane_state)
+               return drm_atomic_helper_plane_duplicate_state(plane);
+
+       return pipe->funcs->duplicate_plane_state(pipe);
+}
+
+static void drm_simple_kms_plane_destroy_state(struct drm_plane *plane,
+                                              struct drm_plane_state *state)
+{
+       struct drm_simple_display_pipe *pipe;
+
+       pipe = container_of(plane, struct drm_simple_display_pipe, plane);
+       if (!pipe->funcs || !pipe->funcs->destroy_plane_state)
+               drm_atomic_helper_plane_destroy_state(plane, state);
+       else
+               pipe->funcs->destroy_plane_state(pipe, state);
+}
+
 static const struct drm_plane_funcs drm_simple_kms_plane_funcs = {
        .update_plane           = drm_atomic_helper_update_plane,
        .disable_plane          = drm_atomic_helper_disable_plane,
        .destroy                = drm_plane_cleanup,
-       .reset                  = drm_atomic_helper_plane_reset,
-       .atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state,
-       .atomic_destroy_state   = drm_atomic_helper_plane_destroy_state,
+       .reset                  = drm_simple_kms_plane_reset,
+       .atomic_duplicate_state = drm_simple_kms_plane_duplicate_state,
+       .atomic_destroy_state   = drm_simple_kms_plane_destroy_state,
        .format_mod_supported   = drm_simple_kms_format_mod_supported,
 };
 
index e6dbf31..40b3457 100644 (file)
@@ -149,6 +149,33 @@ struct drm_simple_display_pipe_funcs {
         * more details.
         */
        void (*disable_vblank)(struct drm_simple_display_pipe *pipe);
+
+       /**
+        * @reset_plane:
+        *
+        * Optional, called by &drm_plane_funcs.reset. Please read the
+        * documentation for the &drm_plane_funcs.reset hook for more details.
+        */
+       void (*reset_plane)(struct drm_simple_display_pipe *pipe);
+
+       /**
+        * @duplicate_plane_state:
+        *
+        * Optional, called by &drm_plane_funcs.atomic_duplicate_state.  Please
+        * read the documentation for the &drm_plane_funcs.atomic_duplicate_state
+        * hook for more details.
+        */
+       struct drm_plane_state * (*duplicate_plane_state)(struct drm_simple_display_pipe *pipe);
+
+       /**
+        * @destroy_plane_state:
+        *
+        * Optional, called by &drm_plane_funcs.atomic_destroy_state.  Please
+        * read the documentation for the &drm_plane_funcs.atomic_destroy_state
+        * hook for more details.
+        */
+       void (*destroy_plane_state)(struct drm_simple_display_pipe *pipe,
+                                   struct drm_plane_state *plane_state);
 };
 
 /**