Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 63f6ff9c authored by Xiaoming Zhou's avatar Xiaoming Zhou
Browse files

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: default avatarXiaoming Zhou <zhoux@codeaurora.org>
parent e388465c
Loading
Loading
Loading
Loading
+13 −9
Original line number Diff line number Diff line
@@ -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,17 +226,11 @@ struct mdss_data_type {
	struct mdss_perf_tune perf_tune;
	bool traffic_shaper_en;
	int iommu_ref_cnt;
};
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
	u64 ab[MDSS_MAX_HW_BLK];
	u64 ib[MDSS_MAX_HW_BLK];
};
extern struct mdss_data_type *mdss_res;

struct mdss_hw {
	u32 hw_ndx;
@@ -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)
{
+3 −3
Original line number Diff line number Diff line
@@ -1344,7 +1344,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);

@@ -1360,8 +1361,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:

	if (from_mdp) { /* from pipe_commit */
+24 −1
Original line number Diff line number Diff line
@@ -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 ||
+1 −1
Original line number Diff line number Diff line
@@ -1002,7 +1002,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__);
}