diff options
| author | Shivaraj Shetty <shivaraj@codeaurora.org> | 2013-11-29 14:58:54 +0530 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:23:59 -0700 |
| commit | bc42f2cffa0161ab871ec3ee2cc321529f01bcb1 (patch) | |
| tree | 32d4ef3706596ba13a268d8141447ab45dd958ea | |
| parent | c703f37d1479f7c48b6a1bcf9a6d667ef6b0061b (diff) | |
msm: mdss: Update the dma stride value on mdp3
The frame buffer is allocated from user space. And it may have some
special alignment requirement. Rather than assuming the alignment in
the driver, this change is to use the value passed in from the
user space to configure the dma stride register.
CRs-fixed: 582796
Change-Id: Ic3884ee0a530ed1ab83b6df26ba180fd21257ae0
Signed-off-by: Shivaraj Shetty <shivaraj@codeaurora.org>
| -rw-r--r-- | drivers/video/fbdev/msm/mdp3_ctrl.c | 16 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdp3_dma.c | 19 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdp3_dma.h | 2 |
3 files changed, 37 insertions, 0 deletions
diff --git a/drivers/video/fbdev/msm/mdp3_ctrl.c b/drivers/video/fbdev/msm/mdp3_ctrl.c index c85104c86c2f..7907051c24e8 100644 --- a/drivers/video/fbdev/msm/mdp3_ctrl.c +++ b/drivers/video/fbdev/msm/mdp3_ctrl.c @@ -839,6 +839,14 @@ static int mdp3_overlay_set(struct msm_fb_data_type *mfd, { int rc = 0; struct mdp3_session_data *mdp3_session = mfd->mdp.private1; + struct fb_var_screeninfo *var; + struct fb_fix_screeninfo *fix; + struct fb_info *fbi = mfd->fbi; + int stride; + + fix = &fbi->fix; + var = &fbi->var; + stride = req->src.width * var->bits_per_pixel/8; mutex_lock(&mdp3_session->lock); @@ -847,6 +855,9 @@ static int mdp3_overlay_set(struct msm_fb_data_type *mfd, mdp3_session->overlay = *req; if (req->id == MSMFB_NEW_REQUEST) { + if (fix->line_length != stride) + mdp3_session->dma->config_stride( + mdp3_session->dma, stride); mdp3_session->overlay.id = 1; req->id = 1; } @@ -860,10 +871,15 @@ static int mdp3_overlay_unset(struct msm_fb_data_type *mfd, int ndx) { int rc = 0; struct mdp3_session_data *mdp3_session = mfd->mdp.private1; + struct fb_info *fbi = mfd->fbi; + struct fb_fix_screeninfo *fix; + fix = &fbi->fix; mutex_lock(&mdp3_session->lock); if (mdp3_session->overlay.id == ndx && ndx == 1) { + mdp3_session->dma->config_stride(mdp3_session->dma, + fix->line_length); mdp3_session->overlay.id = MSMFB_NEW_REQUEST; mdp3_bufq_deinit(&mdp3_session->bufq_in); } else { diff --git a/drivers/video/fbdev/msm/mdp3_dma.c b/drivers/video/fbdev/msm/mdp3_dma.c index 6489cdc1e461..4d9bceab8691 100644 --- a/drivers/video/fbdev/msm/mdp3_dma.c +++ b/drivers/video/fbdev/msm/mdp3_dma.c @@ -268,6 +268,23 @@ static int mdp3_dma_sync_config(struct mdp3_dma *dma, return 0; } +static void mdp3_dma_stride_config(struct mdp3_dma *dma, int stride) +{ + struct mdp3_dma_source *source_config; + u32 dma_stride_offset; + + if (dma->dma_sel == MDP3_DMA_P) + dma_stride_offset = MDP3_REG_DMA_P_IBUF_Y_STRIDE; + else + dma_stride_offset = MDP3_REG_DMA_S_IBUF_Y_STRIDE; + + source_config = &dma->source_config; + source_config->stride = stride; + pr_debug("%s: Update the fb stride for DMA to %d", __func__, + (u32)source_config->stride); + MDP3_REG_WRITE(dma_stride_offset, source_config->stride); +} + static int mdp3_dmap_config(struct mdp3_dma *dma, struct mdp3_dma_source *source_config, struct mdp3_dma_output_config *output_config) @@ -855,6 +872,7 @@ int mdp3_dma_init(struct mdp3_dma *dma) dma->vsync_enable = mdp3_dma_vsync_enable; dma->start = mdp3_dma_start; dma->stop = mdp3_dma_stop; + dma->config_stride = mdp3_dma_stride_config; break; case MDP3_DMA_S: dma->dma_config = mdp3_dmas_config; @@ -869,6 +887,7 @@ int mdp3_dma_init(struct mdp3_dma *dma) dma->vsync_enable = mdp3_dma_vsync_enable; dma->start = mdp3_dma_start; dma->stop = mdp3_dma_stop; + dma->config_stride = mdp3_dma_stride_config; break; case MDP3_DMA_E: default: diff --git a/drivers/video/fbdev/msm/mdp3_dma.h b/drivers/video/fbdev/msm/mdp3_dma.h index b40b4236c1a7..935025f2ea45 100644 --- a/drivers/video/fbdev/msm/mdp3_dma.h +++ b/drivers/video/fbdev/msm/mdp3_dma.h @@ -287,6 +287,8 @@ struct mdp3_dma { int (*histo_op)(struct mdp3_dma *dma, u32 op); + void (*config_stride)(struct mdp3_dma *dma, int stride); + void (*vsync_enable)(struct mdp3_dma *dma, struct mdp3_vsync_notification *vsync_client); }; |
