diff options
| author | Adrian Salido-Moreno <adrianm@codeaurora.org> | 2012-10-01 18:25:22 -0700 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:12:44 -0700 |
| commit | 115367805ef20db47425c8bf7ef02a61bab5a052 (patch) | |
| tree | f52b8e4c5341dfe40f259e7f5702acae41685088 | |
| parent | 2d5f643eaf65406d176756a3e62cc98b733ebd96 (diff) | |
msm: mdss: use half of panel width when using dual pipe
MDP layer mixer only supports up to 2048 width, if the panel resolution
is greater than this dual mixer needs to be used. Setup each mixer width
as half the panel width instead of allocating max width on left mixer
and use left over for right mixer to have better load balancing.
Change-Id: Ibc01591e2e6d5e5f98e81dfba766493abd9895a5
Signed-off-by: Adrian Salido-Moreno <adrianm@codeaurora.org>
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp.h | 2 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_ctl.c | 13 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_overlay.c | 22 |
3 files changed, 24 insertions, 13 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp.h b/drivers/video/fbdev/msm/mdss_mdp.h index 035fec502634..c452b53f9a51 100644 --- a/drivers/video/fbdev/msm/mdss_mdp.h +++ b/drivers/video/fbdev/msm/mdss_mdp.h @@ -29,7 +29,7 @@ #define MDP_CLK_DEFAULT_RATE 37500000 #define PHASE_STEP_SHIFT 21 #define MAX_MIXER_WIDTH 2048 -#define MAX_MIXER_HEIGHT 2048 +#define MAX_MIXER_HEIGHT 2400 #define MAX_IMG_WIDTH 0x3FFF #define MAX_IMG_HEIGHT 0x3FFF #define MIN_DST_W 10 diff --git a/drivers/video/fbdev/msm/mdss_mdp_ctl.c b/drivers/video/fbdev/msm/mdss_mdp_ctl.c index bebcc4bbef56..9f1bab657422 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_ctl.c +++ b/drivers/video/fbdev/msm/mdss_mdp_ctl.c @@ -382,17 +382,18 @@ static int mdss_mdp_ctl_init(struct msm_fb_data_type *mfd) return -ENOMEM; } - ctl->mixer_left->width = MIN(width, MAX_MIXER_WIDTH); + if (width > MAX_MIXER_WIDTH) + width /= 2; + + ctl->mixer_left->width = width; ctl->mixer_left->height = height; ctl->mixer_left->ctl = ctl; - width -= ctl->mixer_left->width; - - if (width) { + if (width < ctl->width) { ctl->mixer_right = - mdss_mdp_mixer_alloc(MDSS_MDP_MIXER_TYPE_INTF); + mdss_mdp_mixer_alloc(MDSS_MDP_MIXER_TYPE_INTF); if (!ctl->mixer_right) { - pr_err("unable to allocate layer mixer\n"); + pr_err("unable to allocate right layer mixer\n"); mdss_mdp_mixer_free(ctl->mixer_left); mdss_mdp_ctl_free(ctl); return -ENOMEM; diff --git a/drivers/video/fbdev/msm/mdss_mdp_overlay.c b/drivers/video/fbdev/msm/mdss_mdp_overlay.c index d7e7a3f14542..098849016fb2 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_overlay.c +++ b/drivers/video/fbdev/msm/mdss_mdp_overlay.c @@ -636,8 +636,15 @@ static int mdss_mdp_overlay_get_fb_pipe(struct msm_fb_data_type *mfd, if (pipe == NULL) { struct mdp_overlay req; struct fb_info *fbi = mfd->fbi; + struct mdss_mdp_mixer *mixer; int ret, bpp; + mixer = mdss_mdp_mixer_get(mfd->ctl, MDSS_MDP_MIXER_MUX_LEFT); + if (!mixer) { + pr_err("unable to retrieve mixer\n"); + return -ENODEV; + } + memset(&req, 0, sizeof(req)); bpp = fbi->var.bits_per_pixel / 8; @@ -646,20 +653,22 @@ static int mdss_mdp_overlay_get_fb_pipe(struct msm_fb_data_type *mfd, req.src.height = fbi->var.yres; req.src.width = fbi->fix.line_length / bpp; if (mixer_mux == MDSS_MDP_MIXER_MUX_RIGHT) { - if (req.src.width <= MAX_MIXER_WIDTH) - return -ENODEV; + if (req.src.width <= mixer->width) { + pr_warn("right fb pipe not needed\n"); + return -EINVAL; + } req.flags |= MDSS_MDP_RIGHT_MIXER; - req.src_rect.x = MAX_MIXER_WIDTH; - req.src_rect.w = fbi->var.xres - MAX_MIXER_WIDTH; + req.src_rect.x = mixer->width; + req.src_rect.w = fbi->var.xres - mixer->width; } else { req.src_rect.x = 0; - req.src_rect.w = MIN(fbi->var.xres, MAX_MIXER_WIDTH); + req.src_rect.w = MIN(fbi->var.xres, mixer->width); } req.src_rect.y = 0; req.src_rect.h = req.src.height; - req.dst_rect.x = req.src_rect.x; + req.dst_rect.x = 0; req.dst_rect.y = 0; req.dst_rect.w = req.src_rect.w; req.dst_rect.h = req.src_rect.h; @@ -696,6 +705,7 @@ static void mdss_mdp_overlay_pan_display(struct msm_fb_data_type *mfd) if (fbi->fix.smem_len == 0) { pr_warn("fb memory not allocated\n"); + mdss_mdp_overlay_kickoff(mfd->ctl); return; } |
