Skip to content

Commit

Permalink
drm/sun4i: backend: Add support for zpos
Browse files Browse the repository at this point in the history
Our various planes have a configurable zpos, that combined with the pipes
allow to configure the composition.

Since the interaction between the pipes, zpos and alphas framebuffers is
not trivial, let's just enable the zpos as an immutable property for now,
and use that zpos in our atomic_update part.

Reviewed-by: Chen-Yu Tsai <wens@csie.org>
Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Link: https://patchwork.freedesktop.org/patch/msgid/b006853e908bd06661c5bc1f2191121523bce0e4.1516617243.git-series.maxime.ripard@free-electrons.com
  • Loading branch information
Maxime Ripard committed Jan 29, 2018
1 parent 2bebcc4 commit 47a05f4
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 0 deletions.
15 changes: 15 additions & 0 deletions drivers/gpu/drm/sun4i/sun4i_backend.c
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,21 @@ int sun4i_backend_update_layer_buffer(struct sun4i_backend *backend,
return 0;
}

int sun4i_backend_update_layer_zpos(struct sun4i_backend *backend, int layer,
struct drm_plane *plane)
{
struct drm_plane_state *state = plane->state;
unsigned int priority = state->normalized_zpos;

DRM_DEBUG_DRIVER("Setting layer %d's priority to %d\n", layer, priority);

regmap_update_bits(backend->engine.regs, SUN4I_BACKEND_ATTCTL_REG0(layer),
SUN4I_BACKEND_ATTCTL_REG0_LAY_PRISEL_MASK,
SUN4I_BACKEND_ATTCTL_REG0_LAY_PRISEL(priority));

return 0;
}

static bool sun4i_backend_plane_uses_scaler(struct drm_plane_state *state)
{
u16 src_h = state->src_h >> 16;
Expand Down
2 changes: 2 additions & 0 deletions drivers/gpu/drm/sun4i/sun4i_backend.h
Original file line number Diff line number Diff line change
Expand Up @@ -182,5 +182,7 @@ int sun4i_backend_update_layer_buffer(struct sun4i_backend *backend,
int layer, struct drm_plane *plane);
int sun4i_backend_update_layer_frontend(struct sun4i_backend *backend,
int layer, uint32_t in_fmt);
int sun4i_backend_update_layer_zpos(struct sun4i_backend *backend,
int layer, struct drm_plane *plane);

#endif /* _SUN4I_BACKEND_H_ */
4 changes: 4 additions & 0 deletions drivers/gpu/drm/sun4i/sun4i_framebuffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@ static int sun4i_de_atomic_check(struct drm_device *dev,
if (ret)
return ret;

ret = drm_atomic_normalize_zpos(dev, state);
if (ret)
return ret;

return drm_atomic_helper_check_planes(dev, state);
}

Expand Down
3 changes: 3 additions & 0 deletions drivers/gpu/drm/sun4i/sun4i_layer.c
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ static void sun4i_backend_layer_atomic_update(struct drm_plane *plane,
}

sun4i_backend_update_layer_coord(backend, layer->id, plane);
sun4i_backend_update_layer_zpos(backend, layer->id, plane);
sun4i_backend_layer_enable(backend, layer->id, true);
}

Expand Down Expand Up @@ -237,6 +238,8 @@ struct drm_plane **sun4i_layers_init(struct drm_device *drm,
return ERR_CAST(layer);
};

drm_plane_create_zpos_immutable_property(&layer->plane, i);

DRM_DEBUG_DRIVER("Assigning %s plane to pipe %d\n",
i ? "overlay" : "primary", plane->pipe);
regmap_update_bits(engine->regs, SUN4I_BACKEND_ATTCTL_REG0(i),
Expand Down

0 comments on commit 47a05f4

Please sign in to comment.