summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/video/fbdev/msm/mdp3_ctrl.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/drivers/video/fbdev/msm/mdp3_ctrl.c b/drivers/video/fbdev/msm/mdp3_ctrl.c
index 401e1dcf6974..7c9aeaf43513 100644
--- a/drivers/video/fbdev/msm/mdp3_ctrl.c
+++ b/drivers/video/fbdev/msm/mdp3_ctrl.c
@@ -953,6 +953,7 @@ static int mdp3_overlay_queue_buffer(struct msm_fb_data_type *mfd,
struct mdp3_session_data *mdp3_session = mfd->mdp.private1;
struct msmfb_data *img = &req->data;
struct mdp3_img_data data;
+ struct mdp3_dma *dma = mdp3_session->dma;
rc = mdp3_get_img(img, &data, MDP3_CLIENT_DMA_P);
if (rc) {
@@ -960,6 +961,12 @@ static int mdp3_overlay_queue_buffer(struct msm_fb_data_type *mfd,
return rc;
}
+ if (data.len < dma->source_config.stride * dma->source_config.height) {
+ pr_err("buf length is smaller than required by dma configuration\n");
+ mdp3_put_img(&data, MDP3_CLIENT_DMA_P);
+ return -EINVAL;
+ }
+
rc = mdp3_bufq_push(&mdp3_session->bufq_in, &data);
if (rc) {
pr_err("fail to queue the overlay buffer, buffer drop\n");
@@ -980,6 +987,12 @@ static int mdp3_overlay_play(struct msm_fb_data_type *mfd,
mutex_lock(&mdp3_session->lock);
+ if (mdp3_session->overlay.id == MSMFB_NEW_REQUEST) {
+ pr_err("overlay play without overlay set first\n");
+ mutex_unlock(&mdp3_session->lock);
+ return -EINVAL;
+ }
+
if (mfd->panel_power_on)
rc = mdp3_overlay_queue_buffer(mfd, req);
else