[PATCH] drm/sun4i: report coverage pixel blending for alpha-capable planes

From: hsyysy

Date: Mon Oct 26 2026 - 10:49:30 EST


From: Yang Siyuan <hsyysy@xxxxxxx>

Linux 7.3 added validate_blend_mode_for_alpha_formats(), which warns once
per plane that exposes a pixel format with an alpha channel but has no
blend mode property:

sun4i-drm display-engine: [drm] [PLANE:35:plane-0] pixel format with
alpha exposed but blend mode not setup. Please fix.

The mixer blends a layer using its own alpha channel: ALPHA_MODE is set
to PIXEL when plane alpha is opaque and to COMBINED otherwise, while
BLEND_PREMULTIPLY keeps its reset value. That is straight alpha, i.e. the
DRM "coverage" blending equation.

Advertise exactly DRM_MODE_BLEND_COVERAGE on every layer that can expose
an alpha format (UI always, VI on DE3 and later). This matches the
existing register programming, keeps userspace behaviour unchanged and
satisfies the new validation. Premultiplied blending would require
driving BLEND_PREMULTIPLY and is left as a follow-up.

Fixes: 860e748bddcc ("drm: ensure blend mode supported if pixel format with alpha exposed")
Signed-off-by: Yang Siyuan <hsyysy@xxxxxxx>
---
drivers/gpu/drm/sun4i/sun8i_ui_layer.c | 13 +++++++++++++
drivers/gpu/drm/sun4i/sun8i_vi_layer.c | 14 ++++++++++++++
2 files changed, 27 insertions(+)

diff --git a/drivers/gpu/drm/sun4i/sun8i_ui_layer.c b/drivers/gpu/drm/sun4i/sun8i_ui_layer.c
index 7d894e1eb..ef059ac47 100644
--- a/drivers/gpu/drm/sun4i/sun8i_ui_layer.c
+++ b/drivers/gpu/drm/sun4i/sun8i_ui_layer.c
@@ -283,6 +283,19 @@ struct sun8i_layer *sun8i_ui_layer_init_one(struct drm_device *drm,
return ERR_PTR(ret);
}

+ /*
+ * The mixer blends the layer using its own alpha channel with the
+ * pixels not premultiplied (BLEND_PREMULTIPLY keeps its reset value),
+ * which is the DRM "coverage" equation. Report it so that the blend
+ * mode validation in drm_mode_config_validate() is satisfied.
+ */
+ ret = drm_plane_create_blend_mode_property(&layer->plane,
+ BIT(DRM_MODE_BLEND_COVERAGE));
+ if (ret) {
+ dev_err(drm->dev, "Couldn't add blend mode property\n");
+ return ERR_PTR(ret);
+ }
+
ret = drm_plane_create_zpos_property(&layer->plane, index,
0, plane_cnt - 1);
if (ret) {
diff --git a/drivers/gpu/drm/sun4i/sun8i_vi_layer.c b/drivers/gpu/drm/sun4i/sun8i_vi_layer.c
index 92dd5a97f..b6771576b 100644
--- a/drivers/gpu/drm/sun4i/sun8i_vi_layer.c
+++ b/drivers/gpu/drm/sun4i/sun8i_vi_layer.c
@@ -470,6 +470,20 @@ struct sun8i_layer *sun8i_vi_layer_init_one(struct drm_device *drm,
}
}

+ /*
+ * Only DE3 and later expose pixel formats with an alpha channel, and
+ * the mixer blends them with straight alpha (coverage), same as the UI
+ * layer.
+ */
+ if (layer->cfg->de_type >= SUN8I_MIXER_DE3) {
+ ret = drm_plane_create_blend_mode_property(&layer->plane,
+ BIT(DRM_MODE_BLEND_COVERAGE));
+ if (ret) {
+ dev_err(drm->dev, "Couldn't add blend mode property\n");
+ return ERR_PTR(ret);
+ }
+ }
+
ret = drm_plane_create_zpos_property(&layer->plane, index,
0, plane_cnt - 1);
if (ret) {
base-commit: 091b06388b117fefdcb63336ac09956a4914b961
--
2.56.0