Lines Matching +full:16 +full:- +full:channel
1 // SPDX-License-Identifier: GPL-2.0-or-later
9 * Maxime Ripard <maxime.ripard@free-electrons.com>
27 static void sun8i_ui_layer_update_alpha(struct sun8i_mixer *mixer, int channel, in sun8i_ui_layer_update_alpha() argument
32 ch_base = sun8i_channel_base(mixer, channel); in sun8i_ui_layer_update_alpha()
37 val = SUN8I_MIXER_CHAN_UI_LAYER_ATTR_ALPHA(plane->state->alpha >> 8); in sun8i_ui_layer_update_alpha()
39 val |= (plane->state->alpha == DRM_BLEND_ALPHA_OPAQUE) ? in sun8i_ui_layer_update_alpha()
43 regmap_update_bits(mixer->engine.regs, in sun8i_ui_layer_update_alpha()
48 static int sun8i_ui_layer_update_coord(struct sun8i_mixer *mixer, int channel, in sun8i_ui_layer_update_coord() argument
52 struct drm_plane_state *state = plane->state; in sun8i_ui_layer_update_coord()
58 DRM_DEBUG_DRIVER("Updating UI channel %d overlay %d\n", in sun8i_ui_layer_update_coord()
59 channel, overlay); in sun8i_ui_layer_update_coord()
62 ch_base = sun8i_channel_base(mixer, channel); in sun8i_ui_layer_update_coord()
64 src_w = drm_rect_width(&state->src) >> 16; in sun8i_ui_layer_update_coord()
65 src_h = drm_rect_height(&state->src) >> 16; in sun8i_ui_layer_update_coord()
66 dst_w = drm_rect_width(&state->dst); in sun8i_ui_layer_update_coord()
67 dst_h = drm_rect_height(&state->dst); in sun8i_ui_layer_update_coord()
69 hphase = state->src.x1 & 0xffff; in sun8i_ui_layer_update_coord()
70 vphase = state->src.y1 & 0xffff; in sun8i_ui_layer_update_coord()
77 state->src.x1 >> 16, state->src.y1 >> 16); in sun8i_ui_layer_update_coord()
79 regmap_write(mixer->engine.regs, in sun8i_ui_layer_update_coord()
82 regmap_write(mixer->engine.regs, in sun8i_ui_layer_update_coord()
91 hscale = state->src_w / state->crtc_w; in sun8i_ui_layer_update_coord()
92 vscale = state->src_h / state->crtc_h; in sun8i_ui_layer_update_coord()
94 sun8i_ui_scaler_setup(mixer, channel, src_w, src_h, dst_w, in sun8i_ui_layer_update_coord()
96 sun8i_ui_scaler_enable(mixer, channel, true); in sun8i_ui_layer_update_coord()
99 sun8i_ui_scaler_enable(mixer, channel, false); in sun8i_ui_layer_update_coord()
104 state->dst.x1, state->dst.y1); in sun8i_ui_layer_update_coord()
106 regmap_write(mixer->engine.regs, in sun8i_ui_layer_update_coord()
108 SUN8I_MIXER_COORD(state->dst.x1, state->dst.y1)); in sun8i_ui_layer_update_coord()
109 regmap_write(mixer->engine.regs, in sun8i_ui_layer_update_coord()
116 static int sun8i_ui_layer_update_formats(struct sun8i_mixer *mixer, int channel, in sun8i_ui_layer_update_formats() argument
119 struct drm_plane_state *state = plane->state; in sun8i_ui_layer_update_formats()
124 ch_base = sun8i_channel_base(mixer, channel); in sun8i_ui_layer_update_formats()
126 fmt = state->fb->format; in sun8i_ui_layer_update_formats()
127 ret = sun8i_mixer_drm_format_to_hw(fmt->format, &hw_fmt); in sun8i_ui_layer_update_formats()
128 if (ret || fmt->is_yuv) { in sun8i_ui_layer_update_formats()
130 return -EINVAL; in sun8i_ui_layer_update_formats()
134 regmap_update_bits(mixer->engine.regs, in sun8i_ui_layer_update_formats()
141 static int sun8i_ui_layer_update_buffer(struct sun8i_mixer *mixer, int channel, in sun8i_ui_layer_update_buffer() argument
144 struct drm_plane_state *state = plane->state; in sun8i_ui_layer_update_buffer()
145 struct drm_framebuffer *fb = state->fb; in sun8i_ui_layer_update_buffer()
151 ch_base = sun8i_channel_base(mixer, channel); in sun8i_ui_layer_update_buffer()
156 DRM_DEBUG_DRIVER("Using GEM @ %pad\n", &gem->dma_addr); in sun8i_ui_layer_update_buffer()
159 bpp = fb->format->cpp[0]; in sun8i_ui_layer_update_buffer()
160 dma_addr = gem->dma_addr + fb->offsets[0]; in sun8i_ui_layer_update_buffer()
163 dma_addr += (state->src.x1 >> 16) * bpp; in sun8i_ui_layer_update_buffer()
164 dma_addr += (state->src.y1 >> 16) * fb->pitches[0]; in sun8i_ui_layer_update_buffer()
167 DRM_DEBUG_DRIVER("Layer line width: %d bytes\n", fb->pitches[0]); in sun8i_ui_layer_update_buffer()
168 regmap_write(mixer->engine.regs, in sun8i_ui_layer_update_buffer()
170 fb->pitches[0]); in sun8i_ui_layer_update_buffer()
174 regmap_write(mixer->engine.regs, in sun8i_ui_layer_update_buffer()
187 struct drm_crtc *crtc = new_plane_state->crtc; in sun8i_ui_layer_atomic_check()
197 return -EINVAL; in sun8i_ui_layer_atomic_check()
202 if (layer->mixer->cfg->scaler_mask & BIT(layer->channel)) { in sun8i_ui_layer_atomic_check()
220 unsigned int zpos = new_state->normalized_zpos; in sun8i_ui_layer_atomic_update()
221 struct sun8i_mixer *mixer = layer->mixer; in sun8i_ui_layer_atomic_update()
223 if (!new_state->crtc || !new_state->visible) in sun8i_ui_layer_atomic_update()
226 sun8i_ui_layer_update_coord(mixer, layer->channel, in sun8i_ui_layer_atomic_update()
227 layer->overlay, plane, zpos); in sun8i_ui_layer_atomic_update()
228 sun8i_ui_layer_update_alpha(mixer, layer->channel, in sun8i_ui_layer_atomic_update()
229 layer->overlay, plane); in sun8i_ui_layer_atomic_update()
230 sun8i_ui_layer_update_formats(mixer, layer->channel, in sun8i_ui_layer_atomic_update()
231 layer->overlay, plane); in sun8i_ui_layer_atomic_update()
232 sun8i_ui_layer_update_buffer(mixer, layer->channel, in sun8i_ui_layer_atomic_update()
233 layer->overlay, plane); in sun8i_ui_layer_atomic_update()
283 int channel = mixer->cfg->vi_num + index; in sun8i_ui_layer_init_one() local
288 layer = devm_kzalloc(drm->dev, sizeof(*layer), GFP_KERNEL); in sun8i_ui_layer_init_one()
290 return ERR_PTR(-ENOMEM); in sun8i_ui_layer_init_one()
296 ret = drm_universal_plane_init(drm, &layer->plane, 0, in sun8i_ui_layer_init_one()
302 dev_err(drm->dev, "Couldn't initialize layer\n"); in sun8i_ui_layer_init_one()
306 plane_cnt = mixer->cfg->ui_num + mixer->cfg->vi_num; in sun8i_ui_layer_init_one()
308 ret = drm_plane_create_alpha_property(&layer->plane); in sun8i_ui_layer_init_one()
310 dev_err(drm->dev, "Couldn't add alpha property\n"); in sun8i_ui_layer_init_one()
314 ret = drm_plane_create_zpos_property(&layer->plane, channel, in sun8i_ui_layer_init_one()
315 0, plane_cnt - 1); in sun8i_ui_layer_init_one()
317 dev_err(drm->dev, "Couldn't add zpos property\n"); in sun8i_ui_layer_init_one()
321 drm_plane_helper_add(&layer->plane, &sun8i_ui_layer_helper_funcs); in sun8i_ui_layer_init_one()
322 layer->mixer = mixer; in sun8i_ui_layer_init_one()
323 layer->type = SUN8I_LAYER_TYPE_UI; in sun8i_ui_layer_init_one()
324 layer->channel = channel; in sun8i_ui_layer_init_one()
325 layer->overlay = 0; in sun8i_ui_layer_init_one()