Enable the 3D LUT in rcar_du_crtc by first creating a property for
the supported 3d lut modes and by calling the drm_crtc_enable_lut3d()
helper.

Signed-off-by: Jacopo Mondi <jacopo.mo...@ideasonboard.com>
---
 drivers/gpu/drm/rcar-du/rcar_cmm.h     | 14 ++++++++++++++
 drivers/gpu/drm/rcar-du/rcar_du_crtc.c | 23 +++++++++++++++++++++--
 2 files changed, 35 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/rcar-du/rcar_cmm.h 
b/drivers/gpu/drm/rcar-du/rcar_cmm.h
index 277b9e4d9cc4..eed9e480a96f 100644
--- a/drivers/gpu/drm/rcar-du/rcar_cmm.h
+++ b/drivers/gpu/drm/rcar-du/rcar_cmm.h
@@ -8,6 +8,8 @@
 #ifndef __RCAR_CMM_H__
 #define __RCAR_CMM_H__
 
+#include <drm/drm_fourcc.h>
+
 #define CM2_LUT_SIZE           256
 #define CM2_CLU_SIZE           (17 * 17 * 17)
 
@@ -43,6 +45,16 @@ void rcar_cmm_disable(struct platform_device *pdev);
 
 int rcar_cmm_setup(struct platform_device *pdev,
                   const struct rcar_cmm_config *config);
+
+static const struct drm_mode_lut3d_mode rcar_cmm_3dlut_modes[] = {
+       {
+               .lut_size = 17,
+               .lut_stride = {17, 17, 17},
+               .bit_depth = 8,
+               .color_format = DRM_FORMAT_XRGB16161616,
+               .flags = 0,
+       },
+};
 #else
 static inline int rcar_cmm_init(struct platform_device *pdev)
 {
@@ -63,6 +75,8 @@ static inline int rcar_cmm_setup(struct platform_device *pdev,
 {
        return 0;
 }
+
+static const struct drm_mode_lut3d_mode rcar_cmm_3dlut_modes[] = { };
 #endif /* IS_ENABLED(CONFIG_DRM_RCAR_CMM) */
 
 #endif /* __RCAR_CMM_H__ */
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c 
b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
index 895a23161f7b..126083d226d2 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
+++ b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
@@ -571,6 +571,24 @@ static void rcar_du_cmm_setup(struct rcar_du_crtc *rcrtc,
        rcar_cmm_setup(rcrtc->cmm, &cmm_config);
 }
 
+static int rcar_du_cmm_enable_color_mgmt(struct rcar_du_crtc *rcrtc)
+{
+       struct drm_crtc *crtc = &rcrtc->crtc;
+       int ret;
+
+       drm_mode_crtc_set_gamma_size(crtc, CM2_LUT_SIZE);
+       drm_crtc_enable_color_mgmt(crtc, 0, false, CM2_LUT_SIZE);
+
+       ret = drm_crtc_create_lut3d_mode_property(crtc, rcar_cmm_3dlut_modes,
+                                                 
ARRAY_SIZE(rcar_cmm_3dlut_modes));
+       if (ret)
+               return ret;
+
+       drm_crtc_enable_lut3d(crtc, 0);
+
+       return 0;
+}
+
 /* 
-----------------------------------------------------------------------------
  * Start/Stop and Suspend/Resume
  */
@@ -1355,8 +1373,9 @@ int rcar_du_crtc_create(struct rcar_du_group *rgrp, 
unsigned int swindex,
                rcrtc->cmm = rcdu->cmms[swindex];
                rgrp->cmms_mask |= BIT(hwindex % 2);
 
-               drm_mode_crtc_set_gamma_size(crtc, CM2_LUT_SIZE);
-               drm_crtc_enable_color_mgmt(crtc, 0, false, CM2_LUT_SIZE);
+               ret = rcar_du_cmm_enable_color_mgmt(rcrtc);
+               if (ret)
+                       return ret;
        }
 
        drm_crtc_helper_add(crtc, &crtc_helper_funcs);
-- 
2.40.1

Reply via email to