From f7de3df39b3b80205ea65d410e4439e5ca0472d6 Mon Sep 17 00:00:00 2001 From: Terence Hampson Date: Thu, 11 Jun 2015 17:20:24 -0400 Subject: [PATCH] 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 --- drivers/video/fbdev/msm/mdss_rotator.c | 44 ++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/drivers/video/fbdev/msm/mdss_rotator.c b/drivers/video/fbdev/msm/mdss_rotator.c index 49fb5b99dd1d..ea7c42505b91 100644 --- a/drivers/video/fbdev/msm/mdss_rotator.c +++ b/drivers/video/fbdev/msm/mdss_rotator.c @@ -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");