Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/sun4i: Add alpha property for sun8i and sun50i VI layer

DE3.0 VI layers supports plane-global alpha channel.
DE2.0 FCC block have GLOBAL_ALPHA register that can be used as alpha source
for blender.

Add alpha property to the DRM plane and connect it to the
corresponding registers in the mixer.

Do not add alpha property for V3s SOC that have DE2.0 and 2 VI planes.

Signed-off-by: Roman Stratiienko <r.stratiienko@gmail.com>
Reviewed-by: Jernej Skrabec <jernej.skrabec@siol.net>
Signed-off-by: Maxime Ripard <maxime@cerno.tech>
Link: https://patchwork.freedesktop.org/patch/msgid/20210128113940.347013-3-r.stratiienko@gmail.com

authored by

Roman Stratiienko and committed by
Maxime Ripard
c0f6f0c4 0ee29373

+51 -8
+40 -8
drivers/gpu/drm/sun4i/sun8i_vi_layer.c
··· 66 66 } 67 67 } 68 68 69 + static void sun8i_vi_layer_update_alpha(struct sun8i_mixer *mixer, int channel, 70 + int overlay, struct drm_plane *plane) 71 + { 72 + u32 mask, val, ch_base; 73 + 74 + ch_base = sun8i_channel_base(mixer, channel); 75 + 76 + if (mixer->cfg->is_de3) { 77 + mask = SUN50I_MIXER_CHAN_VI_LAYER_ATTR_ALPHA_MASK | 78 + SUN50I_MIXER_CHAN_VI_LAYER_ATTR_ALPHA_MODE_MASK; 79 + val = SUN50I_MIXER_CHAN_VI_LAYER_ATTR_ALPHA 80 + (plane->state->alpha >> 8); 81 + 82 + val |= (plane->state->alpha == DRM_BLEND_ALPHA_OPAQUE) ? 83 + SUN50I_MIXER_CHAN_VI_LAYER_ATTR_ALPHA_MODE_PIXEL : 84 + SUN50I_MIXER_CHAN_VI_LAYER_ATTR_ALPHA_MODE_COMBINED; 85 + 86 + regmap_update_bits(mixer->engine.regs, 87 + SUN8I_MIXER_CHAN_VI_LAYER_ATTR(ch_base, 88 + overlay), 89 + mask, val); 90 + } else if (mixer->cfg->vi_num == 1) { 91 + regmap_update_bits(mixer->engine.regs, 92 + SUN8I_MIXER_FCC_GLOBAL_ALPHA_REG, 93 + SUN8I_MIXER_FCC_GLOBAL_ALPHA_MASK, 94 + SUN8I_MIXER_FCC_GLOBAL_ALPHA 95 + (plane->state->alpha >> 8)); 96 + } 97 + } 98 + 69 99 static int sun8i_vi_layer_update_coord(struct sun8i_mixer *mixer, int channel, 70 100 int overlay, struct drm_plane *plane, 71 101 unsigned int zpos) ··· 298 268 SUN8I_MIXER_CHAN_VI_LAYER_ATTR(ch_base, overlay), 299 269 SUN8I_MIXER_CHAN_VI_LAYER_ATTR_RGB_MODE, val); 300 270 301 - /* It seems that YUV formats use global alpha setting. */ 302 - if (mixer->cfg->is_de3) 303 - regmap_update_bits(mixer->engine.regs, 304 - SUN8I_MIXER_CHAN_VI_LAYER_ATTR(ch_base, 305 - overlay), 306 - SUN50I_MIXER_CHAN_VI_LAYER_ATTR_ALPHA_MASK, 307 - SUN50I_MIXER_CHAN_VI_LAYER_ATTR_ALPHA(0xff)); 308 - 309 271 return 0; 310 272 } 311 273 ··· 415 393 416 394 sun8i_vi_layer_update_coord(mixer, layer->channel, 417 395 layer->overlay, plane, zpos); 396 + sun8i_vi_layer_update_alpha(mixer, layer->channel, 397 + layer->overlay, plane); 418 398 sun8i_vi_layer_update_formats(mixer, layer->channel, 419 399 layer->overlay, plane); 420 400 sun8i_vi_layer_update_buffer(mixer, layer->channel, ··· 557 533 } 558 534 559 535 plane_cnt = mixer->cfg->ui_num + mixer->cfg->vi_num; 536 + 537 + if (mixer->cfg->vi_num == 1 || mixer->cfg->is_de3) { 538 + ret = drm_plane_create_alpha_property(&layer->plane); 539 + if (ret) { 540 + dev_err(drm->dev, "Couldn't add alpha property\n"); 541 + return ERR_PTR(ret); 542 + } 543 + } 560 544 561 545 ret = drm_plane_create_zpos_property(&layer->plane, index, 562 546 0, plane_cnt - 1);
+11
drivers/gpu/drm/sun4i/sun8i_vi_layer.h
··· 29 29 #define SUN8I_MIXER_CHAN_VI_VDS_UV(base) \ 30 30 ((base) + 0xfc) 31 31 32 + #define SUN8I_MIXER_FCC_GLOBAL_ALPHA_REG \ 33 + (0xAA000 + 0x90) 34 + 35 + #define SUN8I_MIXER_FCC_GLOBAL_ALPHA(x) ((x) << 24) 36 + #define SUN8I_MIXER_FCC_GLOBAL_ALPHA_MASK GENMASK(31, 24) 37 + 32 38 #define SUN8I_MIXER_CHAN_VI_LAYER_ATTR_EN BIT(0) 33 39 /* RGB mode should be set for RGB formats and cleared for YCbCr */ 34 40 #define SUN8I_MIXER_CHAN_VI_LAYER_ATTR_RGB_MODE BIT(15) 35 41 #define SUN8I_MIXER_CHAN_VI_LAYER_ATTR_FBFMT_OFFSET 8 36 42 #define SUN8I_MIXER_CHAN_VI_LAYER_ATTR_FBFMT_MASK GENMASK(12, 8) 43 + #define SUN50I_MIXER_CHAN_VI_LAYER_ATTR_ALPHA_MODE_MASK GENMASK(2, 1) 37 44 #define SUN50I_MIXER_CHAN_VI_LAYER_ATTR_ALPHA_MASK GENMASK(31, 24) 38 45 #define SUN50I_MIXER_CHAN_VI_LAYER_ATTR_ALPHA(x) ((x) << 24) 46 + 47 + #define SUN50I_MIXER_CHAN_VI_LAYER_ATTR_ALPHA_MODE_PIXEL ((0) << 1) 48 + #define SUN50I_MIXER_CHAN_VI_LAYER_ATTR_ALPHA_MODE_LAYER ((1) << 1) 49 + #define SUN50I_MIXER_CHAN_VI_LAYER_ATTR_ALPHA_MODE_COMBINED ((2) << 1) 39 50 40 51 #define SUN8I_MIXER_CHAN_VI_DS_N(x) ((x) << 16) 41 52 #define SUN8I_MIXER_CHAN_VI_DS_M(x) ((x) << 0)