aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTreeHugger Robot <treehugger-gerrit@google.com>2018-11-28 04:36:39 +0000
committerAndroid Partner Code Review <android-gerrit-partner@google.com>2018-11-28 04:36:39 +0000
commitf244fa6b5eddf32d5fc1d24a1d8b6ce0c5faf623 (patch)
tree10d7b41fe698f7157d10dbf1b0b79da80c30adcf
parent69f97a56229f6b30073d1adfba843d49f9edf92a (diff)
parent474a6d9df33934b44e9f3268e0ae4bab7130d05f (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.c33
-rw-r--r--drivers/video/msm/mdss/mdp3_ctrl.h1
-rw-r--r--drivers/video/msm/mdss/mdp3_dma.c10
-rw-r--r--drivers/video/msm/mdss/mdp3_dma.h2
-rw-r--r--[-rwxr-xr-x]drivers/video/msm/mdss/mdss_fb.c2
-rw-r--r--[-rwxr-xr-x]drivers/video/msm/mdss/mdss_fb.h0
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