drm/msm/mdp5: Add more stuff to CRTC state
authorArchit Taneja <architt@codeaurora.org>
Thu, 23 Mar 2017 10:28:04 +0000 (15:58 +0530)
committerRob Clark <robdclark@gmail.com>
Sat, 8 Apr 2017 10:59:34 +0000 (06:59 -0400)
Things like vblank/err irq masks, mode of operation (command mode or not)
are derivative of the interface and mixer state. Therefore, they need to
be a part of the CRTC state too.

Add them to mdp5_crtc_state, and assign them in the CRTC's atomic_check()
func, so that it can be rolled back to a clean state.

Signed-off-by: Archit Taneja <architt@codeaurora.org>
Signed-off-by: Rob Clark <robdclark@gmail.com>
drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.h

index 9cfad3d..7913e93 100644 (file)
@@ -373,6 +373,7 @@ int mdp5_crtc_setup_pipeline(struct drm_crtc *crtc,
        struct mdp5_crtc_state *mdp5_cstate =
                        to_mdp5_crtc_state(new_crtc_state);
        struct mdp5_pipeline *pipeline = &mdp5_cstate->pipeline;
+       struct mdp5_interface *intf;
        bool new_mixer = false;
 
        new_mixer = !pipeline->mixer;
@@ -388,6 +389,24 @@ int mdp5_crtc_setup_pipeline(struct drm_crtc *crtc,
                mdp5_mixer_release(new_crtc_state->state, old_mixer);
        }
 
+       /*
+        * these should have been already set up in the encoder's atomic
+        * check (called by drm_atomic_helper_check_modeset)
+        */
+       intf = pipeline->intf;
+
+       mdp5_cstate->err_irqmask = intf2err(intf->num);
+       mdp5_cstate->vblank_irqmask = intf2vblank(pipeline->mixer, intf);
+
+       if ((intf->type == INTF_DSI) &&
+           (intf->mode == MDP5_INTF_DSI_MODE_COMMAND)) {
+               mdp5_cstate->pp_done_irqmask = lm2ppdone(pipeline->mixer);
+               mdp5_cstate->cmd_mode = true;
+       } else {
+               mdp5_cstate->pp_done_irqmask = 0;
+               mdp5_cstate->cmd_mode = false;
+       }
+
        return 0;
 }
 
index 35f3c30..35a21e6 100644 (file)
@@ -126,6 +126,13 @@ struct mdp5_crtc_state {
 
        struct mdp5_ctl *ctl;
        struct mdp5_pipeline pipeline;
+
+       /* these are derivatives of intf/mixer state in mdp5_pipeline */
+       u32 vblank_irqmask;
+       u32 err_irqmask;
+       u32 pp_done_irqmask;
+
+       bool cmd_mode;
 };
 #define to_mdp5_crtc_state(x) \
                container_of(x, struct mdp5_crtc_state, base)