aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Documentation/devicetree/bindings/fb/mdss-mdp.txt3
-rw-r--r--drivers/video/msm/mdss/mdss.h1
-rw-r--r--drivers/video/msm/mdss/mdss_mdp.c4
-rw-r--r--drivers/video/msm/mdss/mdss_mdp_overlay.c15
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",