diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/video/fbdev/msm/mdp3_ctrl.c | 13 |
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 |
