aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephane Viau <sviau@codeaurora.org>2015-01-27 11:35:56 -0500
committerRob Clark <robdclark@gmail.com>2015-04-01 19:29:33 -0400
commita73f3382dae242261338588d8411057938501701 (patch)
tree810e2ff10da3a12bcfc160a3598dd72862fa34e2
parent034c5150ae8777265f5beae257f8e7f2721ebccc (diff)
drm/msm/mdp5: only flush on a CRTC ->atomic_flush()
MDP5 hardware has some limitation and requires to avoid flushing registers more than once between two Vblanks. This change removes all FLUSH operations (except for HW cursor) beside the one coming from a CRTC's ->atomic_flush(). This avoid this type of behavior (eg: CRTC + 1 plane overlay): [drm:mdp5_crtc_vblank_irq] vblank [drm:mdp5_ctl_commit] flush (20048) CTL + LM0 + RGB0 [drm:mdp5_ctl_commit] flush (20040) CTL + LM0 [drm:mdp5_crtc_vblank_irq] blank [drm:mdp5_ctl_commit] flush (20049) CTL + LM0 + RGB0 + VIG0 [drm:mdp5_crtc_vblank_irq] blank and replaces it by: [drm:mdp5_crtc_vblank_irq] vblank [drm:mdp5_ctl_commit] flush (20048) CTL + LM0 + RGB0 [drm:mdp5_crtc_vblank_irq] blank [drm:mdp5_ctl_commit] flush (20049) CTL + LM0 + RGB0 + VIG0 [drm:mdp5_crtc_vblank_irq] blank Only *one* FLUSH is called between Vblanks interrupts. Signed-off-by: Stephane Viau <sviau@codeaurora.org> Signed-off-by: Rob Clark <robdclark@gmail.com>
-rw-r--r--drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c7
1 files changed, 0 insertions, 7 deletions
diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
index 2f2863cf8b45..bfba236daaa6 100644
--- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
+++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
@@ -298,8 +298,6 @@ static void mdp5_crtc_enable(struct drm_crtc *crtc)
298 mdp5_enable(mdp5_kms); 298 mdp5_enable(mdp5_kms);
299 mdp_irq_register(&mdp5_kms->base, &mdp5_crtc->err); 299 mdp_irq_register(&mdp5_kms->base, &mdp5_crtc->err);
300 300
301 crtc_flush_all(crtc);
302
303 mdp5_crtc->enabled = true; 301 mdp5_crtc->enabled = true;
304} 302}
305 303
@@ -618,7 +616,6 @@ void mdp5_crtc_set_intf(struct drm_crtc *crtc, int intf,
618{ 616{
619 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); 617 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc);
620 struct mdp5_kms *mdp5_kms = get_kms(crtc); 618 struct mdp5_kms *mdp5_kms = get_kms(crtc);
621 uint32_t flush_mask = 0;
622 uint32_t intf_sel; 619 uint32_t intf_sel;
623 unsigned long flags; 620 unsigned long flags;
624 621
@@ -657,10 +654,6 @@ void mdp5_crtc_set_intf(struct drm_crtc *crtc, int intf,
657 654
658 DBG("%s: intf_sel=%08x", mdp5_crtc->name, intf_sel); 655 DBG("%s: intf_sel=%08x", mdp5_crtc->name, intf_sel);
659 mdp5_ctl_set_intf(mdp5_crtc->ctl, intf); 656 mdp5_ctl_set_intf(mdp5_crtc->ctl, intf);
660 flush_mask |= mdp5_ctl_get_flush(mdp5_crtc->ctl);
661 flush_mask |= mdp5_lm_get_flush(mdp5_crtc->lm);
662
663 crtc_flush(crtc, flush_mask);
664} 657}
665 658
666int mdp5_crtc_get_lm(struct drm_crtc *crtc) 659int mdp5_crtc_get_lm(struct drm_crtc *crtc)