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

Commit 52f2a0da authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

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

parents 6fd61d70 12faedab
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