diff options
| author | Abhijit Kulkarni <kabhijit@codeaurora.org> | 2017-02-15 12:13:25 -0800 |
|---|---|---|
| committer | Abhijit Kulkarni <kabhijit@codeaurora.org> | 2017-02-27 14:27:15 -0800 |
| commit | 9aa059de1397eace044985c5d402b2844d77ab6b (patch) | |
| tree | 42aa879ead245f20c3b0f0268a029b0bb04b7b14 /drivers | |
| parent | 25becb443315339dc207c8687cad258836861063 (diff) | |
msm: mdss: validate qseed3 params
This change adds the validation of qseed3 params before programming
the registers. This check would prevent any wrong configuration on
the vig src pipes.
CRs-Fixed: 2008489
Change-Id: If05d95349ba437332778a378804e6dd373ba2beb
Signed-off-by: Abhijit Kulkarni <kabhijit@codeaurora.org>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_overlay.c | 101 |
1 files changed, 100 insertions, 1 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp_overlay.c b/drivers/video/fbdev/msm/mdss_mdp_overlay.c index da08917d334b..f873b892a390 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_overlay.c +++ b/drivers/video/fbdev/msm/mdss_mdp_overlay.c @@ -519,6 +519,102 @@ static int __mdss_mdp_validate_pxl_extn(struct mdss_mdp_pipe *pipe) return 0; } +static int __mdss_mdp_validate_qseed3_cfg(struct mdss_mdp_pipe *pipe) +{ + int plane; + + for (plane = 0; plane < MAX_PLANES; plane++) { + u32 hor_req_pixels, hor_fetch_pixels; + u32 hor_ov_fetch, vert_ov_fetch; + u32 vert_req_pixels, vert_fetch_pixels; + u32 src_w = DECIMATED_DIMENSION(pipe->src.w, pipe->horz_deci); + u32 src_h = DECIMATED_DIMENSION(pipe->src.h, pipe->vert_deci); + + /* + * plane 1 and 2 are for chroma and are same. While configuring + * HW, programming only one of the chroma components is + * sufficient. + */ + if (plane == 2) + continue; + + /* + * For chroma plane, width is half for the following sub sampled + * formats. Except in case of decimation, where hardware avoids + * 1 line of decimation instead of downsampling. + */ + if (plane == 1 && !pipe->horz_deci && + ((pipe->src_fmt->chroma_sample == MDSS_MDP_CHROMA_420) || + (pipe->src_fmt->chroma_sample == MDSS_MDP_CHROMA_H2V1))) { + src_w >>= 1; + } + + if (plane == 1 && !pipe->vert_deci && + ((pipe->src_fmt->chroma_sample == MDSS_MDP_CHROMA_420) || + (pipe->src_fmt->chroma_sample == MDSS_MDP_CHROMA_H1V2))) + src_h >>= 1; + + hor_req_pixels = pipe->scaler.num_ext_pxls_left[plane]; + + hor_fetch_pixels = src_w + + (pipe->scaler.left_ftch[plane] >> pipe->horz_deci) + + pipe->scaler.left_rpt[plane] + + (pipe->scaler.right_ftch[plane] >> pipe->horz_deci) + + pipe->scaler.right_rpt[plane]; + + hor_ov_fetch = src_w + + (pipe->scaler.left_ftch[plane] >> pipe->horz_deci) + + (pipe->scaler.right_ftch[plane] >> pipe->horz_deci); + + vert_req_pixels = pipe->scaler.num_ext_pxls_top[plane]; + + vert_fetch_pixels = src_h + + (pipe->scaler.top_ftch[plane] >> pipe->vert_deci) + + pipe->scaler.top_rpt[plane] + + (pipe->scaler.btm_ftch[plane] >> pipe->vert_deci) + + pipe->scaler.btm_rpt[plane]; + + vert_ov_fetch = src_h + + (pipe->scaler.top_ftch[plane] >> pipe->vert_deci) + + (pipe->scaler.btm_ftch[plane] >> pipe->vert_deci); + + if ((hor_req_pixels != hor_fetch_pixels) || + (hor_ov_fetch > pipe->img_width) || + (vert_req_pixels != vert_fetch_pixels) || + (vert_ov_fetch > pipe->img_height)) { + pr_err("err: plane=%d h_req:%d h_fetch:%d v_req:%d v_fetch:%d src_img[%d %d] ov_fetch[%d %d]\n", + + plane, + hor_req_pixels, hor_fetch_pixels, + vert_req_pixels, vert_fetch_pixels, + pipe->img_width, pipe->img_height, + hor_ov_fetch, vert_ov_fetch); + pipe->scaler.enable = 0; + return -EINVAL; + } + /* + * alpha plane can only be scaled using bilinear or pixel + * repeat/drop, src_width and src_height are only specified + * for Y and UV plane + */ + if (plane != 3) { + if ((hor_req_pixels != + pipe->scaler.src_width[plane]) || + (vert_req_pixels != + pipe->scaler.src_height[plane])) { + pr_err("roi_w[%d]=%d, scaler:[%d, %d], src_img:[%d, %d]\n", + plane, pipe->scaler.roi_w[plane], + pipe->scaler.src_width[plane], + pipe->scaler.src_height[plane], + pipe->img_width, pipe->img_height); + pipe->scaler.enable = 0; + return -EINVAL; + } + } + } + + return 0; +} int mdss_mdp_overlay_setup_scaling(struct mdss_mdp_pipe *pipe) { @@ -528,8 +624,11 @@ int mdss_mdp_overlay_setup_scaling(struct mdss_mdp_pipe *pipe) mdata = mdss_mdp_get_mdata(); if (pipe->scaler.enable) { - if (!test_bit(MDSS_CAPS_QSEED3, mdata->mdss_caps_map)) + if (test_bit(MDSS_CAPS_QSEED3, mdata->mdss_caps_map)) + rc = __mdss_mdp_validate_qseed3_cfg(pipe); + else rc = __mdss_mdp_validate_pxl_extn(pipe); + return rc; } |
