diff options
| -rw-r--r-- | Documentation/devicetree/bindings/fb/mdss-mdp.txt | 3 | ||||
| -rw-r--r-- | drivers/video/msm/mdss/mdss.h | 1 | ||||
| -rw-r--r-- | drivers/video/msm/mdss/mdss_mdp.c | 4 | ||||
| -rw-r--r-- | drivers/video/msm/mdss/mdss_mdp_overlay.c | 15 |
4 files changed, 22 insertions, 1 deletions
diff --git a/Documentation/devicetree/bindings/fb/mdss-mdp.txt b/Documentation/devicetree/bindings/fb/mdss-mdp.txt index b552ef6e158..379ae495bc4 100644 --- a/Documentation/devicetree/bindings/fb/mdss-mdp.txt +++ b/Documentation/devicetree/bindings/fb/mdss-mdp.txt @@ -230,6 +230,8 @@ Optional properties: then a default value of 128 pixels would be used. - qcom,mdss-has-bwc: Boolean property to indicate the presence of bandwidth compression feature in the rotator. +- qcom,mdss-has-non-scalar-rgb: Boolean property to indicate the presence of RGB + pipes which have no scaling support. - qcom,mdss-has-decimation: Boolean property to indicate the presence of decimation feature in fetch. - qcom,mdss-ad-off: Array of offset addresses for the available @@ -409,6 +411,7 @@ Example: qcom,mdss-rotator-ot-limit = <2>; qcom,mdss-smp-mb-per-pipe = <2>; qcom,mdss-pref-prim-intf = "dsi"; + qcom,mdss-has-non-scalar-rgb; qcom,mdss-has-bwc; qcom,mdss-has-decimation; qcom,mdss-wfd-mode = "intf"; diff --git a/drivers/video/msm/mdss/mdss.h b/drivers/video/msm/mdss/mdss.h index 29462449d3e..8b304ed6cb7 100644 --- a/drivers/video/msm/mdss/mdss.h +++ b/drivers/video/msm/mdss/mdss.h @@ -116,6 +116,7 @@ struct mdss_data_type { u32 has_decimation; u32 wfd_mode; u8 has_wb_ad; + u8 has_non_scalar_rgb; u32 rotator_ot_limit; u32 mdp_irq_mask; diff --git a/drivers/video/msm/mdss/mdss_mdp.c b/drivers/video/msm/mdss/mdss_mdp.c index ded52c03555..2ef27ebbc33 100644 --- a/drivers/video/msm/mdss/mdss_mdp.c +++ b/drivers/video/msm/mdss/mdss_mdp.c @@ -1305,6 +1305,8 @@ static ssize_t mdss_mdp_show_capabilities(struct device *dev, SPRINT(" decimation"); if (mdata->highest_bank_bit) SPRINT(" tile_format"); + if (mdata->has_non_scalar_rgb) + SPRINT(" non_scalar_rgb"); SPRINT("\n"); return cnt; @@ -2273,6 +2275,8 @@ static int mdss_mdp_parse_dt_misc(struct platform_device *pdev) "qcom,mdss-rotator-ot-limit", &data); mdata->rotator_ot_limit = (!rc ? data : 0); + mdata->has_non_scalar_rgb = of_property_read_bool(pdev->dev.of_node, + "qcom,mdss-has-non-scalar-rgb"); mdata->has_bwc = of_property_read_bool(pdev->dev.of_node, "qcom,mdss-has-bwc"); mdata->has_decimation = of_property_read_bool(pdev->dev.of_node, diff --git a/drivers/video/msm/mdss/mdss_mdp_overlay.c b/drivers/video/msm/mdss/mdss_mdp_overlay.c index 53e8d23e1e0..2d3601582c8 100644 --- a/drivers/video/msm/mdss/mdss_mdp_overlay.c +++ b/drivers/video/msm/mdss/mdss_mdp_overlay.c @@ -360,6 +360,7 @@ static int mdss_mdp_overlay_pipe_setup(struct msm_fb_data_type *mfd, struct mdp_histogram_start_req hist; int ret; u32 bwc_enabled; + bool is_vig_needed = false; if (mdp5_data->ctl == NULL) return -ENODEV; @@ -420,10 +421,16 @@ static int mdss_mdp_overlay_pipe_setup(struct msm_fb_data_type *mfd, return -ENODEV; } + if ((mdata->has_non_scalar_rgb) && + ((req->src_rect.w != req->dst_rect.w) || + (req->src_rect.h != req->dst_rect.h))) + is_vig_needed = true; + if (req->id == MSMFB_NEW_REQUEST) { if (req->flags & MDP_OV_PIPE_FORCE_DMA) pipe_type = MDSS_MDP_PIPE_TYPE_DMA; - else if (fmt->is_yuv || (req->flags & MDP_OV_PIPE_SHARE)) + else if (fmt->is_yuv || (req->flags & MDP_OV_PIPE_SHARE) || + is_vig_needed) pipe_type = MDSS_MDP_PIPE_TYPE_VIG; else pipe_type = MDSS_MDP_PIPE_TYPE_RGB; @@ -461,6 +468,12 @@ static int mdss_mdp_overlay_pipe_setup(struct msm_fb_data_type *mfd, return pipe ? PTR_ERR(pipe) : -ENODEV; } + if (is_vig_needed && (pipe->type != MDSS_MDP_PIPE_TYPE_VIG)) { + pr_err("pipe is non-scalar ndx=%x\n", req->id); + ret = -EINVAL; + goto exit_fail; + } + if (pipe->mixer != mixer) { if (!mixer->ctl || (mixer->ctl->mfd != mfd)) { pr_err("Can't switch mixer %d->%d pnum %d!\n", |
