Lines Matching full:link

27  * This file manages link detection states and receiver states by using various
28 * link protocols. It also provides helper functions to interpret certain
51 link->ctx->logger
166 static enum signal_type link_detect_sink_signal_type(struct dc_link *link, in link_detect_sink_signal_type() argument
172 if (link->is_dig_mapping_flexible) in link_detect_sink_signal_type()
175 enc_id = link->link_enc->id; in link_detect_sink_signal_type()
176 result = get_basic_signal_type(enc_id, link->link_id); in link_detect_sink_signal_type()
178 /* Use basic signal type for link without physical connector. */ in link_detect_sink_signal_type()
179 if (link->ep_type != DISPLAY_ENDPOINT_PHY) in link_detect_sink_signal_type()
195 if (link->link_id.id == CONNECTOR_ID_PCIE) { in link_detect_sink_signal_type()
199 switch (link->link_id.id) { in link_detect_sink_signal_type()
205 &link->dc->res_pool->audio_support; in link_detect_sink_signal_type()
208 if (link->link_id.id == CONNECTOR_ID_HDMI_TYPE_A) in link_detect_sink_signal_type()
222 if (!dm_helpers_is_dp_sink_present(link)) in link_detect_sink_signal_type()
307 ddc->link, in i2c_read()
327 struct dc_link *link = ddc->link; in query_dp_dual_mode_adaptor() local
352 CONN_DATA_DETECT(ddc->link, type2_dongle_buf, sizeof(type2_dongle_buf), in query_dp_dual_mode_adaptor()
399 CONN_DATA_DETECT(ddc->link, type2_dongle_buf, in query_dp_dual_mode_adaptor()
407 CONN_DATA_DETECT(ddc->link, type2_dongle_buf, in query_dp_dual_mode_adaptor()
414 CONN_DATA_DETECT(ddc->link, type2_dongle_buf, in query_dp_dual_mode_adaptor()
431 CONN_DATA_DETECT(ddc->link, type2_dongle_buf, in query_dp_dual_mode_adaptor()
438 CONN_DATA_DETECT(ddc->link, type2_dongle_buf, in query_dp_dual_mode_adaptor()
459 static void link_disconnect_sink(struct dc_link *link) in link_disconnect_sink() argument
461 if (link->local_sink) { in link_disconnect_sink()
462 dc_sink_release(link->local_sink); in link_disconnect_sink()
463 link->local_sink = NULL; in link_disconnect_sink()
466 link->dpcd_sink_count = 0; in link_disconnect_sink()
467 //link->dpcd_caps.dpcd_rev.raw = 0; in link_disconnect_sink()
470 static void link_disconnect_remap(struct dc_sink *prev_sink, struct dc_link *link) in link_disconnect_remap() argument
472 dc_sink_release(link->local_sink); in link_disconnect_remap()
473 link->local_sink = prev_sink; in link_disconnect_remap()
476 static void query_hdcp_capability(enum signal_type signal, struct dc_link *link) in query_hdcp_capability() argument
483 memset(link->hdcp_caps.rx_caps.raw, 0, in query_hdcp_capability()
484 sizeof(link->hdcp_caps.rx_caps.raw)); in query_hdcp_capability()
486 if ((link->connector_signal == SIGNAL_TYPE_DISPLAY_PORT && in query_hdcp_capability()
487 link->ddc->transaction_type == in query_hdcp_capability()
489 link->connector_signal == SIGNAL_TYPE_EDP) { in query_hdcp_capability()
490 msg22.data = link->hdcp_caps.rx_caps.raw; in query_hdcp_capability()
491 msg22.length = sizeof(link->hdcp_caps.rx_caps.raw); in query_hdcp_capability()
494 msg22.data = &link->hdcp_caps.rx_caps.fields.version; in query_hdcp_capability()
495 msg22.length = sizeof(link->hdcp_caps.rx_caps.fields.version); in query_hdcp_capability()
499 msg22.link = HDCP_LINK_PRIMARY; in query_hdcp_capability()
501 dc_process_hdcp_msg(signal, link, &msg22); in query_hdcp_capability()
504 msg14.data = &link->hdcp_caps.bcaps.raw; in query_hdcp_capability()
505 msg14.length = sizeof(link->hdcp_caps.bcaps.raw); in query_hdcp_capability()
508 msg14.link = HDCP_LINK_PRIMARY; in query_hdcp_capability()
511 dc_process_hdcp_msg(signal, link, &msg14); in query_hdcp_capability()
515 static void read_current_link_settings_on_detect(struct dc_link *link) in read_current_link_settings_on_detect() argument
527 status = core_link_read_dpcd(link, in read_current_link_settings_on_detect()
537 link->cur_link_settings.lane_count = in read_current_link_settings_on_detect()
545 // Read DPCD 00100h to find if standard link rates are set in read_current_link_settings_on_detect()
546 core_link_read_dpcd(link, DP_LINK_BW_SET, in read_current_link_settings_on_detect()
550 if (link->connector_signal == SIGNAL_TYPE_EDP) { in read_current_link_settings_on_detect()
551 /* If standard link rates are not being used, in read_current_link_settings_on_detect()
552 * Read DPCD 00115h to find the edp link rate set used in read_current_link_settings_on_detect()
554 core_link_read_dpcd(link, DP_LINK_RATE_SET, in read_current_link_settings_on_detect()
558 if (link_rate_set < link->dpcd_caps.edp_supported_link_rates_count) { in read_current_link_settings_on_detect()
559 link->cur_link_settings.link_rate = in read_current_link_settings_on_detect()
560 link->dpcd_caps.edp_supported_link_rates[link_rate_set]; in read_current_link_settings_on_detect()
561 link->cur_link_settings.link_rate_set = link_rate_set; in read_current_link_settings_on_detect()
562 link->cur_link_settings.use_link_rate_set = true; in read_current_link_settings_on_detect()
565 // Link Rate not found. Seamless boot may not work. in read_current_link_settings_on_detect()
569 link->cur_link_settings.link_rate = link_bw_set; in read_current_link_settings_on_detect()
570 link->cur_link_settings.use_link_rate_set = false; in read_current_link_settings_on_detect()
573 core_link_read_dpcd(link, DP_MAX_DOWNSPREAD, in read_current_link_settings_on_detect()
575 link->cur_link_settings.link_spread = in read_current_link_settings_on_detect()
580 static bool detect_dp(struct dc_link *link, in detect_dp() argument
584 struct audio_support *audio_support = &link->dc->res_pool->audio_support; in detect_dp()
586 sink_caps->signal = link_detect_sink_signal_type(link, reason); in detect_dp()
592 if (!detect_dp_sink_caps(link)) in detect_dp()
595 if (is_dp_branch_device(link)) in detect_dp()
597 link->type = dc_connection_sst_branch; in detect_dp()
599 if (link->dc->debug.disable_dp_plus_plus_wa && in detect_dp()
600 link->link_enc->features.flags.bits.IS_UHBR20_CAPABLE) in detect_dp()
604 sink_caps->signal = dp_passive_dongle_detection(link->ddc, in detect_dp()
607 link->dpcd_caps.dongle_type = sink_caps->dongle_type; in detect_dp()
608 link->dpcd_caps.is_dongle_type_one = sink_caps->is_dongle_type_one; in detect_dp()
609 link->dpcd_caps.dpcd_rev.raw = 0; in detect_dp()
627 static bool wait_for_entering_dp_alt_mode(struct dc_link *link) in wait_for_entering_dp_alt_mode() argument
642 DC_LOGGER_INIT(link->ctx->logger); in wait_for_entering_dp_alt_mode()
649 if (!link->link_enc->funcs->is_in_alt_mode) in wait_for_entering_dp_alt_mode()
652 is_in_alt_mode = link->link_enc->funcs->is_in_alt_mode(link->link_enc); in wait_for_entering_dp_alt_mode()
658 enter_timestamp = dm_get_timestamp(link->ctx); in wait_for_entering_dp_alt_mode()
662 /* ask the link if alt mode is enabled, if so return ok */ in wait_for_entering_dp_alt_mode()
663 if (link->link_enc->funcs->is_in_alt_mode(link->link_enc)) { in wait_for_entering_dp_alt_mode()
664 finish_timestamp = dm_get_timestamp(link->ctx); in wait_for_entering_dp_alt_mode()
666 dm_get_elapse_time_in_ns(link->ctx, in wait_for_entering_dp_alt_mode()
674 finish_timestamp = dm_get_timestamp(link->ctx); in wait_for_entering_dp_alt_mode()
675 time_taken_in_ns = dm_get_elapse_time_in_ns(link->ctx, finish_timestamp, in wait_for_entering_dp_alt_mode()
682 static void apply_dpia_mst_dsc_always_on_wa(struct dc_link *link) in apply_dpia_mst_dsc_always_on_wa() argument
687 if (link->ep_type == DISPLAY_ENDPOINT_USB4_DPIA && in apply_dpia_mst_dsc_always_on_wa()
688 link->type == dc_connection_mst_branch && in apply_dpia_mst_dsc_always_on_wa()
689 link->dpcd_caps.branch_dev_id == DP_BRANCH_DEVICE_ID_90CC24 && in apply_dpia_mst_dsc_always_on_wa()
690 link->dpcd_caps.branch_hw_revision == DP_BRANCH_HW_REV_20 && in apply_dpia_mst_dsc_always_on_wa()
691 link->dpcd_caps.dsc_caps.dsc_basic_caps.fields.dsc_support.DSC_SUPPORT && in apply_dpia_mst_dsc_always_on_wa()
692 !link->dc->debug.dpia_debug.bits.disable_mst_dsc_work_around) in apply_dpia_mst_dsc_always_on_wa()
693 link->wa_flags.dpia_mst_dsc_always_on = true; in apply_dpia_mst_dsc_always_on_wa()
696 static void revert_dpia_mst_dsc_always_on_wa(struct dc_link *link) in revert_dpia_mst_dsc_always_on_wa() argument
699 if (link->ep_type == DISPLAY_ENDPOINT_USB4_DPIA) in revert_dpia_mst_dsc_always_on_wa()
700 link->wa_flags.dpia_mst_dsc_always_on = false; in revert_dpia_mst_dsc_always_on_wa()
703 static bool discover_dp_mst_topology(struct dc_link *link, enum dc_detect_reason reason) in discover_dp_mst_topology() argument
705 DC_LOGGER_INIT(link->ctx->logger); in discover_dp_mst_topology()
707 LINK_INFO("link=%d, mst branch is now Connected\n", in discover_dp_mst_topology()
708 link->link_index); in discover_dp_mst_topology()
710 link->type = dc_connection_mst_branch; in discover_dp_mst_topology()
711 apply_dpia_mst_dsc_always_on_wa(link); in discover_dp_mst_topology()
713 dm_helpers_dp_update_branch_info(link->ctx, link); in discover_dp_mst_topology()
714 if (dm_helpers_dp_mst_start_top_mgr(link->ctx, in discover_dp_mst_topology()
715 link, (reason == DETECT_REASON_BOOT || reason == DETECT_REASON_RESUMEFROMS3S4))) { in discover_dp_mst_topology()
716 link_disconnect_sink(link); in discover_dp_mst_topology()
718 link->type = dc_connection_sst_branch; in discover_dp_mst_topology()
721 return link->type == dc_connection_mst_branch; in discover_dp_mst_topology()
724 bool link_reset_cur_dp_mst_topology(struct dc_link *link) in link_reset_cur_dp_mst_topology() argument
726 DC_LOGGER_INIT(link->ctx->logger); in link_reset_cur_dp_mst_topology()
728 LINK_INFO("link=%d, mst branch is now Disconnected\n", in link_reset_cur_dp_mst_topology()
729 link->link_index); in link_reset_cur_dp_mst_topology()
731 revert_dpia_mst_dsc_always_on_wa(link); in link_reset_cur_dp_mst_topology()
732 return dm_helpers_dp_mst_stop_top_mgr(link->ctx, link); in link_reset_cur_dp_mst_topology()
762 static void verify_link_capability_destructive(struct dc_link *link, in verify_link_capability_destructive() argument
767 should_prepare_phy_clocks_for_link_verification(link->dc, reason); in verify_link_capability_destructive()
770 prepare_phy_clocks_for_destructive_link_verification(link->dc); in verify_link_capability_destructive()
772 if (dc_is_dp_signal(link->local_sink->sink_signal)) { in verify_link_capability_destructive()
774 dp_get_max_link_cap(link); in verify_link_capability_destructive()
775 link_set_all_streams_dpms_off_for_link(link); in verify_link_capability_destructive()
777 link, &known_limit_link_setting, in verify_link_capability_destructive()
784 restore_phy_clocks_for_destructive_link_verification(link->dc); in verify_link_capability_destructive()
787 static void verify_link_capability_non_destructive(struct dc_link *link) in verify_link_capability_non_destructive() argument
789 if (dc_is_dp_signal(link->local_sink->sink_signal)) { in verify_link_capability_non_destructive()
790 if (dc_is_embedded_signal(link->local_sink->sink_signal) || in verify_link_capability_non_destructive()
791 link->ep_type == DISPLAY_ENDPOINT_USB4_DPIA) in verify_link_capability_non_destructive()
792 /* TODO - should we check link encoder's max link caps here? in verify_link_capability_non_destructive()
793 * How do we know which link encoder to check from? in verify_link_capability_non_destructive()
795 link->verified_link_cap = link->reported_link_cap; in verify_link_capability_non_destructive()
797 link->verified_link_cap = dp_get_max_link_cap(link); in verify_link_capability_non_destructive()
801 static bool should_verify_link_capability_destructively(struct dc_link *link, in should_verify_link_capability_destructively() argument
806 bool is_link_enc_unavailable = link->link_enc && in should_verify_link_capability_destructively()
807 link->dc->res_pool->funcs->link_encs_assign && in should_verify_link_capability_destructively()
809 link->ctx->dc, in should_verify_link_capability_destructively()
810 link->link_enc->preferred_engine, in should_verify_link_capability_destructively()
811 link); in should_verify_link_capability_destructively()
813 if (dc_is_dp_signal(link->local_sink->sink_signal)) { in should_verify_link_capability_destructively()
814 max_link_cap = dp_get_max_link_cap(link); in should_verify_link_capability_destructively()
817 if (link->dc->debug.skip_detection_link_training || in should_verify_link_capability_destructively()
818 dc_is_embedded_signal(link->local_sink->sink_signal) || in should_verify_link_capability_destructively()
819 link->ep_type == DISPLAY_ENDPOINT_USB4_DPIA) { in should_verify_link_capability_destructively()
823 if (link->dpcd_caps.is_mst_capable || in should_verify_link_capability_destructively()
833 static void verify_link_capability(struct dc_link *link, struct dc_sink *sink, in verify_link_capability() argument
836 if (should_verify_link_capability_destructively(link, reason)) in verify_link_capability()
837 verify_link_capability_destructive(link, sink, reason); in verify_link_capability()
839 verify_link_capability_non_destructive(link); in verify_link_capability()
843 * detect_link_and_local_sink() - Detect if a sink is attached to a given link
845 * link->local_sink is created or destroyed as needed.
849 static bool detect_link_and_local_sink(struct dc_link *link, in detect_link_and_local_sink() argument
856 struct audio_support *aud_support = &link->dc->res_pool->audio_support; in detect_link_and_local_sink()
859 struct dc_context *dc_ctx = link->ctx; in detect_link_and_local_sink()
865 enum dc_connection_type pre_connection_type = link->type; in detect_link_and_local_sink()
868 DC_LOGGER_INIT(link->ctx->logger); in detect_link_and_local_sink()
870 if (dc_is_virtual_signal(link->connector_signal)) in detect_link_and_local_sink()
873 if (((link->connector_signal == SIGNAL_TYPE_LVDS || in detect_link_and_local_sink()
874 link->connector_signal == SIGNAL_TYPE_EDP) && in detect_link_and_local_sink()
875 (!link->dc->config.allow_edp_hotplug_detection)) && in detect_link_and_local_sink()
876 link->local_sink) { in detect_link_and_local_sink()
878 if (link->connector_signal == SIGNAL_TYPE_EDP && in detect_link_and_local_sink()
879 (link->dpcd_sink_ext_caps.bits.oled == 1)) { in detect_link_and_local_sink()
880 dpcd_set_source_specific_data(link); in detect_link_and_local_sink()
882 set_default_brightness_aux(link); in detect_link_and_local_sink()
888 if (!link_detect_connection_type(link, &new_connection_type)) { in detect_link_and_local_sink()
893 prev_sink = link->local_sink; in detect_link_and_local_sink()
896 memcpy(&prev_dpcd_caps, &link->dpcd_caps, sizeof(struct dpcd_caps)); in detect_link_and_local_sink()
899 link_disconnect_sink(link); in detect_link_and_local_sink()
901 link->type = new_connection_type; in detect_link_and_local_sink()
902 link->link_state_valid = false; in detect_link_and_local_sink()
905 switch (link->connector_signal) { in detect_link_and_local_sink()
934 detect_edp_sink_caps(link); in detect_link_and_local_sink()
935 read_current_link_settings_on_detect(link); in detect_link_and_local_sink()
941 link->dpcd_caps.sink_dev_id == DP_BRANCH_DEVICE_ID_0022B9 && in detect_link_and_local_sink()
942 memcmp(&link->dpcd_caps.branch_dev_name, DP_SINK_BRANCH_DEV_NAME_7580, in detect_link_and_local_sink()
943 sizeof(link->dpcd_caps.branch_dev_name)) == 0) { in detect_link_and_local_sink()
946 if (!link->dpcd_caps.set_power_state_capable_edp) in detect_link_and_local_sink()
947 link->wa_flags.dp_keep_receiver_powered = true; in detect_link_and_local_sink()
958 if (link->ep_type == DISPLAY_ENDPOINT_PHY && in detect_link_and_local_sink()
959 link->link_enc->features.flags.bits.DP_IS_USB_C == 1) { in detect_link_and_local_sink()
962 if (!wait_for_entering_dp_alt_mode(link)) in detect_link_and_local_sink()
966 if (!detect_dp(link, &sink_caps, reason)) { in detect_link_and_local_sink()
967 link->type = pre_connection_type; in detect_link_and_local_sink()
975 if (link->type == dc_connection_sst_branch && in detect_link_and_local_sink()
976 link->dpcd_caps.sink_count.bits.SINK_COUNT == 0) { in detect_link_and_local_sink()
984 if (link->type == dc_connection_sst_branch && in detect_link_and_local_sink()
985 is_dp_active_dongle(link) && in detect_link_and_local_sink()
986 (link->dpcd_caps.dongle_type != in detect_link_and_local_sink()
990 /* limited link rate to HBR3 for DPIA until we implement USB4 V2 */ in detect_link_and_local_sink()
991 if (link->ep_type == DISPLAY_ENDPOINT_USB4_DPIA && in detect_link_and_local_sink()
992 link->reported_link_cap.link_rate > LINK_RATE_HIGH3) in detect_link_and_local_sink()
993 link->reported_link_cap.link_rate = LINK_RATE_HIGH3; in detect_link_and_local_sink()
999 link->connector_signal); in detect_link_and_local_sink()
1005 if (link->dpcd_caps.sink_count.bits.SINK_COUNT) in detect_link_and_local_sink()
1006 link->dpcd_sink_count = in detect_link_and_local_sink()
1007 link->dpcd_caps.sink_count.bits.SINK_COUNT; in detect_link_and_local_sink()
1009 link->dpcd_sink_count = 1; in detect_link_and_local_sink()
1011 set_ddc_transaction_type(link->ddc, in detect_link_and_local_sink()
1014 link->aux_mode = in detect_link_and_local_sink()
1015 link_is_in_aux_transaction_mode(link->ddc); in detect_link_and_local_sink()
1017 sink_init_data.link = link; in detect_link_and_local_sink()
1028 sink->link->dongle_max_pix_clk = sink_caps.max_hdmi_pixel_clock; in detect_link_and_local_sink()
1032 link->local_sink = sink; in detect_link_and_local_sink()
1034 edid_status = dm_helpers_read_local_edid(link->ctx, in detect_link_and_local_sink()
1035 link, sink); in detect_link_and_local_sink()
1054 if (dc_is_hdmi_signal(link->connector_signal) || in detect_link_and_local_sink()
1055 dc_is_dvi_signal(link->connector_signal)) { in detect_link_and_local_sink()
1062 if (link->type == dc_connection_sst_branch && in detect_link_and_local_sink()
1063 link->dpcd_caps.dongle_type == in detect_link_and_local_sink()
1072 link_disconnect_sink(link); in detect_link_and_local_sink()
1089 link->ctx->dc->debug.hdmi20_disable = true; in detect_link_and_local_sink()
1092 link->dpcd_sink_ext_caps.raw = 0; in detect_link_and_local_sink()
1094 if (dc_is_hdmi_signal(link->connector_signal)) in detect_link_and_local_sink()
1095 read_scdc_caps(link->ddc, link->local_sink); in detect_link_and_local_sink()
1097 if (link->connector_signal == SIGNAL_TYPE_DISPLAY_PORT && in detect_link_and_local_sink()
1102 * two link trainings in detect_link_and_local_sink()
1104 query_hdcp_capability(sink->sink_signal, link); in detect_link_and_local_sink()
1108 link_disconnect_remap(prev_sink, link); in detect_link_and_local_sink()
1112 query_hdcp_capability(sink->sink_signal, link); in detect_link_and_local_sink()
1120 if (link->local_sink && dc_is_dp_signal(sink_caps.signal)) in detect_link_and_local_sink()
1121 dp_trace_init(link); in detect_link_and_local_sink()
1125 CONN_DATA_DETECT(link, in detect_link_and_local_sink()
1164 if (link->connector_signal == SIGNAL_TYPE_EDP) { in detect_link_and_local_sink()
1167 dc_ctx->dc->res_pool->funcs->get_panel_config_defaults(&link->panel_config); in detect_link_and_local_sink()
1169 dm_helpers_init_panel_settings(dc_ctx, &link->panel_config, sink); in detect_link_and_local_sink()
1171 dm_helpers_override_panel_settings(dc_ctx, &link->panel_config); in detect_link_and_local_sink()
1173 //sink only can use supported link rate table, we are foreced to enable it in detect_link_and_local_sink()
1174 if (link->reported_link_cap.link_rate == LINK_RATE_UNKNOWN) in detect_link_and_local_sink()
1175 link->panel_config.ilr.optimize_edp_link_rate = true; in detect_link_and_local_sink()
1176 if (edp_is_ilr_optimization_enabled(link)) in detect_link_and_local_sink()
1177 link->reported_link_cap.link_rate = get_max_link_rate_from_ilr_table(link); in detect_link_and_local_sink()
1182 link->type = dc_connection_none; in detect_link_and_local_sink()
1184 memset(&link->hdcp_caps, 0, sizeof(struct hdcp_caps)); in detect_link_and_local_sink()
1190 link->dongle_max_pix_clk = 0; in detect_link_and_local_sink()
1192 dc_link_clear_dprx_states(link); in detect_link_and_local_sink()
1193 dp_trace_reset(link); in detect_link_and_local_sink()
1196 LINK_INFO("link=%d, dc_sink_in=%p is now %s prev_sink=%p edid same=%d\n", in detect_link_and_local_sink()
1197 link->link_index, sink, in detect_link_and_local_sink()
1215 bool link_detect_connection_type(struct dc_link *link, enum dc_connection_type *type) in link_detect_connection_type() argument
1219 if (link->connector_signal == SIGNAL_TYPE_LVDS) { in link_detect_connection_type()
1224 if (link->connector_signal == SIGNAL_TYPE_EDP) { in link_detect_connection_type()
1226 if (!link->dc->config.edp_no_power_sequencing) in link_detect_connection_type()
1227 link->dc->hwss.edp_power_control(link, true); in link_detect_connection_type()
1228 link->dc->hwss.edp_wait_for_hpd_ready(link, true); in link_detect_connection_type()
1231 /* Link may not have physical HPD pin. */ in link_detect_connection_type()
1232 if (link->ep_type != DISPLAY_ENDPOINT_PHY) { in link_detect_connection_type()
1233 if (link->is_hpd_pending || !dpia_query_hpd_status(link)) in link_detect_connection_type()
1242 if (!query_hpd_status(link, &is_hpd_high)) in link_detect_connection_type()
1250 if (link->connector_signal == SIGNAL_TYPE_EDP) { in link_detect_connection_type()
1252 if (!link->dc->config.edp_no_power_sequencing) in link_detect_connection_type()
1253 link->dc->hwss.edp_power_control(link, false); in link_detect_connection_type()
1263 bool link_detect(struct dc_link *link, enum dc_detect_reason reason) in link_detect() argument
1267 enum dc_connection_type pre_link_type = link->type; in link_detect()
1269 DC_LOGGER_INIT(link->ctx->logger); in link_detect()
1271 is_local_sink_detect_success = detect_link_and_local_sink(link, reason); in link_detect()
1273 if (is_local_sink_detect_success && link->local_sink) in link_detect()
1274 verify_link_capability(link, link->local_sink, reason); in link_detect()
1277 link->link_index, is_local_sink_detect_success, pre_link_type, link->type); in link_detect()
1279 if (is_local_sink_detect_success && link->local_sink && in link_detect()
1280 dc_is_dp_signal(link->local_sink->sink_signal) && in link_detect()
1281 link->dpcd_caps.is_mst_capable) in link_detect()
1282 is_delegated_to_mst_top_mgr = discover_dp_mst_topology(link, reason); in link_detect()
1286 link->type != dc_connection_mst_branch) in link_detect()
1287 is_delegated_to_mst_top_mgr = link_reset_cur_dp_mst_topology(link); in link_detect()
1292 void link_clear_dprx_states(struct dc_link *link) in link_clear_dprx_states() argument
1294 memset(&link->dprx_states, 0, sizeof(link->dprx_states)); in link_clear_dprx_states()
1297 bool link_is_hdcp14(struct dc_link *link, enum signal_type signal) in link_is_hdcp14() argument
1304 ret = link->hdcp_caps.bcaps.bits.HDCP_CAPABLE; in link_is_hdcp14()
1321 bool link_is_hdcp22(struct dc_link *link, enum signal_type signal) in link_is_hdcp22() argument
1328 ret = (link->hdcp_caps.bcaps.bits.HDCP_CAPABLE && in link_is_hdcp22()
1329 link->hdcp_caps.rx_caps.fields.byte0.hdcp_capable && in link_is_hdcp22()
1330 (link->hdcp_caps.rx_caps.fields.version == 0x2)) ? 1 : 0; in link_is_hdcp22()
1335 ret = (link->hdcp_caps.rx_caps.fields.version == 0x4) ? 1:0; in link_is_hdcp22()
1344 const struct dc_link_status *link_get_status(const struct dc_link *link) in link_get_status() argument
1346 return &link->link_status; in link_get_status()
1366 struct dc_link *link, in link_add_remote_sink() argument
1384 if (!init_data->link) { in link_add_remote_sink()
1398 link, in link_add_remote_sink()
1403 link, in link_add_remote_sink()
1423 void link_remove_remote_sink(struct dc_link *link, struct dc_sink *sink) in link_remove_remote_sink() argument
1427 if (!link->sink_count) { in link_remove_remote_sink()
1432 for (i = 0; i < link->sink_count; i++) { in link_remove_remote_sink()
1433 if (link->remote_sinks[i] == sink) { in link_remove_remote_sink()
1435 link->remote_sinks[i] = NULL; in link_remove_remote_sink()
1438 while (i < link->sink_count - 1) { in link_remove_remote_sink()
1439 link->remote_sinks[i] = link->remote_sinks[i+1]; in link_remove_remote_sink()
1442 link->remote_sinks[i] = NULL; in link_remove_remote_sink()
1443 link->sink_count--; in link_remove_remote_sink()