diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dp_mst.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp_mst.c | 19 |
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 | ||