intel_de_write(dev_priv, FDI_RX_CTL(PIPE_A), val);
}
+static void trans_port_sync_stop_link_train(struct intel_atomic_state *state,
+ struct intel_encoder *encoder,
+ const struct intel_crtc_state *crtc_state)
+{
+ const struct drm_connector_state *conn_state;
+ struct drm_connector *conn;
+ int i;
+
+ if (!crtc_state->sync_mode_slaves_mask)
+ return;
+
+ for_each_new_connector_in_state(&state->base, conn, conn_state, i) {
+ struct intel_encoder *slave_encoder =
+ to_intel_encoder(conn_state->best_encoder);
+ struct intel_crtc *slave_crtc = to_intel_crtc(conn_state->crtc);
+ const struct intel_crtc_state *slave_crtc_state;
+
+ if (!slave_crtc)
+ continue;
+
+ slave_crtc_state =
+ intel_atomic_get_new_crtc_state(state, slave_crtc);
+
+ if (slave_crtc_state->master_transcoder !=
+ crtc_state->cpu_transcoder)
+ continue;
+
+ intel_dp_stop_link_train(enc_to_intel_dp(slave_encoder));
+ }
+
+ usleep_range(200, 400);
+
+ intel_dp_stop_link_train(enc_to_intel_dp(encoder));
+}
+
static void intel_enable_ddi_dp(struct intel_atomic_state *state,
struct intel_encoder *encoder,
const struct intel_crtc_state *crtc_state,
if (crtc_state->has_audio)
intel_audio_codec_enable(encoder, crtc_state, conn_state);
+
+ trans_port_sync_stop_link_train(state, encoder, crtc_state);
}
static i915_reg_t
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);
}
/*
}
}
-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);
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;