Commit 40f302ad authored by Thomas Zimmermann's avatar Thomas Zimmermann
Browse files

drm/simple-kms: Add plane-state helpers



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: default avatarThomas Zimmermann <tzimmermann@suse.de>
Tested-by: default avatarGerd Hoffmann <kraxel@redhat.com>
Acked-by: default avatarGerd Hoffmann <kraxel@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210208115538.6430-2-tzimmermann@suse.de
parent 1d048afe
Loading
Loading
Loading
Loading
+37 −3
Original line number Diff line number Diff line
@@ -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,
};

+27 −0
Original line number Diff line number Diff line
@@ -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);
};

/**