summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_layer.c33
1 files changed, 23 insertions, 10 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp_layer.c b/drivers/video/fbdev/msm/mdss_mdp_layer.c
index 59283c815897..65b3b9739be6 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_layer.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_layer.c
@@ -662,6 +662,23 @@ exit_fail:
return ret;
}
+static int __validate_pipe_priorities(struct mdss_mdp_pipe *left,
+ struct mdss_mdp_pipe *right)
+{
+ if (left->multirect.num > right->multirect.num)
+ return -EINVAL;
+
+ if ((left->multirect.num == right->multirect.num) &&
+ (left->priority >= right->priority))
+ return -EINVAL;
+
+ if ((left->multirect.num < right->multirect.num) &&
+ (left->priority > right->priority))
+ return -EINVAL;
+
+ return 0;
+}
+
static int __configure_pipe_params(struct msm_fb_data_type *mfd,
struct mdss_mdp_validate_info_t *vinfo, struct mdss_mdp_pipe *pipe,
struct mdss_mdp_pipe *left_blend_pipe, bool is_single_layer,
@@ -773,10 +790,12 @@ static int __configure_pipe_params(struct msm_fb_data_type *mfd,
*/
if (mdata->has_src_split) {
if (left_blend_pipe) {
- if (pipe->priority <= left_blend_pipe->priority) {
- pr_err("priority limitation. left:%d right%d\n",
- left_blend_pipe->priority,
- pipe->priority);
+ if (__validate_pipe_priorities(left_blend_pipe, pipe)) {
+ pr_err("priority limitation. left:%d rect:%d, right:%d rect:%d\n",
+ left_blend_pipe->priority,
+ left_blend_pipe->multirect.num,
+ pipe->priority,
+ pipe->multirect.num);
ret = -EPERM;
goto end;
} else {
@@ -1521,12 +1540,6 @@ static bool __multirect_validate_properties(struct mdp_input_layer **layers,
return false;
}
- if (layers[0]->z_order == layers[1]->z_order) {
- pr_err("multirect layers cannot have same z_order=%d\n",
- layers[0]->z_order);
- return false;
- }
-
return true;
}