aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-5.15/950-0650-drm-vc4-Add-alpha_blend_mode-property-to-each-plane.patch
diff options
context:
space:
mode:
authorÁlvaro Fernández Rojas <noltari@gmail.com>2022-05-16 23:40:32 +0200
committerÁlvaro Fernández Rojas <noltari@gmail.com>2022-05-17 15:11:22 +0200
commit20ea6adbf199097c4f5f591ffee088340630dae4 (patch)
treed6719d95e136611a1c25bbf7789652d6d402779d /target/linux/bcm27xx/patches-5.15/950-0650-drm-vc4-Add-alpha_blend_mode-property-to-each-plane.patch
parentbca05bd072180dc38ef740b37ded9572a6db1981 (diff)
downloadupstream-20ea6adbf199097c4f5f591ffee088340630dae4.tar.gz
upstream-20ea6adbf199097c4f5f591ffee088340630dae4.tar.bz2
upstream-20ea6adbf199097c4f5f591ffee088340630dae4.zip
bcm27xx: add support for linux v5.15
Build system: x86_64 Build-tested: bcm2708, bcm2709, bcm2710, bcm2711 Run-tested: bcm2708/RPiB+, bcm2709/RPi3B, bcm2710/RPi3B, bcm2711/RPi4B Signed-off-by: Marty Jones <mj8263788@gmail.com> Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
Diffstat (limited to 'target/linux/bcm27xx/patches-5.15/950-0650-drm-vc4-Add-alpha_blend_mode-property-to-each-plane.patch')
-rw-r--r--target/linux/bcm27xx/patches-5.15/950-0650-drm-vc4-Add-alpha_blend_mode-property-to-each-plane.patch108
1 files changed, 108 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-5.15/950-0650-drm-vc4-Add-alpha_blend_mode-property-to-each-plane.patch b/target/linux/bcm27xx/patches-5.15/950-0650-drm-vc4-Add-alpha_blend_mode-property-to-each-plane.patch
new file mode 100644
index 0000000000..23162421c3
--- /dev/null
+++ b/target/linux/bcm27xx/patches-5.15/950-0650-drm-vc4-Add-alpha_blend_mode-property-to-each-plane.patch
@@ -0,0 +1,108 @@
+From 7760958a0fb50b0e20f88e220f55798ec154c41e Mon Sep 17 00:00:00 2001
+From: Dave Stevenson <dave.stevenson@raspberrypi.com>
+Date: Sat, 8 Jan 2022 13:24:10 +0000
+Subject: [PATCH] drm/vc4: Add alpha_blend_mode property to each plane.
+
+Move from only supporting the default of pre-multiplied
+alpha to supporting user specified blend mode using the
+standardised property.
+
+Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
+---
+ drivers/gpu/drm/vc4/vc4_plane.c | 62 ++++++++++++++++++++++++++-------
+ 1 file changed, 49 insertions(+), 13 deletions(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_plane.c
++++ b/drivers/gpu/drm/vc4/vc4_plane.c
+@@ -663,6 +663,48 @@ static const u32 colorspace_coeffs[2][DR
+ }
+ };
+
++static u32 vc4_hvs4_get_alpha_blend_mode(struct drm_plane_state *state)
++{
++ if (!state->fb->format->has_alpha)
++ return VC4_SET_FIELD(SCALER_POS2_ALPHA_MODE_FIXED,
++ SCALER_POS2_ALPHA_MODE);
++
++ switch (state->pixel_blend_mode) {
++ case DRM_MODE_BLEND_PIXEL_NONE:
++ return VC4_SET_FIELD(SCALER_POS2_ALPHA_MODE_FIXED,
++ SCALER_POS2_ALPHA_MODE);
++ default:
++ case DRM_MODE_BLEND_PREMULTI:
++ return VC4_SET_FIELD(SCALER_POS2_ALPHA_MODE_PIPELINE,
++ SCALER_POS2_ALPHA_MODE) |
++ SCALER_POS2_ALPHA_PREMULT;
++ case DRM_MODE_BLEND_COVERAGE:
++ return VC4_SET_FIELD(SCALER_POS2_ALPHA_MODE_PIPELINE,
++ SCALER_POS2_ALPHA_MODE);
++ }
++}
++
++static u32 vc4_hvs5_get_alpha_blend_mode(struct drm_plane_state *state)
++{
++ if (!state->fb->format->has_alpha)
++ return VC4_SET_FIELD(SCALER5_CTL2_ALPHA_MODE_FIXED,
++ SCALER5_CTL2_ALPHA_MODE);
++
++ switch (state->pixel_blend_mode) {
++ case DRM_MODE_BLEND_PIXEL_NONE:
++ return VC4_SET_FIELD(SCALER5_CTL2_ALPHA_MODE_FIXED,
++ SCALER5_CTL2_ALPHA_MODE);
++ default:
++ case DRM_MODE_BLEND_PREMULTI:
++ return VC4_SET_FIELD(SCALER5_CTL2_ALPHA_MODE_PIPELINE,
++ SCALER5_CTL2_ALPHA_MODE) |
++ SCALER5_CTL2_ALPHA_PREMULT;
++ case DRM_MODE_BLEND_COVERAGE:
++ return VC4_SET_FIELD(SCALER5_CTL2_ALPHA_MODE_PIPELINE,
++ SCALER5_CTL2_ALPHA_MODE);
++ }
++}
++
+ /* Writes out a full display list for an active plane to the plane's
+ * private dlist state.
+ */
+@@ -945,13 +987,8 @@ static int vc4_plane_mode_set(struct drm
+ /* Position Word 2: Source Image Size, Alpha */
+ vc4_state->pos2_offset = vc4_state->dlist_count;
+ vc4_dlist_write(vc4_state,
+- VC4_SET_FIELD(fb->format->has_alpha ?
+- SCALER_POS2_ALPHA_MODE_PIPELINE :
+- SCALER_POS2_ALPHA_MODE_FIXED,
+- SCALER_POS2_ALPHA_MODE) |
+ (mix_plane_alpha ? SCALER_POS2_ALPHA_MIX : 0) |
+- (fb->format->has_alpha ?
+- SCALER_POS2_ALPHA_PREMULT : 0) |
++ vc4_hvs4_get_alpha_blend_mode(state) |
+ VC4_SET_FIELD(vc4_state->src_w[0],
+ SCALER_POS2_WIDTH) |
+ VC4_SET_FIELD(vc4_state->src_h[0],
+@@ -996,14 +1033,9 @@ static int vc4_plane_mode_set(struct drm
+ vc4_dlist_write(vc4_state,
+ VC4_SET_FIELD(state->alpha >> 4,
+ SCALER5_CTL2_ALPHA) |
+- (fb->format->has_alpha ?
+- SCALER5_CTL2_ALPHA_PREMULT : 0) |
++ vc4_hvs5_get_alpha_blend_mode(state) |
+ (mix_plane_alpha ?
+- SCALER5_CTL2_ALPHA_MIX : 0) |
+- VC4_SET_FIELD(fb->format->has_alpha ?
+- SCALER5_CTL2_ALPHA_MODE_PIPELINE :
+- SCALER5_CTL2_ALPHA_MODE_FIXED,
+- SCALER5_CTL2_ALPHA_MODE)
++ SCALER5_CTL2_ALPHA_MIX : 0)
+ );
+
+ /* Position Word 1: Scaled Image Dimensions. */
+@@ -1493,6 +1525,10 @@ struct drm_plane *vc4_plane_init(struct
+ drm_plane_helper_add(plane, &vc4_plane_helper_funcs);
+
+ drm_plane_create_alpha_property(plane);
++ drm_plane_create_blend_mode_property(plane,
++ BIT(DRM_MODE_BLEND_PIXEL_NONE) |
++ BIT(DRM_MODE_BLEND_PREMULTI) |
++ BIT(DRM_MODE_BLEND_COVERAGE));
+ drm_plane_create_rotation_property(plane, DRM_MODE_ROTATE_0,
+ DRM_MODE_ROTATE_0 |
+ DRM_MODE_ROTATE_180 |