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:
parent
c18e5fc4aa
commit
30a4e6891c
4 changed files with 49 additions and 5 deletions
|
@ -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;
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue