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

Commit 3df8f4b7 authored by Kyle Yan's avatar Kyle Yan Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: sde: add minimum bus vote prior to power/clock enable" into msm-4.9

parents d09b7ac4 30ab1ce2
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -96,6 +96,7 @@ enum sde_rot_type {
 * @SDE_CAPS_R1_WB: MDSS V1.x WB block
 * @SDE_CAPS_R3_WB: MDSS V3.x WB block
 * @SDE_CAPS_R3_1P5_DOWNSCALE: 1.5x downscale rotator support
 * @SDE_CAPS_MIN_BUS_VOTE: minimum bus vote prior to power enable
 * @SDE_CAPS_SBUF_1: stream buffer support for inline rotation
 */
enum sde_caps_settings {
@@ -103,6 +104,7 @@ enum sde_caps_settings {
	SDE_CAPS_R3_WB,
	SDE_CAPS_R3_1P5_DOWNSCALE,
	SDE_CAPS_SEC_ATTACH_DETACH_SMMU,
	SDE_CAPS_MIN_BUS_VOTE,
	SDE_CAPS_SBUF_1,
	SDE_CAPS_MAX,
};
+19 −0
Original line number Diff line number Diff line
@@ -67,6 +67,8 @@
#define ROT_OVERHEAD_NUMERATOR		27
#define ROT_OVERHEAD_DENOMINATOR	10000

/* default minimum bandwidth vote */
#define ROT_ENABLE_BW_VOTE		64000
/*
 * Max rotator hw blocks possible. Used for upper array limits instead of
 * alloc and freeing small array
@@ -96,6 +98,9 @@ static struct msm_bus_scale_pdata rot_reg_bus_scale_table = {
	.active_only = 1,
};

/* forward prototype */
static int sde_rotator_update_perf(struct sde_rot_mgr *mgr);

static int sde_rotator_bus_scale_set_quota(struct sde_rot_bus_data_type *bus,
		u64 quota)
{
@@ -292,6 +297,7 @@ static int sde_rotator_update_clk(struct sde_rot_mgr *mgr)

static void sde_rotator_footswitch_ctrl(struct sde_rot_mgr *mgr, bool on)
{
	struct sde_rot_data_type *mdata = sde_rot_get_mdata();
	int ret;

	if (WARN_ON(mgr->regulator_enable == on)) {
@@ -302,6 +308,11 @@ static void sde_rotator_footswitch_ctrl(struct sde_rot_mgr *mgr, bool on)
	SDEROT_EVTLOG(on);
	SDEROT_DBG("%s: rotator regulators\n", on ? "Enable" : "Disable");

	if (test_bit(SDE_CAPS_MIN_BUS_VOTE, mdata->sde_caps_map) && on) {
		mgr->minimum_bw_vote = mgr->enable_bw_vote;
		sde_rotator_update_perf(mgr);
	}

	if (mgr->ops_hw_pre_pmevent)
		mgr->ops_hw_pre_pmevent(mgr, on);

@@ -316,6 +327,11 @@ static void sde_rotator_footswitch_ctrl(struct sde_rot_mgr *mgr, bool on)
	if (mgr->ops_hw_post_pmevent)
		mgr->ops_hw_post_pmevent(mgr, on);

	if (test_bit(SDE_CAPS_MIN_BUS_VOTE, mdata->sde_caps_map) && !on) {
		mgr->minimum_bw_vote = 0;
		sde_rotator_update_perf(mgr);
	}

	mgr->regulator_enable = on;
}

@@ -1323,6 +1339,7 @@ static int sde_rotator_update_perf(struct sde_rot_mgr *mgr)
	}

	total_bw += mgr->pending_close_bw_vote;
	total_bw = max_t(u64, total_bw, mgr->minimum_bw_vote);
	sde_rotator_enable_reg_bus(mgr, total_bw);
	ATRACE_INT("bus_quota", total_bw);
	sde_rotator_bus_scale_set_quota(&mgr->data_bus, total_bw);
@@ -2794,6 +2811,7 @@ int sde_rotator_core_init(struct sde_rot_mgr **pmgr,
	mgr->pdev = pdev;
	mgr->device = &pdev->dev;
	mgr->pending_close_bw_vote = 0;
	mgr->enable_bw_vote = ROT_ENABLE_BW_VOTE;
	mgr->hwacquire_timeout = ROT_HW_ACQUIRE_TIMEOUT_IN_MS;
	mgr->queue_count = 1;
	mgr->pixel_per_clk.numer = ROT_PIXEL_PER_CLK_NUMERATOR;
@@ -3013,6 +3031,7 @@ int sde_rotator_pm_suspend(struct device *dev)
	sde_rot_mgr_lock(mgr);
	atomic_inc(&mgr->device_suspended);
	sde_rotator_suspend_cancel_rot_work(mgr);
	mgr->minimum_bw_vote = 0;
	sde_rotator_update_perf(mgr);
	ATRACE_END("pm_active");
	SDEROT_DBG("end pm active %d\n", atomic_read(&mgr->device_suspended));
+4 −0
Original line number Diff line number Diff line
@@ -367,6 +367,8 @@ struct sde_rot_bus_data_type {
 * @doneq: array of rotator done queue corresponding to hardware queue
 * @file_list: list of all sessions managed by rotator manager
 * @pending_close_bw_vote: bandwidth of closed sessions with pending work
 * @minimum_bw_vote: minimum bandwidth required for current use case
 * @enable_bw_vote: minimum bandwidth required for power enable
 * @data_bus: data bus configuration state
 * @reg_bus: register bus configuration state
 * @module_power: power/clock configuration state
@@ -406,6 +408,8 @@ struct sde_rot_mgr {
	struct list_head file_list;

	u64 pending_close_bw_vote;
	u64 minimum_bw_vote;
	u64 enable_bw_vote;
	struct sde_rot_bus_data_type data_bus;
	struct sde_rot_bus_data_type reg_bus;

+6 −0
Original line number Diff line number Diff line
@@ -868,6 +868,12 @@ static int sde_rotator_core_create_debugfs(
		return -EINVAL;
	}

	if (!debugfs_create_u64("enable_bw_vote", 0644,
			debugfs_root, &mgr->enable_bw_vote)) {
		SDEROT_WARN("failed to create enable_bw_vote\n");
		return -EINVAL;
	}

	if (mgr->ops_hw_create_debugfs) {
		ret = mgr->ops_hw_create_debugfs(mgr, debugfs_root);
		if (ret)
+1 −0
Original line number Diff line number Diff line
@@ -2210,6 +2210,7 @@ static int sde_rotator_hw_rev_init(struct sde_hw_rotator *rot)
	/* features exposed via mdss h/w version */
	if (IS_SDE_MAJOR_MINOR_SAME(mdata->mdss_version, SDE_MDP_HW_REV_400)) {
		SDEROT_DBG("Supporting sys cache inline rotation\n");
		set_bit(SDE_CAPS_MIN_BUS_VOTE,  mdata->sde_caps_map);
		set_bit(SDE_CAPS_SBUF_1,  mdata->sde_caps_map);
		rot->inpixfmts = sde_hw_rotator_v4_inpixfmts;
		rot->num_inpixfmt = ARRAY_SIZE(sde_hw_rotator_v4_inpixfmts);