diff options
| author | Adrian Salido-Moreno <adrianm@codeaurora.org> | 2013-06-14 12:21:28 -0700 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:18:25 -0700 |
| commit | f31c6d495952bf0f8fa450df9bbffc6039ddd3ad (patch) | |
| tree | 9d0aa342e35853dd2be5b7354c8e94ba61b9fe26 /drivers/video/fbdev | |
| parent | ffe39a85da29136ab3da7b78399378f62473fa0c (diff) | |
msm: mdss: keep reference of rotator output buffer
Change logic to free buffer for previous rotation call. This will make
sure to keep a ref count on the buffer secure lock before it's picked up
by MDP for displaying to panel. It will also allow for asynchronous calls
to rotator to be supported by not freeing the source and destination
buffers within same call.
Change-Id: I389d6a4523bdc79a5dfe76e3603e43325d63b82c
Signed-off-by: Adrian Salido-Moreno <adrianm@codeaurora.org>
Diffstat (limited to 'drivers/video/fbdev')
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_overlay.c | 28 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_rotator.c | 12 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_rotator.h | 5 |
3 files changed, 24 insertions, 21 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp_overlay.c b/drivers/video/fbdev/msm/mdss_mdp_overlay.c index a78a10acab55..780ff94ac6ef 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_overlay.c +++ b/drivers/video/fbdev/msm/mdss_mdp_overlay.c @@ -288,7 +288,7 @@ static int mdss_mdp_overlay_rotator_setup(struct msm_fb_data_type *mfd, req->id = rot->session_id; } else { pr_err("Unable to setup rotator session\n"); - mdss_mdp_rotator_release(rot->session_id); + mdss_mdp_rotator_release(rot); } return ret; @@ -894,10 +894,17 @@ static int mdss_mdp_overlay_unset(struct msm_fb_data_type *mfd, int ndx) pr_debug("unset ndx=%x\n", ndx); - if (ndx & MDSS_MDP_ROT_SESSION_MASK) - ret = mdss_mdp_rotator_release(ndx); - else + if (ndx & MDSS_MDP_ROT_SESSION_MASK) { + struct mdss_mdp_rotator_session *rot; + rot = mdss_mdp_rotator_session_get(ndx); + if (rot) { + mdss_mdp_overlay_free_buf(&rot->src_buf); + mdss_mdp_overlay_free_buf(&rot->dst_buf); + ret = mdss_mdp_rotator_release(rot); + } + } else { ret = mdss_mdp_overlay_release(mfd, ndx); + } done: mutex_unlock(&mdp5_data->ov_lock); @@ -958,7 +965,6 @@ static int mdss_mdp_overlay_rotate(struct msm_fb_data_type *mfd, struct msmfb_overlay_data *req) { struct mdss_mdp_rotator_session *rot; - struct mdss_mdp_data src_data, dst_data; int ret; u32 flgs; @@ -970,26 +976,26 @@ static int mdss_mdp_overlay_rotate(struct msm_fb_data_type *mfd, flgs = rot->flags & MDP_SECURE_OVERLAY_SESSION; - ret = mdss_mdp_overlay_get_buf(mfd, &src_data, &req->data, 1, flgs); + mdss_mdp_overlay_free_buf(&rot->src_buf); + ret = mdss_mdp_overlay_get_buf(mfd, &rot->src_buf, &req->data, 1, flgs); if (ret) { pr_err("src_data pmem error\n"); return ret; } - ret = mdss_mdp_overlay_get_buf(mfd, &dst_data, &req->dst_data, 1, flgs); + mdss_mdp_overlay_free_buf(&rot->dst_buf); + ret = mdss_mdp_overlay_get_buf(mfd, &rot->dst_buf, + &req->dst_data, 1, flgs); if (ret) { pr_err("dst_data pmem error\n"); goto dst_buf_fail; } - ret = mdss_mdp_rotator_queue(rot, &src_data, &dst_data); + ret = mdss_mdp_rotator_queue(rot, &rot->src_buf, &rot->dst_buf); if (ret) pr_err("rotator queue error session id=%x\n", req->id); - mdss_mdp_overlay_free_buf(&dst_data); dst_buf_fail: - mdss_mdp_overlay_free_buf(&src_data); - return ret; } diff --git a/drivers/video/fbdev/msm/mdss_mdp_rotator.c b/drivers/video/fbdev/msm/mdss_mdp_rotator.c index f9894ccc088f..8c45df84f462 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_rotator.c +++ b/drivers/video/fbdev/msm/mdss_mdp_rotator.c @@ -366,18 +366,12 @@ static int mdss_mdp_rotator_finish(struct mdss_mdp_rotator_session *rot) return 0; } -int mdss_mdp_rotator_release(u32 ndx) +int mdss_mdp_rotator_release(struct mdss_mdp_rotator_session *rot) { int rc = 0; - struct mdss_mdp_rotator_session *rot; + mutex_lock(&rotator_lock); - rot = mdss_mdp_rotator_session_get(ndx); - if (rot) { - mdss_mdp_rotator_finish(rot); - } else { - pr_warn("unknown session id=%x\n", ndx); - rc = -ENOENT; - } + rc = mdss_mdp_rotator_finish(rot); mutex_unlock(&rotator_lock); return rc; diff --git a/drivers/video/fbdev/msm/mdss_mdp_rotator.h b/drivers/video/fbdev/msm/mdss_mdp_rotator.h index 3401fe81e071..43c9e6af7596 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_rotator.h +++ b/drivers/video/fbdev/msm/mdss_mdp_rotator.h @@ -39,6 +39,9 @@ struct mdss_mdp_rotator_session { u8 busy; u8 no_wait; + struct mdss_mdp_data src_buf; + struct mdss_mdp_data dst_buf; + struct list_head head; struct mdss_mdp_rotator_session *next; }; @@ -67,7 +70,7 @@ int mdss_mdp_rotator_queue(struct mdss_mdp_rotator_session *rot, struct mdss_mdp_data *src_data, struct mdss_mdp_data *dst_data); -int mdss_mdp_rotator_release(u32 ndx); +int mdss_mdp_rotator_release(struct mdss_mdp_rotator_session *rot); int mdss_mdp_rotator_release_all(void); #endif /* MDSS_MDP_ROTATOR_H */ |
