aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_dp_mst.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dp_mst.c')
-rw-r--r--drivers/gpu/drm/i915/intel_dp_mst.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c
index 9646816604be..68a005d729e9 100644
--- a/drivers/gpu/drm/i915/intel_dp_mst.c
+++ b/drivers/gpu/drm/i915/intel_dp_mst.c
@@ -47,7 +47,6 @@ static bool intel_dp_mst_compute_config(struct intel_encoder *encoder,
47 47
48 pipe_config->dp_encoder_is_mst = true; 48 pipe_config->dp_encoder_is_mst = true;
49 pipe_config->has_pch_encoder = false; 49 pipe_config->has_pch_encoder = false;
50 pipe_config->has_dp_encoder = true;
51 bpp = 24; 50 bpp = 24;
52 /* 51 /*
53 * for MST we always configure max link bw - the spec doesn't 52 * for MST we always configure max link bw - the spec doesn't
@@ -140,7 +139,7 @@ static void intel_mst_pre_enable_dp(struct intel_encoder *encoder)
140 struct intel_digital_port *intel_dig_port = intel_mst->primary; 139 struct intel_digital_port *intel_dig_port = intel_mst->primary;
141 struct intel_dp *intel_dp = &intel_dig_port->dp; 140 struct intel_dp *intel_dp = &intel_dig_port->dp;
142 struct drm_device *dev = encoder->base.dev; 141 struct drm_device *dev = encoder->base.dev;
143 struct drm_i915_private *dev_priv = dev->dev_private; 142 struct drm_i915_private *dev_priv = to_i915(dev);
144 enum port port = intel_dig_port->port; 143 enum port port = intel_dig_port->port;
145 int ret; 144 int ret;
146 uint32_t temp; 145 uint32_t temp;
@@ -207,14 +206,17 @@ static void intel_mst_enable_dp(struct intel_encoder *encoder)
207 struct intel_digital_port *intel_dig_port = intel_mst->primary; 206 struct intel_digital_port *intel_dig_port = intel_mst->primary;
208 struct intel_dp *intel_dp = &intel_dig_port->dp; 207 struct intel_dp *intel_dp = &intel_dig_port->dp;
209 struct drm_device *dev = intel_dig_port->base.base.dev; 208 struct drm_device *dev = intel_dig_port->base.base.dev;
210 struct drm_i915_private *dev_priv = dev->dev_private; 209 struct drm_i915_private *dev_priv = to_i915(dev);
211 enum port port = intel_dig_port->port; 210 enum port port = intel_dig_port->port;
212 int ret; 211 int ret;
213 212
214 DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links); 213 DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links);
215 214
216 if (wait_for((I915_READ(DP_TP_STATUS(port)) & DP_TP_STATUS_ACT_SENT), 215 if (intel_wait_for_register(dev_priv,
217 1)) 216 DP_TP_STATUS(port),
217 DP_TP_STATUS_ACT_SENT,
218 DP_TP_STATUS_ACT_SENT,
219 1))
218 DRM_ERROR("Timed out waiting for ACT sent\n"); 220 DRM_ERROR("Timed out waiting for ACT sent\n");
219 221
220 ret = drm_dp_check_act_status(&intel_dp->mst_mgr); 222 ret = drm_dp_check_act_status(&intel_dp->mst_mgr);
@@ -239,12 +241,10 @@ static void intel_dp_mst_enc_get_config(struct intel_encoder *encoder,
239 struct intel_digital_port *intel_dig_port = intel_mst->primary; 241 struct intel_digital_port *intel_dig_port = intel_mst->primary;
240 struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc); 242 struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
241 struct drm_device *dev = encoder->base.dev; 243 struct drm_device *dev = encoder->base.dev;
242 struct drm_i915_private *dev_priv = dev->dev_private; 244 struct drm_i915_private *dev_priv = to_i915(dev);
243 enum transcoder cpu_transcoder = pipe_config->cpu_transcoder; 245 enum transcoder cpu_transcoder = pipe_config->cpu_transcoder;
244 u32 temp, flags = 0; 246 u32 temp, flags = 0;
245 247
246 pipe_config->has_dp_encoder = true;
247
248 temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder)); 248 temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
249 if (temp & TRANS_DDI_PHSYNC) 249 if (temp & TRANS_DDI_PHSYNC)
250 flags |= DRM_MODE_FLAG_PHSYNC; 250 flags |= DRM_MODE_FLAG_PHSYNC;
@@ -336,6 +336,7 @@ static const struct drm_connector_funcs intel_dp_mst_connector_funcs = {
336 .fill_modes = drm_helper_probe_single_connector_modes, 336 .fill_modes = drm_helper_probe_single_connector_modes,
337 .set_property = intel_dp_mst_set_property, 337 .set_property = intel_dp_mst_set_property,
338 .atomic_get_property = intel_connector_atomic_get_property, 338 .atomic_get_property = intel_connector_atomic_get_property,
339 .late_register = intel_connector_register,
339 .early_unregister = intel_connector_unregister, 340 .early_unregister = intel_connector_unregister,
340 .destroy = intel_dp_mst_connector_destroy, 341 .destroy = intel_dp_mst_connector_destroy,
341 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, 342 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
@@ -477,9 +478,11 @@ static void intel_dp_register_mst_connector(struct drm_connector *connector)
477{ 478{
478 struct intel_connector *intel_connector = to_intel_connector(connector); 479 struct intel_connector *intel_connector = to_intel_connector(connector);
479 struct drm_device *dev = connector->dev; 480 struct drm_device *dev = connector->dev;
481
480 drm_modeset_lock_all(dev); 482 drm_modeset_lock_all(dev);
481 intel_connector_add_to_fbdev(intel_connector); 483 intel_connector_add_to_fbdev(intel_connector);
482 drm_modeset_unlock_all(dev); 484 drm_modeset_unlock_all(dev);
485
483 drm_connector_register(&intel_connector->base); 486 drm_connector_register(&intel_connector->base);
484} 487}
485 488