From d6a51f8080a05866d970f5cdee21ec942616ded1 Mon Sep 17 00:00:00 2001 From: Dhaval Patel Date: Wed, 7 Oct 2015 18:40:42 -0700 Subject: msm: mdss: move handoff pipes to used list MDSS client may want to reuse the pipe during boot up which are currently in use. The pipe allocation fails when these pipes are in handoff state and atomic API tries to reallocate them. Moving them to used list allows client to reuse them at early stage without waiting for first valid kickoff. Change-Id: Ia6f1282ea192e3a0e948488ba833c2580bebb9bf Signed-off-by: Dhaval Patel --- drivers/video/fbdev/msm/mdss_mdp_layer.c | 1 + drivers/video/fbdev/msm/mdss_mdp_overlay.c | 18 +++++++++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/drivers/video/fbdev/msm/mdss_mdp_layer.c b/drivers/video/fbdev/msm/mdss_mdp_layer.c index 5e9322800980..bdd0416598c5 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_layer.c +++ b/drivers/video/fbdev/msm/mdss_mdp_layer.c @@ -491,6 +491,7 @@ static int __configure_pipe_params(struct msm_fb_data_type *mfd, pipe->alpha = layer->alpha; pipe->transp = layer->transp_mask; pipe->blend_op = layer->blend_op; + pipe->is_handed_off = false; pipe->async_update = (layer->flags & MDP_LAYER_ASYNC) ? true : false; if (mixer->ctl) { diff --git a/drivers/video/fbdev/msm/mdss_mdp_overlay.c b/drivers/video/fbdev/msm/mdss_mdp_overlay.c index ccc2786e66fd..3a95fa9053e6 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_overlay.c +++ b/drivers/video/fbdev/msm/mdss_mdp_overlay.c @@ -1291,7 +1291,7 @@ void mdss_mdp_handoff_cleanup_pipes(struct msm_fb_data_type *mfd, pipe = &pipes[i]; if (pipe->is_handed_off) { pr_debug("Unmapping handed off pipe %d\n", pipe->num); - list_add(&pipe->list, &mdp5_data->pipes_cleanup); + list_move(&pipe->list, &mdp5_data->pipes_cleanup); mdss_mdp_mixer_pipe_unstage(pipe, pipe->mixer_left); pipe->is_handed_off = false; } @@ -4751,17 +4751,20 @@ ctl_stop: return rc; } -static int __mdss_mdp_ctl_handoff(struct mdss_mdp_ctl *ctl, - struct mdss_data_type *mdata) +static int __mdss_mdp_ctl_handoff(struct msm_fb_data_type *mfd, + struct mdss_mdp_ctl *ctl, struct mdss_data_type *mdata) { int rc = 0; int i, j; u32 mixercfg; struct mdss_mdp_pipe *pipe = NULL; + struct mdss_overlay_private *mdp5_data; if (!ctl || !mdata) return -EINVAL; + mdp5_data = mfd_to_mdp5_data(mfd); + for (i = 0; i < mdata->nmixers_intf; i++) { mixercfg = mdss_mdp_ctl_read(ctl, MDSS_MDP_REG_CTL_LAYER(i)); pr_debug("for lm%d mixercfg = 0x%09x\n", i, mixercfg); @@ -4789,6 +4792,11 @@ static int __mdss_mdp_ctl_handoff(struct mdss_mdp_ctl *ctl, goto exit; } + pipe->mfd = mfd; + mutex_lock(&mdp5_data->list_lock); + list_add(&pipe->list, &mdp5_data->pipes_used); + mutex_unlock(&mdp5_data->list_lock); + rc = mdss_mdp_mixer_handoff(ctl, i, pipe); if (rc) { pr_err("failed to handoff mix%d\n", i); @@ -4842,7 +4850,7 @@ static int mdss_mdp_overlay_handoff(struct msm_fb_data_type *mfd) ctl->clk_rate = mdss_mdp_get_clk_rate(MDSS_CLK_MDP_CORE, false); pr_debug("Set the ctl clock rate to %d Hz\n", ctl->clk_rate); - rc = __mdss_mdp_ctl_handoff(ctl, mdata); + rc = __mdss_mdp_ctl_handoff(mfd, ctl, mdata); if (rc) { pr_err("primary ctl handoff failed. rc=%d\n", rc); goto error; @@ -4855,7 +4863,7 @@ static int mdss_mdp_overlay_handoff(struct msm_fb_data_type *mfd) rc = -EPERM; goto error; } - rc = __mdss_mdp_ctl_handoff(sctl, mdata); + rc = __mdss_mdp_ctl_handoff(mfd, sctl, mdata); if (rc) { pr_err("secondary ctl handoff failed. rc=%d\n", rc); goto error; -- cgit v1.2.3