diff options
author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2016-05-17 06:15:49 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2016-05-17 06:15:49 -0400 |
commit | 9a652cc01e589e10e2aa341074ea240c9838102b (patch) | |
tree | 48ec31db7a09a0e6b7cca66ea08b20cc78f218cb /drivers/gpu/drm/i915/intel_dp_mst.c | |
parent | e8fcdf1e65c71340972041295fb7b3e59929b761 (diff) | |
parent | 99ee87295017e36abb6925e6139ca303cb55aee7 (diff) |
Merge remote-tracking branch 'airlied/drm-next' into drm-intel-next-queued
Backmerge request by Jani to get at
commit 249c4f538b1aae55d41699f8bafc6cb762a7f48f
Author: Deepak M <m.deepak@intel.com>
Date: Wed Mar 30 17:03:39 2016 +0300
drm: Add new DCS commands in the enum list
Some simple conflicts in intel_dp.c.
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dp_mst.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp_mst.c | 43 |
1 files changed, 20 insertions, 23 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c index 55d0543fdf2a..7a34090cef34 100644 --- a/drivers/gpu/drm/i915/intel_dp_mst.c +++ b/drivers/gpu/drm/i915/intel_dp_mst.c | |||
@@ -102,7 +102,7 @@ static void intel_mst_disable_dp(struct intel_encoder *encoder) | |||
102 | 102 | ||
103 | DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links); | 103 | DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links); |
104 | 104 | ||
105 | drm_dp_mst_reset_vcpi_slots(&intel_dp->mst_mgr, intel_mst->port); | 105 | drm_dp_mst_reset_vcpi_slots(&intel_dp->mst_mgr, intel_mst->connector->port); |
106 | 106 | ||
107 | ret = drm_dp_update_payload_part1(&intel_dp->mst_mgr); | 107 | ret = drm_dp_update_payload_part1(&intel_dp->mst_mgr); |
108 | if (ret) { | 108 | if (ret) { |
@@ -123,10 +123,11 @@ static void intel_mst_post_disable_dp(struct intel_encoder *encoder) | |||
123 | /* and this can also fail */ | 123 | /* and this can also fail */ |
124 | drm_dp_update_payload_part2(&intel_dp->mst_mgr); | 124 | drm_dp_update_payload_part2(&intel_dp->mst_mgr); |
125 | 125 | ||
126 | drm_dp_mst_deallocate_vcpi(&intel_dp->mst_mgr, intel_mst->port); | 126 | drm_dp_mst_deallocate_vcpi(&intel_dp->mst_mgr, intel_mst->connector->port); |
127 | 127 | ||
128 | intel_dp->active_mst_links--; | 128 | intel_dp->active_mst_links--; |
129 | intel_mst->port = NULL; | 129 | |
130 | intel_mst->connector = NULL; | ||
130 | if (intel_dp->active_mst_links == 0) { | 131 | if (intel_dp->active_mst_links == 0) { |
131 | intel_dig_port->base.post_disable(&intel_dig_port->base); | 132 | intel_dig_port->base.post_disable(&intel_dig_port->base); |
132 | intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_OFF); | 133 | intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_OFF); |
@@ -166,7 +167,8 @@ static void intel_mst_pre_enable_dp(struct intel_encoder *encoder) | |||
166 | found->encoder = encoder; | 167 | found->encoder = encoder; |
167 | 168 | ||
168 | DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links); | 169 | DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links); |
169 | intel_mst->port = found->port; | 170 | |
171 | intel_mst->connector = found; | ||
170 | 172 | ||
171 | if (intel_dp->active_mst_links == 0) { | 173 | if (intel_dp->active_mst_links == 0) { |
172 | intel_prepare_ddi_buffer(&intel_dig_port->base); | 174 | intel_prepare_ddi_buffer(&intel_dig_port->base); |
@@ -184,7 +186,7 @@ static void intel_mst_pre_enable_dp(struct intel_encoder *encoder) | |||
184 | } | 186 | } |
185 | 187 | ||
186 | ret = drm_dp_mst_allocate_vcpi(&intel_dp->mst_mgr, | 188 | ret = drm_dp_mst_allocate_vcpi(&intel_dp->mst_mgr, |
187 | intel_mst->port, | 189 | intel_mst->connector->port, |
188 | intel_crtc->config->pbn, &slots); | 190 | intel_crtc->config->pbn, &slots); |
189 | if (ret == false) { | 191 | if (ret == false) { |
190 | DRM_ERROR("failed to allocate vcpi\n"); | 192 | DRM_ERROR("failed to allocate vcpi\n"); |
@@ -225,7 +227,7 @@ static bool intel_dp_mst_enc_get_hw_state(struct intel_encoder *encoder, | |||
225 | { | 227 | { |
226 | struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base); | 228 | struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base); |
227 | *pipe = intel_mst->pipe; | 229 | *pipe = intel_mst->pipe; |
228 | if (intel_mst->port) | 230 | if (intel_mst->connector) |
229 | return true; | 231 | return true; |
230 | return false; | 232 | return false; |
231 | } | 233 | } |
@@ -286,10 +288,11 @@ static int intel_dp_mst_get_ddc_modes(struct drm_connector *connector) | |||
286 | struct edid *edid; | 288 | struct edid *edid; |
287 | int ret; | 289 | int ret; |
288 | 290 | ||
289 | edid = drm_dp_mst_get_edid(connector, &intel_dp->mst_mgr, intel_connector->port); | 291 | if (!intel_dp) { |
290 | if (!edid) | 292 | return intel_connector_update_modes(connector, NULL); |
291 | return 0; | 293 | } |
292 | 294 | ||
295 | edid = drm_dp_mst_get_edid(connector, &intel_dp->mst_mgr, intel_connector->port); | ||
293 | ret = intel_connector_update_modes(connector, edid); | 296 | ret = intel_connector_update_modes(connector, edid); |
294 | kfree(edid); | 297 | kfree(edid); |
295 | 298 | ||
@@ -302,6 +305,8 @@ intel_dp_mst_detect(struct drm_connector *connector, bool force) | |||
302 | struct intel_connector *intel_connector = to_intel_connector(connector); | 305 | struct intel_connector *intel_connector = to_intel_connector(connector); |
303 | struct intel_dp *intel_dp = intel_connector->mst_port; | 306 | struct intel_dp *intel_dp = intel_connector->mst_port; |
304 | 307 | ||
308 | if (!intel_dp) | ||
309 | return connector_status_disconnected; | ||
305 | return drm_dp_mst_detect_port(connector, &intel_dp->mst_mgr, intel_connector->port); | 310 | return drm_dp_mst_detect_port(connector, &intel_dp->mst_mgr, intel_connector->port); |
306 | } | 311 | } |
307 | 312 | ||
@@ -367,6 +372,8 @@ static struct drm_encoder *intel_mst_atomic_best_encoder(struct drm_connector *c | |||
367 | struct intel_dp *intel_dp = intel_connector->mst_port; | 372 | struct intel_dp *intel_dp = intel_connector->mst_port; |
368 | struct intel_crtc *crtc = to_intel_crtc(state->crtc); | 373 | struct intel_crtc *crtc = to_intel_crtc(state->crtc); |
369 | 374 | ||
375 | if (!intel_dp) | ||
376 | return NULL; | ||
370 | return &intel_dp->mst_encoders[crtc->pipe]->base.base; | 377 | return &intel_dp->mst_encoders[crtc->pipe]->base.base; |
371 | } | 378 | } |
372 | 379 | ||
@@ -374,6 +381,8 @@ static struct drm_encoder *intel_mst_best_encoder(struct drm_connector *connecto | |||
374 | { | 381 | { |
375 | struct intel_connector *intel_connector = to_intel_connector(connector); | 382 | struct intel_connector *intel_connector = to_intel_connector(connector); |
376 | struct intel_dp *intel_dp = intel_connector->mst_port; | 383 | struct intel_dp *intel_dp = intel_connector->mst_port; |
384 | if (!intel_dp) | ||
385 | return NULL; | ||
377 | return &intel_dp->mst_encoders[0]->base.base; | 386 | return &intel_dp->mst_encoders[0]->base.base; |
378 | } | 387 | } |
379 | 388 | ||
@@ -484,23 +493,11 @@ static void intel_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr, | |||
484 | 493 | ||
485 | /* need to nuke the connector */ | 494 | /* need to nuke the connector */ |
486 | drm_modeset_lock_all(dev); | 495 | drm_modeset_lock_all(dev); |
487 | if (connector->state->crtc) { | ||
488 | struct drm_mode_set set; | ||
489 | int ret; | ||
490 | |||
491 | memset(&set, 0, sizeof(set)); | ||
492 | set.crtc = connector->state->crtc, | ||
493 | |||
494 | ret = drm_atomic_helper_set_config(&set); | ||
495 | |||
496 | WARN(ret, "Disabling mst crtc failed with %i\n", ret); | ||
497 | } | ||
498 | |||
499 | intel_connector_remove_from_fbdev(intel_connector); | 496 | intel_connector_remove_from_fbdev(intel_connector); |
500 | drm_connector_cleanup(connector); | 497 | intel_connector->mst_port = NULL; |
501 | drm_modeset_unlock_all(dev); | 498 | drm_modeset_unlock_all(dev); |
502 | 499 | ||
503 | kfree(intel_connector); | 500 | drm_connector_unreference(&intel_connector->base); |
504 | DRM_DEBUG_KMS("\n"); | 501 | DRM_DEBUG_KMS("\n"); |
505 | } | 502 | } |
506 | 503 | ||