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

Commit 7d978fcb authored by Terence Hampson's avatar Terence Hampson
Browse files

mdss: rotator: validate rotator work item against session



The rationale for open session is to accurately vote for bw and
clk rates based on configuration provided. Prior to this patch it
was possible to call open session with one configuration, but
provided an entirely different rotation configuration as work to
be completed.

Change-Id: I82c95c290cffa75ea7b09ea4a021e9e436782c06
Signed-off-by: default avatarTerence Hampson <thampson@codeaurora.org>
parent 729ef8ff
Loading
Loading
Loading
Loading
+42 −2
Original line number Diff line number Diff line
@@ -1254,6 +1254,37 @@ static int mdss_rotator_verify_config(struct mdss_rot_mgr *mgr,
	return 0;
}

inline int __compare_session_item_rect(struct mdp_rotation_buf_info *s_rect,
	struct mdp_rect *i_rect, uint32_t i_fmt, bool src)
{
	if ((s_rect->width != i_rect->w) || (s_rect->height != i_rect->h) ||
			(s_rect->format != i_fmt)) {
		pr_err("%s: session{%u,%u}f:%u mismatch from item{%u,%u}f:%u\n",
			(src ? "src":"dst"), s_rect->width, s_rect->height,
			s_rect->format, i_rect->w, i_rect->h, i_fmt);
		return -EINVAL;
	}
	return 0;
}

static int mdss_rotator_validate_item_matches_session(
	struct mdp_rotation_config *config, struct mdp_rotation_item *item)
{
	int ret;

	ret = __compare_session_item_rect(&config->input,
		&item->src_rect, item->input.format, true);
	if (ret)
		return ret;

	ret = __compare_session_item_rect(&config->output,
		&item->dst_rect, item->output.format, false);
	if (ret)
		return ret;

	return 0;
}

static int mdss_rotator_validate_entry(struct mdss_rot_mgr *mgr,
	struct mdss_rot_file_private *private,
	struct mdss_rot_entry *entry)
@@ -1261,6 +1292,7 @@ static int mdss_rotator_validate_entry(struct mdss_rot_mgr *mgr,
	int ret;
	u32 out_format, in_format;
	struct mdp_rotation_item *item;
	struct mdss_rot_perf *perf;

	item = &entry->item;
	in_format = item->input.format;
@@ -1277,11 +1309,19 @@ static int mdss_rotator_validate_entry(struct mdss_rot_mgr *mgr,
		return -EINVAL;
	}

	if (!mdss_rotator_find_session(private, item->session_id)) {
		pr_err("Could not find session based on rotation work item\n");
	perf = mdss_rotator_find_session(private, item->session_id);
	if (!perf) {
		pr_err("Could not find session:%u\n", item->session_id);
		return -EINVAL;
	}

	ret = mdss_rotator_validate_item_matches_session(&perf->config, item);
	if (ret) {
		pr_err("Work item does not match session:%u\n",
			item->session_id);
		return ret;
	}

	ret = mdss_rotator_config_dnsc_factor(mgr, entry);
	if (ret) {
		pr_err("fail to configure downscale factor\n");