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: Terence Hampson <thampson@codeaurora.org>
This commit is contained in:
Terence Hampson 2015-06-11 17:20:24 -04:00 committed by David Keitel
parent f8669530b3
commit f7de3df39b

View file

@ -1259,6 +1259,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)
@ -1266,6 +1297,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;
@ -1282,11 +1314,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");