Skip to content

Commit

Permalink
drm/simple-kms: Add plane-state helpers
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Thomas Zimmermann committed Feb 8, 2021
1 parent 1d048af commit 40f302a
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 3 deletions.
40 changes: 37 additions & 3 deletions drivers/gpu/drm/drm_simple_kms_helper.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
};

Expand Down
27 changes: 27 additions & 0 deletions include/drm/drm_simple_kms_helper.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
};

/**
Expand Down

0 comments on commit 40f302a

Please sign in to comment.