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 <ingridg@codeaurora.org>
This commit is contained in:
Ingrid Gallardo 2015-02-02 11:13:07 -08:00 committed by David Keitel
parent c18e5fc4aa
commit 30a4e6891c
4 changed files with 49 additions and 5 deletions

View file

@ -147,6 +147,11 @@ enum mdss_hw_quirk {
MDSS_QUIRK_MAX, MDSS_QUIRK_MAX,
}; };
enum mdss_qos_settings {
MDSS_QOS_PER_PIPE_IB,
MDSS_QOS_MAX,
};
struct mdss_smmu_client { struct mdss_smmu_client {
struct device *dev; struct device *dev;
struct dma_iommu_mapping *mmu_mapping; struct dma_iommu_mapping *mmu_mapping;
@ -214,6 +219,8 @@ struct mdss_data_type {
DECLARE_BITMAP(mdss_quirk_map, MDSS_QUIRK_MAX); DECLARE_BITMAP(mdss_quirk_map, MDSS_QUIRK_MAX);
/* bitmap to track total mmbs in use */ /* bitmap to track total mmbs in use */
DECLARE_BITMAP(mmb_alloc_map, MAX_DRV_SUP_MMB_BLKS); 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; u32 has_bwc;
/* values used when HW has a common panic/robust LUT */ /* 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;
struct mdss_fudge_factor ib_factor_overlap; struct mdss_fudge_factor ib_factor_overlap;
struct mdss_fudge_factor clk_factor; struct mdss_fudge_factor clk_factor;
struct mdss_fudge_factor per_pipe_ib_factor;
u32 disable_prefill; u32 disable_prefill;
u32 *clock_levels; u32 *clock_levels;

View file

@ -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) 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) { switch (mdata->mdp_rev) {
case MDSS_MDP_HW_REV_105:
case MDSS_MDP_HW_REV_107: 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: case MDSS_MDP_HW_REV_109:
mdss_set_quirk(mdata, MDSS_QUIRK_BWCPANIC); mdss_set_quirk(mdata, MDSS_QUIRK_BWCPANIC);
mdata->max_target_zorder = 7; /* excluding base layer */ mdata->max_target_zorder = 7; /* excluding base layer */

View file

@ -199,6 +199,7 @@ struct mdss_mdp_perf_params {
u64 bw_overlap; u64 bw_overlap;
u64 bw_writeback; u64 bw_writeback;
u64 bw_prefill; u64 bw_prefill;
u64 max_per_pipe_ib;
u32 prefill_bytes; u32 prefill_bytes;
u64 bw_ctl; u64 bw_ctl;
u32 mdp_clk_rate; u32 mdp_clk_rate;

View file

@ -798,6 +798,10 @@ static void mdss_mdp_perf_calc_mixer(struct mdss_mdp_mixer *mixer,
flags)) flags))
continue; 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, bitmap_or(perf->bw_vote_mode, perf->bw_vote_mode,
tmp.bw_vote_mode, MDSS_MDP_BW_MODE_MAX); 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, bitmap_or(perf->bw_vote_mode, perf->bw_vote_mode,
tmp.bw_vote_mode, MDSS_MDP_BW_MODE_MAX); 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->bw_overlap += tmp.bw_overlap;
perf->prefill_bytes += tmp.prefill_bytes; perf->prefill_bytes += tmp.prefill_bytes;
perf->mdp_clk_rate = tmp.mdp_clk_rate; 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, bitmap_or(perf->bw_vote_mode, perf->bw_vote_mode,
tmp.bw_vote_mode, MDSS_MDP_BW_MODE_MAX); 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->bw_overlap += tmp.bw_overlap;
perf->prefill_bytes += tmp.prefill_bytes; perf->prefill_bytes += tmp.prefill_bytes;
perf->bw_writeback += tmp.bw_writeback; 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, ctl->cur_perf.bw_vote_mode,
MDSS_MDP_BW_MODE_MAX); 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->intf_num == MDSS_MDP_NO_INTF) {
bw_sum_of_intfs += ctl->cur_perf.bw_writeback; bw_sum_of_intfs += ctl->cur_perf.bw_writeback;
continue; 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; u64 bus_ab_quota, bus_ib_quota;
bw_vote = max(bw_vote, mdata->perf_tune.min_bus_vote); bus_ab_quota = max(bw_vote, mdata->perf_tune.min_bus_vote);
bus_ib_quota = bw_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, if (test_bit(MDSS_MDP_BW_MODE_SINGLE_LAYER,
perf->bw_vote_mode) && perf->bw_vote_mode) &&
@ -1301,7 +1319,12 @@ static void mdss_mdp_ctl_update_client_vote(struct mdss_data_type *mdata,
&ib_factor_vscaling); &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); ATRACE_INT("bus_quota", bus_ib_quota);
mdss_bus_scale_set_quota(nrt_client ? MDSS_MDP_NRT : MDSS_MDP_RT, 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) struct mdss_mdp_ctl *ctl, u32 mdp_clk)
{ {
u64 bw_sum_of_rt_intfs = 0, bw_sum_of_nrt_intfs = 0; 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__); 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, ctl->num, params_changed, new->bw_ctl,
old->bw_ctl); old->bw_ctl);
old->bw_ctl = new->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, bitmap_copy(old->bw_vote_mode, new->bw_vote_mode,
MDSS_MDP_BW_MODE_MAX); MDSS_MDP_BW_MODE_MAX);
update_bus = 1; update_bus = 1;