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

Commit 1de54f79 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: modify BW overhead and compression ratio related logic"

parents 827b6ba8 2a2d99af
Loading
Loading
Loading
Loading
+5 −10
Original line number Diff line number Diff line
@@ -74,11 +74,6 @@ struct mdss_debug_inf {
	void (*debug_enable_clock)(int on);
};

struct mdss_fudge_factor {
	u32 numer;
	u32 denom;
};

struct mdss_perf_tune {
	unsigned long min_mdp_clk;
	u64 min_bus_vote;
@@ -318,11 +313,11 @@ struct mdss_data_type {
	u32 *vbif_nrt_qos;
	u32 npriority_lvl;

	struct mdss_fudge_factor ab_factor;
	struct mdss_fudge_factor ib_factor;
	struct mdss_fudge_factor ib_factor_overlap;
	struct mdss_fudge_factor clk_factor;
	struct mdss_fudge_factor per_pipe_ib_factor;
	struct mult_factor ab_factor;
	struct mult_factor ib_factor;
	struct mult_factor ib_factor_overlap;
	struct mult_factor clk_factor;
	struct mult_factor per_pipe_ib_factor;
	bool apply_post_scale_bytes;
	bool hflip_buffer_reused;

+2 −2
Original line number Diff line number Diff line
@@ -656,7 +656,7 @@ void mdss_debug_register_dump_range(struct platform_device *pdev,
static ssize_t mdss_debug_factor_write(struct file *file,
		    const char __user *user_buf, size_t count, loff_t *ppos)
{
	struct mdss_fudge_factor *factor  = file->private_data;
	struct mult_factor *factor  = file->private_data;
	u32 numer;
	u32 denom;
	char buf[32];
@@ -699,7 +699,7 @@ static ssize_t mdss_debug_factor_write(struct file *file,
static ssize_t mdss_debug_factor_read(struct file *file,
			char __user *buff, size_t count, loff_t *ppos)
{
	struct mdss_fudge_factor *factor = file->private_data;
	struct mult_factor *factor = file->private_data;
	int len = 0;
	char buf[32];

+1 −1
Original line number Diff line number Diff line
@@ -2741,7 +2741,7 @@ static int mdss_mdp_parse_dt_smp(struct platform_device *pdev)
}

static void mdss_mdp_parse_dt_fudge_factors(struct platform_device *pdev,
	char *prop_name, struct mdss_fudge_factor *ff)
	char *prop_name, struct mult_factor *ff)
{
	int rc;
	u32 data[2] = {1, 1};
+7 −5
Original line number Diff line number Diff line
@@ -259,9 +259,12 @@ struct mdss_mdp_ctl {
	u16 height;
	u16 border_x_off;
	u16 border_y_off;
	u32 dst_format;
	bool is_secure;

	/* used for WFD */
	u32 dst_format;
	struct mult_factor dst_comp_ratio;

	u32 clk_rate;
	int force_screen_state;
	struct mdss_mdp_perf_params cur_perf;
@@ -1036,9 +1039,8 @@ 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,
	struct mult_factor *comp_ratio);
u32 apply_comp_ratio_factor(u32 quota, struct mdss_mdp_format_params *fmt,
	struct mult_factor *factor);

int mdss_mdp_scan_pipes(void);

@@ -1161,7 +1163,7 @@ void mdss_mdp_data_calc_offset(struct mdss_mdp_data *data, u16 x, u16 y,
struct mdss_mdp_format_params *mdss_mdp_get_format_params(u32 format);
void mdss_mdp_get_v_h_subsample_rate(u8 chroma_samp,
	u8 *v_sample, u8 *h_sample);
struct mdss_fudge_factor *mdss_mdp_get_comp_factor(u32 format,
struct mult_factor *mdss_mdp_get_comp_factor(u32 format,
	bool rt_factor);
int mdss_mdp_data_get(struct mdss_mdp_data *data, struct msmfb_data *planes,
		int num_planes, u32 flags, struct device *dev, bool rotator,
+21 −67
Original line number Diff line number Diff line
@@ -37,7 +37,7 @@ static inline u64 fudge_factor(u64 val, u32 numer, u32 denom)
}

static inline u64 apply_fudge_factor(u64 val,
	struct mdss_fudge_factor *factor)
	struct mult_factor *factor)
{
	return fudge_factor(val, factor->numer, factor->denom);
}
@@ -549,50 +549,24 @@ static inline bool validate_comp_ratio(struct mult_factor *factor)
	return factor->numer && factor->denom;
}

static u32 apply_comp_ratio_factor(u32 quota,
u32 apply_comp_ratio_factor(u32 quota,
	struct mdss_mdp_format_params *fmt,
	struct mult_factor *factor)
{
	struct mdss_data_type *mdata = mdss_mdp_get_mdata();

	if (!mdata || test_bit(MDSS_QOS_OVERHEAD_FACTOR,
		      mdata->mdss_qos_map))
		return quota;

	/* apply compression ratio, only for compressed formats */
	if (mdss_mdp_is_ubwc_format(fmt) &&
			validate_comp_ratio(factor)) {
	    validate_comp_ratio(factor))
		quota = apply_inverse_fudge_factor(quota , factor);
	}

	return quota;
}

static u32 apply_overhead_factors(u32 quota,
	bool is_nrt, bool is_rot_read,
	struct mdss_mdp_format_params *fmt,
	struct mult_factor *comp_ratio)
{
	u32 overhead_quota;

	if (!fmt) {
		pr_debug("fmt is null, skip overhead factor\n");
	return quota;
}

	/* rotator read + YUV linear format */
	if (is_nrt && is_rot_read && fmt->is_yuv &&
			mdss_mdp_is_linear_format(fmt)) {
		/*
		* overhead and compression ratio factors are 1,
		* so overhead_quota = quota + quota
		*/
		overhead_quota = quota * 2;
	} else {
		/* add ~3% (0.03125) of overhead */
		overhead_quota = quota / 32;
		overhead_quota += apply_comp_ratio_factor(quota, fmt,
			comp_ratio);
	}

	return overhead_quota;
};

static u32 mdss_mdp_get_rotator_fps(struct mdss_mdp_pipe *pipe)
{
	struct mdss_data_type *mdata = mdss_mdp_get_mdata();
@@ -607,23 +581,6 @@ 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 mult_factor *comp_ratio)
{
	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, comp_ratio);
	}
	return quota;
}

u64 mdss_mdp_perf_calc_simplified_prefill(struct mdss_mdp_pipe *pipe,
	u32 v_total, u32 fps, struct mdss_mdp_ctl *ctl)
{
@@ -785,9 +742,8 @@ int mdss_mdp_perf_calc_pipe(struct mdss_mdp_pipe *pipe,
		if (test_bit(MDSS_QOS_OVERHEAD_FACTOR,
				mdata->mdss_qos_map)) {
			/* rotator read */
			quota = apply_overhead_factors(quota,
				true, true, pipe->src_fmt,
				&pipe->comp_ratio);
			quota = apply_comp_ratio_factor(quota,
				pipe->src_fmt, &pipe->comp_ratio);
			/*
			 * rotator write: here we are using src_fmt since
			 * current implementation only supports calculate
@@ -797,9 +753,8 @@ int mdss_mdp_perf_calc_pipe(struct mdss_mdp_pipe *pipe,
			 * calculate the bandwidth, but leaving this
			 * calculation as per current support.
			 */
			quota += apply_overhead_factors(quota,
				true, false, pipe->src_fmt,
				&pipe->comp_ratio);
			quota += apply_comp_ratio_factor(quota,
				pipe->src_fmt, &pipe->comp_ratio);
		} else {
			quota *= 2; /* bus read + write */
		}
@@ -811,10 +766,8 @@ int mdss_mdp_perf_calc_pipe(struct mdss_mdp_pipe *pipe,

		if (test_bit(MDSS_QOS_OVERHEAD_FACTOR,
				mdata->mdss_qos_map))
			quota = apply_overhead_factors(quota,
				mdss_mdp_is_nrt_ctl_path(mixer->ctl),
				false, pipe->src_fmt,
				&pipe->comp_ratio);
			quota = apply_comp_ratio_factor(quota,
				pipe->src_fmt, &pipe->comp_ratio);
	}

	perf->bw_overlap = quota;
@@ -926,7 +879,7 @@ static void mdss_mdp_perf_calc_mixer(struct mdss_mdp_mixer *mixer,

			if (pinfo->type == WRITEBACK_PANEL) {
				fmt = mdss_mdp_get_format_params(
					pinfo->out_format);
					mixer->ctl->dst_format);
				if (fmt)
					bpp = fmt->bpp;
				pinfo = NULL;
@@ -945,11 +898,12 @@ static void mdss_mdp_perf_calc_mixer(struct mdss_mdp_mixer *mixer,

			if (test_bit(MDSS_QOS_OVERHEAD_FACTOR,
					mdata->mdss_qos_map))
				perf->bw_writeback = apply_overhead_factors(
					perf->bw_writeback,
					true, false, fmt, &pipe->comp_ratio);
		/* for command mode, run as fast as the link allows us */
				perf->bw_writeback = apply_comp_ratio_factor(
						perf->bw_writeback, fmt,
						&mixer->ctl->dst_comp_ratio);

		} else if (pinfo->type == MIPI_CMD_PANEL) {
			/* for cmd mode, run as fast as the link allows us */
			u32 dsi_pclk_rate = pinfo->mipi.dsi_pclk_rate;

			if (is_pingpong_split(mixer->ctl->mfd))
@@ -1723,7 +1677,7 @@ static void mdss_mdp_ctl_update_client_vote(struct mdss_data_type *mdata,
	if (test_bit(MDSS_MDP_BW_MODE_SINGLE_LAYER,
		perf->bw_vote_mode) &&
		(bus_ib_quota >= PERF_SINGLE_PIPE_BW_FLOOR)) {
		struct mdss_fudge_factor ib_factor_vscaling;
		struct mult_factor ib_factor_vscaling;
		ib_factor_vscaling.numer = 2;
		ib_factor_vscaling.denom = 1;
		bus_ib_quota = apply_fudge_factor(bus_ib_quota,
Loading