summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_overlay.c51
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_pipe.c3
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_pp.c3
3 files changed, 41 insertions, 16 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp_overlay.c b/drivers/video/fbdev/msm/mdss_mdp_overlay.c
index 847dea1e6ad8..09d15156154d 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_overlay.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_overlay.c
@@ -2893,17 +2893,50 @@ static int mdss_mdp_cursor_pipe_setup(struct msm_fb_data_type *mfd,
struct mdp_overlay *req, int cursor_pipe) {
struct mdss_mdp_pipe *pipe;
struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd);
+ struct mdss_data_type *mdata = mdss_mdp_get_mdata();
int ret = 0;
+ u32 cursor_addr;
+ struct mdss_mdp_data *buf = NULL;
req->id = mdp5_data->cursor_ndx[cursor_pipe];
ret = mdss_mdp_overlay_pipe_setup(mfd, req, &pipe, NULL, false);
if (ret) {
- pr_err("cursor pipe setup failed, cursor_pipe:%d, ret:%d",
+ pr_err("cursor pipe setup failed, cursor_pipe:%d, ret:%d\n",
cursor_pipe, ret);
mdp5_data->cursor_ndx[cursor_pipe] = MSMFB_NEW_REQUEST;
return ret;
}
- mdp5_data->cursor_ndx[cursor_pipe] = req->id;
+
+ pr_debug("req id:%d cursor_pipe:%d pnum:%d\n",
+ req->id, cursor_pipe, pipe->ndx);
+
+ if (mdata->mdss_util->iommu_attached()) {
+ cursor_addr = mfd->cursor_buf_iova;
+ } else {
+ if (MDSS_LPAE_CHECK(mfd->cursor_buf_phys)) {
+ pr_err("can't access phy mem >4GB w/o iommu\n");
+ ret = -ERANGE;
+ goto done;
+ }
+ cursor_addr = mfd->cursor_buf_phys;
+ }
+
+ buf = mdss_mdp_overlay_buf_alloc(mfd, pipe);
+ if (!buf) {
+ pr_err("unable to allocate memory for cursor buffer\n");
+ ret = -ENOMEM;
+ goto done;
+ }
+
+ mdp5_data->cursor_ndx[cursor_pipe] = pipe->ndx;
+ buf->p[0].addr = cursor_addr;
+ buf->p[0].len = MDSS_MDP_CURSOR_SIZE;
+ buf->num_planes = 1;
+
+done:
+ if (ret && mdp5_data->cursor_ndx[cursor_pipe] == MSMFB_NEW_REQUEST)
+ mdss_mdp_overlay_release(mfd, pipe->ndx);
+
return ret;
}
@@ -3027,7 +3060,6 @@ static int mdss_mdp_hw_cursor_pipe_update(struct msm_fb_data_type *mfd,
req->transp_mask = (img->bg_color & 0xffffff);
if (mfd->cursor_buf && (cursor->set & FB_CUR_SETIMAGE)) {
- u32 cursor_addr;
ret = copy_from_user(mfd->cursor_buf, img->data,
img->width * img->height * 4);
if (ret) {
@@ -3035,21 +3067,8 @@ static int mdss_mdp_hw_cursor_pipe_update(struct msm_fb_data_type *mfd,
goto done;
}
- if (mdata->mdss_util->iommu_attached()) {
- cursor_addr = mfd->cursor_buf_iova;
- } else {
- if (MDSS_LPAE_CHECK(mfd->cursor_buf_phys)) {
- pr_err("can't access phy mem >4GB w/o iommu\n");
- ret = -ERANGE;
- goto done;
- }
- cursor_addr = mfd->cursor_buf_phys;
- }
-
mixer->cursor_hotx = 0;
mixer->cursor_hoty = 0;
- mdp5_data->cursor_ndx[CURSOR_PIPE_LEFT] = MSMFB_NEW_REQUEST;
- mdp5_data->cursor_ndx[CURSOR_PIPE_RIGHT] = MSMFB_NEW_REQUEST;
}
if (start_x + roi.w <= left_lm_w) {
diff --git a/drivers/video/fbdev/msm/mdss_mdp_pipe.c b/drivers/video/fbdev/msm/mdss_mdp_pipe.c
index 23ac2a1c1c9d..c2f159f1bc7d 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_pipe.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_pipe.c
@@ -1024,6 +1024,9 @@ static struct mdss_mdp_pipe *mdss_mdp_pipe_init(struct mdss_mdp_mixer *mixer,
if (pipe && type == MDSS_MDP_PIPE_TYPE_CURSOR) {
kref_init(&pipe->kref);
+ INIT_LIST_HEAD(&pipe->buf_queue);
+ pr_debug("cursor: type=%x pnum=%d\n",
+ pipe->type, pipe->num);
goto cursor_done;
}
diff --git a/drivers/video/fbdev/msm/mdss_mdp_pp.c b/drivers/video/fbdev/msm/mdss_mdp_pp.c
index 58c0fcbbb14a..c339297f8111 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_pp.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_pp.c
@@ -1359,6 +1359,9 @@ int mdss_mdp_pipe_sspp_setup(struct mdss_mdp_pipe *pipe, u32 *op)
pipe_cnt = mdata->ndma_pipes;
location = SSPP_DMA;
break;
+ case MDSS_MDP_PIPE_TYPE_CURSOR:
+ /* cursor does not support the feature */
+ return 0;
default:
pr_err("Invalid pipe type %d\n", pipe->type);
return -EINVAL;