Re: [PATCH 4/8] drm/sun4i: crtc: Add a custom crtc atomic_check
From: Neil Armstrong
Date: Wed Dec 13 2017 - 11:06:24 EST
On 13/12/2017 16:33, Maxime Ripard wrote:
> We have some restrictions on what the planes and CRTC can provide that are
> tied to only one generation of display engines.
>
> For example, on the first generation, we can only have one YUV plane or one
> plane that uses the frontend output.
>
> Let's allow our engines to provide an atomic_check callback to validate the
> current configuration.
>
> Signed-off-by: Maxime Ripard <maxime.ripard@xxxxxxxxxxxxxxxxxx>
> ---
> drivers/gpu/drm/sun4i/sun4i_crtc.c | 14 ++++++++++++++
> drivers/gpu/drm/sun4i/sunxi_engine.h | 2 ++
> 2 files changed, 16 insertions(+)
>
> diff --git a/drivers/gpu/drm/sun4i/sun4i_crtc.c b/drivers/gpu/drm/sun4i/sun4i_crtc.c
> index 5decae0069d0..2a565325714f 100644
> --- a/drivers/gpu/drm/sun4i/sun4i_crtc.c
> +++ b/drivers/gpu/drm/sun4i/sun4i_crtc.c
> @@ -46,6 +46,19 @@ static struct drm_encoder *sun4i_crtc_get_encoder(struct drm_crtc *crtc)
> return NULL;
> }
>
> +static int sun4i_crtc_atomic_check(struct drm_crtc *crtc,
> + struct drm_crtc_state *state)
> +{
> + struct sun4i_crtc *scrtc = drm_crtc_to_sun4i_crtc(crtc);
> + struct sunxi_engine *engine = scrtc->engine;
> + int ret = 0;
> +
> + if (engine && engine->ops && engine->ops->atomic_check)
> + ret = engine->ops->atomic_check(engine, state);
> +
> + return ret;
> +}
> +
> static void sun4i_crtc_atomic_begin(struct drm_crtc *crtc,
> struct drm_crtc_state *old_state)
> {
> @@ -125,6 +138,7 @@ static void sun4i_crtc_mode_set_nofb(struct drm_crtc *crtc)
> }
>
> static const struct drm_crtc_helper_funcs sun4i_crtc_helper_funcs = {
> + .atomic_check = sun4i_crtc_atomic_check,
> .atomic_begin = sun4i_crtc_atomic_begin,
> .atomic_flush = sun4i_crtc_atomic_flush,
> .atomic_enable = sun4i_crtc_atomic_enable,
> diff --git a/drivers/gpu/drm/sun4i/sunxi_engine.h b/drivers/gpu/drm/sun4i/sunxi_engine.h
> index 4cb70ae65c79..42655230aeba 100644
> --- a/drivers/gpu/drm/sun4i/sunxi_engine.h
> +++ b/drivers/gpu/drm/sun4i/sunxi_engine.h
> @@ -16,6 +16,8 @@ struct drm_device;
> struct sunxi_engine;
>
> struct sunxi_engine_ops {
> + int (*atomic_check)(struct sunxi_engine *engine,
> + struct drm_crtc_state *state);
> void (*commit)(struct sunxi_engine *engine);
> struct drm_plane **(*layers_init)(struct drm_device *drm,
> struct sunxi_engine *engine);
>
Reviewed-by: Neil Armstrong <narmstrong@xxxxxxxxxxxx>