Merge drm/drm-next into drm-intel-next-queued
[sfrench/cifs-2.6.git] / drivers / gpu / drm / i915 / display / intel_display.c
index af23b89ae9c17368061a7e5e241c12d1a0cb1d85..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);
 }
 
 /*
@@ -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:
@@ -6169,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:
@@ -6432,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;
@@ -6503,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);
@@ -15103,64 +15114,6 @@ static void intel_commit_modeset_enables(struct intel_atomic_state *state)
        }
 }
 
-static void intel_set_dp_tp_ctl_normal(struct intel_atomic_state *state,
-                                      struct intel_crtc *crtc)
-{
-       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);
-}
-
-static void intel_update_trans_port_sync_crtcs(struct intel_atomic_state *state,
-                                              struct intel_crtc *crtc)
-{
-       struct drm_i915_private *i915 = to_i915(state->base.dev);
-       const struct intel_crtc_state *new_slave_crtc_state;
-       const struct intel_crtc_state *new_crtc_state =
-               intel_atomic_get_new_crtc_state(state, crtc);
-       struct intel_crtc *slave_crtc;
-       int i;
-
-       for_each_new_intel_crtc_in_state(state, slave_crtc,
-                                        new_slave_crtc_state, i) {
-               if (new_slave_crtc_state->master_transcoder !=
-                   new_crtc_state->cpu_transcoder)
-                       continue;
-
-               drm_dbg_kms(&i915->drm,
-                           "Updating transcoder port sync slave [CRTC:%d:%s]\n",
-                           slave_crtc->base.base.id, slave_crtc->base.name);
-
-               intel_enable_crtc(state, slave_crtc);
-       }
-
-       drm_dbg_kms(&i915->drm,
-                   "Updating transcoder port sync master [CRTC:%d:%s]\n",
-                   crtc->base.base.id, crtc->base.name);
-
-       intel_enable_crtc(state, crtc);
-
-       for_each_new_intel_crtc_in_state(state, slave_crtc,
-                                        new_slave_crtc_state, i) {
-               if (new_slave_crtc_state->master_transcoder !=
-                   new_crtc_state->cpu_transcoder)
-                       continue;
-
-               intel_set_dp_tp_ctl_normal(state, slave_crtc);
-       }
-
-       usleep_range(200, 400);
-       intel_set_dp_tp_ctl_normal(state, crtc);
-}
-
 static void icl_dbuf_slice_pre_update(struct intel_atomic_state *state)
 {
        struct drm_i915_private *dev_priv = to_i915(state->base.dev);
@@ -15260,35 +15213,17 @@ static void skl_commit_modeset_enables(struct intel_atomic_state *state)
                        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;
 
                modeset_pipes &= ~BIT(pipe);
 
-               if (is_trans_port_sync_mode(new_crtc_state)) {
-                       const struct intel_crtc_state *new_slave_crtc_state;
-                       struct intel_crtc *slave_crtc;
-                       int i;
-
-                       intel_update_trans_port_sync_crtcs(state, crtc);
-
-                       for_each_new_intel_crtc_in_state(state, slave_crtc,
-                                                        new_slave_crtc_state, i) {
-                               if (new_slave_crtc_state->master_transcoder !=
-                                   new_crtc_state->cpu_transcoder)
-                                       continue;
-
-                               modeset_pipes &= ~BIT(slave_crtc->pipe);
-                       }
-               } else {
-                       intel_enable_crtc(state, crtc);
-               }
+               intel_enable_crtc(state, crtc);
        }
 
        /*
         * Then we enable all remaining pipes that depend on other
-        * pipes, right now it is only MST slaves as both port sync
-        * slave and master are enabled together
+        * 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;
@@ -16412,6 +16347,7 @@ static const struct drm_crtc_funcs bdw_crtc_funcs = {
        .get_vblank_counter = g4x_get_vblank_counter,
        .enable_vblank = bdw_enable_vblank,
        .disable_vblank = bdw_disable_vblank,
+       .get_vblank_timestamp = intel_crtc_get_vblank_timestamp,
 };
 
 static const struct drm_crtc_funcs ilk_crtc_funcs = {
@@ -16420,6 +16356,7 @@ static const struct drm_crtc_funcs ilk_crtc_funcs = {
        .get_vblank_counter = g4x_get_vblank_counter,
        .enable_vblank = ilk_enable_vblank,
        .disable_vblank = ilk_disable_vblank,
+       .get_vblank_timestamp = intel_crtc_get_vblank_timestamp,
 };
 
 static const struct drm_crtc_funcs g4x_crtc_funcs = {
@@ -16428,6 +16365,7 @@ static const struct drm_crtc_funcs g4x_crtc_funcs = {
        .get_vblank_counter = g4x_get_vblank_counter,
        .enable_vblank = i965_enable_vblank,
        .disable_vblank = i965_disable_vblank,
+       .get_vblank_timestamp = intel_crtc_get_vblank_timestamp,
 };
 
 static const struct drm_crtc_funcs i965_crtc_funcs = {
@@ -16436,6 +16374,7 @@ static const struct drm_crtc_funcs i965_crtc_funcs = {
        .get_vblank_counter = i915_get_vblank_counter,
        .enable_vblank = i965_enable_vblank,
        .disable_vblank = i965_disable_vblank,
+       .get_vblank_timestamp = intel_crtc_get_vblank_timestamp,
 };
 
 static const struct drm_crtc_funcs i915gm_crtc_funcs = {
@@ -16444,6 +16383,7 @@ static const struct drm_crtc_funcs i915gm_crtc_funcs = {
        .get_vblank_counter = i915_get_vblank_counter,
        .enable_vblank = i915gm_enable_vblank,
        .disable_vblank = i915gm_disable_vblank,
+       .get_vblank_timestamp = intel_crtc_get_vblank_timestamp,
 };
 
 static const struct drm_crtc_funcs i915_crtc_funcs = {
@@ -16452,6 +16392,7 @@ static const struct drm_crtc_funcs i915_crtc_funcs = {
        .get_vblank_counter = i915_get_vblank_counter,
        .enable_vblank = i8xx_enable_vblank,
        .disable_vblank = i8xx_disable_vblank,
+       .get_vblank_timestamp = intel_crtc_get_vblank_timestamp,
 };
 
 static const struct drm_crtc_funcs i8xx_crtc_funcs = {
@@ -16460,6 +16401,7 @@ static const struct drm_crtc_funcs i8xx_crtc_funcs = {
        /* no hw vblank counter */
        .enable_vblank = i8xx_enable_vblank,
        .disable_vblank = i8xx_disable_vblank,
+       .get_vblank_timestamp = intel_crtc_get_vblank_timestamp,
 };
 
 static struct intel_crtc *intel_crtc_alloc(void)