diff --git a/msm/sde/sde_hw_reg_dma_v1_color_proc.c b/msm/sde/sde_hw_reg_dma_v1_color_proc.c index d2e4de2609..45e80bc051 100644 --- a/msm/sde/sde_hw_reg_dma_v1_color_proc.c +++ b/msm/sde/sde_hw_reg_dma_v1_color_proc.c @@ -134,6 +134,7 @@ enum ltm_vlut_ops_bitmask { ltm_dither = BIT(1), ltm_roi = BIT(2), ltm_vlut = BIT(3), + ltm_init = BIT(4), ltm_ops_max = BIT(31), }; @@ -4085,6 +4086,7 @@ static void ltm_initv1_disable(struct sde_hw_dspp *ctx, void *cfg, ltm_vlut_ops_mask[dspp_idx[i]] &= ~ltm_dither; ltm_vlut_ops_mask[dspp_idx[i]] &= ~ltm_unsharp; + ltm_vlut_ops_mask[dspp_idx[i]] &= ~ltm_init; REG_DMA_SETUP_OPS(dma_write_cfg, 0x04, &opmode, sizeof(opmode), REG_SINGLE_MODIFY, 0, 0, REG_DMA_LTM_INIT_DISABLE_OP_MASK); @@ -4215,6 +4217,8 @@ void reg_dmav1_setup_ltm_initv1(struct sde_hw_dspp *ctx, void *cfg) ltm_vlut_ops_mask[dspp_idx[i]] &= ~ltm_unsharp; } + ltm_vlut_ops_mask[dspp_idx[i]] |= ltm_init; + /* broadcast feature is not supported with REG_SINGLE_MODIFY */ REG_DMA_SETUP_OPS(dma_write_cfg, 0x04, &opmode, sizeof(opmode), REG_SINGLE_MODIFY, 0, 0, @@ -4436,6 +4440,13 @@ static int reg_dmav1_setup_ltm_vlutv1_common(struct sde_hw_dspp *ctx, void *cfg, return -EINVAL; } + /* vlut is set before ltm init */ + if (!(ltm_vlut_ops_mask[dspp_idx[0]] & ltm_init)) { + DRM_DEBUG_DRIVER("vlut is set before ltm init\n"); + SDE_EVT32(ctx->idx, 0x2222); + return -EINVAL; + } + if (hw_cfg->len != sizeof(struct drm_msm_ltm_data)) { DRM_ERROR("invalid size of payload len %d exp %zd\n", hw_cfg->len, sizeof(struct drm_msm_ltm_data));