Loading drivers/video/fbdev/msm/mdss_mdp.h +1 −0 Original line number Diff line number Diff line Loading @@ -424,6 +424,7 @@ struct mdss_mdp_ctl_intfs_ops { struct mdss_mdp_cwb { struct mutex queue_lock; struct list_head data_queue; struct list_head cleanup_queue; int valid; u32 wb_idx; struct mdp_output_layer layer; Loading drivers/video/fbdev/msm/mdss_mdp_ctl.c +5 −0 Original line number Diff line number Diff line Loading @@ -3565,6 +3565,11 @@ int mdss_mdp_cwb_setup(struct mdss_mdp_ctl *ctl) goto cwb_setup_fail; } /* Add to cleanup list */ mutex_lock(&cwb->queue_lock); list_add_tail(&cwb_data->next, &mdp5_data->cwb.cleanup_queue); mutex_unlock(&cwb->queue_lock); memset(&wb_args, 0, sizeof(wb_args)); wb_args.data = &cwb_data->data; Loading drivers/video/fbdev/msm/mdss_mdp_overlay.c +15 −0 Original line number Diff line number Diff line Loading @@ -5873,10 +5873,24 @@ __vsync_retire_get_fence(struct msm_sync_pt_data *sync_pt_data) static void __cwb_wq_handler(struct work_struct *cwb_work) { struct mdss_mdp_cwb *cwb = NULL; struct mdss_mdp_wb_data *cwb_data = NULL; cwb = container_of(cwb_work, struct mdss_mdp_cwb, cwb_work); blocking_notifier_call_chain(&cwb->notifier_head, MDP_NOTIFY_FRAME_DONE, NULL); /* free the buffer from cleanup queue */ mutex_lock(&cwb->queue_lock); cwb_data = list_first_entry_or_null(&cwb->cleanup_queue, struct mdss_mdp_wb_data, next); __list_del_entry(&cwb_data->next); mutex_unlock(&cwb->queue_lock); if (cwb_data == NULL) { pr_err("no output buffer for cwb cleanup\n"); return; } mdss_mdp_data_free(&cwb_data->data, true, DMA_FROM_DEVICE); kfree(cwb_data); } static int __vsync_set_vsync_handler(struct msm_fb_data_type *mfd) Loading Loading @@ -6107,6 +6121,7 @@ int mdss_mdp_overlay_init(struct msm_fb_data_type *mfd) mutex_init(&mdp5_data->cwb.queue_lock); mutex_init(&mdp5_data->cwb.cwb_sync_pt_data.sync_mutex); INIT_LIST_HEAD(&mdp5_data->cwb.data_queue); INIT_LIST_HEAD(&mdp5_data->cwb.cleanup_queue); snprintf(timeline_name, sizeof(timeline_name), "cwb%d", mfd->index); mdp5_data->cwb.cwb_sync_pt_data.fence_name = "cwb-fence"; Loading Loading
drivers/video/fbdev/msm/mdss_mdp.h +1 −0 Original line number Diff line number Diff line Loading @@ -424,6 +424,7 @@ struct mdss_mdp_ctl_intfs_ops { struct mdss_mdp_cwb { struct mutex queue_lock; struct list_head data_queue; struct list_head cleanup_queue; int valid; u32 wb_idx; struct mdp_output_layer layer; Loading
drivers/video/fbdev/msm/mdss_mdp_ctl.c +5 −0 Original line number Diff line number Diff line Loading @@ -3565,6 +3565,11 @@ int mdss_mdp_cwb_setup(struct mdss_mdp_ctl *ctl) goto cwb_setup_fail; } /* Add to cleanup list */ mutex_lock(&cwb->queue_lock); list_add_tail(&cwb_data->next, &mdp5_data->cwb.cleanup_queue); mutex_unlock(&cwb->queue_lock); memset(&wb_args, 0, sizeof(wb_args)); wb_args.data = &cwb_data->data; Loading
drivers/video/fbdev/msm/mdss_mdp_overlay.c +15 −0 Original line number Diff line number Diff line Loading @@ -5873,10 +5873,24 @@ __vsync_retire_get_fence(struct msm_sync_pt_data *sync_pt_data) static void __cwb_wq_handler(struct work_struct *cwb_work) { struct mdss_mdp_cwb *cwb = NULL; struct mdss_mdp_wb_data *cwb_data = NULL; cwb = container_of(cwb_work, struct mdss_mdp_cwb, cwb_work); blocking_notifier_call_chain(&cwb->notifier_head, MDP_NOTIFY_FRAME_DONE, NULL); /* free the buffer from cleanup queue */ mutex_lock(&cwb->queue_lock); cwb_data = list_first_entry_or_null(&cwb->cleanup_queue, struct mdss_mdp_wb_data, next); __list_del_entry(&cwb_data->next); mutex_unlock(&cwb->queue_lock); if (cwb_data == NULL) { pr_err("no output buffer for cwb cleanup\n"); return; } mdss_mdp_data_free(&cwb_data->data, true, DMA_FROM_DEVICE); kfree(cwb_data); } static int __vsync_set_vsync_handler(struct msm_fb_data_type *mfd) Loading Loading @@ -6107,6 +6121,7 @@ int mdss_mdp_overlay_init(struct msm_fb_data_type *mfd) mutex_init(&mdp5_data->cwb.queue_lock); mutex_init(&mdp5_data->cwb.cwb_sync_pt_data.sync_mutex); INIT_LIST_HEAD(&mdp5_data->cwb.data_queue); INIT_LIST_HEAD(&mdp5_data->cwb.cleanup_queue); snprintf(timeline_name, sizeof(timeline_name), "cwb%d", mfd->index); mdp5_data->cwb.cwb_sync_pt_data.fence_name = "cwb-fence"; Loading