[PATCH 3/8] drm/sun4i: sun4i_layer: Add a custom plane state
Neil Armstrong
narmstrong at baylibre.com
Wed Dec 13 08:05:41 PST 2017
On 13/12/2017 16:33, Maxime Ripard wrote:
> 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.
>
> Signed-off-by: Maxime Ripard <maxime.ripard at free-electrons.com>
> ---
> drivers/gpu/drm/sun4i/sun4i_layer.c | 48 ++++++++++++++++++++++++++++--
> drivers/gpu/drm/sun4i/sun4i_layer.h | 10 ++++++-
> 2 files changed, 55 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/sun4i/sun4i_layer.c b/drivers/gpu/drm/sun4i/sun4i_layer.c
> index 7bddf12548d3..c3afcf888906 100644
> --- a/drivers/gpu/drm/sun4i/sun4i_layer.c
> +++ b/drivers/gpu/drm/sun4i/sun4i_layer.c
> @@ -25,6 +25,48 @@ struct sun4i_plane_desc {
> 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);
Maybe a blank line here ?
> + 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, ©->state);
> +
> + return ©->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);
You can add a blank line here
> + kfree(s_state);
> +}
> +
> static void sun4i_backend_layer_atomic_disable(struct drm_plane *plane,
> struct drm_plane_state *old_state)
> {
> @@ -52,11 +94,11 @@ static const struct drm_plane_helper_funcs sun4i_backend_layer_helper_funcs = {
> };
>
> static const struct drm_plane_funcs sun4i_backend_layer_funcs = {
> - .atomic_destroy_state = drm_atomic_helper_plane_destroy_state,
> - .atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state,
> + .atomic_destroy_state = sun4i_backend_layer_destroy_state,
> + .atomic_duplicate_state = sun4i_backend_layer_duplicate_state,
> .destroy = drm_plane_cleanup,
> .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,
> };
>
> diff --git a/drivers/gpu/drm/sun4i/sun4i_layer.h b/drivers/gpu/drm/sun4i/sun4i_layer.h
> index 4e84f438b346..d2c19348d1b0 100644
> --- a/drivers/gpu/drm/sun4i/sun4i_layer.h
> +++ b/drivers/gpu/drm/sun4i/sun4i_layer.h
> @@ -22,12 +22,22 @@ struct sun4i_layer {
> int id;
> };
>
> +struct sun4i_layer_state {
> + struct drm_plane_state state;
> +};
> +
> static inline struct sun4i_layer *
> plane_to_sun4i_layer(struct drm_plane *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 sunxi_engine *engine);
>
>
Reviewed-by: Neil Armstrong <narmstrong at baylibre.com>
More information about the linux-arm-kernel
mailing list