Loading drivers/video/msm/mdss/mdss_mdp_overlay.c +44 −9 Original line number Diff line number Diff line Loading @@ -1072,7 +1072,12 @@ static int mdss_mdp_overlay_set(struct msm_fb_data_type *mfd, return ret; } struct mdss_mdp_data *mdss_mdp_overlay_buf_alloc(struct msm_fb_data_type *mfd, /* * it's caller responsibility to acquire mdp5_data->list_lock while calling * this function */ static struct mdss_mdp_data *__mdp_overlay_buf_alloc(struct msm_fb_data_type *mfd, struct mdss_mdp_pipe *pipe) { struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd); Loading @@ -1090,24 +1095,40 @@ struct mdss_mdp_data *mdss_mdp_overlay_buf_alloc(struct msm_fb_data_type *mfd, } list_add(&buf->chunk_list, &mdp5_data->bufs_chunks); for (i = 0; i < BUF_POOL_SIZE; i++) for (i = 0; i < BUF_POOL_SIZE; i++) { buf->state = MDP_BUF_STATE_UNUSED; list_add(&buf[i].buf_list, &mdp5_data->bufs_pool); } } buf = list_first_entry(&mdp5_data->bufs_pool, struct mdss_mdp_data, buf_list); list_move_tail(&buf->buf_list, &mdp5_data->bufs_used); BUG_ON(buf->state != MDP_BUF_STATE_UNUSED); buf->state = MDP_BUF_STATE_READY; buf->last_alloc = local_clock(); buf->last_pipe = pipe; list_move_tail(&buf->buf_list, &mdp5_data->bufs_used); list_add_tail(&buf->pipe_list, &pipe->buf_queue); buf->state = MDP_BUF_STATE_READY; pr_debug("buffer alloc: %p\n", buf); return buf; } struct mdss_mdp_data *mdss_mdp_overlay_buf_alloc(struct msm_fb_data_type *mfd, struct mdss_mdp_pipe *pipe) { struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd); struct mdss_mdp_data *buf; mutex_lock(&mdp5_data->list_lock); buf = __mdp_overlay_buf_alloc(mfd, pipe); mutex_unlock(&mdp5_data->list_lock); return buf; } static void mdss_mdp_overlay_buf_deinit(struct msm_fb_data_type *mfd) { struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd); Loading @@ -1126,7 +1147,11 @@ static void mdss_mdp_overlay_buf_deinit(struct msm_fb_data_type *mfd) } } void mdss_mdp_overlay_buf_free(struct msm_fb_data_type *mfd, /* * it's caller responsibility to acquire mdp5_data->list_lock while calling * this function */ static void __mdp_overlay_buf_free(struct msm_fb_data_type *mfd, struct mdss_mdp_data *buf) { struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd); Loading @@ -1144,6 +1169,16 @@ void mdss_mdp_overlay_buf_free(struct msm_fb_data_type *mfd, list_move_tail(&buf->buf_list, &mdp5_data->bufs_pool); } void mdss_mdp_overlay_buf_free(struct msm_fb_data_type *mfd, struct mdss_mdp_data *buf) { struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd); mutex_lock(&mdp5_data->list_lock); __mdp_overlay_buf_free(mfd, buf); mutex_unlock(&mdp5_data->list_lock); } static inline void __pipe_buf_mark_cleanup(struct msm_fb_data_type *mfd, struct mdss_mdp_data *buf) { Loading @@ -1166,7 +1201,7 @@ static void __mdss_mdp_overlay_free_list_purge(struct msm_fb_data_type *mfd) pr_debug("purging fb%d free list\n", mfd->index); list_for_each_entry_safe(buf, t, &mdp5_data->bufs_freelist, buf_list) mdss_mdp_overlay_buf_free(mfd, buf); __mdp_overlay_buf_free(mfd, buf); } static void __overlay_pipe_cleanup(struct msm_fb_data_type *mfd, Loading @@ -1184,7 +1219,7 @@ static void __overlay_pipe_cleanup(struct msm_fb_data_type *mfd, * soon as session is closed. */ if (pipe->flags & MDP_SECURE_DISPLAY_OVERLAY_SESSION) mdss_mdp_overlay_buf_free(mfd, buf); __mdp_overlay_buf_free(mfd, buf); } mdss_mdp_pipe_destroy(pipe); Loading Loading @@ -2162,7 +2197,7 @@ static int mdss_mdp_overlay_queue(struct msm_fb_data_type *mfd, flags = (pipe->flags & MDP_SECURE_OVERLAY_SESSION); mutex_lock(&mdp5_data->list_lock); src_data = mdss_mdp_overlay_buf_alloc(mfd, pipe); src_data = __mdp_overlay_buf_alloc(mfd, pipe); if (!src_data) { pr_err("unable to allocate source buffer\n"); ret = -ENOMEM; Loading @@ -2170,7 +2205,7 @@ static int mdss_mdp_overlay_queue(struct msm_fb_data_type *mfd, ret = mdss_mdp_data_get(src_data, &req->data, 1, flags); if (IS_ERR_VALUE(ret)) { mdss_mdp_overlay_buf_free(mfd, src_data); __mdp_overlay_buf_free(mfd, src_data); pr_err("src_data pmem error\n"); } } Loading Loading
drivers/video/msm/mdss/mdss_mdp_overlay.c +44 −9 Original line number Diff line number Diff line Loading @@ -1072,7 +1072,12 @@ static int mdss_mdp_overlay_set(struct msm_fb_data_type *mfd, return ret; } struct mdss_mdp_data *mdss_mdp_overlay_buf_alloc(struct msm_fb_data_type *mfd, /* * it's caller responsibility to acquire mdp5_data->list_lock while calling * this function */ static struct mdss_mdp_data *__mdp_overlay_buf_alloc(struct msm_fb_data_type *mfd, struct mdss_mdp_pipe *pipe) { struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd); Loading @@ -1090,24 +1095,40 @@ struct mdss_mdp_data *mdss_mdp_overlay_buf_alloc(struct msm_fb_data_type *mfd, } list_add(&buf->chunk_list, &mdp5_data->bufs_chunks); for (i = 0; i < BUF_POOL_SIZE; i++) for (i = 0; i < BUF_POOL_SIZE; i++) { buf->state = MDP_BUF_STATE_UNUSED; list_add(&buf[i].buf_list, &mdp5_data->bufs_pool); } } buf = list_first_entry(&mdp5_data->bufs_pool, struct mdss_mdp_data, buf_list); list_move_tail(&buf->buf_list, &mdp5_data->bufs_used); BUG_ON(buf->state != MDP_BUF_STATE_UNUSED); buf->state = MDP_BUF_STATE_READY; buf->last_alloc = local_clock(); buf->last_pipe = pipe; list_move_tail(&buf->buf_list, &mdp5_data->bufs_used); list_add_tail(&buf->pipe_list, &pipe->buf_queue); buf->state = MDP_BUF_STATE_READY; pr_debug("buffer alloc: %p\n", buf); return buf; } struct mdss_mdp_data *mdss_mdp_overlay_buf_alloc(struct msm_fb_data_type *mfd, struct mdss_mdp_pipe *pipe) { struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd); struct mdss_mdp_data *buf; mutex_lock(&mdp5_data->list_lock); buf = __mdp_overlay_buf_alloc(mfd, pipe); mutex_unlock(&mdp5_data->list_lock); return buf; } static void mdss_mdp_overlay_buf_deinit(struct msm_fb_data_type *mfd) { struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd); Loading @@ -1126,7 +1147,11 @@ static void mdss_mdp_overlay_buf_deinit(struct msm_fb_data_type *mfd) } } void mdss_mdp_overlay_buf_free(struct msm_fb_data_type *mfd, /* * it's caller responsibility to acquire mdp5_data->list_lock while calling * this function */ static void __mdp_overlay_buf_free(struct msm_fb_data_type *mfd, struct mdss_mdp_data *buf) { struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd); Loading @@ -1144,6 +1169,16 @@ void mdss_mdp_overlay_buf_free(struct msm_fb_data_type *mfd, list_move_tail(&buf->buf_list, &mdp5_data->bufs_pool); } void mdss_mdp_overlay_buf_free(struct msm_fb_data_type *mfd, struct mdss_mdp_data *buf) { struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd); mutex_lock(&mdp5_data->list_lock); __mdp_overlay_buf_free(mfd, buf); mutex_unlock(&mdp5_data->list_lock); } static inline void __pipe_buf_mark_cleanup(struct msm_fb_data_type *mfd, struct mdss_mdp_data *buf) { Loading @@ -1166,7 +1201,7 @@ static void __mdss_mdp_overlay_free_list_purge(struct msm_fb_data_type *mfd) pr_debug("purging fb%d free list\n", mfd->index); list_for_each_entry_safe(buf, t, &mdp5_data->bufs_freelist, buf_list) mdss_mdp_overlay_buf_free(mfd, buf); __mdp_overlay_buf_free(mfd, buf); } static void __overlay_pipe_cleanup(struct msm_fb_data_type *mfd, Loading @@ -1184,7 +1219,7 @@ static void __overlay_pipe_cleanup(struct msm_fb_data_type *mfd, * soon as session is closed. */ if (pipe->flags & MDP_SECURE_DISPLAY_OVERLAY_SESSION) mdss_mdp_overlay_buf_free(mfd, buf); __mdp_overlay_buf_free(mfd, buf); } mdss_mdp_pipe_destroy(pipe); Loading Loading @@ -2162,7 +2197,7 @@ static int mdss_mdp_overlay_queue(struct msm_fb_data_type *mfd, flags = (pipe->flags & MDP_SECURE_OVERLAY_SESSION); mutex_lock(&mdp5_data->list_lock); src_data = mdss_mdp_overlay_buf_alloc(mfd, pipe); src_data = __mdp_overlay_buf_alloc(mfd, pipe); if (!src_data) { pr_err("unable to allocate source buffer\n"); ret = -ENOMEM; Loading @@ -2170,7 +2205,7 @@ static int mdss_mdp_overlay_queue(struct msm_fb_data_type *mfd, ret = mdss_mdp_data_get(src_data, &req->data, 1, flags); if (IS_ERR_VALUE(ret)) { mdss_mdp_overlay_buf_free(mfd, src_data); __mdp_overlay_buf_free(mfd, src_data); pr_err("src_data pmem error\n"); } } Loading