diff options
author | TreeHugger Robot <treehugger-gerrit@google.com> | 2018-11-28 04:36:39 +0000 |
---|---|---|
committer | Android Partner Code Review <android-gerrit-partner@google.com> | 2018-11-28 04:36:39 +0000 |
commit | f244fa6b5eddf32d5fc1d24a1d8b6ce0c5faf623 (patch) | |
tree | 10d7b41fe698f7157d10dbf1b0b79da80c30adcf | |
parent | 69f97a56229f6b30073d1adfba843d49f9edf92a (diff) | |
parent | 474a6d9df33934b44e9f3268e0ae4bab7130d05f (diff) |
Merge "display: flush fences on dma stop" into android-msm-bluegill-3.18android-wear-9.0.0_r0.4
-rw-r--r-- | drivers/video/msm/mdss/mdp3_ctrl.c | 33 | ||||
-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--[-rwxr-xr-x] | drivers/video/msm/mdss/mdss_fb.c | 2 | ||||
-rw-r--r--[-rwxr-xr-x] | drivers/video/msm/mdss/mdss_fb.h | 0 |
6 files changed, 39 insertions, 9 deletions
diff --git a/drivers/video/msm/mdss/mdp3_ctrl.c b/drivers/video/msm/mdss/mdp3_ctrl.c index c114b2455655..2f9405fed1c9 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,13 +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); - cnt--; - } + __mdp3_dispatch_dma_done(session); } static void mdp3_dispatch_clk_off(struct work_struct *work) @@ -3201,6 +3217,7 @@ 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); 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 d9102934011d..3f81e250ec97 100755..100644 --- a/drivers/video/msm/mdss/mdss_fb.c +++ b/drivers/video/msm/mdss/mdss_fb.c @@ -1892,7 +1892,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); diff --git a/drivers/video/msm/mdss/mdss_fb.h b/drivers/video/msm/mdss/mdss_fb.h index cd61ca52c5be..cd61ca52c5be 100755..100644 --- a/drivers/video/msm/mdss/mdss_fb.h +++ b/drivers/video/msm/mdss/mdss_fb.h |