From e3ac2f4367621a2e39bb76bdbf73c8d5cf71d35d Mon Sep 17 00:00:00 2001 From: Ingrid Gallardo Date: Thu, 29 Jan 2015 10:29:42 -0800 Subject: [PATCH] msm: mdss: fix cursor alloc and setup Each pipe holds a list with the addresses to the planes allocated for each pipe. Current code was missing to populate this list for the cursor and update the global list with the correct index for the cursor allocated. This change fixes this issue by populating the list and updating the global cursors list. Change-Id: Ib5bdfd5a93802c05643b74a6ebf396d2d9308365 Signed-off-by: Ingrid Gallardo --- drivers/video/fbdev/msm/mdss_mdp_overlay.c | 51 +++++++++++++++------- drivers/video/fbdev/msm/mdss_mdp_pipe.c | 3 ++ drivers/video/fbdev/msm/mdss_mdp_pp.c | 3 ++ 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;