Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit d540f82a authored by Maxime Ripard's avatar Maxime Ripard
Browse files

drm/sun4i: backend: Add a custom plane state



We will need to store some additional data in the future to the state.
Create a custom plane state that will embed those data, in order to store
the pipe or whether or not that plane should use the frontend.

Reviewed-by: default avatarChen-Yu Tsai <wens@csie.org>
Reviewed-by: default avatarNeil Armstrong <narmstrong@baylibre.com>
Signed-off-by: default avatarMaxime Ripard <maxime.ripard@free-electrons.com>
Link: https://patchwork.freedesktop.org/patch/msgid/88dd9c2b0caa550595e7b2ff37dc9d0af2c78609.1516613040.git-series.maxime.ripard@free-electrons.com
parent 9f4ebf67
Loading
Loading
Loading
Loading
+47 −3
Original line number Original line Diff line number Diff line
@@ -25,6 +25,50 @@ struct sun4i_plane_desc {
	       uint32_t                nformats;
	       uint32_t                nformats;
};
};


static void sun4i_backend_layer_reset(struct drm_plane *plane)
{
	struct sun4i_layer_state *state;

	if (plane->state) {
		state = state_to_sun4i_layer_state(plane->state);

		__drm_atomic_helper_plane_destroy_state(&state->state);

		kfree(state);
		plane->state = NULL;
	}

	state = kzalloc(sizeof(*state), GFP_KERNEL);
	if (state) {
		plane->state = &state->state;
		plane->state->plane = plane;
	}
}

static struct drm_plane_state *
sun4i_backend_layer_duplicate_state(struct drm_plane *plane)
{
	struct sun4i_layer_state *copy;

	copy = kzalloc(sizeof(*copy), GFP_KERNEL);
	if (!copy)
		return NULL;

	__drm_atomic_helper_plane_duplicate_state(plane, &copy->state);

	return &copy->state;
}

static void sun4i_backend_layer_destroy_state(struct drm_plane *plane,
					      struct drm_plane_state *state)
{
	struct sun4i_layer_state *s_state = state_to_sun4i_layer_state(state);

	__drm_atomic_helper_plane_destroy_state(state);

	kfree(s_state);
}

static void sun4i_backend_layer_atomic_disable(struct drm_plane *plane,
static void sun4i_backend_layer_atomic_disable(struct drm_plane *plane,
					       struct drm_plane_state *old_state)
					       struct drm_plane_state *old_state)
{
{
@@ -52,11 +96,11 @@ static const struct drm_plane_helper_funcs sun4i_backend_layer_helper_funcs = {
};
};


static const struct drm_plane_funcs sun4i_backend_layer_funcs = {
static const struct drm_plane_funcs sun4i_backend_layer_funcs = {
	.atomic_destroy_state	= drm_atomic_helper_plane_destroy_state,
	.atomic_destroy_state	= sun4i_backend_layer_destroy_state,
	.atomic_duplicate_state	= drm_atomic_helper_plane_duplicate_state,
	.atomic_duplicate_state	= sun4i_backend_layer_duplicate_state,
	.destroy		= drm_plane_cleanup,
	.destroy		= drm_plane_cleanup,
	.disable_plane		= drm_atomic_helper_disable_plane,
	.disable_plane		= drm_atomic_helper_disable_plane,
	.reset			= drm_atomic_helper_plane_reset,
	.reset			= sun4i_backend_layer_reset,
	.update_plane		= drm_atomic_helper_update_plane,
	.update_plane		= drm_atomic_helper_update_plane,
};
};


+10 −0
Original line number Original line Diff line number Diff line
@@ -22,12 +22,22 @@ struct sun4i_layer {
	int			id;
	int			id;
};
};


struct sun4i_layer_state {
	struct drm_plane_state	state;
};

static inline struct sun4i_layer *
static inline struct sun4i_layer *
plane_to_sun4i_layer(struct drm_plane *plane)
plane_to_sun4i_layer(struct drm_plane *plane)
{
{
	return container_of(plane, struct sun4i_layer, plane);
	return container_of(plane, struct sun4i_layer, plane);
}
}


static inline struct sun4i_layer_state *
state_to_sun4i_layer_state(struct drm_plane_state *state)
{
	return container_of(state, struct sun4i_layer_state, state);
}

struct drm_plane **sun4i_layers_init(struct drm_device *drm,
struct drm_plane **sun4i_layers_init(struct drm_device *drm,
				     struct sunxi_engine *engine);
				     struct sunxi_engine *engine);