From f05732e085fb21f0f96c4f70a0d5bec692a4b4d4 Mon Sep 17 00:00:00 2001 From: Xiaoming Zhou Date: Wed, 4 Jun 2014 17:07:48 -0400 Subject: [PATCH] msm: mdss: distinguish between mdp and dsi bus votes For DSI read or write commands, they will also go through axi bus. Earlier, we were only voting for the mdp bus bandwidth. In the case where the mdp bus bandwidth vote is 0 and there is a DSI transaction, it will result in DSI hang. Change-Id: Iafd9e06ae2050665392c6c74fece8f20cb6d44b1 Signed-off-by: Xiaoming Zhou --- drivers/video/fbdev/msm/mdss.h | 22 +++++++++++++--------- drivers/video/fbdev/msm/mdss_dsi_host.c | 6 +++--- drivers/video/fbdev/msm/mdss_mdp.c | 25 ++++++++++++++++++++++++- drivers/video/fbdev/msm/mdss_mdp_ctl.c | 2 +- 4 files changed, 41 insertions(+), 14 deletions(-) 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__); }