Merge drm/drm-next into drm-intel-next-queued
[sfrench/cifs-2.6.git] / drivers / gpu / drm / i915 / display / intel_display.c
index 346846609f45c9aa522be701d3aaddfb3484d10d..af5b4055b38a9c3e36ac6b4b9f2c1c941c8ef503 100644 (file)
@@ -525,7 +525,7 @@ skl_wa_827(struct drm_i915_private *dev_priv, enum pipe pipe, bool enable)
                               intel_de_read(dev_priv, CLKGATE_DIS_PSL(pipe)) & ~(DUPS1_GATING_DIS | DUPS2_GATING_DIS));
 }
 
-/* Wa_2006604312:icl */
+/* Wa_2006604312:icl,ehl */
 static void
 icl_wa_scalerclkgating(struct drm_i915_private *dev_priv, enum pipe pipe,
                       bool enable)
@@ -544,17 +544,23 @@ needs_modeset(const struct intel_crtc_state *state)
        return drm_atomic_crtc_needs_modeset(&state->uapi);
 }
 
-bool
-is_trans_port_sync_mode(const struct intel_crtc_state *crtc_state)
+static bool
+is_trans_port_sync_slave(const struct intel_crtc_state *crtc_state)
 {
-       return (crtc_state->master_transcoder != INVALID_TRANSCODER ||
-               crtc_state->sync_mode_slaves_mask);
+       return crtc_state->master_transcoder != INVALID_TRANSCODER;
 }
 
 static bool
-is_trans_port_sync_slave(const struct intel_crtc_state *crtc_state)
+is_trans_port_sync_master(const struct intel_crtc_state *crtc_state)
 {
-       return crtc_state->master_transcoder != INVALID_TRANSCODER;
+       return crtc_state->sync_mode_slaves_mask != 0;
+}
+
+bool
+is_trans_port_sync_mode(const struct intel_crtc_state *crtc_state)
+{
+       return is_trans_port_sync_master(crtc_state) ||
+               is_trans_port_sync_slave(crtc_state);
 }
 
 /*
@@ -620,45 +626,43 @@ int chv_calc_dpll_params(int refclk, struct dpll *clock)
        return clock->dot / 5;
 }
 
-#define INTELPllInvalid(s)   do { /* DRM_DEBUG(s); */ return false; } while (0)
-
 /*
  * Returns whether the given set of divisors are valid for a given refclk with
  * the given connectors.
  */
-static bool intel_PLL_is_valid(struct drm_i915_private *dev_priv,
+static bool intel_pll_is_valid(struct drm_i915_private *dev_priv,
                               const struct intel_limit *limit,
                               const struct dpll *clock)
 {
-       if (clock->n   < limit->n.min   || limit->n.max   < clock->n)
-               INTELPllInvalid("n out of range\n");
-       if (clock->p1  < limit->p1.min  || limit->p1.max  < clock->p1)
-               INTELPllInvalid("p1 out of range\n");
-       if (clock->m2  < limit->m2.min  || limit->m2.max  < clock->m2)
-               INTELPllInvalid("m2 out of range\n");
-       if (clock->m1  < limit->m1.min  || limit->m1.max  < clock->m1)
-               INTELPllInvalid("m1 out of range\n");
+       if (clock->n < limit->n.min || limit->n.max < clock->n)
+               return false;
+       if (clock->p1 < limit->p1.min || limit->p1.max < clock->p1)
+               return false;
+       if (clock->m2 < limit->m2.min || limit->m2.max < clock->m2)
+               return false;
+       if (clock->m1 < limit->m1.min || limit->m1.max < clock->m1)
+               return false;
 
        if (!IS_PINEVIEW(dev_priv) && !IS_VALLEYVIEW(dev_priv) &&
            !IS_CHERRYVIEW(dev_priv) && !IS_GEN9_LP(dev_priv))
                if (clock->m1 <= clock->m2)
-                       INTELPllInvalid("m1 <= m2\n");
+                       return false;
 
        if (!IS_VALLEYVIEW(dev_priv) && !IS_CHERRYVIEW(dev_priv) &&
            !IS_GEN9_LP(dev_priv)) {
                if (clock->p < limit->p.min || limit->p.max < clock->p)
-                       INTELPllInvalid("p out of range\n");
+                       return false;
                if (clock->m < limit->m.min || limit->m.max < clock->m)
-                       INTELPllInvalid("m out of range\n");
+                       return false;
        }
 
        if (clock->vco < limit->vco.min || limit->vco.max < clock->vco)
-               INTELPllInvalid("vco out of range\n");
+               return false;
        /* XXX: We may need to be checking "Dot clock" depending on the multiplier,
         * connector, etc., rather than just a single range.
         */
        if (clock->dot < limit->dot.min || limit->dot.max < clock->dot)
-               INTELPllInvalid("dot out of range\n");
+               return false;
 
        return true;
 }
@@ -725,7 +729,7 @@ i9xx_find_best_dpll(const struct intel_limit *limit,
                                        int this_err;
 
                                        i9xx_calc_dpll_params(refclk, &clock);
-                                       if (!intel_PLL_is_valid(to_i915(dev),
+                                       if (!intel_pll_is_valid(to_i915(dev),
                                                                limit,
                                                                &clock))
                                                continue;
@@ -781,7 +785,7 @@ pnv_find_best_dpll(const struct intel_limit *limit,
                                        int this_err;
 
                                        pnv_calc_dpll_params(refclk, &clock);
-                                       if (!intel_PLL_is_valid(to_i915(dev),
+                                       if (!intel_pll_is_valid(to_i915(dev),
                                                                limit,
                                                                &clock))
                                                continue;
@@ -842,7 +846,7 @@ g4x_find_best_dpll(const struct intel_limit *limit,
                                        int this_err;
 
                                        i9xx_calc_dpll_params(refclk, &clock);
-                                       if (!intel_PLL_is_valid(to_i915(dev),
+                                       if (!intel_pll_is_valid(to_i915(dev),
                                                                limit,
                                                                &clock))
                                                continue;
@@ -939,7 +943,7 @@ vlv_find_best_dpll(const struct intel_limit *limit,
 
                                        vlv_calc_dpll_params(refclk, &clock);
 
-                                       if (!intel_PLL_is_valid(to_i915(dev),
+                                       if (!intel_pll_is_valid(to_i915(dev),
                                                                limit,
                                                                &clock))
                                                continue;
@@ -1008,7 +1012,7 @@ chv_find_best_dpll(const struct intel_limit *limit,
 
                        chv_calc_dpll_params(refclk, &clock);
 
-                       if (!intel_PLL_is_valid(to_i915(dev), limit, &clock))
+                       if (!intel_pll_is_valid(to_i915(dev), limit, &clock))
                                continue;
 
                        if (!vlv_PLL_is_optimal(dev, target, &clock, best_clock,
@@ -2910,6 +2914,7 @@ intel_fb_plane_get_subsampling(int *hsub, int *vsub,
 static int
 intel_fb_check_ccs_xy(struct drm_framebuffer *fb, int ccs_plane, int x, int y)
 {
+       struct drm_i915_private *i915 = to_i915(fb->dev);
        struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
        int main_plane;
        int hsub, vsub;
@@ -2938,7 +2943,8 @@ intel_fb_check_ccs_xy(struct drm_framebuffer *fb, int ccs_plane, int x, int y)
         * x/y offsets must match between CCS and the main surface.
         */
        if (main_x != ccs_x || main_y != ccs_y) {
-               DRM_DEBUG_KMS("Bad CCS x/y (main %d,%d ccs %d,%d) full (main %d,%d ccs %d,%d)\n",
+               drm_dbg_kms(&i915->drm,
+                             "Bad CCS x/y (main %d,%d ccs %d,%d) full (main %d,%d ccs %d,%d)\n",
                              main_x, main_y,
                              ccs_x, ccs_y,
                              intel_fb->normal[main_plane].x,
@@ -3336,6 +3342,8 @@ int skl_format_to_fourcc(int format, bool rgb_order, bool alpha)
                return DRM_FORMAT_RGB565;
        case PLANE_CTL_FORMAT_NV12:
                return DRM_FORMAT_NV12;
+       case PLANE_CTL_FORMAT_XYUV:
+               return DRM_FORMAT_XYUV8888;
        case PLANE_CTL_FORMAT_P010:
                return DRM_FORMAT_P010;
        case PLANE_CTL_FORMAT_P012:
@@ -4580,6 +4588,8 @@ static u32 skl_plane_ctl_format(u32 pixel_format)
        case DRM_FORMAT_XRGB16161616F:
        case DRM_FORMAT_ARGB16161616F:
                return PLANE_CTL_FORMAT_XRGB_16161616F;
+       case DRM_FORMAT_XYUV8888:
+               return PLANE_CTL_FORMAT_XYUV;
        case DRM_FORMAT_YUYV:
                return PLANE_CTL_FORMAT_YUV422 | PLANE_CTL_YUV422_YUYV;
        case DRM_FORMAT_YVYU:
@@ -4998,37 +5008,6 @@ static void icl_set_pipe_chicken(struct intel_crtc *crtc)
        intel_de_write(dev_priv, PIPE_CHICKEN(pipe), tmp);
 }
 
-static void icl_enable_trans_port_sync(const struct intel_crtc_state *crtc_state)
-{
-       struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
-       struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
-       u32 trans_ddi_func_ctl2_val;
-       u8 master_select;
-
-       /*
-        * Configure the master select and enable Transcoder Port Sync for
-        * Slave CRTCs transcoder.
-        */
-       if (crtc_state->master_transcoder == INVALID_TRANSCODER)
-               return;
-
-       if (crtc_state->master_transcoder == TRANSCODER_EDP)
-               master_select = 0;
-       else
-               master_select = crtc_state->master_transcoder + 1;
-
-       /* Set the master select bits for Tranascoder Port Sync */
-       trans_ddi_func_ctl2_val = (PORT_SYNC_MODE_MASTER_SELECT(master_select) &
-                                  PORT_SYNC_MODE_MASTER_SELECT_MASK) <<
-               PORT_SYNC_MODE_MASTER_SELECT_SHIFT;
-       /* Enable Transcoder Port Sync */
-       trans_ddi_func_ctl2_val |= PORT_SYNC_MODE_ENABLE;
-
-       intel_de_write(dev_priv,
-                      TRANS_DDI_FUNC_CTL2(crtc_state->cpu_transcoder),
-                      trans_ddi_func_ctl2_val);
-}
-
 static void intel_fdi_normal_train(struct intel_crtc *crtc)
 {
        struct drm_device *dev = crtc->base.dev;
@@ -6200,6 +6179,7 @@ static int skl_update_scaler_plane(struct intel_crtc_state *crtc_state,
        case DRM_FORMAT_UYVY:
        case DRM_FORMAT_VYUY:
        case DRM_FORMAT_NV12:
+       case DRM_FORMAT_XYUV8888:
        case DRM_FORMAT_P010:
        case DRM_FORMAT_P012:
        case DRM_FORMAT_P016:
@@ -6463,8 +6443,8 @@ static bool needs_scalerclk_wa(const struct intel_crtc_state *crtc_state)
 {
        struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
 
-       /* Wa_2006604312:icl */
-       if (crtc_state->scaler_state.scaler_users > 0 && IS_ICELAKE(dev_priv))
+       /* Wa_2006604312:icl,ehl */
+       if (crtc_state->scaler_state.scaler_users > 0 && IS_GEN(dev_priv, 11))
                return true;
 
        return false;
@@ -6534,7 +6514,7 @@ static void intel_pre_plane_update(struct intel_atomic_state *state,
            needs_nv12_wa(new_crtc_state))
                skl_wa_827(dev_priv, pipe, true);
 
-       /* Wa_2006604312:icl */
+       /* Wa_2006604312:icl,ehl */
        if (!needs_scalerclk_wa(old_crtc_state) &&
            needs_scalerclk_wa(new_crtc_state))
                icl_wa_scalerclkgating(dev_priv, pipe, true);
@@ -6720,7 +6700,8 @@ static void intel_encoders_pre_pll_enable(struct intel_atomic_state *state,
                        continue;
 
                if (encoder->pre_pll_enable)
-                       encoder->pre_pll_enable(encoder, crtc_state, conn_state);
+                       encoder->pre_pll_enable(state, encoder,
+                                               crtc_state, conn_state);
        }
 }
 
@@ -6741,7 +6722,8 @@ static void intel_encoders_pre_enable(struct intel_atomic_state *state,
                        continue;
 
                if (encoder->pre_enable)
-                       encoder->pre_enable(encoder, crtc_state, conn_state);
+                       encoder->pre_enable(state, encoder,
+                                           crtc_state, conn_state);
        }
 }
 
@@ -6762,7 +6744,8 @@ static void intel_encoders_enable(struct intel_atomic_state *state,
                        continue;
 
                if (encoder->enable)
-                       encoder->enable(encoder, crtc_state, conn_state);
+                       encoder->enable(state, encoder,
+                                       crtc_state, conn_state);
                intel_opregion_notify_encoder(encoder, true);
        }
 }
@@ -6785,7 +6768,8 @@ static void intel_encoders_disable(struct intel_atomic_state *state,
 
                intel_opregion_notify_encoder(encoder, false);
                if (encoder->disable)
-                       encoder->disable(encoder, old_crtc_state, old_conn_state);
+                       encoder->disable(state, encoder,
+                                        old_crtc_state, old_conn_state);
        }
 }
 
@@ -6806,7 +6790,8 @@ static void intel_encoders_post_disable(struct intel_atomic_state *state,
                        continue;
 
                if (encoder->post_disable)
-                       encoder->post_disable(encoder, old_crtc_state, old_conn_state);
+                       encoder->post_disable(state, encoder,
+                                             old_crtc_state, old_conn_state);
        }
 }
 
@@ -6827,7 +6812,8 @@ static void intel_encoders_post_pll_disable(struct intel_atomic_state *state,
                        continue;
 
                if (encoder->post_pll_disable)
-                       encoder->post_pll_disable(encoder, old_crtc_state, old_conn_state);
+                       encoder->post_pll_disable(state, encoder,
+                                                 old_crtc_state, old_conn_state);
        }
 }
 
@@ -6848,7 +6834,8 @@ static void intel_encoders_update_pipe(struct intel_atomic_state *state,
                        continue;
 
                if (encoder->update_pipe)
-                       encoder->update_pipe(encoder, crtc_state, conn_state);
+                       encoder->update_pipe(state, encoder,
+                                            crtc_state, conn_state);
        }
 }
 
@@ -7037,9 +7024,6 @@ static void hsw_crtc_enable(struct intel_atomic_state *state,
        if (!transcoder_is_dsi(cpu_transcoder))
                intel_set_pipe_timings(new_crtc_state);
 
-       if (INTEL_GEN(dev_priv) >= 11)
-               icl_enable_trans_port_sync(new_crtc_state);
-
        intel_set_pipe_src_size(new_crtc_state);
 
        if (cpu_transcoder != TRANSCODER_EDP &&
@@ -9398,7 +9382,6 @@ static bool i9xx_get_pipe_config(struct intel_crtc *crtc,
        pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
        pipe_config->cpu_transcoder = (enum transcoder) crtc->pipe;
        pipe_config->shared_dpll = NULL;
-       pipe_config->master_transcoder = INVALID_TRANSCODER;
 
        ret = false;
 
@@ -10622,7 +10605,6 @@ static bool ilk_get_pipe_config(struct intel_crtc *crtc,
 
        pipe_config->cpu_transcoder = (enum transcoder) crtc->pipe;
        pipe_config->shared_dpll = NULL;
-       pipe_config->master_transcoder = INVALID_TRANSCODER;
 
        ret = false;
        tmp = intel_de_read(dev_priv, PIPECONF(crtc->pipe));
@@ -10891,7 +10873,7 @@ static bool hsw_get_transcoder_state(struct intel_crtc *crtc,
                panel_transcoder_mask |=
                        BIT(TRANSCODER_DSI_0) | BIT(TRANSCODER_DSI_1);
 
-       if (HAS_TRANSCODER_EDP(dev_priv))
+       if (HAS_TRANSCODER(dev_priv, TRANSCODER_EDP))
                panel_transcoder_mask |= BIT(TRANSCODER_EDP);
 
        /*
@@ -11085,61 +11067,6 @@ static void hsw_get_ddi_port_state(struct intel_crtc *crtc,
        }
 }
 
-static enum transcoder transcoder_master_readout(struct drm_i915_private *dev_priv,
-                                                enum transcoder cpu_transcoder)
-{
-       u32 trans_port_sync, master_select;
-
-       trans_port_sync = intel_de_read(dev_priv,
-                                       TRANS_DDI_FUNC_CTL2(cpu_transcoder));
-
-       if ((trans_port_sync & PORT_SYNC_MODE_ENABLE) == 0)
-               return INVALID_TRANSCODER;
-
-       master_select = trans_port_sync &
-                       PORT_SYNC_MODE_MASTER_SELECT_MASK;
-       if (master_select == 0)
-               return TRANSCODER_EDP;
-       else
-               return master_select - 1;
-}
-
-static void icl_get_trans_port_sync_config(struct intel_crtc_state *crtc_state)
-{
-       struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
-       u32 transcoders;
-       enum transcoder cpu_transcoder;
-
-       crtc_state->master_transcoder = transcoder_master_readout(dev_priv,
-                                                                 crtc_state->cpu_transcoder);
-
-       transcoders = BIT(TRANSCODER_A) |
-               BIT(TRANSCODER_B) |
-               BIT(TRANSCODER_C) |
-               BIT(TRANSCODER_D);
-       for_each_cpu_transcoder_masked(dev_priv, cpu_transcoder, transcoders) {
-               enum intel_display_power_domain power_domain;
-               intel_wakeref_t trans_wakeref;
-
-               power_domain = POWER_DOMAIN_TRANSCODER(cpu_transcoder);
-               trans_wakeref = intel_display_power_get_if_enabled(dev_priv,
-                                                                  power_domain);
-
-               if (!trans_wakeref)
-                       continue;
-
-               if (transcoder_master_readout(dev_priv, cpu_transcoder) ==
-                   crtc_state->cpu_transcoder)
-                       crtc_state->sync_mode_slaves_mask |= BIT(cpu_transcoder);
-
-               intel_display_power_put(dev_priv, power_domain, trans_wakeref);
-       }
-
-       drm_WARN_ON(&dev_priv->drm,
-                   crtc_state->master_transcoder != INVALID_TRANSCODER &&
-                   crtc_state->sync_mode_slaves_mask);
-}
-
 static bool hsw_get_pipe_config(struct intel_crtc *crtc,
                                struct intel_crtc_state *pipe_config)
 {
@@ -11271,10 +11198,6 @@ static bool hsw_get_pipe_config(struct intel_crtc *crtc,
                pipe_config->pixel_multiplier = 1;
        }
 
-       if (INTEL_GEN(dev_priv) >= 11 &&
-           !transcoder_is_dsi(pipe_config->cpu_transcoder))
-               icl_get_trans_port_sync_config(pipe_config);
-
 out:
        for_each_power_domain(power_domain, power_domain_mask)
                intel_display_power_put(dev_priv,
@@ -12377,10 +12300,8 @@ int intel_plane_atomic_calc_changes(const struct intel_crtc_state *old_crtc_stat
         * only combine the results from all planes in the current place?
         */
        if (!is_crtc_enabled) {
-               plane_state->uapi.visible = visible = false;
-               crtc_state->active_planes &= ~BIT(plane->id);
-               crtc_state->data_rate[plane->id] = 0;
-               crtc_state->min_cdclk[plane->id] = 0;
+               intel_plane_set_invisible(crtc_state, plane_state);
+               visible = false;
        }
 
        if (!was_visible && !visible)
@@ -12886,16 +12807,17 @@ compute_baseline_pipe_bpp(struct intel_crtc *crtc,
        return 0;
 }
 
-static void intel_dump_crtc_timings(const struct drm_display_mode *mode)
+static void intel_dump_crtc_timings(struct drm_i915_private *i915,
+                                   const struct drm_display_mode *mode)
 {
-       DRM_DEBUG_KMS("crtc timings: %d %d %d %d %d %d %d %d %d, "
-                     "type: 0x%x flags: 0x%x\n",
-                     mode->crtc_clock,
-                     mode->crtc_hdisplay, mode->crtc_hsync_start,
-                     mode->crtc_hsync_end, mode->crtc_htotal,
-                     mode->crtc_vdisplay, mode->crtc_vsync_start,
-                     mode->crtc_vsync_end, mode->crtc_vtotal,
-                     mode->type, mode->flags);
+       drm_dbg_kms(&i915->drm, "crtc timings: %d %d %d %d %d %d %d %d %d, "
+                   "type: 0x%x flags: 0x%x\n",
+                   mode->crtc_clock,
+                   mode->crtc_hdisplay, mode->crtc_hsync_start,
+                   mode->crtc_hsync_end, mode->crtc_htotal,
+                   mode->crtc_vdisplay, mode->crtc_vsync_start,
+                   mode->crtc_vsync_end, mode->crtc_vtotal,
+                   mode->type, mode->flags);
 }
 
 static inline void
@@ -13042,6 +12964,11 @@ static void intel_dump_pipe_config(const struct intel_crtc_state *pipe_config,
                    transcoder_name(pipe_config->cpu_transcoder),
                    pipe_config->pipe_bpp, pipe_config->dither);
 
+       drm_dbg_kms(&dev_priv->drm,
+                   "port sync: master transcoder: %s, slave transcoder bitmask = 0x%x\n",
+                   transcoder_name(pipe_config->master_transcoder),
+                   pipe_config->sync_mode_slaves_mask);
+
        if (pipe_config->has_pch_encoder)
                intel_dump_m_n_config(pipe_config, "fdi",
                                      pipe_config->fdi_lanes,
@@ -13079,7 +13006,7 @@ static void intel_dump_pipe_config(const struct intel_crtc_state *pipe_config,
        drm_mode_debug_printmodeline(&pipe_config->hw.mode);
        drm_dbg_kms(&dev_priv->drm, "adjusted mode:\n");
        drm_mode_debug_printmodeline(&pipe_config->hw.adjusted_mode);
-       intel_dump_crtc_timings(&pipe_config->hw.adjusted_mode);
+       intel_dump_crtc_timings(dev_priv, &pipe_config->hw.adjusted_mode);
        drm_dbg_kms(&dev_priv->drm,
                    "port clock: %d, pipe src size: %dx%d, pixel rate %d\n",
                    pipe_config->port_clock,
@@ -14999,11 +14926,13 @@ static void intel_pipe_fastset(const struct intel_crtc_state *old_crtc_state,
 }
 
 static void commit_pipe_config(struct intel_atomic_state *state,
-                              struct intel_crtc_state *old_crtc_state,
-                              struct intel_crtc_state *new_crtc_state)
+                              struct intel_crtc *crtc)
 {
-       struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->uapi.crtc);
        struct drm_i915_private *dev_priv = to_i915(state->base.dev);
+       const struct intel_crtc_state *old_crtc_state =
+               intel_atomic_get_old_crtc_state(state, crtc);
+       const struct intel_crtc_state *new_crtc_state =
+               intel_atomic_get_new_crtc_state(state, crtc);
        bool modeset = needs_modeset(new_crtc_state);
 
        /*
@@ -15029,22 +14958,35 @@ static void commit_pipe_config(struct intel_atomic_state *state,
                dev_priv->display.atomic_update_watermarks(state, crtc);
 }
 
-static void intel_update_crtc(struct intel_crtc *crtc,
-                             struct intel_atomic_state *state,
-                             struct intel_crtc_state *old_crtc_state,
-                             struct intel_crtc_state *new_crtc_state)
+static void intel_enable_crtc(struct intel_atomic_state *state,
+                             struct intel_crtc *crtc)
 {
        struct drm_i915_private *dev_priv = to_i915(state->base.dev);
-       bool modeset = needs_modeset(new_crtc_state);
+       const struct intel_crtc_state *new_crtc_state =
+               intel_atomic_get_new_crtc_state(state, crtc);
 
-       if (modeset) {
-               intel_crtc_update_active_timings(new_crtc_state);
+       if (!needs_modeset(new_crtc_state))
+               return;
 
-               dev_priv->display.crtc_enable(state, crtc);
+       intel_crtc_update_active_timings(new_crtc_state);
 
-               /* vblanks work again, re-enable pipe CRC. */
-               intel_crtc_enable_pipe_crc(crtc);
-       } else {
+       dev_priv->display.crtc_enable(state, crtc);
+
+       /* vblanks work again, re-enable pipe CRC. */
+       intel_crtc_enable_pipe_crc(crtc);
+}
+
+static void intel_update_crtc(struct intel_atomic_state *state,
+                             struct intel_crtc *crtc)
+{
+       struct drm_i915_private *dev_priv = to_i915(state->base.dev);
+       const struct intel_crtc_state *old_crtc_state =
+               intel_atomic_get_old_crtc_state(state, crtc);
+       struct intel_crtc_state *new_crtc_state =
+               intel_atomic_get_new_crtc_state(state, crtc);
+       bool modeset = needs_modeset(new_crtc_state);
+
+       if (!modeset) {
                if (new_crtc_state->preload_luts &&
                    (new_crtc_state->uapi.color_mgmt_changed ||
                     new_crtc_state->update_pipe))
@@ -15064,7 +15006,7 @@ static void intel_update_crtc(struct intel_crtc *crtc,
        /* Perform vblank evasion around commit operation */
        intel_pipe_update_start(new_crtc_state);
 
-       commit_pipe_config(state, old_crtc_state, new_crtc_state);
+       commit_pipe_config(state, crtc);
 
        if (INTEL_GEN(dev_priv) >= 9)
                skl_update_planes_on_crtc(state, crtc);
@@ -15084,18 +15026,6 @@ static void intel_update_crtc(struct intel_crtc *crtc,
                intel_crtc_arm_fifo_underrun(crtc, new_crtc_state);
 }
 
-static struct intel_crtc *intel_get_slave_crtc(const struct intel_crtc_state *new_crtc_state)
-{
-       struct drm_i915_private *dev_priv = to_i915(new_crtc_state->uapi.crtc->dev);
-       enum transcoder slave_transcoder;
-
-       drm_WARN_ON(&dev_priv->drm,
-                   !is_power_of_2(new_crtc_state->sync_mode_slaves_mask));
-
-       slave_transcoder = ffs(new_crtc_state->sync_mode_slaves_mask) - 1;
-       return intel_get_crtc_for_pipe(dev_priv,
-                                      (enum pipe)slave_transcoder);
-}
 
 static void intel_old_crtc_state_disables(struct intel_atomic_state *state,
                                          struct intel_crtc_state *old_crtc_state,
@@ -15171,129 +15101,19 @@ static void intel_commit_modeset_disables(struct intel_atomic_state *state)
 
 static void intel_commit_modeset_enables(struct intel_atomic_state *state)
 {
+       struct intel_crtc_state *new_crtc_state;
        struct intel_crtc *crtc;
-       struct intel_crtc_state *old_crtc_state, *new_crtc_state;
        int i;
 
-       for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
+       for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
                if (!new_crtc_state->hw.active)
                        continue;
 
-               intel_update_crtc(crtc, state, old_crtc_state,
-                                 new_crtc_state);
+               intel_enable_crtc(state, crtc);
+               intel_update_crtc(state, crtc);
        }
 }
 
-static void intel_crtc_enable_trans_port_sync(struct intel_crtc *crtc,
-                                             struct intel_atomic_state *state,
-                                             struct intel_crtc_state *new_crtc_state)
-{
-       struct drm_i915_private *dev_priv = to_i915(state->base.dev);
-
-       intel_crtc_update_active_timings(new_crtc_state);
-       dev_priv->display.crtc_enable(state, crtc);
-       intel_crtc_enable_pipe_crc(crtc);
-}
-
-static void intel_set_dp_tp_ctl_normal(struct intel_crtc *crtc,
-                                      struct intel_atomic_state *state)
-{
-       struct drm_connector *uninitialized_var(conn);
-       struct drm_connector_state *conn_state;
-       struct intel_dp *intel_dp;
-       int i;
-
-       for_each_new_connector_in_state(&state->base, conn, conn_state, i) {
-               if (conn_state->crtc == &crtc->base)
-                       break;
-       }
-       intel_dp = intel_attached_dp(to_intel_connector(conn));
-       intel_dp_stop_link_train(intel_dp);
-}
-
-/*
- * TODO: This is only called from port sync and it is identical to what will be
- * executed again in intel_update_crtc() over port sync pipes
- */
-static void intel_post_crtc_enable_updates(struct intel_crtc *crtc,
-                                          struct intel_atomic_state *state)
-{
-       struct intel_crtc_state *new_crtc_state =
-               intel_atomic_get_new_crtc_state(state, crtc);
-       struct intel_crtc_state *old_crtc_state =
-               intel_atomic_get_old_crtc_state(state, crtc);
-       bool modeset = needs_modeset(new_crtc_state);
-
-       if (new_crtc_state->update_pipe && !new_crtc_state->enable_fbc)
-               intel_fbc_disable(crtc);
-       else
-               intel_fbc_enable(state, crtc);
-
-       /* Perform vblank evasion around commit operation */
-       intel_pipe_update_start(new_crtc_state);
-       commit_pipe_config(state, old_crtc_state, new_crtc_state);
-       skl_update_planes_on_crtc(state, crtc);
-       intel_pipe_update_end(new_crtc_state);
-
-       /*
-        * We usually enable FIFO underrun interrupts as part of the
-        * CRTC enable sequence during modesets.  But when we inherit a
-        * valid pipe configuration from the BIOS we need to take care
-        * of enabling them on the CRTC's first fastset.
-        */
-       if (new_crtc_state->update_pipe && !modeset &&
-           old_crtc_state->hw.mode.private_flags & I915_MODE_FLAG_INHERITED)
-               intel_crtc_arm_fifo_underrun(crtc, new_crtc_state);
-}
-
-static void intel_update_trans_port_sync_crtcs(struct intel_crtc *crtc,
-                                              struct intel_atomic_state *state,
-                                              struct intel_crtc_state *old_crtc_state,
-                                              struct intel_crtc_state *new_crtc_state)
-{
-       struct drm_i915_private *i915 = to_i915(crtc->base.dev);
-       struct intel_crtc *slave_crtc = intel_get_slave_crtc(new_crtc_state);
-       struct intel_crtc_state *new_slave_crtc_state =
-               intel_atomic_get_new_crtc_state(state, slave_crtc);
-       struct intel_crtc_state *old_slave_crtc_state =
-               intel_atomic_get_old_crtc_state(state, slave_crtc);
-
-       drm_WARN_ON(&i915->drm, !slave_crtc || !new_slave_crtc_state ||
-                   !old_slave_crtc_state);
-
-       drm_dbg_kms(&i915->drm,
-                   "Updating Transcoder Port Sync Master CRTC = %d %s and Slave CRTC %d %s\n",
-                   crtc->base.base.id, crtc->base.name,
-                   slave_crtc->base.base.id, slave_crtc->base.name);
-
-       /* Enable seq for slave with with DP_TP_CTL left Idle until the
-        * master is ready
-        */
-       intel_crtc_enable_trans_port_sync(slave_crtc,
-                                         state,
-                                         new_slave_crtc_state);
-
-       /* Enable seq for master with with DP_TP_CTL left Idle */
-       intel_crtc_enable_trans_port_sync(crtc,
-                                         state,
-                                         new_crtc_state);
-
-       /* Set Slave's DP_TP_CTL to Normal */
-       intel_set_dp_tp_ctl_normal(slave_crtc,
-                                  state);
-
-       /* Set Master's DP_TP_CTL To Normal */
-       usleep_range(200, 400);
-       intel_set_dp_tp_ctl_normal(crtc,
-                                  state);
-
-       /* Now do the post crtc enable for all master and slaves */
-       intel_post_crtc_enable_updates(slave_crtc,
-                                      state);
-       intel_post_crtc_enable_updates(crtc,
-                                      state);
-}
-
 static void icl_dbuf_slice_pre_update(struct intel_atomic_state *state)
 {
        struct drm_i915_private *dev_priv = to_i915(state->base.dev);
@@ -15365,8 +15185,7 @@ static void skl_commit_modeset_enables(struct intel_atomic_state *state)
                        entries[pipe] = new_crtc_state->wm.skl.ddb;
                        update_pipes &= ~BIT(pipe);
 
-                       intel_update_crtc(crtc, state, old_crtc_state,
-                                         new_crtc_state);
+                       intel_update_crtc(state, crtc);
 
                        /*
                         * If this is an already active pipe, it's DDB changed,
@@ -15381,67 +15200,62 @@ static void skl_commit_modeset_enables(struct intel_atomic_state *state)
                }
        }
 
+       update_pipes = modeset_pipes;
+
        /*
         * Enable all pipes that needs a modeset and do not depends on other
         * pipes
         */
-       for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
-                                           new_crtc_state, i) {
+       for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
                enum pipe pipe = crtc->pipe;
 
                if ((modeset_pipes & BIT(pipe)) == 0)
                        continue;
 
                if (intel_dp_mst_is_slave_trans(new_crtc_state) ||
-                   is_trans_port_sync_slave(new_crtc_state))
+                   is_trans_port_sync_master(new_crtc_state))
                        continue;
 
-               drm_WARN_ON(&dev_priv->drm, skl_ddb_allocation_overlaps(&new_crtc_state->wm.skl.ddb,
-                                                                       entries, I915_MAX_PIPES, pipe));
-
-               entries[pipe] = new_crtc_state->wm.skl.ddb;
                modeset_pipes &= ~BIT(pipe);
 
-               if (is_trans_port_sync_mode(new_crtc_state)) {
-                       struct intel_crtc *slave_crtc;
+               intel_enable_crtc(state, crtc);
+       }
 
-                       intel_update_trans_port_sync_crtcs(crtc, state,
-                                                          old_crtc_state,
-                                                          new_crtc_state);
+       /*
+        * Then we enable all remaining pipes that depend on other
+        * pipes: MST slaves and port sync masters.
+        */
+       for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
+               enum pipe pipe = crtc->pipe;
 
-                       slave_crtc = intel_get_slave_crtc(new_crtc_state);
-                       /* TODO: update entries[] of slave */
-                       modeset_pipes &= ~BIT(slave_crtc->pipe);
+               if ((modeset_pipes & BIT(pipe)) == 0)
+                       continue;
 
-               } else {
-                       intel_update_crtc(crtc, state, old_crtc_state,
-                                         new_crtc_state);
-               }
+               modeset_pipes &= ~BIT(pipe);
+
+               intel_enable_crtc(state, crtc);
        }
 
        /*
-        * Finally enable all pipes that needs a modeset and depends on
-        * other pipes, right now it is only MST slaves as both port sync slave
-        * and master are enabled together
+        * Finally we do the plane updates/etc. for all pipes that got enabled.
         */
-       for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
-                                           new_crtc_state, i) {
+       for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
                enum pipe pipe = crtc->pipe;
 
-               if ((modeset_pipes & BIT(pipe)) == 0)
+               if ((update_pipes & BIT(pipe)) == 0)
                        continue;
 
                drm_WARN_ON(&dev_priv->drm, skl_ddb_allocation_overlaps(&new_crtc_state->wm.skl.ddb,
                                                                        entries, I915_MAX_PIPES, pipe));
 
                entries[pipe] = new_crtc_state->wm.skl.ddb;
-               modeset_pipes &= ~BIT(pipe);
+               update_pipes &= ~BIT(pipe);
 
-               intel_update_crtc(crtc, state, old_crtc_state, new_crtc_state);
+               intel_update_crtc(state, crtc);
        }
 
        drm_WARN_ON(&dev_priv->drm, modeset_pipes);
-
+       drm_WARN_ON(&dev_priv->drm, update_pipes);
 }
 
 static void intel_atomic_helper_free_state(struct drm_i915_private *dev_priv)
@@ -18261,11 +18075,12 @@ static void intel_sanitize_encoder(struct intel_encoder *encoder)
                        best_encoder = connector->base.state->best_encoder;
                        connector->base.state->best_encoder = &encoder->base;
 
+                       /* FIXME NULL atomic state passed! */
                        if (encoder->disable)
-                               encoder->disable(encoder, crtc_state,
+                               encoder->disable(NULL, encoder, crtc_state,
                                                 connector->base.state);
                        if (encoder->post_disable)
-                               encoder->post_disable(encoder, crtc_state,
+                               encoder->post_disable(NULL, encoder, crtc_state,
                                                      connector->base.state);
 
                        connector->base.state->best_encoder = best_encoder;
@@ -18802,15 +18617,6 @@ void intel_modeset_driver_remove_noirq(struct drm_i915_private *i915)
 
 #if IS_ENABLED(CONFIG_DRM_I915_CAPTURE_ERROR)
 
-static bool
-has_transcoder(struct drm_i915_private *dev_priv, enum transcoder cpu_transcoder)
-{
-       if (cpu_transcoder == TRANSCODER_EDP)
-               return HAS_TRANSCODER_EDP(dev_priv);
-       else
-               return INTEL_INFO(dev_priv)->pipe_mask & BIT(cpu_transcoder);
-}
-
 struct intel_display_error_state {
 
        u32 power_well_driver;
@@ -18919,7 +18725,7 @@ intel_display_capture_error_state(struct drm_i915_private *dev_priv)
        for (i = 0; i < ARRAY_SIZE(error->transcoder); i++) {
                enum transcoder cpu_transcoder = transcoders[i];
 
-               if (!has_transcoder(dev_priv, cpu_transcoder))
+               if (!HAS_TRANSCODER(dev_priv, cpu_transcoder))
                        continue;
 
                error->transcoder[i].available = true;