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 <zhoux@codeaurora.org>
This commit is contained in:
parent
882651e495
commit
f05732e085
4 changed files with 41 additions and 14 deletions
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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 ||
|
||||
|
|
|
@ -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__);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue