xref: /dragonfly/sys/dev/drm/i915/intel_dp_mst.c (revision 9317c2d0)
1 /*
2  * Copyright © 2008 Intel Corporation
3  *             2014 Red Hat Inc.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9  * and/or sell copies of the Software, and to permit persons to whom the
10  * Software is furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice (including the next
13  * paragraph) shall be included in all copies or substantial portions of the
14  * Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22  * IN THE SOFTWARE.
23  *
24  */
25 
26 #include <drm/drmP.h>
27 #include "i915_drv.h"
28 #include "intel_drv.h"
29 #include <drm/drm_atomic_helper.h>
30 #include <drm/drm_crtc_helper.h>
31 #include <drm/drm_edid.h>
32 
33 static bool intel_dp_mst_compute_config(struct intel_encoder *encoder,
34 					struct intel_crtc_state *pipe_config,
35 					struct drm_connector_state *conn_state)
36 {
37 	struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base);
38 	struct intel_digital_port *intel_dig_port = intel_mst->primary;
39 	struct intel_dp *intel_dp = &intel_dig_port->dp;
40 	struct drm_atomic_state *state;
41 	int bpp;
42 	int lane_count, slots;
43 	const struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode;
44 	int mst_pbn;
45 
46 	pipe_config->has_pch_encoder = false;
47 	bpp = 24;
48 	/*
49 	 * for MST we always configure max link bw - the spec doesn't
50 	 * seem to suggest we should do otherwise.
51 	 */
52 	lane_count = drm_dp_max_lane_count(intel_dp->dpcd);
53 
54 	pipe_config->lane_count = lane_count;
55 
56 	pipe_config->pipe_bpp = 24;
57 	pipe_config->port_clock = intel_dp_max_link_rate(intel_dp);
58 
59 	state = pipe_config->base.state;
60 
61 	mst_pbn = drm_dp_calc_pbn_mode(adjusted_mode->crtc_clock, bpp);
62 
63 	pipe_config->pbn = mst_pbn;
64 	slots = drm_dp_find_vcpi_slots(&intel_dp->mst_mgr, mst_pbn);
65 
66 	intel_link_compute_m_n(bpp, lane_count,
67 			       adjusted_mode->crtc_clock,
68 			       pipe_config->port_clock,
69 			       &pipe_config->dp_m_n);
70 
71 	pipe_config->dp_m_n.tu = slots;
72 
73 	return true;
74 
75 }
76 
77 static void intel_mst_disable_dp(struct intel_encoder *encoder,
78 				 struct intel_crtc_state *old_crtc_state,
79 				 struct drm_connector_state *old_conn_state)
80 {
81 	struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base);
82 	struct intel_digital_port *intel_dig_port = intel_mst->primary;
83 	struct intel_dp *intel_dp = &intel_dig_port->dp;
84 	struct intel_connector *connector =
85 		to_intel_connector(old_conn_state->connector);
86 	int ret;
87 
88 	DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links);
89 
90 	drm_dp_mst_reset_vcpi_slots(&intel_dp->mst_mgr, connector->port);
91 
92 	ret = drm_dp_update_payload_part1(&intel_dp->mst_mgr);
93 	if (ret) {
94 		DRM_ERROR("failed to update payload %d\n", ret);
95 	}
96 }
97 
98 static void intel_mst_post_disable_dp(struct intel_encoder *encoder,
99 				      struct intel_crtc_state *old_crtc_state,
100 				      struct drm_connector_state *old_conn_state)
101 {
102 	struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base);
103 	struct intel_digital_port *intel_dig_port = intel_mst->primary;
104 	struct intel_dp *intel_dp = &intel_dig_port->dp;
105 	struct intel_connector *connector =
106 		to_intel_connector(old_conn_state->connector);
107 
108 	DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links);
109 
110 	/* this can fail */
111 	drm_dp_check_act_status(&intel_dp->mst_mgr);
112 	/* and this can also fail */
113 	drm_dp_update_payload_part2(&intel_dp->mst_mgr);
114 
115 	drm_dp_mst_deallocate_vcpi(&intel_dp->mst_mgr, connector->port);
116 
117 	intel_dp->active_mst_links--;
118 
119 	intel_mst->connector = NULL;
120 	if (intel_dp->active_mst_links == 0) {
121 		intel_dig_port->base.post_disable(&intel_dig_port->base,
122 						  NULL, NULL);
123 
124 		intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_OFF);
125 	}
126 }
127 
128 static void intel_mst_pre_enable_dp(struct intel_encoder *encoder,
129 				    struct intel_crtc_state *pipe_config,
130 				    struct drm_connector_state *conn_state)
131 {
132 	struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base);
133 	struct intel_digital_port *intel_dig_port = intel_mst->primary;
134 	struct intel_dp *intel_dp = &intel_dig_port->dp;
135 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
136 	enum port port = intel_dig_port->port;
137 	struct intel_connector *connector =
138 		to_intel_connector(conn_state->connector);
139 	int ret;
140 	uint32_t temp;
141 	int slots;
142 
143 	/* MST encoders are bound to a crtc, not to a connector,
144 	 * force the mapping here for get_hw_state.
145 	 */
146 	connector->encoder = encoder;
147 	intel_mst->connector = connector;
148 
149 	DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links);
150 
151 	if (intel_dp->active_mst_links == 0) {
152 		intel_ddi_clk_select(&intel_dig_port->base,
153 				     pipe_config->shared_dpll);
154 
155 		intel_prepare_dp_ddi_buffers(&intel_dig_port->base);
156 		intel_dp_set_link_params(intel_dp,
157 					 pipe_config->port_clock,
158 					 pipe_config->lane_count,
159 					 true);
160 
161 		intel_ddi_init_dp_buf_reg(&intel_dig_port->base);
162 
163 		intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_ON);
164 
165 		intel_dp_start_link_train(intel_dp);
166 		intel_dp_stop_link_train(intel_dp);
167 	}
168 
169 	ret = drm_dp_mst_allocate_vcpi(&intel_dp->mst_mgr,
170 				       connector->port,
171 				       pipe_config->pbn, &slots);
172 	if (ret == false) {
173 		DRM_ERROR("failed to allocate vcpi\n");
174 		return;
175 	}
176 
177 
178 	intel_dp->active_mst_links++;
179 	temp = I915_READ(DP_TP_STATUS(port));
180 	I915_WRITE(DP_TP_STATUS(port), temp);
181 
182 	ret = drm_dp_update_payload_part1(&intel_dp->mst_mgr);
183 }
184 
185 static void intel_mst_enable_dp(struct intel_encoder *encoder,
186 				struct intel_crtc_state *pipe_config,
187 				struct drm_connector_state *conn_state)
188 {
189 	struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base);
190 	struct intel_digital_port *intel_dig_port = intel_mst->primary;
191 	struct intel_dp *intel_dp = &intel_dig_port->dp;
192 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
193 	enum port port = intel_dig_port->port;
194 	int ret;
195 
196 	DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links);
197 
198 	if (intel_wait_for_register(dev_priv,
199 				    DP_TP_STATUS(port),
200 				    DP_TP_STATUS_ACT_SENT,
201 				    DP_TP_STATUS_ACT_SENT,
202 				    1))
203 		DRM_ERROR("Timed out waiting for ACT sent\n");
204 
205 	ret = drm_dp_check_act_status(&intel_dp->mst_mgr);
206 
207 	ret = drm_dp_update_payload_part2(&intel_dp->mst_mgr);
208 }
209 
210 static bool intel_dp_mst_enc_get_hw_state(struct intel_encoder *encoder,
211 				      enum i915_pipe *pipe)
212 {
213 	struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base);
214 	*pipe = intel_mst->pipe;
215 	if (intel_mst->connector)
216 		return true;
217 	return false;
218 }
219 
220 static void intel_dp_mst_enc_get_config(struct intel_encoder *encoder,
221 					struct intel_crtc_state *pipe_config)
222 {
223 	struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base);
224 	struct intel_digital_port *intel_dig_port = intel_mst->primary;
225 	struct intel_crtc *crtc = to_intel_crtc(pipe_config->base.crtc);
226 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
227 	enum transcoder cpu_transcoder = pipe_config->cpu_transcoder;
228 	u32 temp, flags = 0;
229 
230 	temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
231 	if (temp & TRANS_DDI_PHSYNC)
232 		flags |= DRM_MODE_FLAG_PHSYNC;
233 	else
234 		flags |= DRM_MODE_FLAG_NHSYNC;
235 	if (temp & TRANS_DDI_PVSYNC)
236 		flags |= DRM_MODE_FLAG_PVSYNC;
237 	else
238 		flags |= DRM_MODE_FLAG_NVSYNC;
239 
240 	switch (temp & TRANS_DDI_BPC_MASK) {
241 	case TRANS_DDI_BPC_6:
242 		pipe_config->pipe_bpp = 18;
243 		break;
244 	case TRANS_DDI_BPC_8:
245 		pipe_config->pipe_bpp = 24;
246 		break;
247 	case TRANS_DDI_BPC_10:
248 		pipe_config->pipe_bpp = 30;
249 		break;
250 	case TRANS_DDI_BPC_12:
251 		pipe_config->pipe_bpp = 36;
252 		break;
253 	default:
254 		break;
255 	}
256 	pipe_config->base.adjusted_mode.flags |= flags;
257 
258 	pipe_config->lane_count =
259 		((temp & DDI_PORT_WIDTH_MASK) >> DDI_PORT_WIDTH_SHIFT) + 1;
260 
261 	intel_dp_get_m_n(crtc, pipe_config);
262 
263 	intel_ddi_clock_get(&intel_dig_port->base, pipe_config);
264 }
265 
266 static int intel_dp_mst_get_ddc_modes(struct drm_connector *connector)
267 {
268 	struct intel_connector *intel_connector = to_intel_connector(connector);
269 	struct intel_dp *intel_dp = intel_connector->mst_port;
270 	struct edid *edid;
271 	int ret;
272 
273 	if (!intel_dp) {
274 		return intel_connector_update_modes(connector, NULL);
275 	}
276 
277 	edid = drm_dp_mst_get_edid(connector, &intel_dp->mst_mgr, intel_connector->port);
278 	ret = intel_connector_update_modes(connector, edid);
279 	kfree(edid);
280 
281 	return ret;
282 }
283 
284 static enum drm_connector_status
285 intel_dp_mst_detect(struct drm_connector *connector, bool force)
286 {
287 	struct intel_connector *intel_connector = to_intel_connector(connector);
288 	struct intel_dp *intel_dp = intel_connector->mst_port;
289 
290 	if (!intel_dp)
291 		return connector_status_disconnected;
292 	return drm_dp_mst_detect_port(connector, &intel_dp->mst_mgr, intel_connector->port);
293 }
294 
295 static int
296 intel_dp_mst_set_property(struct drm_connector *connector,
297 			  struct drm_property *property,
298 			  uint64_t val)
299 {
300 	return 0;
301 }
302 
303 static void
304 intel_dp_mst_connector_destroy(struct drm_connector *connector)
305 {
306 	struct intel_connector *intel_connector = to_intel_connector(connector);
307 
308 	if (!IS_ERR_OR_NULL(intel_connector->edid))
309 		kfree(intel_connector->edid);
310 
311 	drm_connector_cleanup(connector);
312 	kfree(connector);
313 }
314 
315 static const struct drm_connector_funcs intel_dp_mst_connector_funcs = {
316 	.dpms = drm_atomic_helper_connector_dpms,
317 	.detect = intel_dp_mst_detect,
318 	.fill_modes = drm_helper_probe_single_connector_modes,
319 	.set_property = intel_dp_mst_set_property,
320 	.atomic_get_property = intel_connector_atomic_get_property,
321 	.late_register = intel_connector_register,
322 	.early_unregister = intel_connector_unregister,
323 	.destroy = intel_dp_mst_connector_destroy,
324 	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
325 	.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
326 };
327 
328 static int intel_dp_mst_get_modes(struct drm_connector *connector)
329 {
330 	return intel_dp_mst_get_ddc_modes(connector);
331 }
332 
333 static enum drm_mode_status
334 intel_dp_mst_mode_valid(struct drm_connector *connector,
335 			struct drm_display_mode *mode)
336 {
337 	int max_dotclk = to_i915(connector->dev)->max_dotclk_freq;
338 
339 	/* TODO - validate mode against available PBN for link */
340 	if (mode->clock < 10000)
341 		return MODE_CLOCK_LOW;
342 
343 	if (mode->flags & DRM_MODE_FLAG_DBLCLK)
344 		return MODE_H_ILLEGAL;
345 
346 	if (mode->clock > max_dotclk)
347 		return MODE_CLOCK_HIGH;
348 
349 	return MODE_OK;
350 }
351 
352 static struct drm_encoder *intel_mst_atomic_best_encoder(struct drm_connector *connector,
353 							 struct drm_connector_state *state)
354 {
355 	struct intel_connector *intel_connector = to_intel_connector(connector);
356 	struct intel_dp *intel_dp = intel_connector->mst_port;
357 	struct intel_crtc *crtc = to_intel_crtc(state->crtc);
358 
359 	if (!intel_dp)
360 		return NULL;
361 	return &intel_dp->mst_encoders[crtc->pipe]->base.base;
362 }
363 
364 static struct drm_encoder *intel_mst_best_encoder(struct drm_connector *connector)
365 {
366 	struct intel_connector *intel_connector = to_intel_connector(connector);
367 	struct intel_dp *intel_dp = intel_connector->mst_port;
368 	if (!intel_dp)
369 		return NULL;
370 	return &intel_dp->mst_encoders[0]->base.base;
371 }
372 
373 static const struct drm_connector_helper_funcs intel_dp_mst_connector_helper_funcs = {
374 	.get_modes = intel_dp_mst_get_modes,
375 	.mode_valid = intel_dp_mst_mode_valid,
376 	.atomic_best_encoder = intel_mst_atomic_best_encoder,
377 	.best_encoder = intel_mst_best_encoder,
378 };
379 
380 static void intel_dp_mst_encoder_destroy(struct drm_encoder *encoder)
381 {
382 	struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
383 
384 	drm_encoder_cleanup(encoder);
385 	kfree(intel_mst);
386 }
387 
388 static const struct drm_encoder_funcs intel_dp_mst_enc_funcs = {
389 	.destroy = intel_dp_mst_encoder_destroy,
390 };
391 
392 static bool intel_dp_mst_get_hw_state(struct intel_connector *connector)
393 {
394 	if (connector->encoder && connector->base.state->crtc) {
395 		enum i915_pipe pipe;
396 		if (!connector->encoder->get_hw_state(connector->encoder, &pipe))
397 			return false;
398 		return true;
399 	}
400 	return false;
401 }
402 
403 static void intel_connector_add_to_fbdev(struct intel_connector *connector)
404 {
405 #ifdef CONFIG_DRM_FBDEV_EMULATION
406 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
407 
408 	if (dev_priv->fbdev)
409 		drm_fb_helper_add_one_connector(&dev_priv->fbdev->helper,
410 						&connector->base);
411 #endif
412 }
413 
414 static void intel_connector_remove_from_fbdev(struct intel_connector *connector)
415 {
416 #ifdef CONFIG_DRM_FBDEV_EMULATION
417 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
418 
419 	if (dev_priv->fbdev)
420 		drm_fb_helper_remove_one_connector(&dev_priv->fbdev->helper,
421 						   &connector->base);
422 #endif
423 }
424 
425 static struct drm_connector *intel_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port, const char *pathprop)
426 {
427 	struct intel_dp *intel_dp = container_of(mgr, struct intel_dp, mst_mgr);
428 	struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
429 	struct drm_device *dev = intel_dig_port->base.base.dev;
430 	struct intel_connector *intel_connector;
431 	struct drm_connector *connector;
432 	int i;
433 
434 	intel_connector = intel_connector_alloc();
435 	if (!intel_connector)
436 		return NULL;
437 
438 	connector = &intel_connector->base;
439 	drm_connector_init(dev, connector, &intel_dp_mst_connector_funcs, DRM_MODE_CONNECTOR_DisplayPort);
440 	drm_connector_helper_add(connector, &intel_dp_mst_connector_helper_funcs);
441 
442 	intel_connector->get_hw_state = intel_dp_mst_get_hw_state;
443 	intel_connector->mst_port = intel_dp;
444 	intel_connector->port = port;
445 
446 	for (i = PIPE_A; i <= PIPE_C; i++) {
447 		drm_mode_connector_attach_encoder(&intel_connector->base,
448 						  &intel_dp->mst_encoders[i]->base.base);
449 	}
450 	intel_dp_add_properties(intel_dp, connector);
451 
452 	drm_object_attach_property(&connector->base, dev->mode_config.path_property, 0);
453 	drm_object_attach_property(&connector->base, dev->mode_config.tile_property, 0);
454 
455 	drm_mode_connector_set_path_property(connector, pathprop);
456 	return connector;
457 }
458 
459 static void intel_dp_register_mst_connector(struct drm_connector *connector)
460 {
461 	struct intel_connector *intel_connector = to_intel_connector(connector);
462 	struct drm_device *dev = connector->dev;
463 
464 	drm_modeset_lock_all(dev);
465 	intel_connector_add_to_fbdev(intel_connector);
466 	drm_modeset_unlock_all(dev);
467 
468 	drm_connector_register(&intel_connector->base);
469 }
470 
471 static void intel_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
472 					   struct drm_connector *connector)
473 {
474 	struct intel_connector *intel_connector = to_intel_connector(connector);
475 	struct drm_device *dev = connector->dev;
476 
477 	drm_connector_unregister(connector);
478 
479 	/* need to nuke the connector */
480 	drm_modeset_lock_all(dev);
481 	intel_connector_remove_from_fbdev(intel_connector);
482 	intel_connector->mst_port = NULL;
483 	drm_modeset_unlock_all(dev);
484 
485 	drm_connector_unreference(&intel_connector->base);
486 	DRM_DEBUG_KMS("\n");
487 }
488 
489 static void intel_dp_mst_hotplug(struct drm_dp_mst_topology_mgr *mgr)
490 {
491 	struct intel_dp *intel_dp = container_of(mgr, struct intel_dp, mst_mgr);
492 	struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
493 	struct drm_device *dev = intel_dig_port->base.base.dev;
494 
495 	drm_kms_helper_hotplug_event(dev);
496 }
497 
498 static const struct drm_dp_mst_topology_cbs mst_cbs = {
499 	.add_connector = intel_dp_add_mst_connector,
500 	.register_connector = intel_dp_register_mst_connector,
501 	.destroy_connector = intel_dp_destroy_mst_connector,
502 	.hotplug = intel_dp_mst_hotplug,
503 };
504 
505 static struct intel_dp_mst_encoder *
506 intel_dp_create_fake_mst_encoder(struct intel_digital_port *intel_dig_port, enum i915_pipe pipe)
507 {
508 	struct intel_dp_mst_encoder *intel_mst;
509 	struct intel_encoder *intel_encoder;
510 	struct drm_device *dev = intel_dig_port->base.base.dev;
511 
512 	intel_mst = kzalloc(sizeof(*intel_mst), GFP_KERNEL);
513 
514 	if (!intel_mst)
515 		return NULL;
516 
517 	intel_mst->pipe = pipe;
518 	intel_encoder = &intel_mst->base;
519 	intel_mst->primary = intel_dig_port;
520 
521 	drm_encoder_init(dev, &intel_encoder->base, &intel_dp_mst_enc_funcs,
522 			 DRM_MODE_ENCODER_DPMST, "DP-MST %c", pipe_name(pipe));
523 
524 	intel_encoder->type = INTEL_OUTPUT_DP_MST;
525 	intel_encoder->port = intel_dig_port->port;
526 	intel_encoder->crtc_mask = 0x7;
527 	intel_encoder->cloneable = 0;
528 
529 	intel_encoder->compute_config = intel_dp_mst_compute_config;
530 	intel_encoder->disable = intel_mst_disable_dp;
531 	intel_encoder->post_disable = intel_mst_post_disable_dp;
532 	intel_encoder->pre_enable = intel_mst_pre_enable_dp;
533 	intel_encoder->enable = intel_mst_enable_dp;
534 	intel_encoder->get_hw_state = intel_dp_mst_enc_get_hw_state;
535 	intel_encoder->get_config = intel_dp_mst_enc_get_config;
536 
537 	return intel_mst;
538 
539 }
540 
541 static bool
542 intel_dp_create_fake_mst_encoders(struct intel_digital_port *intel_dig_port)
543 {
544 	int i;
545 	struct intel_dp *intel_dp = &intel_dig_port->dp;
546 
547 	for (i = PIPE_A; i <= PIPE_C; i++)
548 		intel_dp->mst_encoders[i] = intel_dp_create_fake_mst_encoder(intel_dig_port, i);
549 	return true;
550 }
551 
552 int
553 intel_dp_mst_encoder_init(struct intel_digital_port *intel_dig_port, int conn_base_id)
554 {
555 	struct intel_dp *intel_dp = &intel_dig_port->dp;
556 	struct drm_device *dev = intel_dig_port->base.base.dev;
557 	int ret;
558 
559 	intel_dp->can_mst = true;
560 	intel_dp->mst_mgr.cbs = &mst_cbs;
561 
562 	/* create encoders */
563 	intel_dp_create_fake_mst_encoders(intel_dig_port);
564 	ret = drm_dp_mst_topology_mgr_init(&intel_dp->mst_mgr, dev->dev, &intel_dp->aux, 16, 3, conn_base_id);
565 	if (ret) {
566 		intel_dp->can_mst = false;
567 		return ret;
568 	}
569 	return 0;
570 }
571 
572 void
573 intel_dp_mst_encoder_cleanup(struct intel_digital_port *intel_dig_port)
574 {
575 	struct intel_dp *intel_dp = &intel_dig_port->dp;
576 
577 	if (!intel_dp->can_mst)
578 		return;
579 
580 	drm_dp_mst_topology_mgr_destroy(&intel_dp->mst_mgr);
581 	/* encoders will get killed by normal cleanup */
582 }
583