Loading drivers/video/msm/mdss/mdp3_ctrl.c +1 −0 Original line number Original line Diff line number Diff line Loading @@ -2852,6 +2852,7 @@ int mdp3_ctrl_init(struct msm_fb_data_type *mfd) mdp3_interface->lut_update = NULL; mdp3_interface->lut_update = NULL; mdp3_interface->configure_panel = mdp3_update_panel_info; mdp3_interface->configure_panel = mdp3_update_panel_info; mdp3_interface->input_event_handler = NULL; mdp3_interface->input_event_handler = NULL; mdp3_interface->signal_retire_fence = NULL; mdp3_session = kzalloc(sizeof(struct mdp3_session_data), GFP_KERNEL); mdp3_session = kzalloc(sizeof(struct mdp3_session_data), GFP_KERNEL); if (!mdp3_session) { if (!mdp3_session) { Loading drivers/video/msm/mdss/mdss_fb.c +15 −0 Original line number Original line Diff line number Diff line Loading @@ -3646,6 +3646,9 @@ skip_commit: if (IS_ERR_VALUE(ret) || !sync_pt_data->flushed) { if (IS_ERR_VALUE(ret) || !sync_pt_data->flushed) { mdss_fb_release_kickoff(mfd); mdss_fb_release_kickoff(mfd); mdss_fb_signal_timeline(sync_pt_data); 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 (dynamic_dsi_switch) { if (dynamic_dsi_switch) { Loading Loading @@ -4473,6 +4476,7 @@ static int mdss_fb_atomic_commit_ioctl(struct fb_info *info, struct mdp_frc_info *frc_info = NULL; struct mdp_frc_info *frc_info = NULL; struct mdp_frc_info __user *frc_info_user; struct mdp_frc_info __user *frc_info_user; struct msm_fb_data_type *mfd; struct msm_fb_data_type *mfd; struct mdss_overlay_private *mdp5_data = NULL; ret = copy_from_user(&commit, argp, sizeof(struct mdp_layer_commit)); ret = copy_from_user(&commit, argp, sizeof(struct mdp_layer_commit)); if (ret) { if (ret) { Loading @@ -4484,9 +4488,20 @@ static int mdss_fb_atomic_commit_ioctl(struct fb_info *info, if (!mfd) if (!mfd) return -EINVAL; return -EINVAL; mdp5_data = mfd_to_mdp5_data(mfd); if (mfd->panel_info->panel_dead) { if (mfd->panel_info->panel_dead) { pr_debug("early commit return\n"); pr_debug("early commit return\n"); MDSS_XLOG(mfd->panel_info->panel_dead); MDSS_XLOG(mfd->panel_info->panel_dead); /* * In case of an ESD attack, since we early return from the * commits, we need to signal the outstanding fences. */ mdss_fb_release_fences(mfd); if ((mfd->panel.type == MIPI_CMD_PANEL) && mfd->mdp.signal_retire_fence && mdp5_data) mfd->mdp.signal_retire_fence(mfd, mdp5_data->retire_cnt); return 0; return 0; } } Loading drivers/video/msm/mdss/mdss_fb.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -233,6 +233,8 @@ struct msm_mdp_interface { int dest_ctrl); int dest_ctrl); int (*input_event_handler)(struct msm_fb_data_type *mfd); int (*input_event_handler)(struct msm_fb_data_type *mfd); int (*pp_release_fnc)(struct msm_fb_data_type *mfd); int (*pp_release_fnc)(struct msm_fb_data_type *mfd); void (*signal_retire_fence)(struct msm_fb_data_type *mfd, int retire_cnt); void *private1; void *private1; }; }; Loading drivers/video/msm/mdss/mdss_mdp_overlay.c +12 −1 Original line number Original line Diff line number Diff line Loading @@ -6337,8 +6337,11 @@ static void __vsync_retire_signal(struct msm_fb_data_type *mfd, int val) mutex_lock(&mfd->mdp_sync_pt_data.sync_mutex); mutex_lock(&mfd->mdp_sync_pt_data.sync_mutex); if (mdp5_data->retire_cnt > 0) { if (mdp5_data->retire_cnt > 0) { sw_sync_timeline_inc(mdp5_data->vsync_timeline, val); sw_sync_timeline_inc(mdp5_data->vsync_timeline, val); mdp5_data->retire_cnt -= min(val, mdp5_data->retire_cnt); mdp5_data->retire_cnt -= min(val, mdp5_data->retire_cnt); pr_debug("Retire signaled! timeline val=%d remaining=%d\n", mdp5_data->vsync_timeline->value, mdp5_data->retire_cnt); if (mdp5_data->retire_cnt == 0) { if (mdp5_data->retire_cnt == 0) { mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_ON); mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_ON); mdp5_data->ctl->ops.remove_vsync_handler(mdp5_data->ctl, mdp5_data->ctl->ops.remove_vsync_handler(mdp5_data->ctl, Loading Loading @@ -6530,6 +6533,13 @@ int mdss_mdp_input_event_handler(struct msm_fb_data_type *mfd) return rc; return rc; } } static void mdss_mdp_signal_retire_fence(struct msm_fb_data_type *mfd, int retire_cnt) { __vsync_retire_signal(mfd, retire_cnt); pr_debug("Signaled (%d) pending retire fence\n", retire_cnt); } int mdss_mdp_overlay_init(struct msm_fb_data_type *mfd) int mdss_mdp_overlay_init(struct msm_fb_data_type *mfd) { { struct device *dev = mfd->fbi->dev; struct device *dev = mfd->fbi->dev; Loading Loading @@ -6578,6 +6588,7 @@ int mdss_mdp_overlay_init(struct msm_fb_data_type *mfd) mdp5_interface->splash_init_fnc = mdss_mdp_splash_init; mdp5_interface->splash_init_fnc = mdss_mdp_splash_init; mdp5_interface->configure_panel = mdss_mdp_update_panel_info; mdp5_interface->configure_panel = mdss_mdp_update_panel_info; mdp5_interface->input_event_handler = mdss_mdp_input_event_handler; mdp5_interface->input_event_handler = mdss_mdp_input_event_handler; mdp5_interface->signal_retire_fence = mdss_mdp_signal_retire_fence; if (mfd->panel_info->type == WRITEBACK_PANEL) { if (mfd->panel_info->type == WRITEBACK_PANEL) { mdp5_interface->atomic_validate = mdp5_interface->atomic_validate = Loading Loading
drivers/video/msm/mdss/mdp3_ctrl.c +1 −0 Original line number Original line Diff line number Diff line Loading @@ -2852,6 +2852,7 @@ int mdp3_ctrl_init(struct msm_fb_data_type *mfd) mdp3_interface->lut_update = NULL; mdp3_interface->lut_update = NULL; mdp3_interface->configure_panel = mdp3_update_panel_info; mdp3_interface->configure_panel = mdp3_update_panel_info; mdp3_interface->input_event_handler = NULL; mdp3_interface->input_event_handler = NULL; mdp3_interface->signal_retire_fence = NULL; mdp3_session = kzalloc(sizeof(struct mdp3_session_data), GFP_KERNEL); mdp3_session = kzalloc(sizeof(struct mdp3_session_data), GFP_KERNEL); if (!mdp3_session) { if (!mdp3_session) { Loading
drivers/video/msm/mdss/mdss_fb.c +15 −0 Original line number Original line Diff line number Diff line Loading @@ -3646,6 +3646,9 @@ skip_commit: if (IS_ERR_VALUE(ret) || !sync_pt_data->flushed) { if (IS_ERR_VALUE(ret) || !sync_pt_data->flushed) { mdss_fb_release_kickoff(mfd); mdss_fb_release_kickoff(mfd); mdss_fb_signal_timeline(sync_pt_data); 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 (dynamic_dsi_switch) { if (dynamic_dsi_switch) { Loading Loading @@ -4473,6 +4476,7 @@ static int mdss_fb_atomic_commit_ioctl(struct fb_info *info, struct mdp_frc_info *frc_info = NULL; struct mdp_frc_info *frc_info = NULL; struct mdp_frc_info __user *frc_info_user; struct mdp_frc_info __user *frc_info_user; struct msm_fb_data_type *mfd; struct msm_fb_data_type *mfd; struct mdss_overlay_private *mdp5_data = NULL; ret = copy_from_user(&commit, argp, sizeof(struct mdp_layer_commit)); ret = copy_from_user(&commit, argp, sizeof(struct mdp_layer_commit)); if (ret) { if (ret) { Loading @@ -4484,9 +4488,20 @@ static int mdss_fb_atomic_commit_ioctl(struct fb_info *info, if (!mfd) if (!mfd) return -EINVAL; return -EINVAL; mdp5_data = mfd_to_mdp5_data(mfd); if (mfd->panel_info->panel_dead) { if (mfd->panel_info->panel_dead) { pr_debug("early commit return\n"); pr_debug("early commit return\n"); MDSS_XLOG(mfd->panel_info->panel_dead); MDSS_XLOG(mfd->panel_info->panel_dead); /* * In case of an ESD attack, since we early return from the * commits, we need to signal the outstanding fences. */ mdss_fb_release_fences(mfd); if ((mfd->panel.type == MIPI_CMD_PANEL) && mfd->mdp.signal_retire_fence && mdp5_data) mfd->mdp.signal_retire_fence(mfd, mdp5_data->retire_cnt); return 0; return 0; } } Loading
drivers/video/msm/mdss/mdss_fb.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -233,6 +233,8 @@ struct msm_mdp_interface { int dest_ctrl); int dest_ctrl); int (*input_event_handler)(struct msm_fb_data_type *mfd); int (*input_event_handler)(struct msm_fb_data_type *mfd); int (*pp_release_fnc)(struct msm_fb_data_type *mfd); int (*pp_release_fnc)(struct msm_fb_data_type *mfd); void (*signal_retire_fence)(struct msm_fb_data_type *mfd, int retire_cnt); void *private1; void *private1; }; }; Loading
drivers/video/msm/mdss/mdss_mdp_overlay.c +12 −1 Original line number Original line Diff line number Diff line Loading @@ -6337,8 +6337,11 @@ static void __vsync_retire_signal(struct msm_fb_data_type *mfd, int val) mutex_lock(&mfd->mdp_sync_pt_data.sync_mutex); mutex_lock(&mfd->mdp_sync_pt_data.sync_mutex); if (mdp5_data->retire_cnt > 0) { if (mdp5_data->retire_cnt > 0) { sw_sync_timeline_inc(mdp5_data->vsync_timeline, val); sw_sync_timeline_inc(mdp5_data->vsync_timeline, val); mdp5_data->retire_cnt -= min(val, mdp5_data->retire_cnt); mdp5_data->retire_cnt -= min(val, mdp5_data->retire_cnt); pr_debug("Retire signaled! timeline val=%d remaining=%d\n", mdp5_data->vsync_timeline->value, mdp5_data->retire_cnt); if (mdp5_data->retire_cnt == 0) { if (mdp5_data->retire_cnt == 0) { mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_ON); mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_ON); mdp5_data->ctl->ops.remove_vsync_handler(mdp5_data->ctl, mdp5_data->ctl->ops.remove_vsync_handler(mdp5_data->ctl, Loading Loading @@ -6530,6 +6533,13 @@ int mdss_mdp_input_event_handler(struct msm_fb_data_type *mfd) return rc; return rc; } } static void mdss_mdp_signal_retire_fence(struct msm_fb_data_type *mfd, int retire_cnt) { __vsync_retire_signal(mfd, retire_cnt); pr_debug("Signaled (%d) pending retire fence\n", retire_cnt); } int mdss_mdp_overlay_init(struct msm_fb_data_type *mfd) int mdss_mdp_overlay_init(struct msm_fb_data_type *mfd) { { struct device *dev = mfd->fbi->dev; struct device *dev = mfd->fbi->dev; Loading Loading @@ -6578,6 +6588,7 @@ int mdss_mdp_overlay_init(struct msm_fb_data_type *mfd) mdp5_interface->splash_init_fnc = mdss_mdp_splash_init; mdp5_interface->splash_init_fnc = mdss_mdp_splash_init; mdp5_interface->configure_panel = mdss_mdp_update_panel_info; mdp5_interface->configure_panel = mdss_mdp_update_panel_info; mdp5_interface->input_event_handler = mdss_mdp_input_event_handler; mdp5_interface->input_event_handler = mdss_mdp_input_event_handler; mdp5_interface->signal_retire_fence = mdss_mdp_signal_retire_fence; if (mfd->panel_info->type == WRITEBACK_PANEL) { if (mfd->panel_info->type == WRITEBACK_PANEL) { mdp5_interface->atomic_validate = mdp5_interface->atomic_validate = Loading