From db2b74c45630ad8b40a30b165861a0732541fea6 Mon Sep 17 00:00:00 2001 From: Adrian Salido-Moreno Date: Tue, 1 Sep 2015 18:17:07 -0700 Subject: [PATCH] msm: mdss: validate current switch state before commit If mode switch is currently in progress, then proper state machine of calls is expected. If these calls are not observed then it could lead to issues during display commit, because of incomplete update. Add checks for current mode switch state to prevent improper state during commit. Change-Id: I31dae6e15761fc745efd79edbe1070af992db904 Signed-off-by: Adrian Salido-Moreno Signed-off-by: Veera Sundaram Sankaran --- drivers/video/fbdev/msm/mdss_fb.c | 7 +++++++ drivers/video/fbdev/msm/mdss_mdp_overlay.c | 16 ++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/drivers/video/fbdev/msm/mdss_fb.c b/drivers/video/fbdev/msm/mdss_fb.c index 6655da7ca5a5..893c07379e20 100644 --- a/drivers/video/fbdev/msm/mdss_fb.c +++ b/drivers/video/fbdev/msm/mdss_fb.c @@ -3453,6 +3453,11 @@ static int __mdss_fb_perform_commit(struct msm_fb_data_type *mfd) if (mfd->switch_state == MDSS_MDP_WAIT_FOR_COMMIT) { dynamic_dsi_switch = 1; new_dsi_mode = mfd->switch_new_mode; + } else if (mfd->switch_state != MDSS_MDP_NO_UPDATE_REQUESTED) { + pr_err("invalid commit on fb%d with state = %d\n", + mfd->index, mfd->switch_state); + mutex_unlock(&mfd->switch_lock); + goto skip_commit; } mutex_unlock(&mfd->switch_lock); @@ -3486,6 +3491,8 @@ static int __mdss_fb_perform_commit(struct msm_fb_data_type *mfd) pr_err("pan display failed %x on fb%d\n", ret, mfd->index); } + +skip_commit: if (!ret) mdss_fb_update_backlight(mfd); diff --git a/drivers/video/fbdev/msm/mdss_mdp_overlay.c b/drivers/video/fbdev/msm/mdss_mdp_overlay.c index 45069b54a6e3..388e0057d746 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_overlay.c +++ b/drivers/video/fbdev/msm/mdss_mdp_overlay.c @@ -4294,6 +4294,22 @@ static int mdss_mdp_overlay_precommit(struct msm_fb_data_type *mfd) mfd->index, ret); ret = -EPIPE; } + + /* + * If we are in process of mode switch we may have an invalid state. + * We can allow commit to happen if there are no pipes attached as only + * border color will be seen regardless of resolution or mode. + */ + if ((mfd->switch_state != MDSS_MDP_NO_UPDATE_REQUESTED) && + (mfd->switch_state != MDSS_MDP_WAIT_FOR_COMMIT)) { + if (list_empty(&mdp5_data->pipes_used)) { + mfd->switch_state = MDSS_MDP_WAIT_FOR_COMMIT; + } else { + pr_warn("Invalid commit on fb%d with state=%d\n", + mfd->index, mfd->switch_state); + ret = -EINVAL; + } + } mutex_unlock(&mdp5_data->ov_lock); return ret;