diff options
author | TreeHugger Robot <treehugger-gerrit@google.com> | 2018-11-21 12:43:23 +0000 |
---|---|---|
committer | Android Partner Code Review <android-gerrit-partner@google.com> | 2018-11-21 12:43:23 +0000 |
commit | 0930c407e84e167e56414c33bba64b6511b0808c (patch) | |
tree | 357c65e03a5c90efafb712f44b985a6b2c4ac01b | |
parent | d10ee2ba1ce17a20c6de325be1061cd28d2b7d0a (diff) | |
parent | 5acfb31156ce376093cf27614aa9468d66a3a54f (diff) |
Merge "display: flush fences on dma stop" into android-msm-ray-3.18android-wear-9.0.0_r0.6
-rw-r--r-- | drivers/video/msm/mdss/mdp3_ctrl.c | 36 | ||||
-rw-r--r-- | drivers/video/msm/mdss/mdp3_ctrl.h | 1 | ||||
-rw-r--r-- | drivers/video/msm/mdss/mdp3_dma.c | 10 | ||||
-rw-r--r-- | drivers/video/msm/mdss/mdp3_dma.h | 2 | ||||
-rw-r--r-- | drivers/video/msm/mdss/mdss_fb.c | 2 |
5 files changed, 40 insertions, 11 deletions
diff --git a/drivers/video/msm/mdss/mdp3_ctrl.c b/drivers/video/msm/mdss/mdp3_ctrl.c index ff361f4e280f..1e4f5849ae1d 100644 --- a/drivers/video/msm/mdss/mdp3_ctrl.c +++ b/drivers/video/msm/mdss/mdp3_ctrl.c @@ -153,10 +153,32 @@ int mdp3_ctrl_notify(struct mdp3_session_data *ses, int event) return blocking_notifier_call_chain(&ses->notifier_head, event, ses); } +static void __mdp3_dispatch_dma_done(struct mdp3_session_data *session) +{ + int cnt; + + cnt = atomic_read(&session->dma_done_cnt); + MDSS_XLOG(cnt); + while (cnt > 0) { + mdp3_ctrl_notify(session, MDP_NOTIFY_FRAME_DONE); + atomic_dec(&session->dma_done_cnt); + cnt--; + } +} + +void mdp3_flush_dma_done(struct mdp3_session_data *session) +{ + if (!session) + return; + + pr_debug("%s\n", __func__); + + __mdp3_dispatch_dma_done(session); +} + static void mdp3_dispatch_dma_done(struct kthread_work *work) { struct mdp3_session_data *session; - int cnt = 0; pr_debug("%s\n", __func__); session = container_of(work, struct mdp3_session_data, @@ -164,14 +186,7 @@ static void mdp3_dispatch_dma_done(struct kthread_work *work) if (!session) return; - cnt = atomic_read(&session->dma_done_cnt); - MDSS_XLOG(cnt); - while (cnt > 0) { - mdp3_ctrl_notify(session, MDP_NOTIFY_FRAME_DONE); - atomic_dec(&session->dma_done_cnt); - mdp3_ctrl_notify(session, MDP_NOTIFY_FRAME_CTX_DONE); - cnt--; - } + __mdp3_dispatch_dma_done(session); } static void mdp3_dispatch_clk_off(struct work_struct *work) @@ -3202,7 +3217,8 @@ int mdp3_ctrl_init(struct msm_fb_data_type *mfd) pr_err("fail to init dma\n"); goto init_done; } - + mdp3_session->dma->session = mdp3_session; + intf_type = mdp3_ctrl_get_intf_type(mfd); mdp3_session->intf = mdp3_get_display_intf(intf_type); if (!mdp3_session->intf) { diff --git a/drivers/video/msm/mdss/mdp3_ctrl.h b/drivers/video/msm/mdss/mdp3_ctrl.h index 38766c9c61b2..ad6e46fe4cc8 100644 --- a/drivers/video/msm/mdss/mdp3_ctrl.h +++ b/drivers/video/msm/mdss/mdp3_ctrl.h @@ -90,6 +90,7 @@ struct mdp3_session_data { void mdp3_bufq_deinit(struct mdp3_buffer_queue *bufq, int client); int mdp3_ctrl_init(struct msm_fb_data_type *mfd); +void mdp3_flush_dma_done(struct mdp3_session_data *mdp3_session); int mdp3_bufq_push(struct mdp3_buffer_queue *bufq, struct mdp3_img_data *data); int mdp3_ctrl_get_source_format(u32 imgType); diff --git a/drivers/video/msm/mdss/mdp3_dma.c b/drivers/video/msm/mdss/mdp3_dma.c index eb37e7122f8e..a6a5ad4f50cc 100644 --- a/drivers/video/msm/mdss/mdp3_dma.c +++ b/drivers/video/msm/mdss/mdp3_dma.c @@ -1146,6 +1146,16 @@ static int mdp3_dma_stop(struct mdp3_dma *dma, struct mdp3_intf *intf) reinit_completion(&dma->dma_comp); dma->vsync_client.handler = NULL; + + /* + * Interrupts are disabled. + * Check for blocked dma done interrupt. + * Flush items waiting for dma done interrupt. + */ + if (dma->output_config.out_sel == MDP3_DMA_OUTPUT_SEL_DSI_CMD && + atomic_read(&dma->session->dma_done_cnt)) + mdp3_flush_dma_done(dma->session); + return ret; } diff --git a/drivers/video/msm/mdss/mdp3_dma.h b/drivers/video/msm/mdss/mdp3_dma.h index c0391e338903..60b4abdb5b17 100644 --- a/drivers/video/msm/mdss/mdp3_dma.h +++ b/drivers/video/msm/mdss/mdp3_dma.h @@ -292,6 +292,8 @@ struct mdp3_dma { struct fb_cmap *gc_cmap; struct fb_cmap *hist_cmap; + struct mdp3_session_data *session; + bool (*busy)(void); int (*dma_config)(struct mdp3_dma *dma, diff --git a/drivers/video/msm/mdss/mdss_fb.c b/drivers/video/msm/mdss/mdss_fb.c index 35319b82b72c..db1d13d04bee 100644 --- a/drivers/video/msm/mdss/mdss_fb.c +++ b/drivers/video/msm/mdss/mdss_fb.c @@ -1929,7 +1929,7 @@ static int mdss_fb_blank_blank(struct msm_fb_data_type *mfd, ret = mfd->mdp.off_fnc(mfd); if (ret) mfd->panel_power_state = cur_power_state; - else if (mdss_panel_is_power_off(req_power_state)) + else if (!mdss_panel_is_power_on_interactive(req_power_state)) mdss_fb_release_fences(mfd); mfd->op_enable = true; complete(&mfd->power_off_comp); |