Gen3 hardware supports color keying with replacement of the pixel value.
Implement it using the standard KMS colorkey properties.

Signed-off-by: Laurent Pinchart <laurent.pinchart+rene...@ideasonboard.com>
---
 drivers/gpu/drm/rcar-du/rcar_du_vsp.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/drivers/gpu/drm/rcar-du/rcar_du_vsp.c 
b/drivers/gpu/drm/rcar-du/rcar_du_vsp.c
index 882d1f7a328b..54deb9567cd3 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_vsp.c
+++ b/drivers/gpu/drm/rcar-du/rcar_du_vsp.c
@@ -198,6 +198,13 @@ static void rcar_du_vsp_plane_setup(struct 
rcar_du_vsp_plane *plane)
                }
        }
 
+       /* Convert the colorkey from 16 bits to 8 bits per component. */
+       cfg.colorkey.enabled = state->state.colorkey.mode;
+       cfg.colorkey.alpha = state->state.colorkey.value >> 56;
+       cfg.colorkey.key = ((state->state.colorkey.min >> 24) & 0x00ff0000)
+                        | ((state->state.colorkey.min >> 16) & 0x0000ff00)
+                        | ((state->state.colorkey.min >>  8) & 0x000000ff);
+
        vsp1_du_atomic_update(plane->vsp->vsp, crtc->vsp_pipe,
                              plane->index, &cfg);
 }
@@ -383,6 +390,11 @@ static const struct drm_plane_funcs 
rcar_du_vsp_plane_funcs = {
        .atomic_get_property = rcar_du_vsp_plane_atomic_get_property,
 };
 
+static const struct drm_prop_enum_list colorkey_modes[] = {
+       { 0, "disabled" },
+       { 1, "source" },
+};
+
 int rcar_du_vsp_init(struct rcar_du_vsp *vsp, struct device_node *np,
                     unsigned int crtcs)
 {
@@ -441,6 +453,10 @@ int rcar_du_vsp_init(struct rcar_du_vsp *vsp, struct 
device_node *np,
                                           rcdu->props.alpha, 255);
                drm_plane_create_zpos_property(&plane->plane, 1, 1,
                                               vsp->num_planes - 1);
+               drm_plane_create_colorkey_properties(&plane->plane,
+                                                    colorkey_modes,
+                                                    ARRAY_SIZE(colorkey_modes),
+                                                    true);
        }
 
        return 0;
-- 
Regards,

Laurent Pinchart

Reply via email to