fbdev: msm: use sync_file interface for fence
use sync_file interface for fence handling.
mdss_sync.h, mdss_sync.c are derived from sde_rotator_sync.h
sde_rotator_sync.c from commit 281fc6b6a9df ("msm: sde: add support
for sync file to sde rotator").
Change-Id: I8ef479bb096300a4ea055d4dd226b9d092db1f84
Signed-off-by: Sachin Bhayare <sachin.bhayare@codeaurora.org>
diff --git a/drivers/video/fbdev/msm/mdss_fb.c b/drivers/video/fbdev/msm/mdss_fb.c
index 6d494da..65b689f 100644
--- a/drivers/video/fbdev/msm/mdss_fb.c
+++ b/drivers/video/fbdev/msm/mdss_fb.c
@@ -43,8 +43,6 @@
#include <linux/uaccess.h>
#include <linux/version.h>
#include <linux/vmalloc.h>
-#include <linux/sync.h>
-#include <linux/sw_sync.h>
#include <linux/file.h>
#include <linux/kthread.h>
#include <linux/dma-buf.h>
@@ -55,6 +53,7 @@
#include "mdss_smmu.h"
#include "mdss_mdp.h"
#include "mdp3_ctrl.h"
+#include "mdss_sync.h"
#ifdef CONFIG_FB_MSM_TRIPLE_BUFFER
#define MDSS_FB_NUM 3
@@ -1311,12 +1310,20 @@
mfd->mdp_sync_pt_data.fence_name = "mdp-fence";
if (mfd->mdp_sync_pt_data.timeline == NULL) {
- char timeline_name[16];
+ char timeline_name[32];
snprintf(timeline_name, sizeof(timeline_name),
"mdss_fb_%d", mfd->index);
mfd->mdp_sync_pt_data.timeline =
- sw_sync_timeline_create(timeline_name);
+ mdss_create_timeline(timeline_name);
+ if (mfd->mdp_sync_pt_data.timeline == NULL) {
+ pr_err("cannot create release fence time line\n");
+ return -ENOMEM;
+ }
+ snprintf(timeline_name, sizeof(timeline_name),
+ "mdss_fb_%d_retire", mfd->index);
+ mfd->mdp_sync_pt_data.timeline_retire =
+ mdss_create_timeline(timeline_name);
if (mfd->mdp_sync_pt_data.timeline == NULL) {
pr_err("cannot create release fence time line\n");
return -ENOMEM;
@@ -2871,7 +2878,7 @@
}
static void __mdss_fb_copy_fence(struct msm_sync_pt_data *sync_pt_data,
- struct sync_fence **fences, u32 *fence_cnt)
+ struct mdss_fence **fences, u32 *fence_cnt)
{
pr_debug("%s: wait for fences\n", sync_pt_data->fence_name);
@@ -2884,12 +2891,12 @@
sync_pt_data->acq_fen_cnt = 0;
if (*fence_cnt)
memcpy(fences, sync_pt_data->acq_fen,
- *fence_cnt * sizeof(struct sync_fence *));
+ *fence_cnt * sizeof(struct mdss_fence *));
mutex_unlock(&sync_pt_data->sync_mutex);
}
static int __mdss_fb_wait_for_fence_sub(struct msm_sync_pt_data *sync_pt_data,
- struct sync_fence **fences, int fence_cnt)
+ struct mdss_fence **fences, int fence_cnt)
{
int i, ret = 0;
unsigned long max_wait = msecs_to_jiffies(WAIT_MAX_FENCE_TIMEOUT);
@@ -2913,7 +2920,7 @@
wait_ms = min_t(long, WAIT_FENCE_FIRST_TIMEOUT,
wait_ms);
- ret = sync_fence_wait(fences[i], wait_ms);
+ ret = mdss_wait_sync_fence(fences[i], wait_ms);
if (ret == -ETIME) {
wait_jf = timeout - jiffies;
@@ -2925,31 +2932,31 @@
wait_ms);
pr_warn("%s: sync_fence_wait timed out! ",
- fences[i]->name);
+ mdss_get_sync_fence_name(fences[i]));
pr_cont("Waiting %ld.%ld more seconds\n",
(wait_ms/MSEC_PER_SEC), (wait_ms%MSEC_PER_SEC));
MDSS_XLOG(sync_pt_data->timeline_value);
MDSS_XLOG_TOUT_HANDLER("mdp");
- ret = sync_fence_wait(fences[i], wait_ms);
+ ret = mdss_wait_sync_fence(fences[i], wait_ms);
if (ret == -ETIME)
break;
}
- sync_fence_put(fences[i]);
+ mdss_put_sync_fence(fences[i]);
}
if (ret < 0) {
pr_err("%s: sync_fence_wait failed! ret = %x\n",
sync_pt_data->fence_name, ret);
for (; i < fence_cnt; i++)
- sync_fence_put(fences[i]);
+ mdss_put_sync_fence(fences[i]);
}
return ret;
}
int mdss_fb_wait_for_fence(struct msm_sync_pt_data *sync_pt_data)
{
- struct sync_fence *fences[MDP_MAX_FENCE_FD];
+ struct mdss_fence *fences[MDP_MAX_FENCE_FD];
int fence_cnt = 0;
__mdss_fb_copy_fence(sync_pt_data, fences, &fence_cnt);
@@ -2974,7 +2981,8 @@
mutex_lock(&sync_pt_data->sync_mutex);
if (atomic_add_unless(&sync_pt_data->commit_cnt, -1, 0) &&
sync_pt_data->timeline) {
- sw_sync_timeline_inc(sync_pt_data->timeline, 1);
+ mdss_inc_timeline(sync_pt_data->timeline, 1);
+ mdss_inc_timeline(sync_pt_data->timeline_retire, 1);
MDSS_XLOG(sync_pt_data->timeline_value);
sync_pt_data->timeline_value++;
@@ -3006,7 +3014,7 @@
if (sync_pt_data->timeline) {
val = sync_pt_data->threshold +
atomic_read(&sync_pt_data->commit_cnt);
- sw_sync_timeline_inc(sync_pt_data->timeline, val);
+ mdss_inc_timeline(sync_pt_data->timeline, val);
sync_pt_data->timeline_value += val;
atomic_set(&sync_pt_data->commit_cnt, 0);
}
@@ -4183,24 +4191,16 @@
* Function returns a fence on the timeline given with the name provided.
* The fence created will be signaled when the timeline is advanced.
*/
-struct sync_fence *mdss_fb_sync_get_fence(struct sw_sync_timeline *timeline,
+struct mdss_fence *mdss_fb_sync_get_fence(struct mdss_timeline *timeline,
const char *fence_name, int val)
{
- struct sync_pt *sync_pt;
- struct sync_fence *fence;
+ struct mdss_fence *fence;
- pr_debug("%s: buf sync fence timeline=%d\n", fence_name, val);
- sync_pt = sw_sync_pt_create(timeline, val);
- if (sync_pt == NULL) {
- pr_err("%s: cannot create sync point\n", fence_name);
- return NULL;
- }
-
- /* create fence */
- fence = sync_fence_create(fence_name, sync_pt);
+ fence = mdss_get_sync_fence(timeline, fence_name, NULL, val);
+ pr_debug("%s: buf sync fence timeline=%d\n",
+ mdss_get_sync_fence_name(fence), val);
if (fence == NULL) {
- sync_pt_free(sync_pt);
pr_err("%s: cannot create fence\n", fence_name);
return NULL;
}
@@ -4213,7 +4213,7 @@
{
int i, ret = 0;
int acq_fen_fd[MDP_MAX_FENCE_FD];
- struct sync_fence *fence, *rel_fence, *retire_fence;
+ struct mdss_fence *fence, *rel_fence, *retire_fence;
int rel_fen_fd;
int retire_fen_fd;
int val;
@@ -4237,7 +4237,7 @@
mutex_lock(&sync_pt_data->sync_mutex);
for (i = 0; i < buf_sync->acq_fen_fd_cnt; i++) {
- fence = sync_fence_fdget(acq_fen_fd[i]);
+ fence = mdss_get_fd_sync_fence(acq_fen_fd[i]);
if (fence == NULL) {
pr_err("%s: null fence! i=%d fd=%d\n",
sync_pt_data->fence_name, i,
@@ -4251,7 +4251,7 @@
if (ret)
goto buf_sync_err_1;
- val = sync_pt_data->timeline_value + sync_pt_data->threshold +
+ val = sync_pt_data->threshold +
atomic_read(&sync_pt_data->commit_cnt);
MDSS_XLOG(sync_pt_data->timeline_value, val,
@@ -4270,7 +4270,7 @@
}
/* create fd */
- rel_fen_fd = get_unused_fd_flags(0);
+ rel_fen_fd = mdss_get_sync_fence_fd(rel_fence);
if (rel_fen_fd < 0) {
pr_err("%s: get_unused_fd_flags failed error:0x%x\n",
sync_pt_data->fence_name, rel_fen_fd);
@@ -4304,13 +4304,13 @@
ret = retire_fence ? PTR_ERR(rel_fence) : -ENOMEM;
goto buf_sync_err_3;
}
- retire_fen_fd = get_unused_fd_flags(0);
+ retire_fen_fd = mdss_get_sync_fence_fd(retire_fence);
if (retire_fen_fd < 0) {
pr_err("%s: get_unused_fd_flags failed for retire fence error:0x%x\n",
sync_pt_data->fence_name, retire_fen_fd);
ret = retire_fen_fd;
- sync_fence_put(retire_fence);
+ mdss_put_sync_fence(retire_fence);
goto buf_sync_err_3;
}
@@ -4320,14 +4320,12 @@
pr_err("%s: copy_to_user failed for retire fence\n",
sync_pt_data->fence_name);
put_unused_fd(retire_fen_fd);
- sync_fence_put(retire_fence);
+ mdss_put_sync_fence(retire_fence);
goto buf_sync_err_3;
}
- sync_fence_install(retire_fence, retire_fen_fd);
-
skip_retire_fence:
- sync_fence_install(rel_fence, rel_fen_fd);
+ mdss_get_sync_fence_fd(rel_fence);
mutex_unlock(&sync_pt_data->sync_mutex);
if (buf_sync->flags & MDP_BUF_SYNC_FLAG_WAIT)
@@ -4337,10 +4335,10 @@
buf_sync_err_3:
put_unused_fd(rel_fen_fd);
buf_sync_err_2:
- sync_fence_put(rel_fence);
+ mdss_put_sync_fence(rel_fence);
buf_sync_err_1:
for (i = 0; i < sync_pt_data->acq_fen_cnt; i++)
- sync_fence_put(sync_pt_data->acq_fen[i]);
+ mdss_put_sync_fence(sync_pt_data->acq_fen[i]);
sync_pt_data->acq_fen_cnt = 0;
mutex_unlock(&sync_pt_data->sync_mutex);
return ret;