summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorIngrid Gallardo <ingridg@codeaurora.org>2015-02-02 11:13:07 -0800
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 20:38:27 -0700
commit30a4e6891cf2147e7a25be2f8eafe1c3348874c3 (patch)
tree8ac697073dca1d6de374fe55526654aa5f30ba9b /drivers
parentc18e5fc4aae23ae15a3855f74b0f763ee7182989 (diff)
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>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/video/fbdev/msm/mdss.h8
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp.c13
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp.h1
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_ctl.c32
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;