Loading drivers/video/msm/mdss/mdss_mdp.h +21 −1 Original line number Diff line number Diff line Loading @@ -121,6 +121,19 @@ enum mdss_mdp_reg_bus_cfg { REG_CLK_CFG_HIGH, }; /** * enum mdp_commit_stage_type - Indicate different commit stages * * @MDP_COMMIT_STATE_WAIT_FOR_PINGPONG: At the stage of being ready to * wait for pingpong buffer. * @MDP_COMMIT_STATE_PINGPONG_DONE: At the stage that pingpong * buffer is ready. */ enum mdp_commit_stage_type { MDP_COMMIT_STAGE_WAIT_FOR_PINGPONG, MDP_COMMIT_STAGE_PINGPONG_DONE, }; struct mdss_mdp_ctl; typedef void (*mdp_vsync_handler_t)(struct mdss_mdp_ctl *, ktime_t); Loading Loading @@ -467,6 +480,12 @@ struct mdss_overlay_private { int retire_cnt; }; struct mdss_mdp_commit_cb { void *data; int (*commit_cb_fnc) (enum mdp_commit_stage_type commit_state, void *data); }; /** * enum mdss_screen_state - Screen states that MDP can be forced into * Loading Loading @@ -683,7 +702,8 @@ int mdss_mdp_mixer_pipe_update(struct mdss_mdp_pipe *pipe, int mdss_mdp_mixer_pipe_unstage(struct mdss_mdp_pipe *pipe, struct mdss_mdp_mixer *mixer); void mdss_mdp_mixer_unstage_all(struct mdss_mdp_mixer *mixer); int mdss_mdp_display_commit(struct mdss_mdp_ctl *ctl, void *arg); int mdss_mdp_display_commit(struct mdss_mdp_ctl *ctl, void *arg, struct mdss_mdp_commit_cb *commit_cb); int mdss_mdp_display_wait4comp(struct mdss_mdp_ctl *ctl); int mdss_mdp_display_wait4pingpong(struct mdss_mdp_ctl *ctl); int mdss_mdp_display_wakeup_time(struct mdss_mdp_ctl *ctl, Loading drivers/video/msm/mdss/mdss_mdp_ctl.c +23 −12 Original line number Diff line number Diff line Loading @@ -2930,7 +2930,8 @@ int mdss_mdp_display_wait4pingpong(struct mdss_mdp_ctl *ctl) return ret; } int mdss_mdp_display_commit(struct mdss_mdp_ctl *ctl, void *arg) int mdss_mdp_display_commit(struct mdss_mdp_ctl *ctl, void *arg, struct mdss_mdp_commit_cb *commit_cb) { struct mdss_mdp_ctl *sctl = NULL; int ret = 0; Loading Loading @@ -3013,20 +3014,9 @@ int mdss_mdp_display_commit(struct mdss_mdp_ctl *ctl, void *arg) mdss_mdp_ctl_notify(ctl, MDP_NOTIFY_FRAME_READY); ATRACE_END("frame_ready"); ATRACE_BEGIN("wait_pingpong"); if (ctl->wait_pingpong) ctl->wait_pingpong(ctl, NULL); ATRACE_END("wait_pingpong"); ctl->roi_bkup.w = ctl->roi.w; ctl->roi_bkup.h = ctl->roi.h; if (sctl && sctl->wait_pingpong) { ATRACE_BEGIN("wait_pingpong sctl"); sctl->wait_pingpong(sctl, NULL); ATRACE_END("wait_pingpong sctl"); } /* * With partial frame update, enable split display bit only * when validity of ROI's on both the DSI's are identical Loading Loading @@ -3071,6 +3061,27 @@ int mdss_mdp_display_commit(struct mdss_mdp_ctl *ctl, void *arg) sctl->panel_data->panel_info.roi = sctl->roi; } if (ctl->wait_pingpong) { if (commit_cb) commit_cb->commit_cb_fnc( MDP_COMMIT_STAGE_WAIT_FOR_PINGPONG, commit_cb->data); ATRACE_BEGIN("wait_pingpong"); ctl->wait_pingpong(ctl, NULL); ATRACE_END("wait_pingpong"); if (sctl && sctl->wait_pingpong) { ATRACE_BEGIN("wait_pingpong sctl"); sctl->wait_pingpong(sctl, NULL); ATRACE_END("wait_pingpong sctl"); } if (commit_cb) commit_cb->commit_cb_fnc(MDP_COMMIT_STAGE_PINGPONG_DONE, commit_cb->data); } if (sctl && !ctl->valid_roi && sctl->valid_roi) { /* * Seperate kickoff on DSI1 is needed only when we have Loading drivers/video/msm/mdss/mdss_mdp_intf_video.c +2 −2 Original line number Diff line number Diff line Loading @@ -635,7 +635,7 @@ static int mdss_mdp_video_config_fps(struct mdss_mdp_ctl *ctl, return -EINVAL; } ctl->force_screen_state = MDSS_SCREEN_FORCE_BLANK; mdss_mdp_display_commit(ctl, NULL); mdss_mdp_display_commit(ctl, NULL, NULL); mdss_mdp_display_wait4comp(ctl); mdp_video_write(ctx, MDSS_MDP_REG_INTF_TIMING_ENGINE_EN, 0); Loading @@ -657,7 +657,7 @@ static int mdss_mdp_video_config_fps(struct mdss_mdp_ctl *ctl, */ mb(); ctl->force_screen_state = MDSS_SCREEN_DEFAULT; mdss_mdp_display_commit(ctl, NULL); mdss_mdp_display_commit(ctl, NULL, NULL); mdss_mdp_display_wait4comp(ctl); } else if (pdata->panel_info.dfps_update == DFPS_IMMEDIATE_PORCH_UPDATE_MODE){ Loading drivers/video/msm/mdss/mdss_mdp_intf_writeback.c +1 −1 Original line number Diff line number Diff line Loading @@ -723,5 +723,5 @@ int mdss_mdp_writeback_display_commit(struct mdss_mdp_ctl *ctl, void *arg) ctl->mixer_right->params_changed++; } return mdss_mdp_display_commit(ctl, arg); return mdss_mdp_display_commit(ctl, arg, NULL); } drivers/video/msm/mdss/mdss_mdp_overlay.c +39 −4 Original line number Diff line number Diff line Loading @@ -1298,17 +1298,42 @@ static void __overlay_kickoff_requeue(struct msm_fb_data_type *mfd) { struct mdss_mdp_ctl *ctl = mfd_to_ctl(mfd); mdss_mdp_display_commit(ctl, NULL); mdss_mdp_display_commit(ctl, NULL, NULL); mdss_mdp_display_wait4comp(ctl); ATRACE_BEGIN("sspp_programming"); __overlay_queue_pipes(mfd); ATRACE_END("sspp_programming"); mdss_mdp_display_commit(ctl, NULL); mdss_mdp_display_commit(ctl, NULL, NULL); mdss_mdp_display_wait4comp(ctl); } static int mdss_mdp_commit_cb(enum mdp_commit_stage_type commit_stage, void *data) { int ret = 0; struct msm_fb_data_type *mfd = (struct msm_fb_data_type *)data; struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd); struct mdss_mdp_ctl *ctl; switch (commit_stage) { case MDP_COMMIT_STAGE_WAIT_FOR_PINGPONG: ctl = mfd_to_ctl(mfd); mdss_mdp_ctl_notify(ctl, MDP_NOTIFY_FRAME_START); mutex_unlock(&mdp5_data->ov_lock); break; case MDP_COMMIT_STAGE_PINGPONG_DONE: mutex_lock(&mdp5_data->ov_lock); break; default: pr_err("Invalid commit stage %x", commit_stage); break; } return ret; } int mdss_mdp_overlay_kickoff(struct msm_fb_data_type *mfd, struct mdp_display_commit *data) { Loading @@ -1319,6 +1344,7 @@ int mdss_mdp_overlay_kickoff(struct msm_fb_data_type *mfd, int ret = 0; int sd_in_pipe = 0; bool need_cleanup = false; struct mdss_mdp_commit_cb commit_cb; ATRACE_BEGIN(__func__); if (ctl->shared_lock) { Loading Loading @@ -1392,13 +1418,22 @@ int mdss_mdp_overlay_kickoff(struct msm_fb_data_type *mfd, ATRACE_BEGIN("wb_kickoff"); ret = mdss_mdp_wb_kickoff(mfd); ATRACE_END("wb_kickoff"); } else if (!need_cleanup) { ATRACE_BEGIN("display_commit"); commit_cb.commit_cb_fnc = mdss_mdp_commit_cb; commit_cb.data = mfd; ret = mdss_mdp_display_commit(mdp5_data->ctl, NULL, &commit_cb); ATRACE_END("display_commit"); } else { ATRACE_BEGIN("display_commit"); ret = mdss_mdp_display_commit(mdp5_data->ctl, NULL); ret = mdss_mdp_display_commit(mdp5_data->ctl, NULL, NULL); ATRACE_END("display_commit"); } if (!need_cleanup) /* MDP_NOTIFY_FRAME_START is sent in cb for command panel */ if ((!need_cleanup) && (!mdp5_data->ctl->wait_pingpong)) mdss_mdp_ctl_notify(ctl, MDP_NOTIFY_FRAME_START); if (IS_ERR_VALUE(ret)) Loading Loading
drivers/video/msm/mdss/mdss_mdp.h +21 −1 Original line number Diff line number Diff line Loading @@ -121,6 +121,19 @@ enum mdss_mdp_reg_bus_cfg { REG_CLK_CFG_HIGH, }; /** * enum mdp_commit_stage_type - Indicate different commit stages * * @MDP_COMMIT_STATE_WAIT_FOR_PINGPONG: At the stage of being ready to * wait for pingpong buffer. * @MDP_COMMIT_STATE_PINGPONG_DONE: At the stage that pingpong * buffer is ready. */ enum mdp_commit_stage_type { MDP_COMMIT_STAGE_WAIT_FOR_PINGPONG, MDP_COMMIT_STAGE_PINGPONG_DONE, }; struct mdss_mdp_ctl; typedef void (*mdp_vsync_handler_t)(struct mdss_mdp_ctl *, ktime_t); Loading Loading @@ -467,6 +480,12 @@ struct mdss_overlay_private { int retire_cnt; }; struct mdss_mdp_commit_cb { void *data; int (*commit_cb_fnc) (enum mdp_commit_stage_type commit_state, void *data); }; /** * enum mdss_screen_state - Screen states that MDP can be forced into * Loading Loading @@ -683,7 +702,8 @@ int mdss_mdp_mixer_pipe_update(struct mdss_mdp_pipe *pipe, int mdss_mdp_mixer_pipe_unstage(struct mdss_mdp_pipe *pipe, struct mdss_mdp_mixer *mixer); void mdss_mdp_mixer_unstage_all(struct mdss_mdp_mixer *mixer); int mdss_mdp_display_commit(struct mdss_mdp_ctl *ctl, void *arg); int mdss_mdp_display_commit(struct mdss_mdp_ctl *ctl, void *arg, struct mdss_mdp_commit_cb *commit_cb); int mdss_mdp_display_wait4comp(struct mdss_mdp_ctl *ctl); int mdss_mdp_display_wait4pingpong(struct mdss_mdp_ctl *ctl); int mdss_mdp_display_wakeup_time(struct mdss_mdp_ctl *ctl, Loading
drivers/video/msm/mdss/mdss_mdp_ctl.c +23 −12 Original line number Diff line number Diff line Loading @@ -2930,7 +2930,8 @@ int mdss_mdp_display_wait4pingpong(struct mdss_mdp_ctl *ctl) return ret; } int mdss_mdp_display_commit(struct mdss_mdp_ctl *ctl, void *arg) int mdss_mdp_display_commit(struct mdss_mdp_ctl *ctl, void *arg, struct mdss_mdp_commit_cb *commit_cb) { struct mdss_mdp_ctl *sctl = NULL; int ret = 0; Loading Loading @@ -3013,20 +3014,9 @@ int mdss_mdp_display_commit(struct mdss_mdp_ctl *ctl, void *arg) mdss_mdp_ctl_notify(ctl, MDP_NOTIFY_FRAME_READY); ATRACE_END("frame_ready"); ATRACE_BEGIN("wait_pingpong"); if (ctl->wait_pingpong) ctl->wait_pingpong(ctl, NULL); ATRACE_END("wait_pingpong"); ctl->roi_bkup.w = ctl->roi.w; ctl->roi_bkup.h = ctl->roi.h; if (sctl && sctl->wait_pingpong) { ATRACE_BEGIN("wait_pingpong sctl"); sctl->wait_pingpong(sctl, NULL); ATRACE_END("wait_pingpong sctl"); } /* * With partial frame update, enable split display bit only * when validity of ROI's on both the DSI's are identical Loading Loading @@ -3071,6 +3061,27 @@ int mdss_mdp_display_commit(struct mdss_mdp_ctl *ctl, void *arg) sctl->panel_data->panel_info.roi = sctl->roi; } if (ctl->wait_pingpong) { if (commit_cb) commit_cb->commit_cb_fnc( MDP_COMMIT_STAGE_WAIT_FOR_PINGPONG, commit_cb->data); ATRACE_BEGIN("wait_pingpong"); ctl->wait_pingpong(ctl, NULL); ATRACE_END("wait_pingpong"); if (sctl && sctl->wait_pingpong) { ATRACE_BEGIN("wait_pingpong sctl"); sctl->wait_pingpong(sctl, NULL); ATRACE_END("wait_pingpong sctl"); } if (commit_cb) commit_cb->commit_cb_fnc(MDP_COMMIT_STAGE_PINGPONG_DONE, commit_cb->data); } if (sctl && !ctl->valid_roi && sctl->valid_roi) { /* * Seperate kickoff on DSI1 is needed only when we have Loading
drivers/video/msm/mdss/mdss_mdp_intf_video.c +2 −2 Original line number Diff line number Diff line Loading @@ -635,7 +635,7 @@ static int mdss_mdp_video_config_fps(struct mdss_mdp_ctl *ctl, return -EINVAL; } ctl->force_screen_state = MDSS_SCREEN_FORCE_BLANK; mdss_mdp_display_commit(ctl, NULL); mdss_mdp_display_commit(ctl, NULL, NULL); mdss_mdp_display_wait4comp(ctl); mdp_video_write(ctx, MDSS_MDP_REG_INTF_TIMING_ENGINE_EN, 0); Loading @@ -657,7 +657,7 @@ static int mdss_mdp_video_config_fps(struct mdss_mdp_ctl *ctl, */ mb(); ctl->force_screen_state = MDSS_SCREEN_DEFAULT; mdss_mdp_display_commit(ctl, NULL); mdss_mdp_display_commit(ctl, NULL, NULL); mdss_mdp_display_wait4comp(ctl); } else if (pdata->panel_info.dfps_update == DFPS_IMMEDIATE_PORCH_UPDATE_MODE){ Loading
drivers/video/msm/mdss/mdss_mdp_intf_writeback.c +1 −1 Original line number Diff line number Diff line Loading @@ -723,5 +723,5 @@ int mdss_mdp_writeback_display_commit(struct mdss_mdp_ctl *ctl, void *arg) ctl->mixer_right->params_changed++; } return mdss_mdp_display_commit(ctl, arg); return mdss_mdp_display_commit(ctl, arg, NULL); }
drivers/video/msm/mdss/mdss_mdp_overlay.c +39 −4 Original line number Diff line number Diff line Loading @@ -1298,17 +1298,42 @@ static void __overlay_kickoff_requeue(struct msm_fb_data_type *mfd) { struct mdss_mdp_ctl *ctl = mfd_to_ctl(mfd); mdss_mdp_display_commit(ctl, NULL); mdss_mdp_display_commit(ctl, NULL, NULL); mdss_mdp_display_wait4comp(ctl); ATRACE_BEGIN("sspp_programming"); __overlay_queue_pipes(mfd); ATRACE_END("sspp_programming"); mdss_mdp_display_commit(ctl, NULL); mdss_mdp_display_commit(ctl, NULL, NULL); mdss_mdp_display_wait4comp(ctl); } static int mdss_mdp_commit_cb(enum mdp_commit_stage_type commit_stage, void *data) { int ret = 0; struct msm_fb_data_type *mfd = (struct msm_fb_data_type *)data; struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd); struct mdss_mdp_ctl *ctl; switch (commit_stage) { case MDP_COMMIT_STAGE_WAIT_FOR_PINGPONG: ctl = mfd_to_ctl(mfd); mdss_mdp_ctl_notify(ctl, MDP_NOTIFY_FRAME_START); mutex_unlock(&mdp5_data->ov_lock); break; case MDP_COMMIT_STAGE_PINGPONG_DONE: mutex_lock(&mdp5_data->ov_lock); break; default: pr_err("Invalid commit stage %x", commit_stage); break; } return ret; } int mdss_mdp_overlay_kickoff(struct msm_fb_data_type *mfd, struct mdp_display_commit *data) { Loading @@ -1319,6 +1344,7 @@ int mdss_mdp_overlay_kickoff(struct msm_fb_data_type *mfd, int ret = 0; int sd_in_pipe = 0; bool need_cleanup = false; struct mdss_mdp_commit_cb commit_cb; ATRACE_BEGIN(__func__); if (ctl->shared_lock) { Loading Loading @@ -1392,13 +1418,22 @@ int mdss_mdp_overlay_kickoff(struct msm_fb_data_type *mfd, ATRACE_BEGIN("wb_kickoff"); ret = mdss_mdp_wb_kickoff(mfd); ATRACE_END("wb_kickoff"); } else if (!need_cleanup) { ATRACE_BEGIN("display_commit"); commit_cb.commit_cb_fnc = mdss_mdp_commit_cb; commit_cb.data = mfd; ret = mdss_mdp_display_commit(mdp5_data->ctl, NULL, &commit_cb); ATRACE_END("display_commit"); } else { ATRACE_BEGIN("display_commit"); ret = mdss_mdp_display_commit(mdp5_data->ctl, NULL); ret = mdss_mdp_display_commit(mdp5_data->ctl, NULL, NULL); ATRACE_END("display_commit"); } if (!need_cleanup) /* MDP_NOTIFY_FRAME_START is sent in cb for command panel */ if ((!need_cleanup) && (!mdp5_data->ctl->wait_pingpong)) mdss_mdp_ctl_notify(ctl, MDP_NOTIFY_FRAME_START); if (IS_ERR_VALUE(ret)) Loading