diff options
author | william_liu <william_liu@compal.com> | 2019-02-15 11:27:12 +0800 |
---|---|---|
committer | william_liu <william_liu@compal.com> | 2019-02-15 16:19:26 +0800 |
commit | f6cf16dc75b4fe1d6d046f1768292e3da55ebc75 (patch) | |
tree | d5ea3ccfbdd8c19f8629c6df0082813f5915218a | |
parent | 0b19a6a113cf8eae673a41389784999ca3a08d32 (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.c | 4 | ||||
-rw-r--r-- | drivers/video/msm/mdss/mdp3_ctrl.h | 4 | ||||
-rw-r--r-- | drivers/video/msm/mdss/mdp3_dma.c | 17 | ||||
-rw-r--r-- | drivers/video/msm/mdss/mdss_fb.c | 28 |
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) { |