aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArchit Taneja <architt@codeaurora.org>2017-03-23 06:28:08 -0400
committerRob Clark <robdclark@gmail.com>2017-04-08 06:59:34 -0400
commitb7621b2a081c2ac2c1c54070f6e88f774fe4b6b1 (patch)
tree9ca03cdb13924df4cf35b48070fe1a05f0a81195
parent621da7d93ceca260c2a95ca240e58f08fe30b1dc (diff)
drm/msm/mdp5: Add optional 'right' Layer Mixer in CRTC state
Add another mdp5_hw_mixer pointer (r_mixer) in mdp5_crtc_state. This mixer will be used to generate the right half of the scanout. With Source Split, a SSPP can now be connected to 2 Layer Mixers, but has to be at the same blend level (stage #) on both Layer Mixers. A drm_plane that has a lesser width than the max width supported, will comprise of a single SSPP/hwpipe, staged on both the Layer Mixers at the same blend level. A plane that is greater than max width will comprise of 2 SSPPs, with the 'left' SSPP staged on the left LM, and the 'right' SSPP staged on the right LM at the same blend level. For now, the drm_plane consists of only one SSPP, therefore, it needs to be staged on both the LMs in blend_setup() and mdp5_ctl_blend(). We'll extend this logic to support 2 hwpipes per plane later. The crtc cursor ops (using the LM cursors, not SSPP cursors) simply return an error if they're called when the right mixer is assigned to the CRTC state. With source split is enabled, we're expected to only SSPP cursors. This commit adds code that configures the right mixer, but the r_mixer itself isn't assigned at the moment. Signed-off-by: Archit Taneja <architt@codeaurora.org> Signed-off-by: Rob Clark <robdclark@gmail.com>
-rw-r--r--drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c62
-rw-r--r--drivers/gpu/drm/msm/mdp/mdp5/mdp5_ctl.c44
-rw-r--r--drivers/gpu/drm/msm/mdp/mdp5/mdp5_ctl.h7
-rw-r--r--drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.h1
4 files changed, 103 insertions, 11 deletions
diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
index 03a64bd39f22..82827f3e2a47 100644
--- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
+++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
@@ -105,7 +105,7 @@ static u32 crtc_flush(struct drm_crtc *crtc, u32 flush_mask)
105static u32 crtc_flush_all(struct drm_crtc *crtc) 105static u32 crtc_flush_all(struct drm_crtc *crtc)
106{ 106{
107 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); 107 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state);
108 struct mdp5_hw_mixer *mixer; 108 struct mdp5_hw_mixer *mixer, *r_mixer;
109 struct drm_plane *plane; 109 struct drm_plane *plane;
110 uint32_t flush_mask = 0; 110 uint32_t flush_mask = 0;
111 111
@@ -120,6 +120,10 @@ static u32 crtc_flush_all(struct drm_crtc *crtc)
120 mixer = mdp5_cstate->pipeline.mixer; 120 mixer = mdp5_cstate->pipeline.mixer;
121 flush_mask |= mdp_ctl_flush_mask_lm(mixer->lm); 121 flush_mask |= mdp_ctl_flush_mask_lm(mixer->lm);
122 122
123 r_mixer = mdp5_cstate->pipeline.r_mixer;
124 if (r_mixer)
125 flush_mask |= mdp_ctl_flush_mask_lm(r_mixer->lm);
126
123 return crtc_flush(crtc, flush_mask); 127 return crtc_flush(crtc, flush_mask);
124} 128}
125 129
@@ -145,7 +149,7 @@ static void complete_flip(struct drm_crtc *crtc, struct drm_file *file)
145 149
146 if (ctl && !crtc->state->enable) { 150 if (ctl && !crtc->state->enable) {
147 /* set STAGE_UNUSED for all layers */ 151 /* set STAGE_UNUSED for all layers */
148 mdp5_ctl_blend(ctl, pipeline, NULL, 0, 0); 152 mdp5_ctl_blend(ctl, pipeline, NULL, NULL, 0, 0);
149 /* XXX: What to do here? */ 153 /* XXX: What to do here? */
150 /* mdp5_crtc->ctl = NULL; */ 154 /* mdp5_crtc->ctl = NULL; */
151 } 155 }
@@ -187,6 +191,12 @@ static inline u32 mdp5_lm_use_fg_alpha_mask(enum mdp_mixer_stage_id stage)
187} 191}
188 192
189/* 193/*
194 * left/right pipe offsets for the stage array used in blend_setup()
195 */
196#define PIPE_LEFT 0
197#define PIPE_RIGHT 1
198
199/*
190 * blend_setup() - blend all the planes of a CRTC 200 * blend_setup() - blend all the planes of a CRTC
191 * 201 *
192 * If no base layer is available, border will be enabled as the base layer. 202 * If no base layer is available, border will be enabled as the base layer.
@@ -205,10 +215,13 @@ static void blend_setup(struct drm_crtc *crtc)
205 const struct mdp_format *format; 215 const struct mdp_format *format;
206 struct mdp5_hw_mixer *mixer = pipeline->mixer; 216 struct mdp5_hw_mixer *mixer = pipeline->mixer;
207 uint32_t lm = mixer->lm; 217 uint32_t lm = mixer->lm;
218 struct mdp5_hw_mixer *r_mixer = pipeline->r_mixer;
219 uint32_t r_lm = r_mixer ? r_mixer->lm : 0;
208 struct mdp5_ctl *ctl = mdp5_cstate->ctl; 220 struct mdp5_ctl *ctl = mdp5_cstate->ctl;
209 uint32_t blend_op, fg_alpha, bg_alpha, ctl_blend_flags = 0; 221 uint32_t blend_op, fg_alpha, bg_alpha, ctl_blend_flags = 0;
210 unsigned long flags; 222 unsigned long flags;
211 enum mdp5_pipe stage[STAGE_MAX + 1] = { SSPP_NONE }; 223 enum mdp5_pipe stage[STAGE_MAX + 1][MAX_PIPE_STAGE] = { SSPP_NONE };
224 enum mdp5_pipe r_stage[STAGE_MAX + 1][MAX_PIPE_STAGE] = { SSPP_NONE };
212 int i, plane_cnt = 0; 225 int i, plane_cnt = 0;
213 bool bg_alpha_enabled = false; 226 bool bg_alpha_enabled = false;
214 u32 mixer_op_mode = 0; 227 u32 mixer_op_mode = 0;
@@ -227,7 +240,15 @@ static void blend_setup(struct drm_crtc *crtc)
227 drm_atomic_crtc_for_each_plane(plane, crtc) { 240 drm_atomic_crtc_for_each_plane(plane, crtc) {
228 pstate = to_mdp5_plane_state(plane->state); 241 pstate = to_mdp5_plane_state(plane->state);
229 pstates[pstate->stage] = pstate; 242 pstates[pstate->stage] = pstate;
230 stage[pstate->stage] = mdp5_plane_pipe(plane); 243 stage[pstate->stage][PIPE_LEFT] = mdp5_plane_pipe(plane);
244 /*
245 * if we have a right mixer, stage the same pipe as we
246 * have on the left mixer
247 */
248 if (r_mixer)
249 r_stage[pstate->stage][PIPE_LEFT] =
250 mdp5_plane_pipe(plane);
251
231 plane_cnt++; 252 plane_cnt++;
232 } 253 }
233 254
@@ -293,12 +314,23 @@ static void blend_setup(struct drm_crtc *crtc)
293 blender(i)), fg_alpha); 314 blender(i)), fg_alpha);
294 mdp5_write(mdp5_kms, REG_MDP5_LM_BLEND_BG_ALPHA(lm, 315 mdp5_write(mdp5_kms, REG_MDP5_LM_BLEND_BG_ALPHA(lm,
295 blender(i)), bg_alpha); 316 blender(i)), bg_alpha);
317 if (r_mixer) {
318 mdp5_write(mdp5_kms, REG_MDP5_LM_BLEND_OP_MODE(r_lm,
319 blender(i)), blend_op);
320 mdp5_write(mdp5_kms, REG_MDP5_LM_BLEND_FG_ALPHA(r_lm,
321 blender(i)), fg_alpha);
322 mdp5_write(mdp5_kms, REG_MDP5_LM_BLEND_BG_ALPHA(r_lm,
323 blender(i)), bg_alpha);
324 }
296 } 325 }
297 326
298 mdp5_write(mdp5_kms, REG_MDP5_LM_BLEND_COLOR_OUT(lm), mixer_op_mode); 327 mdp5_write(mdp5_kms, REG_MDP5_LM_BLEND_COLOR_OUT(lm), mixer_op_mode);
328 if (r_mixer)
329 mdp5_write(mdp5_kms, REG_MDP5_LM_BLEND_COLOR_OUT(r_lm),
330 mixer_op_mode);
299 331
300 mdp5_ctl_blend(ctl, pipeline, stage, plane_cnt, ctl_blend_flags); 332 mdp5_ctl_blend(ctl, pipeline, stage, r_stage, plane_cnt,
301 333 ctl_blend_flags);
302out: 334out:
303 spin_unlock_irqrestore(&mdp5_crtc->lm_lock, flags); 335 spin_unlock_irqrestore(&mdp5_crtc->lm_lock, flags);
304} 336}
@@ -309,6 +341,7 @@ static void mdp5_crtc_mode_set_nofb(struct drm_crtc *crtc)
309 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); 341 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state);
310 struct mdp5_kms *mdp5_kms = get_kms(crtc); 342 struct mdp5_kms *mdp5_kms = get_kms(crtc);
311 struct mdp5_hw_mixer *mixer = mdp5_cstate->pipeline.mixer; 343 struct mdp5_hw_mixer *mixer = mdp5_cstate->pipeline.mixer;
344 struct mdp5_hw_mixer *r_mixer = mdp5_cstate->pipeline.r_mixer;
312 uint32_t lm = mixer->lm; 345 uint32_t lm = mixer->lm;
313 unsigned long flags; 346 unsigned long flags;
314 struct drm_display_mode *mode; 347 struct drm_display_mode *mode;
@@ -331,6 +364,10 @@ static void mdp5_crtc_mode_set_nofb(struct drm_crtc *crtc)
331 mdp5_write(mdp5_kms, REG_MDP5_LM_OUT_SIZE(lm), 364 mdp5_write(mdp5_kms, REG_MDP5_LM_OUT_SIZE(lm),
332 MDP5_LM_OUT_SIZE_WIDTH(mode->hdisplay) | 365 MDP5_LM_OUT_SIZE_WIDTH(mode->hdisplay) |
333 MDP5_LM_OUT_SIZE_HEIGHT(mode->vdisplay)); 366 MDP5_LM_OUT_SIZE_HEIGHT(mode->vdisplay));
367 if (r_mixer)
368 mdp5_write(mdp5_kms, REG_MDP5_LM_OUT_SIZE(r_mixer->lm),
369 MDP5_LM_OUT_SIZE_WIDTH(mode->hdisplay) |
370 MDP5_LM_OUT_SIZE_HEIGHT(mode->vdisplay));
334 spin_unlock_irqrestore(&mdp5_crtc->lm_lock, flags); 371 spin_unlock_irqrestore(&mdp5_crtc->lm_lock, flags);
335} 372}
336 373
@@ -612,6 +649,10 @@ static int mdp5_crtc_cursor_set(struct drm_crtc *crtc,
612 if (!ctl) 649 if (!ctl)
613 return -EINVAL; 650 return -EINVAL;
614 651
652 /* don't support LM cursors when we we have source split enabled */
653 if (mdp5_cstate->pipeline.r_mixer)
654 return -EINVAL;
655
615 if (!handle) { 656 if (!handle) {
616 DBG("Cursor off"); 657 DBG("Cursor off");
617 cursor_enable = false; 658 cursor_enable = false;
@@ -685,6 +726,10 @@ static int mdp5_crtc_cursor_move(struct drm_crtc *crtc, int x, int y)
685 uint32_t roi_h; 726 uint32_t roi_h;
686 unsigned long flags; 727 unsigned long flags;
687 728
729 /* don't support LM cursors when we we have source split enabled */
730 if (mdp5_cstate->pipeline.r_mixer)
731 return -EINVAL;
732
688 /* In case the CRTC is disabled, just drop the cursor update */ 733 /* In case the CRTC is disabled, just drop the cursor update */
689 if (unlikely(!crtc->state->enable)) 734 if (unlikely(!crtc->state->enable))
690 return 0; 735 return 0;
@@ -714,12 +759,17 @@ mdp5_crtc_atomic_print_state(struct drm_printer *p,
714{ 759{
715 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(state); 760 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(state);
716 struct mdp5_pipeline *pipeline = &mdp5_cstate->pipeline; 761 struct mdp5_pipeline *pipeline = &mdp5_cstate->pipeline;
762 struct mdp5_kms *mdp5_kms = get_kms(state->crtc);
717 763
718 if (WARN_ON(!pipeline)) 764 if (WARN_ON(!pipeline))
719 return; 765 return;
720 766
721 drm_printf(p, "\thwmixer=%s\n", pipeline->mixer ? 767 drm_printf(p, "\thwmixer=%s\n", pipeline->mixer ?
722 pipeline->mixer->name : "(null)"); 768 pipeline->mixer->name : "(null)");
769
770 if (mdp5_kms->caps & MDP_CAP_SRC_SPLIT)
771 drm_printf(p, "\tright hwmixer=%s\n", pipeline->r_mixer ?
772 pipeline->r_mixer->name : "(null)");
723} 773}
724 774
725static void mdp5_crtc_reset(struct drm_crtc *crtc) 775static void mdp5_crtc_reset(struct drm_crtc *crtc)
diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_ctl.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_ctl.c
index 9a0109410974..1fdbb936877f 100644
--- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_ctl.c
+++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_ctl.c
@@ -172,9 +172,12 @@ int mdp5_ctl_set_pipeline(struct mdp5_ctl *ctl, struct mdp5_pipeline *pipeline)
172 struct mdp5_kms *mdp5_kms = get_kms(ctl_mgr); 172 struct mdp5_kms *mdp5_kms = get_kms(ctl_mgr);
173 struct mdp5_interface *intf = pipeline->intf; 173 struct mdp5_interface *intf = pipeline->intf;
174 struct mdp5_hw_mixer *mixer = pipeline->mixer; 174 struct mdp5_hw_mixer *mixer = pipeline->mixer;
175 struct mdp5_hw_mixer *r_mixer = pipeline->r_mixer;
175 176
176 ctl->start_mask = mdp_ctl_flush_mask_lm(mixer->lm) | 177 ctl->start_mask = mdp_ctl_flush_mask_lm(mixer->lm) |
177 mdp_ctl_flush_mask_encoder(intf); 178 mdp_ctl_flush_mask_encoder(intf);
179 if (r_mixer)
180 ctl->start_mask |= mdp_ctl_flush_mask_lm(r_mixer->lm);
178 181
179 /* Virtual interfaces need not set a display intf (e.g.: Writeback) */ 182 /* Virtual interfaces need not set a display intf (e.g.: Writeback) */
180 if (!mdp5_cfg_intf_is_virtual(intf->type)) 183 if (!mdp5_cfg_intf_is_virtual(intf->type))
@@ -224,8 +227,11 @@ static void refill_start_mask(struct mdp5_ctl *ctl,
224{ 227{
225 struct mdp5_interface *intf = pipeline->intf; 228 struct mdp5_interface *intf = pipeline->intf;
226 struct mdp5_hw_mixer *mixer = pipeline->mixer; 229 struct mdp5_hw_mixer *mixer = pipeline->mixer;
230 struct mdp5_hw_mixer *r_mixer = pipeline->r_mixer;
227 231
228 ctl->start_mask = mdp_ctl_flush_mask_lm(mixer->lm); 232 ctl->start_mask = mdp_ctl_flush_mask_lm(mixer->lm);
233 if (r_mixer)
234 ctl->start_mask |= mdp_ctl_flush_mask_lm(r_mixer->lm);
229 235
230 /* 236 /*
231 * Writeback encoder needs to program & flush 237 * Writeback encoder needs to program & flush
@@ -282,6 +288,11 @@ int mdp5_ctl_set_cursor(struct mdp5_ctl *ctl, struct mdp5_pipeline *pipeline,
282 return -EINVAL; 288 return -EINVAL;
283 } 289 }
284 290
291 if (pipeline->r_mixer) {
292 dev_err(ctl_mgr->dev->dev, "unsupported configuration");
293 return -EINVAL;
294 }
295
285 spin_lock_irqsave(&ctl->hw_lock, flags); 296 spin_lock_irqsave(&ctl->hw_lock, flags);
286 297
287 blend_cfg = ctl_read(ctl, REG_MDP5_CTL_LAYER_REG(ctl->id, mixer->lm)); 298 blend_cfg = ctl_read(ctl, REG_MDP5_CTL_LAYER_REG(ctl->id, mixer->lm));
@@ -344,24 +355,40 @@ static u32 mdp_ctl_blend_ext_mask(enum mdp5_pipe pipe,
344 } 355 }
345} 356}
346 357
358#define PIPE_LEFT 0
359#define PIPE_RIGHT 1
347int mdp5_ctl_blend(struct mdp5_ctl *ctl, struct mdp5_pipeline *pipeline, 360int mdp5_ctl_blend(struct mdp5_ctl *ctl, struct mdp5_pipeline *pipeline,
348 enum mdp5_pipe *stage, u32 stage_cnt, u32 ctl_blend_op_flags) 361 enum mdp5_pipe stage[][MAX_PIPE_STAGE],
362 enum mdp5_pipe r_stage[][MAX_PIPE_STAGE],
363 u32 stage_cnt, u32 ctl_blend_op_flags)
349{ 364{
350 struct mdp5_hw_mixer *mixer = pipeline->mixer; 365 struct mdp5_hw_mixer *mixer = pipeline->mixer;
366 struct mdp5_hw_mixer *r_mixer = pipeline->r_mixer;
351 unsigned long flags; 367 unsigned long flags;
352 u32 blend_cfg = 0, blend_ext_cfg = 0; 368 u32 blend_cfg = 0, blend_ext_cfg = 0;
369 u32 r_blend_cfg = 0, r_blend_ext_cfg = 0;
353 int i, start_stage; 370 int i, start_stage;
354 371
355 if (ctl_blend_op_flags & MDP5_CTL_BLEND_OP_FLAG_BORDER_OUT) { 372 if (ctl_blend_op_flags & MDP5_CTL_BLEND_OP_FLAG_BORDER_OUT) {
356 start_stage = STAGE0; 373 start_stage = STAGE0;
357 blend_cfg |= MDP5_CTL_LAYER_REG_BORDER_COLOR; 374 blend_cfg |= MDP5_CTL_LAYER_REG_BORDER_COLOR;
375 if (r_mixer)
376 r_blend_cfg |= MDP5_CTL_LAYER_REG_BORDER_COLOR;
358 } else { 377 } else {
359 start_stage = STAGE_BASE; 378 start_stage = STAGE_BASE;
360 } 379 }
361 380
362 for (i = start_stage; stage_cnt && i <= STAGE_MAX; i++) { 381 for (i = start_stage; stage_cnt && i <= STAGE_MAX; i++) {
363 blend_cfg |= mdp_ctl_blend_mask(stage[i], i); 382 blend_cfg |=
364 blend_ext_cfg |= mdp_ctl_blend_ext_mask(stage[i], i); 383 mdp_ctl_blend_mask(stage[i][PIPE_LEFT], i);
384 blend_ext_cfg |=
385 mdp_ctl_blend_ext_mask(stage[i][PIPE_LEFT], i);
386 if (r_mixer) {
387 r_blend_cfg |=
388 mdp_ctl_blend_mask(r_stage[i][PIPE_LEFT], i);
389 r_blend_ext_cfg |=
390 mdp_ctl_blend_ext_mask(r_stage[i][PIPE_LEFT], i);
391 }
365 } 392 }
366 393
367 spin_lock_irqsave(&ctl->hw_lock, flags); 394 spin_lock_irqsave(&ctl->hw_lock, flags);
@@ -371,12 +398,23 @@ int mdp5_ctl_blend(struct mdp5_ctl *ctl, struct mdp5_pipeline *pipeline,
371 ctl_write(ctl, REG_MDP5_CTL_LAYER_REG(ctl->id, mixer->lm), blend_cfg); 398 ctl_write(ctl, REG_MDP5_CTL_LAYER_REG(ctl->id, mixer->lm), blend_cfg);
372 ctl_write(ctl, REG_MDP5_CTL_LAYER_EXT_REG(ctl->id, mixer->lm), 399 ctl_write(ctl, REG_MDP5_CTL_LAYER_EXT_REG(ctl->id, mixer->lm),
373 blend_ext_cfg); 400 blend_ext_cfg);
401 if (r_mixer) {
402 ctl_write(ctl, REG_MDP5_CTL_LAYER_REG(ctl->id, r_mixer->lm),
403 r_blend_cfg);
404 ctl_write(ctl, REG_MDP5_CTL_LAYER_EXT_REG(ctl->id, r_mixer->lm),
405 r_blend_ext_cfg);
406 }
374 spin_unlock_irqrestore(&ctl->hw_lock, flags); 407 spin_unlock_irqrestore(&ctl->hw_lock, flags);
375 408
376 ctl->pending_ctl_trigger = mdp_ctl_flush_mask_lm(mixer->lm); 409 ctl->pending_ctl_trigger = mdp_ctl_flush_mask_lm(mixer->lm);
410 if (r_mixer)
411 ctl->pending_ctl_trigger |= mdp_ctl_flush_mask_lm(r_mixer->lm);
377 412
378 DBG("lm%d: blend config = 0x%08x. ext_cfg = 0x%08x", mixer->lm, 413 DBG("lm%d: blend config = 0x%08x. ext_cfg = 0x%08x", mixer->lm,
379 blend_cfg, blend_ext_cfg); 414 blend_cfg, blend_ext_cfg);
415 if (r_mixer)
416 DBG("lm%d: blend config = 0x%08x. ext_cfg = 0x%08x",
417 r_mixer->lm, r_blend_cfg, r_blend_ext_cfg);
380 418
381 return 0; 419 return 0;
382} 420}
diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_ctl.h b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_ctl.h
index 751dd861cfd8..b63120388dc6 100644
--- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_ctl.h
+++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_ctl.h
@@ -46,6 +46,8 @@ int mdp5_ctl_set_cursor(struct mdp5_ctl *ctl, struct mdp5_pipeline *pipeline,
46 int cursor_id, bool enable); 46 int cursor_id, bool enable);
47int mdp5_ctl_pair(struct mdp5_ctl *ctlx, struct mdp5_ctl *ctly, bool enable); 47int mdp5_ctl_pair(struct mdp5_ctl *ctlx, struct mdp5_ctl *ctly, bool enable);
48 48
49#define MAX_PIPE_STAGE 2
50
49/* 51/*
50 * mdp5_ctl_blend() - Blend multiple layers on a Layer Mixer (LM) 52 * mdp5_ctl_blend() - Blend multiple layers on a Layer Mixer (LM)
51 * 53 *
@@ -59,8 +61,9 @@ int mdp5_ctl_pair(struct mdp5_ctl *ctlx, struct mdp5_ctl *ctly, bool enable);
59 */ 61 */
60#define MDP5_CTL_BLEND_OP_FLAG_BORDER_OUT BIT(0) 62#define MDP5_CTL_BLEND_OP_FLAG_BORDER_OUT BIT(0)
61int mdp5_ctl_blend(struct mdp5_ctl *ctl, struct mdp5_pipeline *pipeline, 63int mdp5_ctl_blend(struct mdp5_ctl *ctl, struct mdp5_pipeline *pipeline,
62 enum mdp5_pipe *stage, u32 stage_cnt, 64 enum mdp5_pipe stage[][MAX_PIPE_STAGE],
63 u32 ctl_blend_op_flags); 65 enum mdp5_pipe r_stage[][MAX_PIPE_STAGE],
66 u32 stage_cnt, u32 ctl_blend_op_flags);
64 67
65/** 68/**
66 * mdp_ctl_flush_mask...() - Register FLUSH masks 69 * mdp_ctl_flush_mask...() - Register FLUSH masks
diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.h b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.h
index fcd067f65a93..d68e92d71afe 100644
--- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.h
+++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.h
@@ -119,6 +119,7 @@ struct mdp5_plane_state {
119struct mdp5_pipeline { 119struct mdp5_pipeline {
120 struct mdp5_interface *intf; 120 struct mdp5_interface *intf;
121 struct mdp5_hw_mixer *mixer; 121 struct mdp5_hw_mixer *mixer;
122 struct mdp5_hw_mixer *r_mixer; /* right mixer */
122}; 123};
123 124
124struct mdp5_crtc_state { 125struct mdp5_crtc_state {