__set_input_tf_32() can fail on ENOMEM and let the blend transfer
function setup in an unstable state. Check its return value and only
enable blend if transfer function was successfully configured.

Reported-by: Sashiko <[email protected]>
Fixes: 5ed78b44e4e6 ("drm/amd/display: add shaper and blend colorops for 1D 
Curve Custom LUT")
Signed-off-by: Melissa Wen <[email protected]>
---
 .../drm/amd/display/amdgpu_dm/amdgpu_dm_color.c   | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 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 ad67106c6435..c528daefac5e 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
@@ -1835,7 +1835,7 @@ __set_dm_plane_colorop_blend(struct drm_plane_state 
*plane_state,
        const struct drm_color_lut32 *blend_lut = NULL;
        struct drm_device *dev = colorop->dev;
        uint32_t blend_size = 0;
-       int i = 0;
+       int i = 0, ret;
 
        tf->type = TF_TYPE_BYPASS;
        dc_plane_state->cm.flags.bits.blend_enable = 0;
@@ -1870,8 +1870,10 @@ __set_dm_plane_colorop_blend(struct drm_plane_state 
*plane_state,
                tf->type = TF_TYPE_DISTRIBUTED_POINTS;
                tf->tf = default_tf = 
amdgpu_colorop_tf_to_dc_tf(tf_state->curve_1d_type);
                tf->sdr_ref_white_level = SDR_WHITE_LEVEL_INIT_VALUE;
+               ret = __set_input_tf_32(NULL, tf, blend_lut, blend_size);
+               if (ret)
+                       return ret;
                dc_plane_state->cm.flags.bits.blend_enable = 1;
-               __set_input_tf_32(NULL, tf, blend_lut, blend_size);
        }
 
        if (lut_state && !lut_state->bypass) {
@@ -1879,13 +1881,16 @@ __set_dm_plane_colorop_blend(struct drm_plane_state 
*plane_state,
                tf->type = TF_TYPE_DISTRIBUTED_POINTS;
                tf->tf = default_tf;
                tf->sdr_ref_white_level = SDR_WHITE_LEVEL_INIT_VALUE;
-               dc_plane_state->cm.flags.bits.blend_enable = 1;
                blend_lut = __extract_blob_lut32(lut_state->data, &blend_size);
                blend_size = blend_lut != NULL ? blend_size : 0;
 
                /* Custom LUT size must be the same as supported size */
-               if (blend_size == lut_colorop->size)
-                       __set_input_tf_32(NULL, tf, blend_lut, blend_size);
+               if (blend_size == lut_colorop->size) {
+                       ret = __set_input_tf_32(NULL, tf, blend_lut, 
blend_size);
+                       if (ret)
+                               return ret;
+                       dc_plane_state->cm.flags.bits.blend_enable = 1;
+               }
        }
 
        return 0;
-- 
2.53.0

Reply via email to