From 2446a049dda9c12e0723f45eda8b513ddfbc9fe4 Mon Sep 17 00:00:00 2001 From: Ping Li Date: Wed, 30 Jul 2014 14:53:56 -0700 Subject: [PATCH] msm: mdss: Disable post processing feature if partial update is enabled Block all post processing and histogram IOCTLs if partial update sysfs node value is set to true, except for the disabling calls. Change-Id: Ib32a668747569d9ad898f5519d7fd22b9bb41547 Signed-off-by: Ping Li --- drivers/video/fbdev/msm/mdss_mdp_overlay.c | 70 ++++++++++++++++++++++ 1 file changed, 70 insertions(+) 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))