aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwilliam_liu <william_liu@compal.com>2019-02-15 11:27:12 +0800
committerwilliam_liu <william_liu@compal.com>2019-02-15 16:19:26 +0800
commitf6cf16dc75b4fe1d6d046f1768292e3da55ebc75 (patch)
treed5ea3ccfbdd8c19f8629c6df0082813f5915218a
parent0b19a6a113cf8eae673a41389784999ca3a08d32 (diff)
[PATCH] fbdev: mdss: Signal pending retire fenceandroid-wear-9.0.0_r0.17
During fb blank or dma stop check if there are any pending retire fences. Signal all. Bug: 123606584 Qcom patch. No modification. Change-Id: I29890c7ba4f184603b4c9e4a82062c242ba74bbf Signed-off-by: william_liu <william_liu@compal.com>
-rw-r--r--drivers/video/msm/mdss/mdp3_ctrl.c4
-rw-r--r--drivers/video/msm/mdss/mdp3_ctrl.h4
-rw-r--r--drivers/video/msm/mdss/mdp3_dma.c17
-rw-r--r--drivers/video/msm/mdss/mdss_fb.c28
4 files changed, 39 insertions, 14 deletions
diff --git a/drivers/video/msm/mdss/mdp3_ctrl.c b/drivers/video/msm/mdss/mdp3_ctrl.c
index 740bf1fbc040..a76118be7c3e 100644
--- a/drivers/video/msm/mdss/mdp3_ctrl.c
+++ b/drivers/video/msm/mdss/mdp3_ctrl.c
@@ -265,7 +265,7 @@ static void mdp3_vsync_retire_handle_vsync(void *arg)
&mdp3_session->retire_work);
}
-static void mdp3_vsync_retire_signal(struct msm_fb_data_type *mfd, int val)
+void mdp3_vsync_retire_signal(struct msm_fb_data_type *mfd, int val)
{
struct mdp3_session_data *mdp3_session;
@@ -3194,7 +3194,7 @@ int mdp3_ctrl_init(struct msm_fb_data_type *mfd)
mdp3_interface->lut_update = NULL;
mdp3_interface->configure_panel = mdp3_update_panel_info;
mdp3_interface->input_event_handler = NULL;
- mdp3_interface->signal_retire_fence = NULL;
+ mdp3_interface->signal_retire_fence = mdp3_vsync_retire_signal;
mdp3_interface->is_twm_en = mdp3_is_twm_en;
mdp3_session = kzalloc(sizeof(struct mdp3_session_data), GFP_KERNEL);
diff --git a/drivers/video/msm/mdss/mdp3_ctrl.h b/drivers/video/msm/mdss/mdp3_ctrl.h
index f268d781c990..ee3960e097ea 100644
--- a/drivers/video/msm/mdss/mdp3_ctrl.h
+++ b/drivers/video/msm/mdss/mdp3_ctrl.h
@@ -36,6 +36,9 @@ struct mdp3_buffer_queue {
int pop_idx;
};
+/* struct mdp3_session_data is MDP3 fb private data */
+#define mfd_to_mdp3_data(mfd) (mfd->mdp.private1)
+
struct mdp3_session_data {
struct mutex lock;
int status;
@@ -101,5 +104,6 @@ int mdp3_ctrl_get_pack_pattern(u32 imgType);
int mdp3_ctrl_reset(struct msm_fb_data_type *mfd);
int mdp3_get_ion_client(struct msm_fb_data_type *mfd);
int config_secure_display(struct mdp3_session_data *mdp3_session);
+void mdp3_vsync_retire_signal(struct msm_fb_data_type *mfd, int val);
#endif /* MDP3_CTRL_H */
diff --git a/drivers/video/msm/mdss/mdp3_dma.c b/drivers/video/msm/mdss/mdp3_dma.c
index a6a5ad4f50cc..28d48625df18 100644
--- a/drivers/video/msm/mdss/mdp3_dma.c
+++ b/drivers/video/msm/mdss/mdp3_dma.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2014, 2016, 2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2013-2014, 2016, 2018-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -1149,12 +1149,17 @@ static int mdp3_dma_stop(struct mdp3_dma *dma, struct mdp3_intf *intf)
/*
* Interrupts are disabled.
- * Check for blocked dma done interrupt.
- * Flush items waiting for dma done interrupt.
+ * Check for blocked dma done and vsync interrupt.
+ * Flush items waiting for interrupts.
*/
- 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);
+ if (dma->output_config.out_sel == MDP3_DMA_OUTPUT_SEL_DSI_CMD) {
+ if (atomic_read(&dma->session->dma_done_cnt))
+ mdp3_flush_dma_done(dma->session);
+ if (dma->session->retire_cnt) {
+ mdp3_vsync_retire_signal(dma->session->mfd,
+ dma->session->retire_cnt);
+ }
+ }
return ret;
}
diff --git a/drivers/video/msm/mdss/mdss_fb.c b/drivers/video/msm/mdss/mdss_fb.c
index 432c8312ac46..00ef7cc50f32 100644
--- a/drivers/video/msm/mdss/mdss_fb.c
+++ b/drivers/video/msm/mdss/mdss_fb.c
@@ -2,7 +2,7 @@
* Core MDSS framebuffer driver.
*
* Copyright (C) 2007 Google Incorporated
- * Copyright (c) 2008-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2008-2019, The Linux Foundation. All rights reserved.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
@@ -1814,6 +1814,20 @@ static void mdss_panel_validate_debugfs_info(struct msm_fb_data_type *mfd)
}
}
+static void mdss_fb_signal_retire_fence(struct msm_fb_data_type *mfd)
+{
+#ifdef TARGET_HW_MDSS_MDP3
+ struct mdp3_session_data *mdp3_session = mfd_to_mdp3_data(mfd);
+ int retire_cnt = mdp3_session->retire_cnt;
+#else
+ struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd);
+ int retire_cnt = mdp5_data->retire_cnt;
+#endif
+
+ if (mfd->mdp.signal_retire_fence)
+ mfd->mdp.signal_retire_fence(mfd, retire_cnt);
+}
+
static int mdss_fb_blank_blank(struct msm_fb_data_type *mfd,
int req_power_state)
{
@@ -1861,10 +1875,13 @@ static int mdss_fb_blank_blank(struct msm_fb_data_type *mfd,
mfd->panel_power_state = req_power_state;
ret = mfd->mdp.off_fnc(mfd);
- if (ret)
+ if (ret) {
mfd->panel_power_state = cur_power_state;
- else if (!mdss_panel_is_power_on_interactive(req_power_state))
+ } else if (!mdss_panel_is_power_on_interactive(req_power_state)) {
mdss_fb_release_fences(mfd);
+ if (mfd->panel.type == MIPI_CMD_PANEL)
+ mdss_fb_signal_retire_fence(mfd);
+ }
mfd->op_enable = true;
complete(&mfd->power_off_comp);
@@ -3687,9 +3704,8 @@ skip_commit:
if (IS_ERR_VALUE(ret) || !sync_pt_data->flushed) {
mdss_fb_release_kickoff(mfd);
mdss_fb_signal_timeline(sync_pt_data);
- if ((mfd->panel.type == MIPI_CMD_PANEL) &&
- (mfd->mdp.signal_retire_fence))
- mfd->mdp.signal_retire_fence(mfd, 1);
+ if (mfd->panel.type == MIPI_CMD_PANEL)
+ mdss_fb_signal_retire_fence(mfd);
}
if (dynamic_dsi_switch) {