diff --git a/drivers/video/msm/msm_fb.c b/drivers/video/msm/msm_fb.c index 95165f4bdeac23b69308209d321fcf26b97267fe..0f684979ae4151be3a1cc18bf91102eaaa4abf1d 100644 --- a/drivers/video/msm/msm_fb.c +++ b/drivers/video/msm/msm_fb.c @@ -1863,8 +1863,6 @@ int msm_fb_signal_timeline(struct msm_fb_data_type *mfd) sw_sync_timeline_inc(mfd->timeline, 1); mfd->timeline_value++; } - mfd->last_rel_fence = mfd->cur_rel_fence; - mfd->cur_rel_fence = 0; mutex_unlock(&mfd->sync_mutex); return 0; } @@ -1876,8 +1874,6 @@ void msm_fb_release_timeline(struct msm_fb_data_type *mfd) sw_sync_timeline_inc(mfd->timeline, 2); mfd->timeline_value += 2; } - mfd->last_rel_fence = 0; - mfd->cur_rel_fence = 0; mutex_unlock(&mfd->sync_mutex); } @@ -3682,6 +3678,12 @@ static int msmfb_handle_buf_sync_ioctl(struct msm_fb_data_type *mfd, u32 threshold; int acq_fen_fd[MDP_MAX_FENCE_FD]; struct sync_fence *fence; + struct sync_pt *release_sync_pt; + struct sync_pt *retire_sync_pt; + struct sync_fence *release_fence; + struct sync_fence *retire_fence; + int release_fen_fd; + int retire_fen_fd; if ((buf_sync->acq_fen_fd_cnt > MDP_MAX_FENCE_FD) || (mfd->timeline == NULL)) @@ -3719,45 +3721,54 @@ static int msmfb_handle_buf_sync_ioctl(struct msm_fb_data_type *mfd, threshold = 1; else threshold = 2; - mfd->cur_rel_sync_pt = sw_sync_pt_create(mfd->timeline, - mfd->timeline_value + threshold); - if (mfd->cur_rel_sync_pt == NULL) { - pr_err("%s: cannot create sync point", __func__); - ret = -ENOMEM; - goto buf_sync_err_1; - } - /* create fence */ - mfd->cur_rel_fence = sync_fence_create("mdp-fence", - mfd->cur_rel_sync_pt); - if (mfd->cur_rel_fence == NULL) { - sync_pt_free(mfd->cur_rel_sync_pt); - mfd->cur_rel_sync_pt = NULL; - pr_err("%s: cannot create fence", __func__); - ret = -ENOMEM; + + release_fen_fd = get_unused_fd_flags(0); + if (release_fen_fd < 0) { + pr_err("%s: get_unused_fd_flags failed", __func__); + ret = -EIO; goto buf_sync_err_1; } - /* create fd */ - mfd->cur_rel_fen_fd = get_unused_fd_flags(0); - if (mfd->cur_rel_fen_fd < 0) { + + retire_fen_fd = get_unused_fd_flags(0); + if (retire_fen_fd < 0) { pr_err("%s: get_unused_fd_flags failed", __func__); ret = -EIO; goto buf_sync_err_2; } - sync_fence_install(mfd->cur_rel_fence, mfd->cur_rel_fen_fd); + + release_sync_pt = sw_sync_pt_create(mfd->timeline, + mfd->timeline_value + threshold); + release_fence = sync_fence_create("mdp-fence", + release_sync_pt); + sync_fence_install(release_fence, release_fen_fd); + retire_sync_pt = sw_sync_pt_create(mfd->timeline, + mfd->timeline_value + threshold); + retire_fence = sync_fence_create("mdp-retire-fence", + retire_sync_pt); + sync_fence_install(retire_fence, retire_fen_fd); + ret = copy_to_user(buf_sync->rel_fen_fd, - &mfd->cur_rel_fen_fd, sizeof(int)); + &release_fen_fd, sizeof(int)); + if (ret) { + pr_err("%s:copy_to_user failed", __func__); + goto buf_sync_err_3; + } + + ret = copy_to_user(buf_sync->retire_fen_fd, + &retire_fen_fd, sizeof(int)); if (ret) { pr_err("%s:copy_to_user failed", __func__); goto buf_sync_err_3; } + mutex_unlock(&mfd->sync_mutex); return ret; buf_sync_err_3: - put_unused_fd(mfd->cur_rel_fen_fd); + sync_fence_put(release_fence); + sync_fence_put(retire_fence); + put_unused_fd(retire_fen_fd); buf_sync_err_2: - sync_fence_put(mfd->cur_rel_fence); - mfd->cur_rel_fence = NULL; - mfd->cur_rel_fen_fd = 0; + put_unused_fd(release_fen_fd); buf_sync_err_1: for (i = 0; i < mfd->acq_fen_cnt; i++) sync_fence_put(mfd->acq_fen[i]); diff --git a/drivers/video/msm/msm_fb.h b/drivers/video/msm/msm_fb.h index 115f3e3aee687a9d4fcabf7af5eb37a23fb7d3a6..086cf2411d5d4ed75c9b3914d8f5e905e95d3a01 100644 --- a/drivers/video/msm/msm_fb.h +++ b/drivers/video/msm/msm_fb.h @@ -198,14 +198,8 @@ struct msm_fb_data_type { void *cpu_pm_hdl; u32 acq_fen_cnt; struct sync_fence *acq_fen[MDP_MAX_FENCE_FD]; - int cur_rel_fen_fd; - struct sync_pt *cur_rel_sync_pt; - struct sync_fence *cur_rel_fence; - struct sync_fence *last_rel_fence; struct sw_sync_timeline *timeline; int timeline_value; - u32 last_acq_fen_cnt; - struct sync_fence *last_acq_fen[MDP_MAX_FENCE_FD]; struct mutex sync_mutex; struct completion commit_comp; u32 is_committing; diff --git a/include/linux/msm_mdp.h b/include/linux/msm_mdp.h index 394394b618de1bdae33d7e6c37689e7a0d48f3b0..641f4239f006ad03dc05b7a594f52b19233eeaa7 100644 --- a/include/linux/msm_mdp.h +++ b/include/linux/msm_mdp.h @@ -573,13 +573,7 @@ struct mdp_buf_sync { uint32_t acq_fen_fd_cnt; int *acq_fen_fd; int *rel_fen_fd; -}; - -struct mdp_buf_fence { - uint32_t flags; - uint32_t acq_fen_fd_cnt; - int acq_fen_fd[MDP_MAX_FENCE_FD]; - int rel_fen_fd[MDP_MAX_FENCE_FD]; + int *retire_fen_fd; }; #define MDP_DISPLAY_COMMIT_OVERLAY 0x00000001