summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPrabhanjan Kandula <pkandula@codeaurora.org>2016-12-06 18:07:54 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2016-12-11 10:51:15 -0800
commit262104226d4d6c561fc690f785b481567bba720d (patch)
treefe9f106bd7c369b1f7ba30576ff9f25f77c179b0
parenta80e267a8c0d61790c3d1d5f7181ebd1be39c438 (diff)
msm: mdss: rely on client provided stride for CWB
Though CWB output is configured to primary resolution, client can provide an output buffer with bigger stride. Use client stride for computing output buffer plane info. Change-Id: Ib632c95fbb89dc181247dddee27b393a65aaa296 Signed-off-by: Prabhanjan Kandula <pkandula@codeaurora.org>
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_intf_writeback.c37
1 files changed, 34 insertions, 3 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp_intf_writeback.c b/drivers/video/fbdev/msm/mdss_mdp_intf_writeback.c
index 80549908beb6..feb75eb890ee 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_intf_writeback.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_intf_writeback.c
@@ -478,20 +478,34 @@ int mdss_mdp_writeback_prepare_cwb(struct mdss_mdp_ctl *ctl,
struct mdp_layer_buffer *buffer = NULL;
struct mdss_mdp_cwb *cwb = NULL;
struct mdss_mdp_ctl *sctl = NULL;
- int ret = 0;
+ int i, ret = 0;
+ unsigned long total_buf_len = 0;
+ struct mdss_mdp_data *data = NULL;
+ struct mdss_mdp_plane_sizes ps;
+ struct mdss_mdp_format_params *fmt;
+
+ if (!wb_arg->data)
+ return -EINVAL;
mdp5_data = mfd_to_mdp5_data(ctl->mfd);
cwb = &mdp5_data->cwb;
ctx = (struct mdss_mdp_writeback_ctx *)cwb->priv_data;
+ data = wb_arg->data;
buffer = &cwb->layer.buffer;
- ctx->opmode = 0;
- ctx->img_width = buffer->width;
+ /*
+ * client can program CWB output dimensions as only primary
+ * resolution, but output buffer allocated can be with bigger stride
+ * aligned for platform specific reasons & can interpret the output
+ * buffer in same stride. Program output stride based on client request
+ */
+ ctx->img_width = buffer->planes[0].stride;
ctx->img_height = buffer->height;
ctx->width = buffer->width;
ctx->height = buffer->height;
ctx->frame_rate = ctl->frame_rate;
+ ctx->opmode = 0;
ctx->dst_rect.x = 0;
ctx->dst_rect.y = 0;
ctx->dst_rect.w = ctx->width;
@@ -503,6 +517,23 @@ int mdss_mdp_writeback_prepare_cwb(struct mdss_mdp_ctl *ctl,
return ret;
}
+ /*
+ * Need additional buffer size validation as we are
+ * updating img_width with buffer->planes[0].stride
+ */
+ fmt = mdss_mdp_get_format_params(buffer->format);
+ mdss_mdp_get_plane_sizes(fmt, ctx->img_width,
+ buffer->height, &ps, 0, 0);
+
+ for (i = 0; i < buffer->plane_count ; i++)
+ total_buf_len += data->p[i].len;
+
+ if (total_buf_len < ps.total_size) {
+ pr_err("Buffer size=%lu, expected size=%d\n", total_buf_len,
+ ps.total_size);
+ return -EINVAL;
+ }
+
ret = mdss_mdp_writeback_addr_setup(ctx, wb_arg->data);
if (ret) {
pr_err("cwb writeback data setup error\n");