diff options
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp.c | 6 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp.h | 2 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_ctl.c | 19 |
3 files changed, 18 insertions, 9 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp.c b/drivers/video/fbdev/msm/mdss_mdp.c index a8e32c051d27..8b27bc4f6533 100644 --- a/drivers/video/fbdev/msm/mdss_mdp.c +++ b/drivers/video/fbdev/msm/mdss_mdp.c @@ -292,7 +292,7 @@ static void mdss_mdp_bus_scale_unregister(struct mdss_data_type *mdata) msm_bus_scale_unregister_client(mdata->bus_hdl); } -int mdss_mdp_bus_scale_set_quota(u32 ab_quota, u32 ib_quota) +int mdss_mdp_bus_scale_set_quota(u64 ab_quota, u64 ib_quota) { static int current_bus_idx; int bus_idx; @@ -310,6 +310,10 @@ int mdss_mdp_bus_scale_set_quota(u32 ab_quota, u32 ib_quota) bus_idx = (current_bus_idx % (num_cases - 1)) + 1; + /* aligning to avoid performing updates for small changes */ + ab_quota = ALIGN(ab_quota, SZ_64M); + ib_quota = ALIGN(ib_quota, SZ_64M); + vect = mdp_bus_scale_table.usecase[current_bus_idx].vectors; if ((ab_quota == vect->ab) && (ib_quota == vect->ib)) { pr_debug("skip bus scaling, no change in vectors\n"); diff --git a/drivers/video/fbdev/msm/mdss_mdp.h b/drivers/video/fbdev/msm/mdss_mdp.h index a5fc0200e5db..33a72860bc27 100644 --- a/drivers/video/fbdev/msm/mdss_mdp.h +++ b/drivers/video/fbdev/msm/mdss_mdp.h @@ -276,7 +276,7 @@ void mdss_mdp_irq_disable_nosync(u32 intr_type, u32 intf_num); int mdss_mdp_set_intr_callback(u32 intr_type, u32 intf_num, void (*fnc_ptr)(void *), void *arg); -int mdss_mdp_bus_scale_set_quota(u32 ab_quota, u32 ib_quota); +int mdss_mdp_bus_scale_set_quota(u64 ab_quota, u64 ib_quota); void mdss_mdp_set_clk_rate(unsigned long min_clk_rate); unsigned long mdss_mdp_get_clk_rate(u32 clk_idx); int mdss_mdp_vsync_clk_enable(int enable); diff --git a/drivers/video/fbdev/msm/mdss_mdp_ctl.c b/drivers/video/fbdev/msm/mdss_mdp_ctl.c index d68e6ac27de5..a793c2c2126c 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_ctl.c +++ b/drivers/video/fbdev/msm/mdss_mdp_ctl.c @@ -20,8 +20,10 @@ #include "mdss_fb.h" #include "mdss_mdp.h" +/* truncate at 1k */ +#define MDSS_MDP_BUS_FACTOR_SHIFT 10 /* 1.5 bus fudge factor */ -#define MDSS_MDP_BUS_FUDGE_FACTOR(val) ALIGN((((val) * 3) / 2), SZ_16M) +#define MDSS_MDP_BUS_FUDGE_FACTOR(val) (((val) / 2) * 3) /* 1.25 clock fudge factor */ #define MDSS_MDP_CLK_FUDGE_FACTOR(val) (((val) * 5) / 4) @@ -44,7 +46,7 @@ static int mdss_mdp_ctl_perf_commit(u32 flags) struct mdss_mdp_ctl *ctl; int cnum; unsigned long clk_rate = 0; - u32 bus_ab_quota = 0, bus_ib_quota = 0; + u64 bus_ab_quota = 0, bus_ib_quota = 0; if (!flags) { pr_err("nothing to update\n"); @@ -63,7 +65,9 @@ static int mdss_mdp_ctl_perf_commit(u32 flags) } } if (flags & MDSS_MDP_PERF_UPDATE_BUS) { + bus_ab_quota = bus_ab_quota << MDSS_MDP_BUS_FACTOR_SHIFT; bus_ib_quota = MDSS_MDP_BUS_FUDGE_FACTOR(bus_ib_quota); + bus_ib_quota <<= MDSS_MDP_BUS_FACTOR_SHIFT; mdss_mdp_bus_scale_set_quota(bus_ab_quota, bus_ib_quota); } if (flags & MDSS_MDP_PERF_UPDATE_CLK) { @@ -116,6 +120,7 @@ static void mdss_mdp_perf_mixer_update(struct mdss_mdp_mixer *mixer, if (is_writeback) { /* perf for bus writeback */ *bus_ab_quota = fps * mixer->width * mixer->height * 3; + *bus_ab_quota >>= MDSS_MDP_BUS_FACTOR_SHIFT; *bus_ib_quota = *bus_ab_quota; } } @@ -148,13 +153,13 @@ static void mdss_mdp_perf_mixer_update(struct mdss_mdp_mixer *mixer, if (mixer->rotator_mode) rate /= 4; /* block mode fetch at 4 pix/clk */ - *bus_ab_quota += quota; - *bus_ib_quota += ib_quota; - if (rate > *clk_rate) - *clk_rate = rate; - pr_debug("mixer=%d pnum=%d clk_rate=%u bus ab=%u ib=%u\n", mixer->num, pipe->num, rate, quota, ib_quota); + + *bus_ab_quota += quota >> MDSS_MDP_BUS_FACTOR_SHIFT; + *bus_ib_quota += ib_quota >> MDSS_MDP_BUS_FACTOR_SHIFT; + if (rate > *clk_rate) + *clk_rate = rate; } pr_debug("final mixer=%d clk_rate=%u bus ab=%u ib=%u\n", mixer->num, |
