Lines Matching +full:dp +full:- +full:connector

1 // SPDX-License-Identifier: MIT
24 * intel_dp_tunnel_disconnect - Disconnect a DP tunnel from a port
25 * @intel_dp: DP port object the tunnel is connected to
27 * Disconnect a DP tunnel from @intel_dp, destroying any related state. This
28 * should be called after detecting a sink-disconnect event from the port.
32 drm_dp_tunnel_destroy(intel_dp->tunnel); in intel_dp_tunnel_disconnect()
33 intel_dp->tunnel = NULL; in intel_dp_tunnel_disconnect()
37 * intel_dp_tunnel_destroy - Destroy a DP tunnel
38 * @intel_dp: DP port object the tunnel is connected to
40 * Destroy a DP tunnel connected to @intel_dp, after disabling the BW
47 drm_dp_tunnel_disable_bw_alloc(intel_dp->tunnel); in intel_dp_tunnel_destroy()
73 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; in update_tunnel_state()
82 ret = drm_dp_tunnel_update_state(intel_dp->tunnel); in update_tunnel_state()
84 drm_dbg_kms(display->drm, in update_tunnel_state()
86 drm_dp_tunnel_name(intel_dp->tunnel), in update_tunnel_state()
87 encoder->base.base.id, encoder->base.name, in update_tunnel_state()
94 !drm_dp_tunnel_bw_alloc_is_enabled(intel_dp->tunnel)) in update_tunnel_state()
106 drm_dbg_kms(display->drm, in update_tunnel_state()
107 "[DPTUN %s][ENCODER:%d:%s] Notify users about BW change: %d -> %d\n", in update_tunnel_state()
108 drm_dp_tunnel_name(intel_dp->tunnel), in update_tunnel_state()
109 encoder->base.base.id, encoder->base.name, in update_tunnel_state()
116 * Allocate the BW for a tunnel on a DP connector/port if the connector/port
125 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; in allocate_initial_tunnel_bw_for_pipes()
130 for_each_intel_crtc_in_pipe_mask(display->drm, crtc, pipe_mask) { in allocate_initial_tunnel_bw_for_pipes()
132 to_intel_crtc_state(crtc->base.state); in allocate_initial_tunnel_bw_for_pipes()
137 drm_dbg_kms(display->drm, in allocate_initial_tunnel_bw_for_pipes()
139 drm_dp_tunnel_name(intel_dp->tunnel), in allocate_initial_tunnel_bw_for_pipes()
140 encoder->base.base.id, encoder->base.name, in allocate_initial_tunnel_bw_for_pipes()
141 crtc->base.base.id, crtc->base.name, in allocate_initial_tunnel_bw_for_pipes()
142 crtc->pipe, in allocate_initial_tunnel_bw_for_pipes()
146 err = drm_dp_tunnel_alloc_bw(intel_dp->tunnel, tunnel_bw); in allocate_initial_tunnel_bw_for_pipes()
148 drm_dbg_kms(display->drm, in allocate_initial_tunnel_bw_for_pipes()
150 drm_dp_tunnel_name(intel_dp->tunnel), in allocate_initial_tunnel_bw_for_pipes()
151 encoder->base.base.id, encoder->base.name, in allocate_initial_tunnel_bw_for_pipes()
176 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; in detect_new_tunnel()
180 tunnel = drm_dp_tunnel_detect(display->dp_tunnel_mgr, in detect_new_tunnel()
181 &intel_dp->aux); in detect_new_tunnel()
185 intel_dp->tunnel = tunnel; in detect_new_tunnel()
187 ret = drm_dp_tunnel_enable_bw_alloc(intel_dp->tunnel); in detect_new_tunnel()
189 if (ret == -EOPNOTSUPP) in detect_new_tunnel()
192 drm_dbg_kms(display->drm, in detect_new_tunnel()
194 drm_dp_tunnel_name(intel_dp->tunnel), in detect_new_tunnel()
195 encoder->base.base.id, encoder->base.name, in detect_new_tunnel()
210 * intel_dp_tunnel_detect - Detect a DP tunnel on a port
211 * @intel_dp: DP port object
212 * @ctx: lock context acquired by the connector detection handler
214 * Detect a DP tunnel on the @intel_dp port, enabling the BW allocation mode
221 * tunnel. If the tunnel's state change requires this - for instance the
222 * tunnel's group ID has changed - the tunnel will be dropped and recreated.
224 * Return 0 in case of success - after any tunnel detected and added to
225 * @intel_dp - 1 in case the BW on an already existing tunnel has changed in a
235 if (intel_dp->tunnel) { in intel_dp_tunnel_detect()
248 * intel_dp_tunnel_bw_alloc_is_enabled - Query the BW allocation support on a tunnel
249 * @intel_dp: DP port object
251 * Query whether a DP tunnel is connected on @intel_dp and the tunnel supports
258 return drm_dp_tunnel_bw_alloc_is_enabled(intel_dp->tunnel); in intel_dp_tunnel_bw_alloc_is_enabled()
262 * intel_dp_tunnel_suspend - Suspend a DP tunnel connected on a port
263 * @intel_dp: DP port object
265 * Suspend a DP tunnel on @intel_dp with BW allocation mode enabled on it.
270 struct intel_connector *connector = intel_dp->attached_connector; in intel_dp_tunnel_suspend() local
271 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; in intel_dp_tunnel_suspend()
276 drm_dbg_kms(display->drm, in intel_dp_tunnel_suspend()
277 "[DPTUN %s][CONNECTOR:%d:%s][ENCODER:%d:%s] Suspend\n", in intel_dp_tunnel_suspend()
278 drm_dp_tunnel_name(intel_dp->tunnel), in intel_dp_tunnel_suspend()
279 connector->base.base.id, connector->base.name, in intel_dp_tunnel_suspend()
280 encoder->base.base.id, encoder->base.name); in intel_dp_tunnel_suspend()
282 drm_dp_tunnel_disable_bw_alloc(intel_dp->tunnel); in intel_dp_tunnel_suspend()
284 intel_dp->tunnel_suspended = true; in intel_dp_tunnel_suspend()
288 * intel_dp_tunnel_resume - Resume a DP tunnel connected on a port
289 * @intel_dp: DP port object
293 * Resume a DP tunnel on @intel_dp with BW allocation mode enabled on it.
300 struct intel_connector *connector = intel_dp->attached_connector; in intel_dp_tunnel_resume() local
301 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; in intel_dp_tunnel_resume()
306 if (!intel_dp->tunnel_suspended) in intel_dp_tunnel_resume()
309 intel_dp->tunnel_suspended = false; in intel_dp_tunnel_resume()
311 drm_dbg_kms(display->drm, in intel_dp_tunnel_resume()
312 "[DPTUN %s][CONNECTOR:%d:%s][ENCODER:%d:%s] Resume\n", in intel_dp_tunnel_resume()
313 drm_dp_tunnel_name(intel_dp->tunnel), in intel_dp_tunnel_resume()
314 connector->base.base.id, connector->base.name, in intel_dp_tunnel_resume()
315 encoder->base.base.id, encoder->base.name); in intel_dp_tunnel_resume()
328 drm_dp_tunnel_set_io_error(intel_dp->tunnel); in intel_dp_tunnel_resume()
333 err = drm_dp_tunnel_enable_bw_alloc(intel_dp->tunnel); in intel_dp_tunnel_resume()
339 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); in intel_dp_tunnel_resume()
342 pipe_mask |= BIT(crtc->pipe); in intel_dp_tunnel_resume()
352 drm_dbg_kms(display->drm, in intel_dp_tunnel_resume()
353 …"[DPTUN %s][CONNECTOR:%d:%s][ENCODER:%d:%s] Tunnel can't be resumed, will drop and reject it (err … in intel_dp_tunnel_resume()
354 drm_dp_tunnel_name(intel_dp->tunnel), in intel_dp_tunnel_resume()
355 connector->base.base.id, connector->base.name, in intel_dp_tunnel_resume()
356 encoder->base.base.id, encoder->base.name, in intel_dp_tunnel_resume()
363 if (!state->inherited_dp_tunnels) in get_inherited_tunnel()
366 return state->inherited_dp_tunnels->ref[crtc->pipe].tunnel; in get_inherited_tunnel()
379 drm_WARN_ON(display->drm, old_tunnel != tunnel); in add_inherited_tunnel()
383 if (!state->inherited_dp_tunnels) { in add_inherited_tunnel()
384 state->inherited_dp_tunnels = kzalloc(sizeof(*state->inherited_dp_tunnels), in add_inherited_tunnel()
386 if (!state->inherited_dp_tunnels) in add_inherited_tunnel()
387 return -ENOMEM; in add_inherited_tunnel()
390 drm_dp_tunnel_ref_get(tunnel, &state->inherited_dp_tunnels->ref[crtc->pipe]); in add_inherited_tunnel()
400 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; in check_inherited_tunnel_state()
401 struct intel_connector *connector = in check_inherited_tunnel_state() local
402 to_intel_connector(old_conn_state->base.connector); in check_inherited_tunnel_state()
408 * connector got enabled already without a BWA tunnel, or a different in check_inherited_tunnel_state()
417 if (!old_conn_state->base.crtc) in check_inherited_tunnel_state()
420 old_crtc = to_intel_crtc(old_conn_state->base.crtc); in check_inherited_tunnel_state()
423 if (!old_crtc_state->hw.active || in check_inherited_tunnel_state()
424 old_crtc_state->dp_tunnel_ref.tunnel == intel_dp->tunnel) in check_inherited_tunnel_state()
427 drm_dbg_kms(display->drm, in check_inherited_tunnel_state()
428 … "[DPTUN %s][CONNECTOR:%d:%s][ENCODER:%d:%s][CRTC:%d:%s] Adding state for inherited tunnel %p\n", in check_inherited_tunnel_state()
429 drm_dp_tunnel_name(intel_dp->tunnel), in check_inherited_tunnel_state()
430 connector->base.base.id, connector->base.name, in check_inherited_tunnel_state()
431 encoder->base.base.id, encoder->base.name, in check_inherited_tunnel_state()
432 old_crtc->base.base.id, old_crtc->base.name, in check_inherited_tunnel_state()
433 intel_dp->tunnel); in check_inherited_tunnel_state()
435 return add_inherited_tunnel(state, intel_dp->tunnel, old_crtc); in check_inherited_tunnel_state()
439 * intel_dp_tunnel_atomic_cleanup_inherited_state - Free any inherited DP tunnel state
442 * Free the inherited DP tunnel state in @state.
449 if (!state->inherited_dp_tunnels) in intel_dp_tunnel_atomic_cleanup_inherited_state()
453 if (state->inherited_dp_tunnels->ref[pipe].tunnel) in intel_dp_tunnel_atomic_cleanup_inherited_state()
454 drm_dp_tunnel_ref_put(&state->inherited_dp_tunnels->ref[pipe]); in intel_dp_tunnel_atomic_cleanup_inherited_state()
456 kfree(state->inherited_dp_tunnels); in intel_dp_tunnel_atomic_cleanup_inherited_state()
457 state->inherited_dp_tunnels = NULL; in intel_dp_tunnel_atomic_cleanup_inherited_state()
467 err = drm_dp_tunnel_atomic_get_group_streams_in_state(&state->base, in intel_dp_tunnel_atomic_add_group_state()
472 drm_WARN_ON(display->drm, pipe_mask & ~((1 << I915_MAX_PIPES) - 1)); in intel_dp_tunnel_atomic_add_group_state()
478 * intel_dp_tunnel_atomic_add_state_for_crtc - Add CRTC specific DP tunnel state
482 * Add the DP tunnel state for @crtc if the CRTC (aka DP tunnel stream) is enabled
483 * via a DP tunnel.
493 struct drm_dp_tunnel *tunnel = new_crtc_state->dp_tunnel_ref.tunnel; in intel_dp_tunnel_atomic_add_state_for_crtc()
498 tunnel_state = drm_dp_tunnel_atomic_get_state(&state->base, tunnel); in intel_dp_tunnel_atomic_add_state_for_crtc()
507 struct intel_connector *connector, in check_group_state() argument
511 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; in check_group_state()
515 if (!crtc_state->dp_tunnel_ref.tunnel) in check_group_state()
518 drm_dbg_kms(display->drm, in check_group_state()
519 "[DPTUN %s][CONNECTOR:%d:%s][ENCODER:%d:%s][CRTC:%d:%s] Adding group state for tunnel %p\n", in check_group_state()
520 drm_dp_tunnel_name(intel_dp->tunnel), in check_group_state()
521 connector->base.base.id, connector->base.name, in check_group_state()
522 encoder->base.base.id, encoder->base.name, in check_group_state()
523 crtc->base.base.id, crtc->base.name, in check_group_state()
524 crtc_state->dp_tunnel_ref.tunnel); in check_group_state()
526 return intel_dp_tunnel_atomic_add_group_state(state, crtc_state->dp_tunnel_ref.tunnel); in check_group_state()
530 * intel_dp_tunnel_atomic_check_state - Check a connector's DP tunnel specific state
532 * @intel_dp: DP port object
533 * @connector: connector using @intel_dp
535 * Check and add the DP tunnel atomic state for @intel_dp/@connector to
536 * @state, if there is a DP tunnel detected on @intel_dp with BW allocation
537 * mode enabled on it, or if @intel_dp/@connector was previously enabled via a
538 * DP tunnel.
544 struct intel_connector *connector) in intel_dp_tunnel_atomic_check_state() argument
547 intel_atomic_get_old_connector_state(state, connector); in intel_dp_tunnel_atomic_check_state()
549 intel_atomic_get_new_connector_state(state, connector); in intel_dp_tunnel_atomic_check_state()
552 if (old_conn_state->base.crtc) { in intel_dp_tunnel_atomic_check_state()
553 err = check_group_state(state, intel_dp, connector, in intel_dp_tunnel_atomic_check_state()
554 to_intel_crtc(old_conn_state->base.crtc)); in intel_dp_tunnel_atomic_check_state()
559 if (new_conn_state->base.crtc && in intel_dp_tunnel_atomic_check_state()
560 new_conn_state->base.crtc != old_conn_state->base.crtc) { in intel_dp_tunnel_atomic_check_state()
561 err = check_group_state(state, intel_dp, connector, in intel_dp_tunnel_atomic_check_state()
562 to_intel_crtc(new_conn_state->base.crtc)); in intel_dp_tunnel_atomic_check_state()
571 * intel_dp_tunnel_atomic_compute_stream_bw - Compute the BW required by a DP tunnel stream
573 * @intel_dp: DP object
574 * @connector: connector using @intel_dp
575 * @crtc_state: state of CRTC of the given DP tunnel stream
577 * Compute the required BW of CRTC (aka DP tunnel stream), storing this BW to
578 * the DP tunnel state containing the stream in @state. Before re-calculating a
586 const struct intel_connector *connector, in intel_dp_tunnel_atomic_compute_stream_bw() argument
590 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; in intel_dp_tunnel_atomic_compute_stream_bw()
591 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); in intel_dp_tunnel_atomic_compute_stream_bw()
598 drm_dbg_kms(display->drm, in intel_dp_tunnel_atomic_compute_stream_bw()
599 "[DPTUN %s][CONNECTOR:%d:%s][ENCODER:%d:%s][CRTC:%d:%s] Stream %d required BW %d Mb/s\n", in intel_dp_tunnel_atomic_compute_stream_bw()
600 drm_dp_tunnel_name(intel_dp->tunnel), in intel_dp_tunnel_atomic_compute_stream_bw()
601 connector->base.base.id, connector->base.name, in intel_dp_tunnel_atomic_compute_stream_bw()
602 encoder->base.base.id, encoder->base.name, in intel_dp_tunnel_atomic_compute_stream_bw()
603 crtc->base.base.id, crtc->base.name, in intel_dp_tunnel_atomic_compute_stream_bw()
604 crtc->pipe, in intel_dp_tunnel_atomic_compute_stream_bw()
607 ret = drm_dp_tunnel_atomic_set_stream_bw(&state->base, intel_dp->tunnel, in intel_dp_tunnel_atomic_compute_stream_bw()
608 crtc->pipe, required_rate); in intel_dp_tunnel_atomic_compute_stream_bw()
612 drm_dp_tunnel_ref_get(intel_dp->tunnel, in intel_dp_tunnel_atomic_compute_stream_bw()
613 &crtc_state->dp_tunnel_ref); in intel_dp_tunnel_atomic_compute_stream_bw()
619 * intel_dp_tunnel_atomic_clear_stream_bw - Clear any DP tunnel stream BW requirement
621 * @crtc_state: state of CRTC of the given DP tunnel stream
623 * Clear any DP tunnel stream BW requirement set by
629 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); in intel_dp_tunnel_atomic_clear_stream_bw()
631 if (!crtc_state->dp_tunnel_ref.tunnel) in intel_dp_tunnel_atomic_clear_stream_bw()
634 drm_dp_tunnel_atomic_set_stream_bw(&state->base, in intel_dp_tunnel_atomic_clear_stream_bw()
635 crtc_state->dp_tunnel_ref.tunnel, in intel_dp_tunnel_atomic_clear_stream_bw()
636 crtc->pipe, 0); in intel_dp_tunnel_atomic_clear_stream_bw()
637 drm_dp_tunnel_ref_put(&crtc_state->dp_tunnel_ref); in intel_dp_tunnel_atomic_clear_stream_bw()
641 * intel_dp_tunnel_atomic_check_link - Check the DP tunnel atomic state
645 * Check the link configuration for all DP tunnels in @state. If the
651 * - 0 if the configuration is valid
652 * - %-EAGAIN, if the configuration is invalid and @limits got updated
655 * - Other negative error, if the configuration is invalid without a
664 err = drm_dp_tunnel_atomic_check_stream_bws(&state->base, in intel_dp_tunnel_atomic_check_link()
666 if (err != -ENOSPC) in intel_dp_tunnel_atomic_check_link()
670 failed_stream_mask, "DP tunnel link BW"); in intel_dp_tunnel_atomic_check_link()
672 return err ? : -EAGAIN; in intel_dp_tunnel_atomic_check_link()
693 tunnel = old_crtc_state->dp_tunnel_ref.tunnel; in atomic_decrease_bw()
700 new_tunnel_state = drm_dp_tunnel_atomic_get_new_state(&state->base, tunnel); in atomic_decrease_bw()
722 drm_dbg_kms(display->drm, in queue_retry_work()
725 encoder->base.base.id, in queue_retry_work()
726 encoder->base.name); in queue_retry_work()
739 struct drm_dp_tunnel *tunnel = crtc_state->dp_tunnel_ref.tunnel; in atomic_increase_bw()
748 tunnel_state = drm_dp_tunnel_atomic_get_new_state(&state->base, tunnel); in atomic_increase_bw()
758 * intel_dp_tunnel_atomic_alloc_bw - Allocate the BW for all modeset tunnels
770 * intel_dp_tunnel_mgr_init - Initialize the DP tunnel manager
773 * Initialize the DP tunnel manager. The tunnel manager will support the
774 * detection/management of DP tunnels on all DP connectors, so the function
783 struct intel_connector *connector; in intel_dp_tunnel_mgr_init() local
786 drm_connector_list_iter_begin(display->drm, &connector_list_iter); in intel_dp_tunnel_mgr_init()
787 for_each_intel_connector_iter(connector, &connector_list_iter) { in intel_dp_tunnel_mgr_init()
788 if (connector->base.connector_type != DRM_MODE_CONNECTOR_DisplayPort) in intel_dp_tunnel_mgr_init()
795 tunnel_mgr = drm_dp_tunnel_mgr_create(display->drm, dp_connectors); in intel_dp_tunnel_mgr_init()
799 display->dp_tunnel_mgr = tunnel_mgr; in intel_dp_tunnel_mgr_init()
805 * intel_dp_tunnel_mgr_cleanup - Clean up the DP tunnel manager state
808 * Clean up the DP tunnel manager state.
812 drm_dp_tunnel_mgr_destroy(display->dp_tunnel_mgr); in intel_dp_tunnel_mgr_cleanup()
813 display->dp_tunnel_mgr = NULL; in intel_dp_tunnel_mgr_cleanup()