__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
