Loading drivers/video/fbdev/msm/mdp3_ctrl.c +6 −2 Original line number Diff line number Diff line Loading @@ -263,7 +263,7 @@ static void mdp3_vsync_retire_handle_vsync(void *arg) schedule_work(&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; Loading @@ -273,6 +273,10 @@ static void mdp3_vsync_retire_signal(struct msm_fb_data_type *mfd, int val) if (mdp3_session->retire_cnt > 0) { mdss_inc_timeline(mfd->mdp_sync_pt_data.timeline_retire, val); mdp3_session->retire_cnt -= min(val, mdp3_session->retire_cnt); pr_debug("Retire signaled! timeline val=%d remaining=%d\n", mdss_get_timeline_retire_ts( mfd->mdp_sync_pt_data.timeline_retire), mdp3_session->retire_cnt); } mutex_unlock(&mfd->mdp_sync_pt_data.sync_mutex); } Loading Loading @@ -3044,7 +3048,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); Loading drivers/video/fbdev/msm/mdp3_ctrl.h +4 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -92,5 +95,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); void mdp3_flush_dma_done(struct mdp3_session_data *mdp3_session); void mdp3_vsync_retire_signal(struct msm_fb_data_type *mfd, int val); #endif /* MDP3_CTRL_H */ drivers/video/fbdev/msm/mdp3_dma.c +10 −5 Original line number Diff line number Diff line Loading @@ -1084,12 +1084,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)) 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; } Loading drivers/video/fbdev/msm/mdss_fb.c +23 −8 Original line number Diff line number Diff line Loading @@ -1859,6 +1859,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) { Loading Loading @@ -1906,10 +1920,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); Loading Loading @@ -3712,9 +3729,8 @@ static int __mdss_fb_perform_commit(struct msm_fb_data_type *mfd) */ 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); return ret; } if (!sync_pt_data->async_wait_fences) Loading Loading @@ -3772,9 +3788,8 @@ static int __mdss_fb_perform_commit(struct msm_fb_data_type *mfd) if (IS_ERR_VALUE((unsigned long)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) { Loading Loading
drivers/video/fbdev/msm/mdp3_ctrl.c +6 −2 Original line number Diff line number Diff line Loading @@ -263,7 +263,7 @@ static void mdp3_vsync_retire_handle_vsync(void *arg) schedule_work(&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; Loading @@ -273,6 +273,10 @@ static void mdp3_vsync_retire_signal(struct msm_fb_data_type *mfd, int val) if (mdp3_session->retire_cnt > 0) { mdss_inc_timeline(mfd->mdp_sync_pt_data.timeline_retire, val); mdp3_session->retire_cnt -= min(val, mdp3_session->retire_cnt); pr_debug("Retire signaled! timeline val=%d remaining=%d\n", mdss_get_timeline_retire_ts( mfd->mdp_sync_pt_data.timeline_retire), mdp3_session->retire_cnt); } mutex_unlock(&mfd->mdp_sync_pt_data.sync_mutex); } Loading Loading @@ -3044,7 +3048,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); Loading
drivers/video/fbdev/msm/mdp3_ctrl.h +4 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -92,5 +95,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); void mdp3_flush_dma_done(struct mdp3_session_data *mdp3_session); void mdp3_vsync_retire_signal(struct msm_fb_data_type *mfd, int val); #endif /* MDP3_CTRL_H */
drivers/video/fbdev/msm/mdp3_dma.c +10 −5 Original line number Diff line number Diff line Loading @@ -1084,12 +1084,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)) 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; } Loading
drivers/video/fbdev/msm/mdss_fb.c +23 −8 Original line number Diff line number Diff line Loading @@ -1859,6 +1859,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) { Loading Loading @@ -1906,10 +1920,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); Loading Loading @@ -3712,9 +3729,8 @@ static int __mdss_fb_perform_commit(struct msm_fb_data_type *mfd) */ 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); return ret; } if (!sync_pt_data->async_wait_fences) Loading Loading @@ -3772,9 +3788,8 @@ static int __mdss_fb_perform_commit(struct msm_fb_data_type *mfd) if (IS_ERR_VALUE((unsigned long)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) { Loading