Loading drivers/video/msm/mdss/mdss_mdp_overlay.c +44 −8 Original line number Diff line number Diff line Loading @@ -1457,6 +1457,21 @@ static void mdss_mdp_overlay_update_pm(struct mdss_overlay_private *mdp5_data) activate_event_timer(mdp5_data->cpu_pm_hdl, wakeup_time); } static void __unstage_pipe_and_clean_buf(struct msm_fb_data_type *mfd, struct mdss_mdp_pipe *pipe, struct mdss_mdp_data *buf) { pr_debug("unstaging pipe:%d rect:%d buf:%d\n", pipe->num, pipe->multirect.num, !buf); MDSS_XLOG(pipe->num, pipe->multirect.num, !buf); mdss_mdp_mixer_pipe_unstage(pipe, pipe->mixer_left); mdss_mdp_mixer_pipe_unstage(pipe, pipe->mixer_right); pipe->dirty = true; if (buf) __pipe_buf_mark_cleanup(mfd, buf); } static int __overlay_queue_pipes(struct msm_fb_data_type *mfd) { struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd); Loading Loading @@ -1568,7 +1583,6 @@ static int __overlay_queue_pipes(struct msm_fb_data_type *mfd) pipe->num); ret = -EINVAL; } /* * if we reach here without errors and buf == NULL * then solid fill will be set Loading @@ -1577,14 +1591,36 @@ static int __overlay_queue_pipes(struct msm_fb_data_type *mfd) ret = mdss_mdp_pipe_queue_data(pipe, buf); if (IS_ERR_VALUE(ret)) { pr_warn("Unable to queue data for pnum=%d\n", pr_warn("Unable to queue data for pnum=%d rect=%d\n", pipe->num, pipe->multirect.num); /* * If we fail for a multi-rect pipe, unstage both rects * so we don't leave the pipe configured in multi-rect * mode with only one rectangle staged. */ if (pipe->multirect.mode != MDSS_MDP_PIPE_MULTIRECT_NONE) { struct mdss_mdp_pipe *next_pipe = (struct mdss_mdp_pipe *) pipe->multirect.next; if (next_pipe) { struct mdss_mdp_data *next_buf = list_first_entry_or_null( &next_pipe->buf_queue, struct mdss_mdp_data, pipe_list); __unstage_pipe_and_clean_buf(mfd, next_pipe, next_buf); } else { pr_warn("cannot find rect pnum=%d\n", pipe->num); mdss_mdp_mixer_pipe_unstage(pipe, pipe->mixer_left); mdss_mdp_mixer_pipe_unstage(pipe, pipe->mixer_right); pipe->dirty = true; } } if (buf) __pipe_buf_mark_cleanup(mfd, buf); __unstage_pipe_and_clean_buf(mfd, pipe, buf); } } Loading drivers/video/msm/mdss/mdss_mdp_pipe.c +6 −4 Original line number Diff line number Diff line Loading @@ -2664,20 +2664,22 @@ int mdss_mdp_pipe_queue_data(struct mdss_mdp_pipe *pipe, pipe->params_changed = 0; mdss_mdp_pipe_solidfill_setup(pipe); MDSS_XLOG(pipe->num, pipe->mixer_left->num, pipe->play_cnt, 0x111); MDSS_XLOG(pipe->num, pipe->multirect.num, pipe->mixer_left->num, pipe->play_cnt, 0x111); goto update_nobuf; } MDSS_XLOG(pipe->num, pipe->mixer_left->num, pipe->play_cnt, 0x222); MDSS_XLOG(pipe->num, pipe->multirect.num, pipe->mixer_left->num, pipe->play_cnt, 0x222); if (params_changed) { pipe->params_changed = 0; ret = mdss_mdp_pipe_pp_setup(pipe, &opmode); if (ret) { pr_err("pipe pp setup error for pnum=%d\n", pipe->num); pr_err("pipe pp setup error for pnum=%d rect=%d\n", pipe->num, pipe->multirect.num); goto done; } Loading Loading
drivers/video/msm/mdss/mdss_mdp_overlay.c +44 −8 Original line number Diff line number Diff line Loading @@ -1457,6 +1457,21 @@ static void mdss_mdp_overlay_update_pm(struct mdss_overlay_private *mdp5_data) activate_event_timer(mdp5_data->cpu_pm_hdl, wakeup_time); } static void __unstage_pipe_and_clean_buf(struct msm_fb_data_type *mfd, struct mdss_mdp_pipe *pipe, struct mdss_mdp_data *buf) { pr_debug("unstaging pipe:%d rect:%d buf:%d\n", pipe->num, pipe->multirect.num, !buf); MDSS_XLOG(pipe->num, pipe->multirect.num, !buf); mdss_mdp_mixer_pipe_unstage(pipe, pipe->mixer_left); mdss_mdp_mixer_pipe_unstage(pipe, pipe->mixer_right); pipe->dirty = true; if (buf) __pipe_buf_mark_cleanup(mfd, buf); } static int __overlay_queue_pipes(struct msm_fb_data_type *mfd) { struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd); Loading Loading @@ -1568,7 +1583,6 @@ static int __overlay_queue_pipes(struct msm_fb_data_type *mfd) pipe->num); ret = -EINVAL; } /* * if we reach here without errors and buf == NULL * then solid fill will be set Loading @@ -1577,14 +1591,36 @@ static int __overlay_queue_pipes(struct msm_fb_data_type *mfd) ret = mdss_mdp_pipe_queue_data(pipe, buf); if (IS_ERR_VALUE(ret)) { pr_warn("Unable to queue data for pnum=%d\n", pr_warn("Unable to queue data for pnum=%d rect=%d\n", pipe->num, pipe->multirect.num); /* * If we fail for a multi-rect pipe, unstage both rects * so we don't leave the pipe configured in multi-rect * mode with only one rectangle staged. */ if (pipe->multirect.mode != MDSS_MDP_PIPE_MULTIRECT_NONE) { struct mdss_mdp_pipe *next_pipe = (struct mdss_mdp_pipe *) pipe->multirect.next; if (next_pipe) { struct mdss_mdp_data *next_buf = list_first_entry_or_null( &next_pipe->buf_queue, struct mdss_mdp_data, pipe_list); __unstage_pipe_and_clean_buf(mfd, next_pipe, next_buf); } else { pr_warn("cannot find rect pnum=%d\n", pipe->num); mdss_mdp_mixer_pipe_unstage(pipe, pipe->mixer_left); mdss_mdp_mixer_pipe_unstage(pipe, pipe->mixer_right); pipe->dirty = true; } } if (buf) __pipe_buf_mark_cleanup(mfd, buf); __unstage_pipe_and_clean_buf(mfd, pipe, buf); } } Loading
drivers/video/msm/mdss/mdss_mdp_pipe.c +6 −4 Original line number Diff line number Diff line Loading @@ -2664,20 +2664,22 @@ int mdss_mdp_pipe_queue_data(struct mdss_mdp_pipe *pipe, pipe->params_changed = 0; mdss_mdp_pipe_solidfill_setup(pipe); MDSS_XLOG(pipe->num, pipe->mixer_left->num, pipe->play_cnt, 0x111); MDSS_XLOG(pipe->num, pipe->multirect.num, pipe->mixer_left->num, pipe->play_cnt, 0x111); goto update_nobuf; } MDSS_XLOG(pipe->num, pipe->mixer_left->num, pipe->play_cnt, 0x222); MDSS_XLOG(pipe->num, pipe->multirect.num, pipe->mixer_left->num, pipe->play_cnt, 0x222); if (params_changed) { pipe->params_changed = 0; ret = mdss_mdp_pipe_pp_setup(pipe, &opmode); if (ret) { pr_err("pipe pp setup error for pnum=%d\n", pipe->num); pr_err("pipe pp setup error for pnum=%d rect=%d\n", pipe->num, pipe->multirect.num); goto done; } Loading