diff options
| author | Dhaval Patel <pdhaval@codeaurora.org> | 2015-03-03 14:06:29 -0800 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:38:33 -0700 |
| commit | 65ded8d75deeb5eda2ab508f3880609d4dd807a2 (patch) | |
| tree | d526c13dd9a40d4e5673af47e08bae34855ebc51 /drivers | |
| parent | cf5ef3a2180595370379167d64864d9c5ca66303 (diff) | |
msm: mdss: fix ab/ib vote for nrt clients
Invalid port calculation is causing wrong ab/ib
vote on rt(RealTime) and nrt(NonRealTime) clients.
This change fixes it and provides correct ab/ib
vote for nrt clients.
Change-Id: I6b7f63721237b63fa12457b96e47852913597d9f
Signed-off-by: Dhaval Patel <pdhaval@codeaurora.org>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp.c | 14 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_ctl.c | 53 |
2 files changed, 39 insertions, 28 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp.c b/drivers/video/fbdev/msm/mdss_mdp.c index 2163eb9c3d41..1bb3ebbbc240 100644 --- a/drivers/video/fbdev/msm/mdss_mdp.c +++ b/drivers/video/fbdev/msm/mdss_mdp.c @@ -332,8 +332,9 @@ static int mdss_mdp_bus_scale_set_quota(u64 ab_quota_rt, u64 ab_quota_nrt, mdss_res->bus_channels); } - if (mdss_res->has_fixed_qos_arbiter_enabled && - rt_axi_port_cnt && nrt_axi_port_cnt) { + if (mdss_res->has_fixed_qos_arbiter_enabled || + nrt_axi_port_cnt) { + ab_quota_rt = div_u64(ab_quota_rt, rt_axi_port_cnt); ab_quota_nrt = div_u64(ab_quota_nrt, nrt_axi_port_cnt); @@ -2920,6 +2921,7 @@ static int mdss_mdp_parse_dt_bus_scale(struct platform_device *pdev) rc); return rc; } + mdss_res->axi_port_cnt = paths; rc = of_property_read_u32(pdev->dev.of_node, "qcom,mdss-num-nrt-paths", &mdata->nrt_axi_port_cnt); @@ -2931,14 +2933,6 @@ static int mdss_mdp_parse_dt_bus_scale(struct platform_device *pdev) rc = 0; } - if (paths > mdata->nrt_axi_port_cnt) { - mdata->axi_port_cnt = paths - mdata->nrt_axi_port_cnt; - } else { - pr_err("invalid real time path config, total ports:%d, nrt ports:%d\n", - paths, mdata->nrt_axi_port_cnt); - return -EINVAL; - } - mdata->bus_scale_table = msm_bus_cl_get_pdata(pdev); if (IS_ERR_OR_NULL(mdata->bus_scale_table)) { rc = PTR_ERR(mdata->bus_scale_table); diff --git a/drivers/video/fbdev/msm/mdss_mdp_ctl.c b/drivers/video/fbdev/msm/mdss_mdp_ctl.c index 7fe01fe152d7..8807c1677125 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_ctl.c +++ b/drivers/video/fbdev/msm/mdss_mdp_ctl.c @@ -1077,9 +1077,9 @@ static void __mdss_mdp_perf_calc_ctl_helper(struct mdss_mdp_ctl *ctl, } perf->bw_ctl = max(perf->bw_prefill, perf->bw_overlap); - pr_debug("ctl=%d prefill bw=%llu overlap bw=%llu mode=0x%lx\n", + pr_debug("ctl=%d prefill bw=%llu overlap bw=%llu mode=0x%lx writeback:%llu\n", ctl->num, perf->bw_prefill, perf->bw_overlap, - *(perf->bw_vote_mode)); + *(perf->bw_vote_mode), perf->bw_writeback); } int mdss_mdp_perf_bw_check(struct mdss_mdp_ctl *ctl, @@ -1361,14 +1361,15 @@ static u64 mdss_mdp_ctl_calc_client_vote(struct mdss_data_type *mdata, ctl->cur_perf.bw_vote_mode, MDSS_MDP_BW_MODE_MAX); - perf->max_per_pipe_ib = max(perf->max_per_pipe_ib, - ctl->cur_perf.max_per_pipe_ib); - - if (nrt_client && ctl->intf_num == MDSS_MDP_NO_INTF) { + if (nrt_client && ctl->mixer_left && + !ctl->mixer_left->rotator_mode) { bw_sum_of_intfs += ctl->cur_perf.bw_writeback; continue; } + perf->max_per_pipe_ib = max(perf->max_per_pipe_ib, + ctl->cur_perf.max_per_pipe_ib); + bw_sum_of_intfs += ctl->cur_perf.bw_ctl; pr_debug("ctl_num=%d bw=%llu mode=0x%lx\n", ctl->num, @@ -1573,7 +1574,7 @@ static bool is_traffic_shaper_enabled(struct mdss_data_type *mdata) } static void mdss_mdp_ctl_perf_update(struct mdss_mdp_ctl *ctl, - int params_changed) + int params_changed, bool stop_req) { struct mdss_mdp_perf_params *new, *old; int update_bus = 0, update_clk = 0; @@ -1602,18 +1603,34 @@ static void mdss_mdp_ctl_perf_update(struct mdss_mdp_ctl *ctl, mdss_mdp_perf_release_ctl_bw(ctl, new); else if (is_bw_released || params_changed) mdss_mdp_perf_calc_ctl(ctl, new); + /* - * If params have just changed delay the update until - * later once the hw configuration has been flushed to - * MDP. + * three cases for bus bandwidth update. + * 1. new bandwidth vote or writeback output vote + * are higher than current vote for update request. + * 2. new bandwidth vote or writeback output vote are + * lower than current vote at end of commit or stop. + * 3. end of writeback/rotator session - last chance to + * non-realtime remove vote. */ - if ((params_changed && (new->bw_ctl > old->bw_ctl)) || - (!params_changed && (new->bw_ctl < old->bw_ctl))) { + if ((params_changed && ((new->bw_ctl > old->bw_ctl) || + (new->bw_writeback > old->bw_writeback))) || + (!params_changed && ((new->bw_ctl < old->bw_ctl) || + (new->bw_writeback < old->bw_writeback))) || + (stop_req && mdss_mdp_is_nrt_ctl_path(ctl))) { + pr_debug("c=%d p=%d new_bw=%llu,old_bw=%llu\n", ctl->num, params_changed, new->bw_ctl, old->bw_ctl); - old->bw_ctl = new->bw_ctl; - old->max_per_pipe_ib = new->max_per_pipe_ib; + if (stop_req) { + old->bw_writeback = 0; + old->bw_ctl = 0; + old->max_per_pipe_ib = 0; + } else { + old->bw_ctl = new->bw_ctl; + old->max_per_pipe_ib = new->max_per_pipe_ib; + old->bw_writeback = new->bw_writeback; + } bitmap_copy(old->bw_vote_mode, new->bw_vote_mode, MDSS_MDP_BW_MODE_MAX); update_bus = 1; @@ -1963,7 +1980,7 @@ int mdss_mdp_block_mixer_destroy(struct mdss_mdp_mixer *mixer) mdss_mdp_ctl_free(ctl); - mdss_mdp_ctl_perf_update(ctl, 0); + mdss_mdp_ctl_perf_update(ctl, 0, true); return 0; } @@ -2742,7 +2759,7 @@ int mdss_mdp_ctl_stop(struct mdss_mdp_ctl *ctl, int power_state) } ctl->play_cnt = 0; - mdss_mdp_ctl_perf_update(ctl, 0); + mdss_mdp_ctl_perf_update(ctl, 0, true); end: if (!ret) @@ -3502,7 +3519,7 @@ int mdss_mdp_display_wait4comp(struct mdss_mdp_ctl *ctl) trace_mdp_commit(ctl); - mdss_mdp_ctl_perf_update(ctl, 0); + mdss_mdp_ctl_perf_update(ctl, 0, false); if (IS_MDSS_MAJOR_MINOR_SAME(mdata->mdp_rev, MDSS_MDP_HW_REV_103)) { mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_ON); @@ -3602,7 +3619,7 @@ int mdss_mdp_display_commit(struct mdss_mdp_ctl *ctl, void *arg, } ATRACE_BEGIN("mixer_programming"); - mdss_mdp_ctl_perf_update(ctl, 1); + mdss_mdp_ctl_perf_update(ctl, 1, false); mdss_mdp_mixer_setup(ctl, MDSS_MDP_MIXER_MUX_LEFT); mdss_mdp_mixer_setup(ctl, MDSS_MDP_MIXER_MUX_RIGHT); |
