Lines Matching refs:dig_port
28 struct intel_digital_port *dig_port) in tc_port_load_fia_params() argument
30 enum port port = dig_port->base.port; in tc_port_load_fia_params()
48 dig_port->tc_phy_fia = tc_port / 2; in tc_port_load_fia_params()
49 dig_port->tc_phy_fia_idx = tc_port % 2; in tc_port_load_fia_params()
51 dig_port->tc_phy_fia = FIA1; in tc_port_load_fia_params()
52 dig_port->tc_phy_fia_idx = tc_port; in tc_port_load_fia_params()
57 tc_cold_get_power_domain(struct intel_digital_port *dig_port) in tc_cold_get_power_domain() argument
59 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); in tc_cold_get_power_domain()
62 return intel_legacy_aux_to_power_domain(dig_port->aux_ch); in tc_cold_get_power_domain()
68 tc_cold_block(struct intel_digital_port *dig_port) in tc_cold_block() argument
70 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); in tc_cold_block()
73 if (INTEL_GEN(i915) == 11 && !dig_port->tc_legacy_port) in tc_cold_block()
76 domain = tc_cold_get_power_domain(dig_port); in tc_cold_block()
81 tc_cold_unblock(struct intel_digital_port *dig_port, intel_wakeref_t wakeref) in tc_cold_unblock() argument
83 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); in tc_cold_unblock()
94 domain = tc_cold_get_power_domain(dig_port); in tc_cold_unblock()
99 assert_tc_cold_blocked(struct intel_digital_port *dig_port) in assert_tc_cold_blocked() argument
101 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); in assert_tc_cold_blocked()
104 if (INTEL_GEN(i915) == 11 && !dig_port->tc_legacy_port) in assert_tc_cold_blocked()
108 tc_cold_get_power_domain(dig_port)); in assert_tc_cold_blocked()
112 u32 intel_tc_port_get_lane_mask(struct intel_digital_port *dig_port) in intel_tc_port_get_lane_mask() argument
114 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); in intel_tc_port_get_lane_mask()
119 PORT_TX_DFLEXDPSP(dig_port->tc_phy_fia)); in intel_tc_port_get_lane_mask()
122 assert_tc_cold_blocked(dig_port); in intel_tc_port_get_lane_mask()
124 lane_mask &= DP_LANE_ASSIGNMENT_MASK(dig_port->tc_phy_fia_idx); in intel_tc_port_get_lane_mask()
125 return lane_mask >> DP_LANE_ASSIGNMENT_SHIFT(dig_port->tc_phy_fia_idx); in intel_tc_port_get_lane_mask()
128 u32 intel_tc_port_get_pin_assignment_mask(struct intel_digital_port *dig_port) in intel_tc_port_get_pin_assignment_mask() argument
130 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); in intel_tc_port_get_pin_assignment_mask()
135 PORT_TX_DFLEXPA1(dig_port->tc_phy_fia)); in intel_tc_port_get_pin_assignment_mask()
138 assert_tc_cold_blocked(dig_port); in intel_tc_port_get_pin_assignment_mask()
140 return (pin_mask & DP_PIN_ASSIGNMENT_MASK(dig_port->tc_phy_fia_idx)) >> in intel_tc_port_get_pin_assignment_mask()
141 DP_PIN_ASSIGNMENT_SHIFT(dig_port->tc_phy_fia_idx); in intel_tc_port_get_pin_assignment_mask()
144 int intel_tc_port_fia_max_lane_count(struct intel_digital_port *dig_port) in intel_tc_port_fia_max_lane_count() argument
146 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); in intel_tc_port_fia_max_lane_count()
150 if (dig_port->tc_mode != TC_PORT_DP_ALT) in intel_tc_port_fia_max_lane_count()
153 assert_tc_cold_blocked(dig_port); in intel_tc_port_fia_max_lane_count()
157 lane_mask = intel_tc_port_get_lane_mask(dig_port); in intel_tc_port_fia_max_lane_count()
176 void intel_tc_port_set_fia_lane_count(struct intel_digital_port *dig_port, in intel_tc_port_set_fia_lane_count() argument
179 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); in intel_tc_port_set_fia_lane_count()
180 bool lane_reversal = dig_port->saved_port_bits & DDI_BUF_PORT_REVERSAL; in intel_tc_port_set_fia_lane_count()
185 lane_reversal && dig_port->tc_mode != TC_PORT_LEGACY); in intel_tc_port_set_fia_lane_count()
187 assert_tc_cold_blocked(dig_port); in intel_tc_port_set_fia_lane_count()
190 PORT_TX_DFLEXDPMLE1(dig_port->tc_phy_fia)); in intel_tc_port_set_fia_lane_count()
191 val &= ~DFLEXDPMLE1_DPMLETC_MASK(dig_port->tc_phy_fia_idx); in intel_tc_port_set_fia_lane_count()
196 DFLEXDPMLE1_DPMLETC_ML3(dig_port->tc_phy_fia_idx) : in intel_tc_port_set_fia_lane_count()
197 DFLEXDPMLE1_DPMLETC_ML0(dig_port->tc_phy_fia_idx); in intel_tc_port_set_fia_lane_count()
201 DFLEXDPMLE1_DPMLETC_ML3_2(dig_port->tc_phy_fia_idx) : in intel_tc_port_set_fia_lane_count()
202 DFLEXDPMLE1_DPMLETC_ML1_0(dig_port->tc_phy_fia_idx); in intel_tc_port_set_fia_lane_count()
205 val |= DFLEXDPMLE1_DPMLETC_ML3_0(dig_port->tc_phy_fia_idx); in intel_tc_port_set_fia_lane_count()
212 PORT_TX_DFLEXDPMLE1(dig_port->tc_phy_fia), val); in intel_tc_port_set_fia_lane_count()
215 static void tc_port_fixup_legacy_flag(struct intel_digital_port *dig_port, in tc_port_fixup_legacy_flag() argument
218 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); in tc_port_fixup_legacy_flag()
221 if (dig_port->tc_legacy_port) in tc_port_fixup_legacy_flag()
233 dig_port->tc_port_name, live_status_mask); in tc_port_fixup_legacy_flag()
235 dig_port->tc_legacy_port = !dig_port->tc_legacy_port; in tc_port_fixup_legacy_flag()
238 static u32 tc_port_live_status_mask(struct intel_digital_port *dig_port) in tc_port_live_status_mask() argument
240 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); in tc_port_live_status_mask()
242 u32 isr_bit = i915->hotplug.pch_hpd[dig_port->base.hpd_pin]; in tc_port_live_status_mask()
247 PORT_TX_DFLEXDPSP(dig_port->tc_phy_fia)); in tc_port_live_status_mask()
252 dig_port->tc_port_name); in tc_port_live_status_mask()
256 if (val & TC_LIVE_STATE_TBT(dig_port->tc_phy_fia_idx)) in tc_port_live_status_mask()
258 if (val & TC_LIVE_STATE_TC(dig_port->tc_phy_fia_idx)) in tc_port_live_status_mask()
266 tc_port_fixup_legacy_flag(dig_port, mask); in tc_port_live_status_mask()
271 static bool icl_tc_phy_status_complete(struct intel_digital_port *dig_port) in icl_tc_phy_status_complete() argument
273 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); in icl_tc_phy_status_complete()
278 PORT_TX_DFLEXDPPMS(dig_port->tc_phy_fia)); in icl_tc_phy_status_complete()
282 dig_port->tc_port_name); in icl_tc_phy_status_complete()
286 return val & DP_PHY_MODE_STATUS_COMPLETED(dig_port->tc_phy_fia_idx); in icl_tc_phy_status_complete()
289 static bool icl_tc_phy_set_safe_mode(struct intel_digital_port *dig_port, in icl_tc_phy_set_safe_mode() argument
292 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); in icl_tc_phy_set_safe_mode()
297 PORT_TX_DFLEXDPCSSS(dig_port->tc_phy_fia)); in icl_tc_phy_set_safe_mode()
301 dig_port->tc_port_name, enableddisabled(enable)); in icl_tc_phy_set_safe_mode()
306 val &= ~DP_PHY_MODE_STATUS_NOT_SAFE(dig_port->tc_phy_fia_idx); in icl_tc_phy_set_safe_mode()
308 val |= DP_PHY_MODE_STATUS_NOT_SAFE(dig_port->tc_phy_fia_idx); in icl_tc_phy_set_safe_mode()
311 PORT_TX_DFLEXDPCSSS(dig_port->tc_phy_fia), val); in icl_tc_phy_set_safe_mode()
313 if (enable && wait_for(!icl_tc_phy_status_complete(dig_port), 10)) in icl_tc_phy_set_safe_mode()
316 dig_port->tc_port_name); in icl_tc_phy_set_safe_mode()
321 static bool icl_tc_phy_is_in_safe_mode(struct intel_digital_port *dig_port) in icl_tc_phy_is_in_safe_mode() argument
323 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); in icl_tc_phy_is_in_safe_mode()
328 PORT_TX_DFLEXDPCSSS(dig_port->tc_phy_fia)); in icl_tc_phy_is_in_safe_mode()
332 dig_port->tc_port_name); in icl_tc_phy_is_in_safe_mode()
336 return !(val & DP_PHY_MODE_STATUS_NOT_SAFE(dig_port->tc_phy_fia_idx)); in icl_tc_phy_is_in_safe_mode()
350 static void icl_tc_phy_connect(struct intel_digital_port *dig_port, in icl_tc_phy_connect() argument
353 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); in icl_tc_phy_connect()
356 if (!icl_tc_phy_status_complete(dig_port)) { in icl_tc_phy_connect()
358 dig_port->tc_port_name); in icl_tc_phy_connect()
362 if (!icl_tc_phy_set_safe_mode(dig_port, false) && in icl_tc_phy_connect()
363 !drm_WARN_ON(&i915->drm, dig_port->tc_legacy_port)) in icl_tc_phy_connect()
366 max_lanes = intel_tc_port_fia_max_lane_count(dig_port); in icl_tc_phy_connect()
367 if (dig_port->tc_legacy_port) { in icl_tc_phy_connect()
369 dig_port->tc_mode = TC_PORT_LEGACY; in icl_tc_phy_connect()
378 if (!(tc_port_live_status_mask(dig_port) & BIT(TC_PORT_DP_ALT))) { in icl_tc_phy_connect()
380 dig_port->tc_port_name); in icl_tc_phy_connect()
387 dig_port->tc_port_name, in icl_tc_phy_connect()
392 dig_port->tc_mode = TC_PORT_DP_ALT; in icl_tc_phy_connect()
397 icl_tc_phy_set_safe_mode(dig_port, true); in icl_tc_phy_connect()
399 dig_port->tc_mode = TC_PORT_TBT_ALT; in icl_tc_phy_connect()
406 static void icl_tc_phy_disconnect(struct intel_digital_port *dig_port) in icl_tc_phy_disconnect() argument
408 switch (dig_port->tc_mode) { in icl_tc_phy_disconnect()
413 icl_tc_phy_set_safe_mode(dig_port, true); in icl_tc_phy_disconnect()
414 dig_port->tc_mode = TC_PORT_TBT_ALT; in icl_tc_phy_disconnect()
420 MISSING_CASE(dig_port->tc_mode); in icl_tc_phy_disconnect()
424 static bool icl_tc_phy_is_connected(struct intel_digital_port *dig_port) in icl_tc_phy_is_connected() argument
426 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); in icl_tc_phy_is_connected()
428 if (!icl_tc_phy_status_complete(dig_port)) { in icl_tc_phy_is_connected()
430 dig_port->tc_port_name); in icl_tc_phy_is_connected()
431 return dig_port->tc_mode == TC_PORT_TBT_ALT; in icl_tc_phy_is_connected()
434 if (icl_tc_phy_is_in_safe_mode(dig_port)) { in icl_tc_phy_is_connected()
436 dig_port->tc_port_name); in icl_tc_phy_is_connected()
441 return dig_port->tc_mode == TC_PORT_DP_ALT || in icl_tc_phy_is_connected()
442 dig_port->tc_mode == TC_PORT_LEGACY; in icl_tc_phy_is_connected()
446 intel_tc_port_get_current_mode(struct intel_digital_port *dig_port) in intel_tc_port_get_current_mode() argument
448 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); in intel_tc_port_get_current_mode()
449 u32 live_status_mask = tc_port_live_status_mask(dig_port); in intel_tc_port_get_current_mode()
450 bool in_safe_mode = icl_tc_phy_is_in_safe_mode(dig_port); in intel_tc_port_get_current_mode()
454 drm_WARN_ON(&i915->drm, !icl_tc_phy_status_complete(dig_port))) in intel_tc_port_get_current_mode()
457 mode = dig_port->tc_legacy_port ? TC_PORT_LEGACY : TC_PORT_DP_ALT; in intel_tc_port_get_current_mode()
469 intel_tc_port_get_target_mode(struct intel_digital_port *dig_port) in intel_tc_port_get_target_mode() argument
471 u32 live_status_mask = tc_port_live_status_mask(dig_port); in intel_tc_port_get_target_mode()
476 return icl_tc_phy_status_complete(dig_port) && in intel_tc_port_get_target_mode()
477 dig_port->tc_legacy_port ? TC_PORT_LEGACY : in intel_tc_port_get_target_mode()
481 static void intel_tc_port_reset_mode(struct intel_digital_port *dig_port, in intel_tc_port_reset_mode() argument
484 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); in intel_tc_port_reset_mode()
485 enum tc_port_mode old_tc_mode = dig_port->tc_mode; in intel_tc_port_reset_mode()
488 if (INTEL_GEN(i915) != 11 || !dig_port->tc_legacy_port) { in intel_tc_port_reset_mode()
492 aux_domain = intel_aux_power_domain(dig_port); in intel_tc_port_reset_mode()
497 icl_tc_phy_disconnect(dig_port); in intel_tc_port_reset_mode()
498 icl_tc_phy_connect(dig_port, required_lanes); in intel_tc_port_reset_mode()
501 dig_port->tc_port_name, in intel_tc_port_reset_mode()
503 tc_port_mode_name(dig_port->tc_mode)); in intel_tc_port_reset_mode()
507 intel_tc_port_link_init_refcount(struct intel_digital_port *dig_port, in intel_tc_port_link_init_refcount() argument
510 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); in intel_tc_port_link_init_refcount()
512 drm_WARN_ON(&i915->drm, dig_port->tc_link_refcount); in intel_tc_port_link_init_refcount()
513 dig_port->tc_link_refcount = refcount; in intel_tc_port_link_init_refcount()
516 void intel_tc_port_sanitize(struct intel_digital_port *dig_port) in intel_tc_port_sanitize() argument
518 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); in intel_tc_port_sanitize()
519 struct intel_encoder *encoder = &dig_port->base; in intel_tc_port_sanitize()
523 mutex_lock(&dig_port->tc_lock); in intel_tc_port_sanitize()
524 tc_cold_wref = tc_cold_block(dig_port); in intel_tc_port_sanitize()
526 dig_port->tc_mode = intel_tc_port_get_current_mode(dig_port); in intel_tc_port_sanitize()
527 if (dig_port->dp.is_mst) in intel_tc_port_sanitize()
528 active_links = intel_dp_mst_encoder_active_links(dig_port); in intel_tc_port_sanitize()
533 if (!icl_tc_phy_is_connected(dig_port)) in intel_tc_port_sanitize()
536 dig_port->tc_port_name, active_links); in intel_tc_port_sanitize()
537 intel_tc_port_link_init_refcount(dig_port, active_links); in intel_tc_port_sanitize()
542 if (dig_port->tc_legacy_port) in intel_tc_port_sanitize()
543 icl_tc_phy_connect(dig_port, 1); in intel_tc_port_sanitize()
547 dig_port->tc_port_name, in intel_tc_port_sanitize()
548 tc_port_mode_name(dig_port->tc_mode)); in intel_tc_port_sanitize()
550 tc_cold_unblock(dig_port, tc_cold_wref); in intel_tc_port_sanitize()
551 mutex_unlock(&dig_port->tc_lock); in intel_tc_port_sanitize()
554 static bool intel_tc_port_needs_reset(struct intel_digital_port *dig_port) in intel_tc_port_needs_reset() argument
556 return intel_tc_port_get_target_mode(dig_port) != dig_port->tc_mode; in intel_tc_port_needs_reset()
571 struct intel_digital_port *dig_port = enc_to_dig_port(encoder); in intel_tc_port_connected() local
575 intel_tc_port_lock(dig_port); in intel_tc_port_connected()
576 tc_cold_wref = tc_cold_block(dig_port); in intel_tc_port_connected()
578 is_connected = tc_port_live_status_mask(dig_port) & in intel_tc_port_connected()
579 BIT(dig_port->tc_mode); in intel_tc_port_connected()
581 tc_cold_unblock(dig_port, tc_cold_wref); in intel_tc_port_connected()
582 intel_tc_port_unlock(dig_port); in intel_tc_port_connected()
587 static void __intel_tc_port_lock(struct intel_digital_port *dig_port, in __intel_tc_port_lock() argument
590 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); in __intel_tc_port_lock()
595 mutex_lock(&dig_port->tc_lock); in __intel_tc_port_lock()
597 if (!dig_port->tc_link_refcount) { in __intel_tc_port_lock()
600 tc_cold_wref = tc_cold_block(dig_port); in __intel_tc_port_lock()
602 if (intel_tc_port_needs_reset(dig_port)) in __intel_tc_port_lock()
603 intel_tc_port_reset_mode(dig_port, required_lanes); in __intel_tc_port_lock()
605 tc_cold_unblock(dig_port, tc_cold_wref); in __intel_tc_port_lock()
608 drm_WARN_ON(&i915->drm, dig_port->tc_lock_wakeref); in __intel_tc_port_lock()
609 dig_port->tc_lock_wakeref = wakeref; in __intel_tc_port_lock()
612 void intel_tc_port_lock(struct intel_digital_port *dig_port) in intel_tc_port_lock() argument
614 __intel_tc_port_lock(dig_port, 1); in intel_tc_port_lock()
617 void intel_tc_port_unlock(struct intel_digital_port *dig_port) in intel_tc_port_unlock() argument
619 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); in intel_tc_port_unlock()
620 intel_wakeref_t wakeref = fetch_and_zero(&dig_port->tc_lock_wakeref); in intel_tc_port_unlock()
622 mutex_unlock(&dig_port->tc_lock); in intel_tc_port_unlock()
628 bool intel_tc_port_ref_held(struct intel_digital_port *dig_port) in intel_tc_port_ref_held() argument
630 return mutex_is_locked(&dig_port->tc_lock) || in intel_tc_port_ref_held()
631 dig_port->tc_link_refcount; in intel_tc_port_ref_held()
634 void intel_tc_port_get_link(struct intel_digital_port *dig_port, in intel_tc_port_get_link() argument
637 __intel_tc_port_lock(dig_port, required_lanes); in intel_tc_port_get_link()
638 dig_port->tc_link_refcount++; in intel_tc_port_get_link()
639 intel_tc_port_unlock(dig_port); in intel_tc_port_get_link()
642 void intel_tc_port_put_link(struct intel_digital_port *dig_port) in intel_tc_port_put_link() argument
644 mutex_lock(&dig_port->tc_lock); in intel_tc_port_put_link()
645 dig_port->tc_link_refcount--; in intel_tc_port_put_link()
646 mutex_unlock(&dig_port->tc_lock); in intel_tc_port_put_link()
649 void intel_tc_port_init(struct intel_digital_port *dig_port, bool is_legacy) in intel_tc_port_init() argument
651 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); in intel_tc_port_init()
652 enum port port = dig_port->base.port; in intel_tc_port_init()
658 snprintf(dig_port->tc_port_name, sizeof(dig_port->tc_port_name), in intel_tc_port_init()
661 mutex_init(&dig_port->tc_lock); in intel_tc_port_init()
662 dig_port->tc_legacy_port = is_legacy; in intel_tc_port_init()
663 dig_port->tc_link_refcount = 0; in intel_tc_port_init()
664 tc_port_load_fia_params(i915, dig_port); in intel_tc_port_init()