Commit bb1d2dde authored by Jernej Skrabec's avatar Jernej Skrabec Committed by Chen-Yu Tsai
Browse files

drm/sun4i: layer: replace mixer with layer struct



This allows to almost completely decouple layer code from mixer. This is
important for DE33.

Reviewed-by: default avatarChen-Yu Tsai <wens@kernel.org>
Tested-by: default avatarRyan Walklin <ryan@testtoast.com>
Signed-off-by: default avatarJernej Skrabec <jernej.skrabec@gmail.com>
Link: https://patch.msgid.link/20251104180942.61538-29-jernej.skrabec@gmail.com


Signed-off-by: default avatarChen-Yu Tsai <wens@kernel.org>
parent d1fe2639
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -233,14 +233,14 @@ void sun8i_csc_config(struct sun8i_layer *layer,
	u32 mode = sun8i_csc_get_mode(state);
	u32 base;

	if (layer->mixer->cfg->de_type == SUN8I_MIXER_DE3) {
	if (layer->cfg->de_type == SUN8I_MIXER_DE3) {
		sun8i_de3_ccsc_setup(layer->regs, layer->channel,
				     mode, state->color_encoding,
				     state->color_range);
		return;
	}

	base = ccsc_base[layer->mixer->cfg->lay_cfg.ccsc][layer->channel];
	base = ccsc_base[layer->cfg->ccsc][layer->channel];

	sun8i_csc_setup(layer->regs, base,
			mode, state->color_encoding,
+4 −2
Original line number Diff line number Diff line
@@ -339,7 +339,8 @@ static struct drm_plane **sun8i_layers_init(struct drm_device *drm,

		layer = sun8i_vi_layer_init_one(drm, mixer, type,
						mixer->engine.regs, i,
						phy_index, plane_cnt);
						phy_index, plane_cnt,
						&mixer->cfg->lay_cfg);
		if (IS_ERR(layer)) {
			dev_err(drm->dev,
				"Couldn't initialize overlay plane\n");
@@ -364,7 +365,8 @@ static struct drm_plane **sun8i_layers_init(struct drm_device *drm,

		layer = sun8i_ui_layer_init_one(drm, mixer, type,
						mixer->engine.regs, index,
						phy_index, plane_cnt);
						phy_index, plane_cnt,
						&mixer->cfg->lay_cfg);
		if (IS_ERR(layer)) {
			dev_err(drm->dev, "Couldn't initialize %s plane\n",
				i ? "overlay" : "primary");
+14 −13
Original line number Diff line number Diff line
@@ -232,6 +232,7 @@ struct sun8i_layer {
	int				channel;
	int				overlay;
	struct regmap			*regs;
	const struct sun8i_layer_cfg	*cfg;
};

static inline struct sun8i_layer *
@@ -260,14 +261,14 @@ sun8i_blender_regmap(struct sun8i_mixer *mixer)
}

static inline u32
sun8i_channel_base(struct sun8i_mixer *mixer, int channel)
sun8i_channel_base(struct sun8i_layer *layer)
{
	if (mixer->cfg->de_type == SUN8I_MIXER_DE33)
		return DE33_CH_BASE + channel * DE33_CH_SIZE;
	else if (mixer->cfg->de_type == SUN8I_MIXER_DE3)
		return DE3_CH_BASE + channel * DE3_CH_SIZE;
	if (layer->cfg->de_type == SUN8I_MIXER_DE33)
		return DE33_CH_BASE + layer->channel * DE33_CH_SIZE;
	else if (layer->cfg->de_type == SUN8I_MIXER_DE3)
		return DE3_CH_BASE + layer->channel * DE3_CH_SIZE;
	else
		return DE2_CH_BASE + channel * DE2_CH_SIZE;
		return DE2_CH_BASE + layer->channel * DE2_CH_SIZE;
}

int sun8i_mixer_drm_format_to_hw(u32 format, u32 *hw_format);
+11 −13
Original line number Diff line number Diff line
@@ -28,10 +28,9 @@

static void sun8i_ui_layer_disable(struct sun8i_layer *layer)
{
	struct sun8i_mixer *mixer = layer->mixer;
	u32 ch_base = sun8i_channel_base(mixer, layer->channel);
	u32 ch_base = sun8i_channel_base(layer);

	regmap_write(mixer->engine.regs,
	regmap_write(layer->regs,
		     SUN8I_MIXER_CHAN_UI_LAYER_ATTR(ch_base, layer->overlay), 0);
}

@@ -39,11 +38,10 @@ static void sun8i_ui_layer_update_attributes(struct sun8i_layer *layer,
					     struct drm_plane *plane)
{
	struct drm_plane_state *state = plane->state;
	struct sun8i_mixer *mixer = layer->mixer;
	const struct drm_format_info *fmt;
	u32 val, ch_base, hw_fmt;

	ch_base = sun8i_channel_base(mixer, layer->channel);
	ch_base = sun8i_channel_base(layer);
	fmt = state->fb->format;
	sun8i_mixer_drm_format_to_hw(fmt->format, &hw_fmt);

@@ -62,7 +60,6 @@ static void sun8i_ui_layer_update_coord(struct sun8i_layer *layer,
					struct drm_plane *plane)
{
	struct drm_plane_state *state = plane->state;
	struct sun8i_mixer *mixer = layer->mixer;
	u32 src_w, src_h, dst_w, dst_h;
	u32 outsize, insize;
	u32 hphase, vphase;
@@ -71,7 +68,7 @@ static void sun8i_ui_layer_update_coord(struct sun8i_layer *layer,
	DRM_DEBUG_DRIVER("Updating UI channel %d overlay %d\n",
			 layer->channel, layer->overlay);

	ch_base = sun8i_channel_base(mixer, layer->channel);
	ch_base = sun8i_channel_base(layer);

	src_w = drm_rect_width(&state->src) >> 16;
	src_h = drm_rect_height(&state->src) >> 16;
@@ -103,7 +100,7 @@ static void sun8i_ui_layer_update_coord(struct sun8i_layer *layer,
		hscale = state->src_w / state->crtc_w;
		vscale = state->src_h / state->crtc_h;

		if (mixer->cfg->de_type == SUN8I_MIXER_DE33) {
		if (layer->cfg->de_type == SUN8I_MIXER_DE33) {
			sun8i_vi_scaler_setup(layer, src_w, src_h, dst_w, dst_h,
					      hscale, vscale, hphase, vphase,
					      state->fb->format);
@@ -115,7 +112,7 @@ static void sun8i_ui_layer_update_coord(struct sun8i_layer *layer,
		}
	} else {
		DRM_DEBUG_DRIVER("HW scaling is not needed\n");
		if (mixer->cfg->de_type == SUN8I_MIXER_DE33)
		if (layer->cfg->de_type == SUN8I_MIXER_DE33)
			sun8i_vi_scaler_enable(layer, false);
		else
			sun8i_ui_scaler_enable(layer, false);
@@ -126,14 +123,13 @@ static void sun8i_ui_layer_update_buffer(struct sun8i_layer *layer,
					 struct drm_plane *plane)
{
	struct drm_plane_state *state = plane->state;
	struct sun8i_mixer *mixer = layer->mixer;
	struct drm_framebuffer *fb = state->fb;
	struct drm_gem_dma_object *gem;
	dma_addr_t dma_addr;
	u32 ch_base;
	int bpp;

	ch_base = sun8i_channel_base(mixer, layer->channel);
	ch_base = sun8i_channel_base(layer);

	/* Get the physical address of the buffer in memory */
	gem = drm_fb_dma_get_gem_obj(fb, 0);
@@ -190,7 +186,7 @@ static int sun8i_ui_layer_atomic_check(struct drm_plane *plane,
	min_scale = DRM_PLANE_NO_SCALING;
	max_scale = DRM_PLANE_NO_SCALING;

	if (layer->mixer->cfg->lay_cfg.scaler_mask & BIT(layer->channel)) {
	if (layer->cfg->scaler_mask & BIT(layer->channel)) {
		min_scale = SUN8I_UI_SCALER_SCALE_MIN;
		max_scale = SUN8I_UI_SCALER_SCALE_MAX;
	}
@@ -266,7 +262,8 @@ struct sun8i_layer *sun8i_ui_layer_init_one(struct drm_device *drm,
					    enum drm_plane_type type,
					    struct regmap *regs,
					    int index, int phy_index,
					    int plane_cnt)
					    int plane_cnt,
					    const struct sun8i_layer_cfg *cfg)
{
	struct sun8i_layer *layer;
	int ret;
@@ -281,6 +278,7 @@ struct sun8i_layer *sun8i_ui_layer_init_one(struct drm_device *drm,
	layer->channel = phy_index;
	layer->overlay = 0;
	layer->regs = regs;
	layer->cfg = cfg;

	/* possible crtcs are set later */
	ret = drm_universal_plane_init(drm, &layer->plane, 0,
+2 −1
Original line number Diff line number Diff line
@@ -54,5 +54,6 @@ struct sun8i_layer *sun8i_ui_layer_init_one(struct drm_device *drm,
					    enum drm_plane_type type,
					    struct regmap *regs,
					    int index, int phy_index,
					    int plane_cnt);
					    int plane_cnt,
					    const struct sun8i_layer_cfg *cfg);
#endif /* _SUN8I_UI_LAYER_H_ */
Loading