diff options
| author | Shivaraj Shetty <shivaraj@codeaurora.org> | 2014-01-13 17:03:10 +0530 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:26:07 -0700 |
| commit | fba371f77c50aff004badba623057644b01e13a4 (patch) | |
| tree | 3d584bc4c8a3829fe3c546e442d471b18a39d68b /drivers/video/fbdev | |
| parent | 0200b868d3c15e58505fc84151c7561fe36f5d45 (diff) | |
msm: mdss: Finetune ab votes for PPP
Current ab calculation pushed the power numbers very high.
Finentune the calculation and keep ib undisturbed.
Change-Id: Iddfa39a735201a52daae7278f4006fa6f929b19c
Signed-off-by: Shivaraj Shetty <shivaraj@codeaurora.org>
Signed-off-by: Sravan Kumar D.V.N <sravank1@codeaurora.org>
Diffstat (limited to 'drivers/video/fbdev')
| -rw-r--r-- | drivers/video/fbdev/msm/mdp3_ppp.c | 53 |
1 files changed, 50 insertions, 3 deletions
diff --git a/drivers/video/fbdev/msm/mdp3_ppp.c b/drivers/video/fbdev/msm/mdp3_ppp.c index 84d9b715f99c..78746329202c 100644 --- a/drivers/video/fbdev/msm/mdp3_ppp.c +++ b/drivers/video/fbdev/msm/mdp3_ppp.c @@ -101,6 +101,7 @@ struct ppp_status { struct timer_list free_bw_timer; struct work_struct free_bw_work; bool bw_on; + bool bw_optimal; }; static struct ppp_status *ppp_stat; @@ -337,21 +338,54 @@ void mdp3_ppp_kickoff(void) mdp3_irq_disable(MDP3_PPP_DONE); } +int mdp3_ppp_vote_update(struct msm_fb_data_type *mfd) +{ + struct mdss_panel_info *panel_info = mfd->panel_info; + uint64_t req_bw = 0, ab = 0, ib = 0; + int rate = 0; + int rc = 0; + if (!ppp_stat->bw_on) + pr_err("%s: PPP vote update in wrong state\n", __func__); + + rate = MDP_BLIT_CLK_RATE; + req_bw = panel_info->xres * panel_info->yres * + panel_info->mipi.frame_rate * + MDP_PPP_MAX_BPP * + MDP_PPP_DYNAMIC_FACTOR * + MDP_PPP_MAX_READ_WRITE; + ib = (req_bw * 3) / 2; + + if (ppp_stat->bw_optimal) + ab = ib / 2; + else + ab = req_bw; + rc = mdp3_bus_scale_set_quota(MDP3_CLIENT_PPP, ab, ib); + if (rc < 0) { + pr_err("%s: scale_set_quota failed\n", __func__); + return rc; + } + return rc; +} + int mdp3_ppp_turnon(struct msm_fb_data_type *mfd, int on_off) { struct mdss_panel_info *panel_info = mfd->panel_info; - uint64_t ab = 0, ib = 0; + uint64_t req_bw = 0, ab = 0, ib = 0; int rate = 0; int rc; if (on_off) { rate = MDP_BLIT_CLK_RATE; - ab = panel_info->xres * panel_info->yres * + req_bw = panel_info->xres * panel_info->yres * panel_info->mipi.frame_rate * MDP_PPP_MAX_BPP * MDP_PPP_DYNAMIC_FACTOR * MDP_PPP_MAX_READ_WRITE; - ib = (ab * 3) / 2; + ib = (req_bw * 3) / 2; + if (ppp_stat->bw_optimal) + ab = ib / 2; + else + ab = req_bw; } mdp3_clk_set_rate(MDP3_CLK_CORE, rate, MDP3_CLIENT_PPP); rc = mdp3_clk_enable(on_off, 0); @@ -369,6 +403,13 @@ int mdp3_ppp_turnon(struct msm_fb_data_type *mfd, int on_off) return 0; } +bool mdp3_optimal_bw(int req_cnt) +{ + if (req_cnt == 1 && ppp_stat->req_q.count == 1) + return true; + return false; +} + void mdp3_start_ppp(struct ppp_blit_op *blit_op) { /* Wait for the pipe to clear */ @@ -1032,6 +1073,7 @@ static void mdp3_ppp_blit_wq_handler(struct work_struct *work) pr_err("%s: mdp3_iommu_enable failed\n", __func__); return; } + ppp_stat->bw_optimal = mdp3_optimal_bw(req->count); mdp3_ppp_turnon(mfd, 1); if (rc < 0) { mdp3_iommu_disable(MDP3_CLIENT_PPP); @@ -1065,6 +1107,11 @@ static void mdp3_ppp_blit_wq_handler(struct work_struct *work) if (ppp_stat->wait_for_pop) complete(&ppp_stat->pop_q_comp); mutex_unlock(&ppp_stat->req_mutex); + if (req && + (ppp_stat->bw_optimal != mdp3_optimal_bw(req->count))) { + ppp_stat->bw_optimal = !ppp_stat->bw_optimal; + mdp3_ppp_vote_update(mfd); + } } mod_timer(&ppp_stat->free_bw_timer, jiffies + msecs_to_jiffies(MDP_RELEASE_BW_TIMEOUT)); |
