From 30a4e6891cf2147e7a25be2f8eafe1c3348874c3 Mon Sep 17 00:00:00 2001 From: Ingrid Gallardo Date: Mon, 2 Feb 2015 11:13:07 -0800 Subject: [PATCH] msm: mdss: adjust ib bw vote as maximum per-pipe bw Adjust ib vote to calculate it as the maximum per-pipe bandwidth of the real time clients. Change-Id: I1596b7dd8e1304985ac3ab49581d9083c64a2b9d Signed-off-by: Ingrid Gallardo --- drivers/video/fbdev/msm/mdss.h | 8 +++++++ drivers/video/fbdev/msm/mdss_mdp.c | 13 ++++++++++- drivers/video/fbdev/msm/mdss_mdp.h | 1 + drivers/video/fbdev/msm/mdss_mdp_ctl.c | 32 ++++++++++++++++++++++---- 4 files changed, 49 insertions(+), 5 deletions(-) diff --git a/drivers/video/fbdev/msm/mdss.h b/drivers/video/fbdev/msm/mdss.h index e2325efdf91d..6469bb48fec2 100644 --- a/drivers/video/fbdev/msm/mdss.h +++ b/drivers/video/fbdev/msm/mdss.h @@ -147,6 +147,11 @@ enum mdss_hw_quirk { MDSS_QUIRK_MAX, }; +enum mdss_qos_settings { + MDSS_QOS_PER_PIPE_IB, + MDSS_QOS_MAX, +}; + struct mdss_smmu_client { struct device *dev; struct dma_iommu_mapping *mmu_mapping; @@ -214,6 +219,8 @@ struct mdss_data_type { DECLARE_BITMAP(mdss_quirk_map, MDSS_QUIRK_MAX); /* bitmap to track total mmbs in use */ DECLARE_BITMAP(mmb_alloc_map, MAX_DRV_SUP_MMB_BLKS); + /* bitmap to track qos applicable settings */ + DECLARE_BITMAP(mdss_qos_map, MDSS_QOS_MAX); u32 has_bwc; /* values used when HW has a common panic/robust LUT */ @@ -280,6 +287,7 @@ struct mdss_data_type { struct mdss_fudge_factor ib_factor; struct mdss_fudge_factor ib_factor_overlap; struct mdss_fudge_factor clk_factor; + struct mdss_fudge_factor per_pipe_ib_factor; u32 disable_prefill; u32 *clock_levels; diff --git a/drivers/video/fbdev/msm/mdss_mdp.c b/drivers/video/fbdev/msm/mdss_mdp.c index fda06fe63e8b..ede913e997f0 100644 --- a/drivers/video/fbdev/msm/mdss_mdp.c +++ b/drivers/video/fbdev/msm/mdss_mdp.c @@ -1001,9 +1001,20 @@ static int mdss_mdp_debug_init(struct mdss_data_type *mdata) static void mdss_mdp_hw_rev_caps_init(struct mdss_data_type *mdata) { + + mdata->per_pipe_ib_factor.numer = 0; + mdata->per_pipe_ib_factor.denom = 0; + switch (mdata->mdp_rev) { - case MDSS_MDP_HW_REV_105: case MDSS_MDP_HW_REV_107: + mdss_set_quirk(mdata, MDSS_QUIRK_BWCPANIC); + mdata->max_target_zorder = 7; /* excluding base layer */ + mdata->max_cursor_size = 128; + mdata->per_pipe_ib_factor.numer = 3; + mdata->per_pipe_ib_factor.denom = 2; + set_bit(MDSS_QOS_PER_PIPE_IB, mdata->mdss_qos_map); + break; + case MDSS_MDP_HW_REV_105: case MDSS_MDP_HW_REV_109: mdss_set_quirk(mdata, MDSS_QUIRK_BWCPANIC); mdata->max_target_zorder = 7; /* excluding base layer */ diff --git a/drivers/video/fbdev/msm/mdss_mdp.h b/drivers/video/fbdev/msm/mdss_mdp.h index a7fc795a23d2..30b653dfdcbd 100644 --- a/drivers/video/fbdev/msm/mdss_mdp.h +++ b/drivers/video/fbdev/msm/mdss_mdp.h @@ -199,6 +199,7 @@ struct mdss_mdp_perf_params { u64 bw_overlap; u64 bw_writeback; u64 bw_prefill; + u64 max_per_pipe_ib; u32 prefill_bytes; u64 bw_ctl; u32 mdp_clk_rate; diff --git a/drivers/video/fbdev/msm/mdss_mdp_ctl.c b/drivers/video/fbdev/msm/mdss_mdp_ctl.c index 53c156b572f7..9eee579a1e73 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_ctl.c +++ b/drivers/video/fbdev/msm/mdss_mdp_ctl.c @@ -798,6 +798,10 @@ static void mdss_mdp_perf_calc_mixer(struct mdss_mdp_mixer *mixer, flags)) continue; + if (!mdss_mdp_is_nrt_ctl_path(mixer->ctl)) + perf->max_per_pipe_ib = max(perf->max_per_pipe_ib, + tmp.bw_overlap); + bitmap_or(perf->bw_vote_mode, perf->bw_vote_mode, tmp.bw_vote_mode, MDSS_MDP_BW_MODE_MAX); @@ -936,6 +940,7 @@ static void __mdss_mdp_perf_calc_ctl_helper(struct mdss_mdp_ctl *ctl, bitmap_or(perf->bw_vote_mode, perf->bw_vote_mode, tmp.bw_vote_mode, MDSS_MDP_BW_MODE_MAX); + perf->max_per_pipe_ib = tmp.max_per_pipe_ib; perf->bw_overlap += tmp.bw_overlap; perf->prefill_bytes += tmp.prefill_bytes; perf->mdp_clk_rate = tmp.mdp_clk_rate; @@ -949,6 +954,8 @@ static void __mdss_mdp_perf_calc_ctl_helper(struct mdss_mdp_ctl *ctl, bitmap_or(perf->bw_vote_mode, perf->bw_vote_mode, tmp.bw_vote_mode, MDSS_MDP_BW_MODE_MAX); + perf->max_per_pipe_ib = max(perf->max_per_pipe_ib, + tmp.max_per_pipe_ib); perf->bw_overlap += tmp.bw_overlap; perf->prefill_bytes += tmp.prefill_bytes; perf->bw_writeback += tmp.bw_writeback; @@ -1267,6 +1274,9 @@ 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) { bw_sum_of_intfs += ctl->cur_perf.bw_writeback; continue; @@ -1288,8 +1298,16 @@ static void mdss_mdp_ctl_update_client_vote(struct mdss_data_type *mdata, { u64 bus_ab_quota, bus_ib_quota; - bw_vote = max(bw_vote, mdata->perf_tune.min_bus_vote); - bus_ib_quota = bw_vote; + bus_ab_quota = max(bw_vote, mdata->perf_tune.min_bus_vote); + + if (test_bit(MDSS_QOS_PER_PIPE_IB, mdata->mdss_qos_map)) { + if (!nrt_client) + bus_ib_quota = perf->max_per_pipe_ib; + else + bus_ib_quota = 0; + } else { + bus_ib_quota = bw_vote; + } if (test_bit(MDSS_MDP_BW_MODE_SINGLE_LAYER, perf->bw_vote_mode) && @@ -1301,7 +1319,12 @@ static void mdss_mdp_ctl_update_client_vote(struct mdss_data_type *mdata, &ib_factor_vscaling); } - bus_ab_quota = apply_fudge_factor(bw_vote, &mdss_res->ab_factor); + if (test_bit(MDSS_QOS_PER_PIPE_IB, mdata->mdss_qos_map) && + !nrt_client) + apply_fudge_factor(bus_ib_quota, + &mdata->per_pipe_ib_factor); + + bus_ab_quota = apply_fudge_factor(bus_ab_quota, &mdss_res->ab_factor); ATRACE_INT("bus_quota", bus_ib_quota); mdss_bus_scale_set_quota(nrt_client ? MDSS_MDP_NRT : MDSS_MDP_RT, @@ -1314,7 +1337,7 @@ static void mdss_mdp_ctl_perf_update_bus(struct mdss_data_type *mdata, struct mdss_mdp_ctl *ctl, u32 mdp_clk) { u64 bw_sum_of_rt_intfs = 0, bw_sum_of_nrt_intfs = 0; - struct mdss_mdp_perf_params perf; + struct mdss_mdp_perf_params perf = {0}; ATRACE_BEGIN(__func__); @@ -1503,6 +1526,7 @@ static void mdss_mdp_ctl_perf_update(struct mdss_mdp_ctl *ctl, 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; bitmap_copy(old->bw_vote_mode, new->bw_vote_mode, MDSS_MDP_BW_MODE_MAX); update_bus = 1;