Loading drivers/video/msm/mdss/mdss_fb.c +7 −4 Original line number Diff line number Diff line Loading @@ -2399,7 +2399,7 @@ static void __mdss_fb_copy_fence(struct msm_sync_pt_data *sync_pt_data, mutex_unlock(&sync_pt_data->sync_mutex); } static void __mdss_fb_wait_for_fence_sub(struct msm_sync_pt_data *sync_pt_data, static int __mdss_fb_wait_for_fence_sub(struct msm_sync_pt_data *sync_pt_data, struct sync_fence **fences, int fence_cnt) { int i, ret = 0; Loading Loading @@ -2454,7 +2454,7 @@ static void __mdss_fb_wait_for_fence_sub(struct msm_sync_pt_data *sync_pt_data, for (; i < fence_cnt; i++) sync_fence_put(fences[i]); } return ret; } int mdss_fb_wait_for_fence(struct msm_sync_pt_data *sync_pt_data) Loading Loading @@ -2544,6 +2544,7 @@ static int __mdss_fb_sync_buf_done_callback(struct notifier_block *p, struct msm_sync_pt_data *sync_pt_data; struct msm_fb_data_type *mfd; int fence_cnt; int ret = NOTIFY_OK; sync_pt_data = container_of(p, struct msm_sync_pt_data, notifier); mfd = container_of(sync_pt_data, struct msm_fb_data_type, Loading @@ -2562,7 +2563,7 @@ static int __mdss_fb_sync_buf_done_callback(struct notifier_block *p, sync_pt_data->temp_fen_cnt) { fence_cnt = sync_pt_data->temp_fen_cnt; sync_pt_data->temp_fen_cnt = 0; __mdss_fb_wait_for_fence_sub(sync_pt_data, ret = __mdss_fb_wait_for_fence_sub(sync_pt_data, sync_pt_data->temp_fen, fence_cnt); } if (mfd->idle_time && !mod_delayed_work(system_wq, Loading @@ -2570,6 +2571,8 @@ static int __mdss_fb_sync_buf_done_callback(struct notifier_block *p, msecs_to_jiffies(mfd->idle_time))) pr_debug("fb%d: restarted idle work\n", mfd->index); if (ret == -ETIME) ret = NOTIFY_BAD; break; case MDP_NOTIFY_FRAME_FLUSHED: pr_debug("%s: frame flushed\n", sync_pt_data->fence_name); Loading @@ -2594,7 +2597,7 @@ static int __mdss_fb_sync_buf_done_callback(struct notifier_block *p, break; } return NOTIFY_OK; return ret; } /** Loading drivers/video/msm/mdss/mdss_fb.h +1 −1 Original line number Diff line number Diff line Loading @@ -41,7 +41,7 @@ * unreasonably large. Set to 1s more than first wait + final wait which * are already quite long and proceed without any further waits. */ #define WAIT_DISP_OP_TIMEOUT (WAIT_FENCE_FIRST_TIMEOUT + \ WAIT_FENCE_FINAL_TIMEOUT + 1) WAIT_FENCE_FINAL_TIMEOUT + MSEC_PER_SEC) #ifndef MAX #define MAX(x, y) (((x) > (y)) ? (x) : (y)) Loading drivers/video/msm/mdss/mdss_mdp_ctl.c +39 −1 Original line number Diff line number Diff line Loading @@ -3474,6 +3474,32 @@ int mdss_mdp_display_wait4pingpong(struct mdss_mdp_ctl *ctl, bool use_lock) return ret; } static void mdss_mdp_force_border_color(struct mdss_mdp_ctl *ctl) { struct mdss_mdp_ctl *sctl = mdss_mdp_get_split_ctl(ctl); ctl->force_screen_state = MDSS_SCREEN_FORCE_BLANK; if (sctl) sctl->force_screen_state = MDSS_SCREEN_FORCE_BLANK; mdss_mdp_mixer_setup(ctl, MDSS_MDP_MIXER_MUX_LEFT); mdss_mdp_mixer_setup(ctl, MDSS_MDP_MIXER_MUX_RIGHT); ctl->force_screen_state = MDSS_SCREEN_DEFAULT; if (sctl) sctl->force_screen_state = MDSS_SCREEN_DEFAULT; /* * Update the params changed for mixer for the next frame to * configure the mixer setup properly. */ if (ctl->mixer_left) ctl->mixer_left->params_changed++; if (ctl->mixer_right) ctl->mixer_right->params_changed++; } int mdss_mdp_display_commit(struct mdss_mdp_ctl *ctl, void *arg, struct mdss_mdp_commit_cb *commit_cb) { Loading Loading @@ -3576,7 +3602,19 @@ int mdss_mdp_display_commit(struct mdss_mdp_ctl *ctl, void *arg, commit_cb->commit_cb_fnc( MDP_COMMIT_STAGE_SETUP_DONE, commit_cb->data); mdss_mdp_ctl_notify(ctl, MDP_NOTIFY_FRAME_READY); ret = mdss_mdp_ctl_notify(ctl, MDP_NOTIFY_FRAME_READY); /* * When wait for fence timed out, driver ignores the fences * for signalling. Hardware needs to access only on the buffers * that are valid and driver needs to ensure it. This function * would set the mixer state to border when there is timeout. */ if (ret == NOTIFY_BAD) { mdss_mdp_force_border_color(ctl); ret = 0; } ATRACE_END("frame_ready"); if (ctl->ops.wait_pingpong && !mdata->serialize_wait4pp) Loading Loading
drivers/video/msm/mdss/mdss_fb.c +7 −4 Original line number Diff line number Diff line Loading @@ -2399,7 +2399,7 @@ static void __mdss_fb_copy_fence(struct msm_sync_pt_data *sync_pt_data, mutex_unlock(&sync_pt_data->sync_mutex); } static void __mdss_fb_wait_for_fence_sub(struct msm_sync_pt_data *sync_pt_data, static int __mdss_fb_wait_for_fence_sub(struct msm_sync_pt_data *sync_pt_data, struct sync_fence **fences, int fence_cnt) { int i, ret = 0; Loading Loading @@ -2454,7 +2454,7 @@ static void __mdss_fb_wait_for_fence_sub(struct msm_sync_pt_data *sync_pt_data, for (; i < fence_cnt; i++) sync_fence_put(fences[i]); } return ret; } int mdss_fb_wait_for_fence(struct msm_sync_pt_data *sync_pt_data) Loading Loading @@ -2544,6 +2544,7 @@ static int __mdss_fb_sync_buf_done_callback(struct notifier_block *p, struct msm_sync_pt_data *sync_pt_data; struct msm_fb_data_type *mfd; int fence_cnt; int ret = NOTIFY_OK; sync_pt_data = container_of(p, struct msm_sync_pt_data, notifier); mfd = container_of(sync_pt_data, struct msm_fb_data_type, Loading @@ -2562,7 +2563,7 @@ static int __mdss_fb_sync_buf_done_callback(struct notifier_block *p, sync_pt_data->temp_fen_cnt) { fence_cnt = sync_pt_data->temp_fen_cnt; sync_pt_data->temp_fen_cnt = 0; __mdss_fb_wait_for_fence_sub(sync_pt_data, ret = __mdss_fb_wait_for_fence_sub(sync_pt_data, sync_pt_data->temp_fen, fence_cnt); } if (mfd->idle_time && !mod_delayed_work(system_wq, Loading @@ -2570,6 +2571,8 @@ static int __mdss_fb_sync_buf_done_callback(struct notifier_block *p, msecs_to_jiffies(mfd->idle_time))) pr_debug("fb%d: restarted idle work\n", mfd->index); if (ret == -ETIME) ret = NOTIFY_BAD; break; case MDP_NOTIFY_FRAME_FLUSHED: pr_debug("%s: frame flushed\n", sync_pt_data->fence_name); Loading @@ -2594,7 +2597,7 @@ static int __mdss_fb_sync_buf_done_callback(struct notifier_block *p, break; } return NOTIFY_OK; return ret; } /** Loading
drivers/video/msm/mdss/mdss_fb.h +1 −1 Original line number Diff line number Diff line Loading @@ -41,7 +41,7 @@ * unreasonably large. Set to 1s more than first wait + final wait which * are already quite long and proceed without any further waits. */ #define WAIT_DISP_OP_TIMEOUT (WAIT_FENCE_FIRST_TIMEOUT + \ WAIT_FENCE_FINAL_TIMEOUT + 1) WAIT_FENCE_FINAL_TIMEOUT + MSEC_PER_SEC) #ifndef MAX #define MAX(x, y) (((x) > (y)) ? (x) : (y)) Loading
drivers/video/msm/mdss/mdss_mdp_ctl.c +39 −1 Original line number Diff line number Diff line Loading @@ -3474,6 +3474,32 @@ int mdss_mdp_display_wait4pingpong(struct mdss_mdp_ctl *ctl, bool use_lock) return ret; } static void mdss_mdp_force_border_color(struct mdss_mdp_ctl *ctl) { struct mdss_mdp_ctl *sctl = mdss_mdp_get_split_ctl(ctl); ctl->force_screen_state = MDSS_SCREEN_FORCE_BLANK; if (sctl) sctl->force_screen_state = MDSS_SCREEN_FORCE_BLANK; mdss_mdp_mixer_setup(ctl, MDSS_MDP_MIXER_MUX_LEFT); mdss_mdp_mixer_setup(ctl, MDSS_MDP_MIXER_MUX_RIGHT); ctl->force_screen_state = MDSS_SCREEN_DEFAULT; if (sctl) sctl->force_screen_state = MDSS_SCREEN_DEFAULT; /* * Update the params changed for mixer for the next frame to * configure the mixer setup properly. */ if (ctl->mixer_left) ctl->mixer_left->params_changed++; if (ctl->mixer_right) ctl->mixer_right->params_changed++; } int mdss_mdp_display_commit(struct mdss_mdp_ctl *ctl, void *arg, struct mdss_mdp_commit_cb *commit_cb) { Loading Loading @@ -3576,7 +3602,19 @@ int mdss_mdp_display_commit(struct mdss_mdp_ctl *ctl, void *arg, commit_cb->commit_cb_fnc( MDP_COMMIT_STAGE_SETUP_DONE, commit_cb->data); mdss_mdp_ctl_notify(ctl, MDP_NOTIFY_FRAME_READY); ret = mdss_mdp_ctl_notify(ctl, MDP_NOTIFY_FRAME_READY); /* * When wait for fence timed out, driver ignores the fences * for signalling. Hardware needs to access only on the buffers * that are valid and driver needs to ensure it. This function * would set the mixer state to border when there is timeout. */ if (ret == NOTIFY_BAD) { mdss_mdp_force_border_color(ctl); ret = 0; } ATRACE_END("frame_ready"); if (ctl->ops.wait_pingpong && !mdata->serialize_wait4pp) Loading