Check dpp.hw_3d_lut before creating shaper tf/lut and 3dlut colorops in
colorpipeline and handling these colorops.

Signed-off-by: Alex Hung <alex.h...@amd.com>
---
V10:
 - Check dpp.hw_3d_lut before creating shaper tf/lut and 3dlut colorops
   (Melissa Wen)

 .../amd/display/amdgpu_dm/amdgpu_dm_color.c   |  47 ++++----
 .../amd/display/amdgpu_dm/amdgpu_dm_colorop.c | 103 +++++++++---------
 2 files changed, 78 insertions(+), 72 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c
index b53aecd1bebc..c6d4a9365c00 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c
@@ -1825,6 +1825,7 @@ amdgpu_dm_plane_set_colorop_properties(struct 
drm_plane_state *plane_state,
 {
        struct drm_colorop *colorop = plane_state->color_pipeline;
        struct drm_device *dev = plane_state->plane->dev;
+       struct amdgpu_device *adev = drm_to_adev(dev);
        int ret;
 
        /* 1D Curve - DEGAM TF */
@@ -1857,32 +1858,34 @@ amdgpu_dm_plane_set_colorop_properties(struct 
drm_plane_state *plane_state,
        if (ret)
                return ret;
 
-       /* 1D Curve & LUT - SHAPER TF & LUT */
-       colorop = colorop->next;
-       if (!colorop) {
-               drm_dbg(dev, "no Shaper TF colorop found\n");
-               return -EINVAL;
-       }
+       if (adev->dm.dc->caps.color.dpp.hw_3d_lut) {
+               /* 1D Curve & LUT - SHAPER TF & LUT */
+               colorop = colorop->next;
+               if (!colorop) {
+                       drm_dbg(dev, "no Shaper TF colorop found\n");
+                       return -EINVAL;
+               }
 
-       ret = __set_dm_plane_colorop_shaper(plane_state, dc_plane_state, 
colorop);
-       if (ret)
-               return ret;
+               ret = __set_dm_plane_colorop_shaper(plane_state, 
dc_plane_state, colorop);
+               if (ret)
+                       return ret;
 
-       /* Shaper LUT colorop is already handled, just skip here */
-       colorop = colorop->next;
-       if (!colorop)
-               return -EINVAL;
+               /* Shaper LUT colorop is already handled, just skip here */
+               colorop = colorop->next;
+               if (!colorop)
+                       return -EINVAL;
 
-       /* 3D LUT */
-       colorop = colorop->next;
-       if (!colorop) {
-               drm_dbg(dev, "no 3D LUT colorop found\n");
-               return -EINVAL;
-       }
+               /* 3D LUT */
+               colorop = colorop->next;
+               if (!colorop) {
+                       drm_dbg(dev, "no 3D LUT colorop found\n");
+                       return -EINVAL;
+               }
 
-       ret = __set_dm_plane_colorop_3dlut(plane_state, dc_plane_state, 
colorop);
-       if (ret)
-               return ret;
+               ret = __set_dm_plane_colorop_3dlut(plane_state, dc_plane_state, 
colorop);
+               if (ret)
+                       return ret;
+       }
 
        /* 1D Curve & LUT - BLND TF & LUT */
        colorop = colorop->next;
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_colorop.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_colorop.c
index 680b4e783959..fdb653548c9a 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_colorop.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_colorop.c
@@ -31,6 +31,7 @@
 
 #include "amdgpu.h"
 #include "amdgpu_dm_colorop.h"
+#include "dc.h"
 
 const u64 amdgpu_dm_supported_degam_tfs =
        BIT(DRM_COLOROP_1D_CURVE_SRGB_EOTF) |
@@ -55,6 +56,7 @@ int amdgpu_dm_initialize_default_pipeline(struct drm_plane 
*plane, struct drm_pr
 {
        struct drm_colorop *ops[MAX_COLOR_PIPELINE_OPS];
        struct drm_device *dev = plane->dev;
+       struct amdgpu_device *adev = drm_to_adev(dev);
        int ret;
        int i = 0;
 
@@ -108,57 +110,58 @@ int amdgpu_dm_initialize_default_pipeline(struct 
drm_plane *plane, struct drm_pr
 
        i++;
 
-       /* 1D curve - SHAPER TF */
-       ops[i] = kzalloc(sizeof(struct drm_colorop), GFP_KERNEL);
-       if (!ops[i]) {
-               ret = -ENOMEM;
-               goto cleanup;
-       }
-
-       ret = drm_plane_colorop_curve_1d_init(dev, ops[i], plane,
-                                             amdgpu_dm_supported_shaper_tfs,
-                                             DRM_COLOROP_FLAG_ALLOW_BYPASS);
-       if (ret)
-               goto cleanup;
-
-       drm_colorop_set_next_property(ops[i-1], ops[i]);
-
-       i++;
-
-       /* 1D LUT - SHAPER LUT */
-       ops[i] = kzalloc(sizeof(struct drm_colorop), GFP_KERNEL);
-       if (!ops[i]) {
-               ret = -ENOMEM;
-               goto cleanup;
+       if (adev->dm.dc->caps.color.dpp.hw_3d_lut) {
+               /* 1D curve - SHAPER TF */
+               ops[i] = kzalloc(sizeof(struct drm_colorop), GFP_KERNEL);
+               if (!ops[i]) {
+                       ret = -ENOMEM;
+                       goto cleanup;
+               }
+
+               ret = drm_plane_colorop_curve_1d_init(dev, ops[i], plane,
+                                               amdgpu_dm_supported_shaper_tfs,
+                                               DRM_COLOROP_FLAG_ALLOW_BYPASS);
+               if (ret)
+                       goto cleanup;
+
+               drm_colorop_set_next_property(ops[i-1], ops[i]);
+
+               i++;
+
+               /* 1D LUT - SHAPER LUT */
+               ops[i] = kzalloc(sizeof(struct drm_colorop), GFP_KERNEL);
+               if (!ops[i]) {
+                       ret = -ENOMEM;
+                       goto cleanup;
+               }
+
+               ret = drm_plane_colorop_curve_1d_lut_init(dev, ops[i], plane, 
MAX_COLOR_LUT_ENTRIES,
+                                                       
DRM_COLOROP_LUT1D_INTERPOLATION_LINEAR,
+                                                       
DRM_COLOROP_FLAG_ALLOW_BYPASS);
+               if (ret)
+                       goto cleanup;
+
+               drm_colorop_set_next_property(ops[i-1], ops[i]);
+
+               i++;
+
+               /* 3D LUT */
+               ops[i] = kzalloc(sizeof(struct drm_colorop), GFP_KERNEL);
+               if (!ops[i]) {
+                       ret = -ENOMEM;
+                       goto cleanup;
+               }
+
+               ret = drm_plane_colorop_3dlut_init(dev, ops[i], plane, 
LUT3D_SIZE,
+                                       
DRM_COLOROP_LUT3D_INTERPOLATION_TETRAHEDRAL,
+                                       DRM_COLOROP_FLAG_ALLOW_BYPASS);
+               if (ret)
+                       goto cleanup;
+
+               drm_colorop_set_next_property(ops[i-1], ops[i]);
+
+               i++;
        }
-
-       ret = drm_plane_colorop_curve_1d_lut_init(dev, ops[i], plane, 
MAX_COLOR_LUT_ENTRIES,
-                                                 
DRM_COLOROP_LUT1D_INTERPOLATION_LINEAR,
-                                                 
DRM_COLOROP_FLAG_ALLOW_BYPASS);
-       if (ret)
-               goto cleanup;
-
-       drm_colorop_set_next_property(ops[i-1], ops[i]);
-
-       i++;
-
-       /* 3D LUT */
-       ops[i] = kzalloc(sizeof(struct drm_colorop), GFP_KERNEL);
-       if (!ops[i]) {
-               ret = -ENOMEM;
-               goto cleanup;
-       }
-
-       ret = drm_plane_colorop_3dlut_init(dev, ops[i], plane, LUT3D_SIZE,
-                                    
DRM_COLOROP_LUT3D_INTERPOLATION_TETRAHEDRAL,
-                                    DRM_COLOROP_FLAG_ALLOW_BYPASS);
-       if (ret)
-               goto cleanup;
-
-       drm_colorop_set_next_property(ops[i-1], ops[i]);
-
-       i++;
-
        /* 1D curve - BLND TF */
        ops[i] = kzalloc(sizeof(struct drm_colorop), GFP_KERNEL);
        if (!ops[i]) {
-- 
2.43.0

Reply via email to