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

Commit 12faedab authored by Vishnuvardhan Prodduturi's avatar Vishnuvardhan Prodduturi
Browse files

msm: mdss: Add support for different voting on RT/NRT AXI Ports



In 8939, MDSS has two AXI Ports one for real time client and the other
for non-real time clients. Bandwidth required on each of the port changes
according to the use case which necessitates the voting to separate on two
different ports. Separate vote is calculated for RT clients and NRT clients
which will be voted on respective ports.

Change-Id: If3d3d670c19a03d5d9659db6e3630a2958744f07
Signed-off-by: default avatarVishnuvardhan Prodduturi <vproddut@codeaurora.org>
parent e92aa60f
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -242,7 +242,8 @@ struct mdss_data_type {
	u32 latency_buff_per;
	atomic_t active_intf_cnt;

	u64 ab[MDSS_MAX_HW_BLK];
	u64 ab_rt[MDSS_MAX_HW_BLK];
	u64 ab_nrt[MDSS_MAX_HW_BLK];
	u64 ib[MDSS_MAX_HW_BLK];
};
extern struct mdss_data_type *mdss_res;
@@ -259,7 +260,8 @@ 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);
int mdss_bus_scale_set_quota(int client, u64 ab_quota_rt, u64 ab_quota_nrt,
		u64 ib_quota);

static inline struct ion_client *mdss_get_ionclient(void)
{
+2 −2
Original line number Diff line number Diff line
@@ -1351,7 +1351,7 @@ 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_scale_set_quota(MDSS_HW_DSI0, SZ_1M, SZ_1M);
	mdss_bus_scale_set_quota(MDSS_HW_DSI0, SZ_1M, 0, 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);
@@ -1368,7 +1368,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_scale_set_quota(MDSS_HW_DSI0, 0, 0);
	mdss_bus_scale_set_quota(MDSS_HW_DSI0, 0, 0, 0);
need_lock:

	MDSS_XLOG(ctrl->ndx, from_mdp, ctrl->mdp_busy, current->pid,
+25 −13
Original line number Diff line number Diff line
@@ -424,7 +424,7 @@ static int mdss_mdp_bus_scale_register(struct mdss_data_type *mdata)
					mdata->reg_bus_hdl);
	}

	return mdss_bus_scale_set_quota(MDSS_HW_MDP, AB_QUOTA, IB_QUOTA);
	return mdss_bus_scale_set_quota(MDSS_HW_MDP, AB_QUOTA, 0, IB_QUOTA);
}

static void mdss_mdp_bus_scale_unregister(struct mdss_data_type *mdata)
@@ -442,16 +442,18 @@ static void mdss_mdp_bus_scale_unregister(struct mdss_data_type *mdata)
	}
}

int mdss_mdp_bus_scale_set_quota(u64 ab_quota, u64 ib_quota)
int mdss_mdp_bus_scale_set_quota(u64 ab_quota_rt, u64 ab_quota_nrt,
		u64 ib_quota)
{
	int new_uc_idx;
	u64 ab_quota[2];

	if (mdss_res->bus_hdl < 1) {
		pr_err("invalid bus handle %d\n", mdss_res->bus_hdl);
		return -EINVAL;
	}

	if ((ab_quota | ib_quota) == 0) {
	if (((ab_quota_rt + ab_quota_nrt) || ib_quota) == 0) {
		new_uc_idx = 0;
	} else {
		int i;
@@ -466,8 +468,15 @@ int mdss_mdp_bus_scale_set_quota(u64 ab_quota, u64 ib_quota)
		}

		size = SZ_64M / mdss_res->axi_port_cnt;

		ab_quota = div_u64(ab_quota, mdss_res->axi_port_cnt);
		if (mdss_res->has_fixed_qos_arbiter_enabled &&
				mdss_res->axi_port_cnt > 1) {
			ab_quota[0] = ab_quota_rt;
			ab_quota[1] = ab_quota_nrt;
		} else {
			ab_quota[0] = div_u64(ab_quota_rt + ab_quota_nrt,
					mdss_res->axi_port_cnt);
			ab_quota[1] = ab_quota[0];
		}

		new_uc_idx = (mdss_res->curr_bw_uc_idx %
			(bw_table->num_usecases - 1)) + 1;
@@ -477,14 +486,14 @@ int mdss_mdp_bus_scale_set_quota(u64 ab_quota, u64 ib_quota)
				vectors[i];

			/* avoid performing updates for small changes */
			if ((ALIGN(ab_quota, size) == ALIGN(vect->ab, size)) &&
			    (ALIGN(ib_quota, size) == ALIGN(vect->ib, size))) {
			if ((ALIGN(ab_quota[i], size) == ALIGN(vect->ab, size))
			&& (ALIGN(ib_quota, size) == ALIGN(vect->ib, size))) {
				pr_debug("skip bus scaling, no changes\n");
				return 0;
			}

			vect = &bw_table->usecase[new_uc_idx].vectors[i];
			vect->ab = ab_quota;
			vect->ab = ab_quota[i];
			vect->ib = ib_quota;

			pr_debug("uc_idx=%d path_idx=%d ab=%llu ib=%llu\n",
@@ -497,23 +506,26 @@ 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 mdss_bus_scale_set_quota(int client, u64 ab_quota_rt, u64 ab_quota_nrt,
		u64 ib_quota)
{
	int rc = 0;
	int i;
	u64 total_ab = 0;
	u64 total_ab_rt = 0, total_ab_nrt = 0;
	u64 total_ib = 0;

	mutex_lock(&bus_bw_lock);

	mdss_res->ab[client] = ab_quota;
	mdss_res->ab_rt[client] = ab_quota_rt;
	mdss_res->ab_nrt[client] = ab_quota_nrt;
	mdss_res->ib[client] = ib_quota;
	for (i = 0; i < MDSS_MAX_HW_BLK; i++) {
		total_ab += mdss_res->ab[i];
		total_ab_rt += mdss_res->ab_rt[i];
		total_ab_nrt += mdss_res->ab_nrt[i];
		total_ib = max(total_ib, mdss_res->ib[i]);
	}

	rc = mdss_mdp_bus_scale_set_quota(total_ab, total_ib);
	rc = mdss_mdp_bus_scale_set_quota(total_ab_rt, total_ab_nrt, total_ib);

	mutex_unlock(&bus_bw_lock);

+2 −1
Original line number Diff line number Diff line
@@ -670,7 +670,8 @@ int mdss_mdp_set_intr_callback(u32 intr_type, u32 intf_num,

void mdss_mdp_footswitch_ctrl_splash(int on);
void mdss_mdp_batfet_ctrl(struct mdss_data_type *mdata, int enable);
int mdss_mdp_bus_scale_set_quota(u64 ab_quota, u64 ib_quota);
int mdss_mdp_bus_scale_set_quota(u64 ab_quota_rt, u64 ab_quota_nrt,
				u64 ib_quota);
void mdss_mdp_set_clk_rate(unsigned long min_clk_rate);
unsigned long mdss_mdp_get_clk_rate(u32 clk_idx);
int mdss_mdp_vsync_clk_enable(int enable);
+22 −8
Original line number Diff line number Diff line
@@ -1083,13 +1083,14 @@ static void mdss_mdp_ctl_perf_update_traffic_shaper_bw(struct mdss_mdp_ctl *ctl,
static inline void mdss_mdp_ctl_perf_update_bus(struct mdss_data_type *mdata,
		u32 mdp_clk)
{
	u64 bw_sum_of_intfs = 0;
	u64 bus_ab_quota, bus_ib_quota;
	u64 bw_sum_of_intfs_rt = 0, bw_sum_of_intfs_nrt = 0;
	u64 bus_ab_quota_rt, bus_ab_quota_nrt, bus_ib_quota;
	int i;

	ATRACE_BEGIN(__func__);
	for (i = 0; i < mdata->nctl; i++) {
		struct mdss_mdp_ctl *ctl;
		struct mdss_mdp_mixer *mixer;
		ctl = mdata->ctl_off + i;
		if (ctl->power_on) {
			/*
@@ -1099,18 +1100,31 @@ static inline void mdss_mdp_ctl_perf_update_bus(struct mdss_data_type *mdata,
			if (ctl->traffic_shaper_enabled)
				mdss_mdp_ctl_perf_update_traffic_shaper_bw
					(ctl, mdp_clk);
			bw_sum_of_intfs += ctl->cur_perf.bw_ctl;
			mixer = ctl->mixer_left;
			if (ctl->intf_num ==  MDSS_MDP_NO_INTF ||
					mixer->rotator_mode)
				bw_sum_of_intfs_nrt += ctl->cur_perf.bw_ctl;
			else
				bw_sum_of_intfs_rt += ctl->cur_perf.bw_ctl;

			pr_debug("ctl_num=%d bw=%llu\n", ctl->num,
				ctl->cur_perf.bw_ctl);
		}
	}
	bus_ib_quota = max(bw_sum_of_intfs, mdata->perf_tune.min_bus_vote);
	bus_ab_quota = apply_fudge_factor(bus_ib_quota,
	bw_sum_of_intfs_rt = max(bw_sum_of_intfs_rt,
			mdata->perf_tune.min_bus_vote);
	bus_ib_quota = bw_sum_of_intfs_rt + bw_sum_of_intfs_nrt;
	bus_ab_quota_rt = apply_fudge_factor(bw_sum_of_intfs_rt,
		&mdss_res->ab_factor);
	bus_ab_quota_nrt = apply_fudge_factor(bw_sum_of_intfs_nrt,
		&mdss_res->ab_factor);
	trace_mdp_perf_update_bus(bus_ab_quota, bus_ib_quota);
	trace_mdp_perf_update_bus(bus_ab_quota_rt, bus_ab_quota_nrt
			, bus_ib_quota);
	ATRACE_INT("bus_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);
	mdss_bus_scale_set_quota(MDSS_HW_MDP, bus_ab_quota_rt, bus_ab_quota_nrt
			, bus_ib_quota);
	pr_debug("ab_rt=%llu ab_nrt=%llu ib=%llu\n",
			bus_ab_quota_rt, bus_ab_quota_nrt, bus_ib_quota);
	ATRACE_END(__func__);
}

Loading