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

Commit c826470a authored by Terence Hampson's avatar Terence Hampson Committed by Matt Wagantall
Browse files

msm: rotator: Rotator resource management



As a part of the effort to separate out rotator from MDP driver
to be its own driver, Rotator will independently vote for
resources it requires.

Change-Id: Ic7f7705852ee29d69e45dd22238f3447646bde4d
Signed-off-by: default avatarTerence Hampson <thampson@codeaurora.org>
parent ce387c55
Loading
Loading
Loading
Loading
+53 −1
Original line number Diff line number Diff line
@@ -7,8 +7,47 @@ Required properties
- compatible :			Must be "qcom,mdss-rotator".
- qcom,mdss-wb-count:		The number of writeback block
				in the hardware
- <name>-supply:		Phandle for <name> regulator device node.

Bus Scaling Data:
- qcom,msm-bus,name:		String property describing MDSS client.
- qcom,msm-bus,num-cases:	This is the the number of Bus Scaling use cases
				defined in the vectors property. This must be
				set to <3> for MDSS driver where use-case 0 is
				used to take off MDSS BW votes from the system.
				And use-case 1 & 2 are used in ping-pong fashion
				to generate run-time BW requests.
- qcom,msm-bus,num-paths:	This represents the number of paths in each
				Bus Scaling Usecase. This value depends on
				how many number of AXI master ports are
				dedicated to MDSS for particular chipset.
- qcom,msm-bus,vectors-KBps:	* A series of 4 cell properties, with a format
				of (src, dst, ab, ib) which is defined at
				Documentation/devicetree/bindings/arm/msm/msm_bus.txt
				* Current values of src & dst are defined at
				include/linux/msm-bus-board.h
				src values allowed for MDSS are:
					22 = MSM_BUS_MASTER_MDP_PORT0
					23 = MSM_BUS_MASTER_MDP_PORT1
					25 = MSM_BUS_MASTER_ROTATOR
				dst values allowed for MDSS are:
					512 = MSM_BUS_SLAVE_EBI_CH0
				ab: Represents aggregated bandwidth.
				ib: Represents instantaneous bandwidth.
				* Total number of 4 cell properties will be
				(number of use-cases * number of paths).
				* These values will be overridden by the driver
				based on the run-time requirements. So initial
				ab and ib values defined here are random and
				bare no logic except for the use-case 0 where ab
				and ib values needs to be 0.
				* Define realtime vector properties followed by
				non-realtime vector properties.

Optional properties
- qcom,mdss-has-reg-bus:	Boolean property to indicate
				if rotator needs to vote for register bus. This
				property is needed starting 8996
- qcom,mdss-has-ubwc:		Boolean property to indicate
				if the hw supports universal
				bandwidth compression (ubwc)
@@ -21,6 +60,19 @@ Example:
		qcom,mdss-has-downscale;
		qcom,mdss-has-ubwc;
		qcom,mdss-wb-count = <2>;
	};

		qcom,mdss-has-reg-bus;
		/* Bus Scale Settings */
		qcom,msm-bus,name = "mdss_rotator";
		qcom,msm-bus,num-cases = <3>;
		qcom,msm-bus,num-paths = <1>;
		qcom,mdss-num-nrt-paths = <1>;
		qcom,msm-bus,vectors-KBps =
			<25 512 0 0>,
			<25 512 0 6400000>,
			<25 512 0 6400000>;

		vdd-supply = <&gdsc_mdss>;
		gdsc-mmagic-mdss-supply = <&gdsc_mmagic_mdss>;
		qcom,supply-names = "vdd", "gdsc-mmagic-mdss";
	};
+21 −4
Original line number Diff line number Diff line
@@ -99,7 +99,7 @@
		clocks = <&clock_mmss clk_mdss_ahb_clk>,
			 <&clock_mmss clk_mdss_axi_clk>,
			 <&clock_mmss clk_mdp_clk_src>,
			 <&clock_mmss clk_mdss_mdp_clk>,
			 <&clock_mmss clk_mdss_mdp_vote_clk>,
			 <&clock_mmss clk_mdss_vsync_clk>,
			 <&clock_mmss clk_mmagic_mdss_axi_clk>;
		clock-names = "iface_clk", "bus_clk", "core_clk_src",
@@ -272,7 +272,7 @@

		qcom,mdss-mdp = <&mdss_mdp>;
		qcom,mdss-fb-map = <&mdss_fb0>;
		clocks = <&clock_mmss clk_mdss_mdp_clk>,
		clocks = <&clock_mmss clk_mdss_mdp_vote_clk>,
                         <&clock_mmss clk_mdss_ahb_clk>,
			 <&clock_mmss clk_mmss_misc_ahb_clk>,
                         <&clock_mmss clk_mdss_axi_clk>,
@@ -372,7 +372,7 @@
		qcom,mdss-mdp = <&mdss_mdp>;
		qcom,mdss-fb-map = <&mdss_fb0>;

		clocks = <&clock_mmss clk_mdss_mdp_clk>,
		clocks = <&clock_mmss clk_mdss_mdp_vote_clk>,
                         <&clock_mmss clk_mdss_ahb_clk>,
			 <&clock_mmss clk_mmss_misc_ahb_clk>,
                         <&clock_mmss clk_mdss_axi_clk>,
@@ -480,7 +480,7 @@
		qcom,enable-load = <0>;
		qcom,disable-load = <0>;

		clocks = <&clock_mmss clk_mdss_mdp_clk>,
		clocks = <&clock_mmss clk_mdss_mdp_vote_clk>,
			 <&clock_mmss clk_mdss_ahb_clk>,
			 <&clock_mmss clk_mdss_hdmi_clk>,
			 <&clock_mmss clk_mdss_hdmi_ahb_clk>,
@@ -501,5 +501,22 @@
		qcom,mdss-wb-count = <2>;
		qcom,mdss-has-downscale;
		qcom,mdss-has-ubwc;
		/* Bus Scale Settings */
		qcom,msm-bus,name = "mdss_rotator";
		qcom,msm-bus,num-cases = <3>;
		qcom,msm-bus,num-paths = <1>;
		qcom,msm-bus,vectors-KBps =
			<25 512 0 0>,
			<25 512 0 6400000>,
			<25 512 0 6400000>;

		rot-vdd-supply = <&gdsc_mdss>;
		rot-mmagic-mdss-gdsc-supply = <&gdsc_mmagic_mdss>;

		qcom,supply-names = "rot-vdd", "rot-mmagic-mdss-gdsc";

		clocks = <&clock_mmss clk_mmss_misc_ahb_clk>,
			<&clock_mmss clk_mdss_rotator_vote_clk>;
		clock-names = "iface_clk", "rot_core_clk";
	};
};
+3 −0
Original line number Diff line number Diff line
@@ -1019,6 +1019,9 @@ void mdss_mdp_ctl_notifier_register(struct mdss_mdp_ctl *ctl,
void mdss_mdp_ctl_notifier_unregister(struct mdss_mdp_ctl *ctl,
	struct notifier_block *notifier);
u32 mdss_mdp_ctl_perf_get_transaction_status(struct mdss_mdp_ctl *ctl);
u32 mdss_apply_overhead_factors(u32 quota, bool is_nrt,
	bool is_rot_read, struct mdss_mdp_format_params *fmt);


int mdss_mdp_scan_pipes(void);

+25 −1
Original line number Diff line number Diff line
@@ -607,6 +607,22 @@ static u32 mdss_mdp_get_rotator_fps(struct mdss_mdp_pipe *pipe)
	return fps;
}

u32 mdss_apply_overhead_factors(u32 quota, bool is_nrt,
	bool is_rot_read, struct mdss_mdp_format_params *fmt)
{
	struct mdss_data_type *mdata = mdss_mdp_get_mdata();

	if (!mdata)
		return quota;

	if (test_bit(MDSS_QOS_OVERHEAD_FACTOR,
			mdata->mdss_qos_map)) {
		quota = apply_overhead_factors(quota,
			is_nrt, is_rot_read, fmt);
	}
	return quota;
}

/**
 * mdss_mdp_perf_calc_pipe() - calculate performance numbers required by pipe
 * @pipe:	Source pipe struct containing updated pipe params
@@ -1467,6 +1483,9 @@ static u64 mdss_mdp_ctl_calc_client_vote(struct mdss_data_type *mdata,
			!ctl->mixer_left->rotator_mode) ||
		    /* Non-RealTime clients */
		    (nrt_client && mdss_mdp_is_nrt_ctl_path(ctl)))) {
			/* Skip rotation layers as bw calc by rot driver */
			if (ctl->mixer_left && ctl->mixer_left->rotator_mode)
				continue;
			/*
			 * If traffic shaper is enabled we must check
			 * if additional bandwidth is required.
@@ -1663,7 +1682,7 @@ u32 mdss_mdp_get_mdp_clk_rate(struct mdss_data_type *mdata)
{
	u32 clk_rate = 0;
	uint i;
	struct clk *clk = mdss_mdp_get_clk(MDSS_CLK_MDP_SRC);
	struct clk *clk = mdss_mdp_get_clk(MDSS_CLK_MDP_CORE);

	for (i = 0; i < mdata->nctl; i++) {
		struct mdss_mdp_ctl *ctl;
@@ -1718,6 +1737,10 @@ static void mdss_mdp_ctl_perf_update(struct mdss_mdp_ctl *ctl,
	is_bw_released = !mdss_mdp_ctl_perf_get_transaction_status(ctl);

	if (mdss_mdp_ctl_is_power_on(ctl)) {
		/* Skip perf update if ctl is used for rotation */
		if (ctl->mixer_left && ctl->mixer_left->rotator_mode)
			goto end;

		if (ctl->perf_release_ctl_bw &&
			mdata->enable_rotator_bw_release)
			mdss_mdp_perf_release_ctl_bw(ctl, new);
@@ -1796,6 +1819,7 @@ static void mdss_mdp_ctl_perf_update(struct mdss_mdp_ctl *ctl,
		pr_debug("update clk rate = %d HZ\n", clk_rate);
	}

end:
	mutex_unlock(&mdss_mdp_ctl_lock);
	ATRACE_END(__func__);
}
+1 −1
Original line number Diff line number Diff line
@@ -4570,7 +4570,7 @@ static int mdss_mdp_overlay_handoff(struct msm_fb_data_type *mfd)
		goto error;
	}

	ctl->clk_rate = mdss_mdp_get_clk_rate(MDSS_CLK_MDP_SRC);
	ctl->clk_rate = mdss_mdp_get_clk_rate(MDSS_CLK_MDP_CORE);
	pr_debug("Set the ctl clock rate to %d Hz\n", ctl->clk_rate);

	rc = __mdss_mdp_ctl_handoff(ctl, mdata);
Loading