diff --git a/drivers/video/fbdev/msm/mdss.h b/drivers/video/fbdev/msm/mdss.h index 5303cdb10e0a..1f6bd03f2189 100644 --- a/drivers/video/fbdev/msm/mdss.h +++ b/drivers/video/fbdev/msm/mdss.h @@ -99,6 +99,15 @@ struct mdss_prefill_data { u32 fbc_lines; }; +enum mdss_hw_index { + MDSS_HW_MDP, + MDSS_HW_DSI0, + MDSS_HW_DSI1, + MDSS_HW_HDMI, + MDSS_HW_EDP, + MDSS_MAX_HW_BLK +}; + struct mdss_data_type { u32 mdp_rev; struct clk *mdp_clk[MDSS_MAX_CLK]; @@ -217,18 +226,12 @@ struct mdss_data_type { struct mdss_perf_tune perf_tune; bool traffic_shaper_en; int iommu_ref_cnt; + + u64 ab[MDSS_MAX_HW_BLK]; + u64 ib[MDSS_MAX_HW_BLK]; }; extern struct mdss_data_type *mdss_res; -enum mdss_hw_index { - MDSS_HW_MDP, - MDSS_HW_DSI0, - MDSS_HW_DSI1, - MDSS_HW_HDMI, - MDSS_HW_EDP, - MDSS_MAX_HW_BLK -}; - struct mdss_hw { u32 hw_ndx; void *ptr; @@ -241,6 +244,7 @@ void mdss_disable_irq(struct mdss_hw *hw); void mdss_disable_irq_nosync(struct mdss_hw *hw); void mdss_bus_bandwidth_ctrl(int enable); int mdss_iommu_ctrl(int enable); +int mdss_bus_scale_set_quota(int client, u64 ab_quota, u64 ib_quota); static inline struct ion_client *mdss_get_ionclient(void) { diff --git a/drivers/video/fbdev/msm/mdss_dsi_host.c b/drivers/video/fbdev/msm/mdss_dsi_host.c index c9c76cbcc22a..27ac95f60ea4 100644 --- a/drivers/video/fbdev/msm/mdss_dsi_host.c +++ b/drivers/video/fbdev/msm/mdss_dsi_host.c @@ -1345,7 +1345,8 @@ int mdss_dsi_cmdlist_commit(struct mdss_dsi_ctrl_pdata *ctrl, int from_mdp) * also, axi bus bandwidth need since dsi controller will * fetch dcs commands from axi bus */ - mdss_bus_bandwidth_ctrl(1); + mdss_bus_scale_set_quota(MDSS_HW_DSI0, SZ_1M, SZ_1M); + pr_debug("%s: from_mdp=%d pid=%d\n", __func__, from_mdp, current->pid); mdss_dsi_clk_ctrl(ctrl, DSI_ALL_CLKS, 1); @@ -1361,8 +1362,7 @@ int mdss_dsi_cmdlist_commit(struct mdss_dsi_ctrl_pdata *ctrl, int from_mdp) ret = mdss_dsi_cmdlist_tx(ctrl, req); mdss_iommu_ctrl(0); mdss_dsi_clk_ctrl(ctrl, DSI_ALL_CLKS, 0); - mdss_bus_bandwidth_ctrl(0); - + mdss_bus_scale_set_quota(MDSS_HW_DSI0, 0, 0); need_lock: MDSS_XLOG(ctrl->ndx, from_mdp, ctrl->mdp_busy, current->pid, diff --git a/drivers/video/fbdev/msm/mdss_mdp.c b/drivers/video/fbdev/msm/mdss_mdp.c index 02c190896fcb..4600bb057a21 100644 --- a/drivers/video/fbdev/msm/mdss_mdp.c +++ b/drivers/video/fbdev/msm/mdss_mdp.c @@ -419,7 +419,7 @@ static int mdss_mdp_bus_scale_register(struct mdss_data_type *mdata) mdata->reg_bus_hdl); } - return mdss_mdp_bus_scale_set_quota(AB_QUOTA, IB_QUOTA); + return mdss_bus_scale_set_quota(MDSS_HW_MDP, AB_QUOTA, IB_QUOTA); } static void mdss_mdp_bus_scale_unregister(struct mdss_data_type *mdata) @@ -492,6 +492,29 @@ int mdss_mdp_bus_scale_set_quota(u64 ab_quota, u64 ib_quota) new_uc_idx); } +int mdss_bus_scale_set_quota(int client, u64 ab_quota, u64 ib_quota) +{ + int rc = 0; + int i; + u64 total_ab = 0; + u64 total_ib = 0; + + mutex_lock(&bus_bw_lock); + + mdss_res->ab[client] = ab_quota; + mdss_res->ib[client] = ib_quota; + for (i = 0; i < MDSS_MAX_HW_BLK; i++) { + total_ab += mdss_res->ab[i]; + total_ib = max(total_ib, mdss_res->ib[i]); + } + + rc = mdss_mdp_bus_scale_set_quota(total_ab, total_ib); + + mutex_unlock(&bus_bw_lock); + + return rc; +} + static inline u32 mdss_mdp_irq_mask(u32 intr_type, u32 intf_num) { if (intr_type == MDSS_MDP_IRQ_INTF_UNDER_RUN || diff --git a/drivers/video/fbdev/msm/mdss_mdp_ctl.c b/drivers/video/fbdev/msm/mdss_mdp_ctl.c index 1971c2217ea8..44f5d119b89d 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_ctl.c +++ b/drivers/video/fbdev/msm/mdss_mdp_ctl.c @@ -996,7 +996,7 @@ static inline void mdss_mdp_ctl_perf_update_bus(struct mdss_data_type *mdata, &mdss_res->ab_factor); trace_mdp_perf_update_bus(bus_ab_quota, bus_ib_quota); ATRACE_INT("bus_quota", bus_ib_quota); - mdss_mdp_bus_scale_set_quota(bus_ab_quota, bus_ib_quota); + mdss_bus_scale_set_quota(MDSS_HW_MDP, bus_ab_quota, bus_ib_quota); pr_debug("ab=%llu ib=%llu\n", bus_ab_quota, bus_ib_quota); ATRACE_END(__func__); }