diff --git a/drivers/video/fbdev/msm/mdss_mdp_overlay.c b/drivers/video/fbdev/msm/mdss_mdp_overlay.c index a17d7bcc047a..db71c47b792c 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_overlay.c +++ b/drivers/video/fbdev/msm/mdss_mdp_overlay.c @@ -2695,6 +2695,62 @@ static int mdss_bl_scale_config(struct msm_fb_data_type *mfd, return ret; } +static int mdss_mdp_pp_is_disable_op(struct msmfb_mdp_pp *pp) +{ + int flags = 0, ret = 0; + switch (pp->op) { + case mdp_op_pa_cfg: + flags = pp->data.pa_cfg_data.pa_data.flags; + break; + case mdp_op_pa_v2_cfg: + flags = pp->data.pa_v2_cfg_data.pa_v2_data.flags; + break; + case mdp_op_pcc_cfg: + flags = pp->data.pcc_cfg_data.ops; + break; + case mdp_op_lut_cfg: + switch (pp->data.lut_cfg_data.lut_type) { + case mdp_lut_igc: + flags = pp->data.lut_cfg_data.data.igc_lut_data.ops; + break; + case mdp_lut_pgc: + flags = pp->data.lut_cfg_data.data.pgc_lut_data.flags; + break; + case mdp_lut_hist: + flags = pp->data.lut_cfg_data.data.hist_lut_data.ops; + break; + default: + break; + } + break; + case mdp_op_dither_cfg: + flags = pp->data.dither_cfg_data.flags; + break; + case mdp_op_gamut_cfg: + flags = pp->data.gamut_cfg_data.flags; + break; + case mdp_op_ad_cfg: + flags = pp->data.ad_init_cfg.ops; + break; + case mdp_bl_scale_cfg: + flags = MDP_PP_OPS_DISABLE; + break; + case mdp_op_ad_input: + case mdp_op_calib_cfg: + case mdp_op_calib_mode: + case mdp_op_calib_buffer: + case mdp_op_calib_dcm_state: + break; + default: + pr_err("Unsupported request to MDP_PP IOCTL. %d = op\n", + pp->op); + break; + } + if (flags & MDP_PP_OPS_DISABLE) + ret = 1; + return ret; +} + static int mdss_mdp_pp_ioctl(struct msm_fb_data_type *mfd, void __user *argp) { @@ -2703,6 +2759,7 @@ static int mdss_mdp_pp_ioctl(struct msm_fb_data_type *mfd, struct mdss_data_type *mdata = mdss_mdp_get_mdata(); u32 copyback = 0; u32 copy_from_kernel = 0; + struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd); if (!mdata) return -EPERM; @@ -2720,6 +2777,12 @@ static int mdss_mdp_pp_ioctl(struct msm_fb_data_type *mfd, return -EPERM; } + if (mfd->panel_info->partial_update_enabled && mdp5_data->dyn_pu_state + && !mdss_mdp_pp_is_disable_op(&mdp_pp)) { + pr_debug("Partial update feature is enabled.\n"); + return -EPERM; + } + /* Supprt only MDP register read/write and exit_dcm in DCM state*/ if (mfd->dcm_state == DCM_ENTER && @@ -2832,6 +2895,7 @@ static int mdss_mdp_histo_ioctl(struct msm_fb_data_type *mfd, u32 cmd, struct mdss_data_type *mdata = mdss_mdp_get_mdata(); u32 block; static int req = -1; + struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd); if (!mdata) return -EPERM; @@ -2841,6 +2905,12 @@ static int mdss_mdp_histo_ioctl(struct msm_fb_data_type *mfd, u32 cmd, return -EPERM; } + if (mfd->panel_info->partial_update_enabled && mdp5_data->dyn_pu_state + && (cmd != MSMFB_HISTOGRAM_STOP)) { + pr_err("Partial update feature is enabled.\n"); + return -EPERM; + } + switch (cmd) { case MSMFB_HISTOGRAM_START: if (mdss_fb_is_power_off(mfd))