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
55 link->ctx->logger
170 static enum signal_type link_detect_sink_signal_type(struct dc_link *link, in link_detect_sink_signal_type() argument
176 if (link->is_dig_mapping_flexible) in link_detect_sink_signal_type()
179 enc_id = link->link_enc->id; in link_detect_sink_signal_type()
180 result = get_basic_signal_type(enc_id, link->link_id); in link_detect_sink_signal_type()
182 /* Use basic signal type for link without physical connector. */ in link_detect_sink_signal_type()
183 if (link->ep_type != DISPLAY_ENDPOINT_PHY) in link_detect_sink_signal_type()
199 if (link->link_id.id == CONNECTOR_ID_PCIE) { in link_detect_sink_signal_type()
203 switch (link->link_id.id) { in link_detect_sink_signal_type()
209 &link->dc->res_pool->audio_support; in link_detect_sink_signal_type()
212 if (link->link_id.id == CONNECTOR_ID_HDMI_TYPE_A) in link_detect_sink_signal_type()
226 if (!dm_helpers_is_dp_sink_present(link)) in link_detect_sink_signal_type()
311 ddc->link, in i2c_read()
331 struct dc_link *link = ddc->link; in query_dp_dual_mode_adaptor() local
356 CONN_DATA_DETECT(ddc->link, type2_dongle_buf, sizeof(type2_dongle_buf), in query_dp_dual_mode_adaptor()
403 CONN_DATA_DETECT(ddc->link, type2_dongle_buf, in query_dp_dual_mode_adaptor()
411 CONN_DATA_DETECT(ddc->link, type2_dongle_buf, in query_dp_dual_mode_adaptor()
418 CONN_DATA_DETECT(ddc->link, type2_dongle_buf, in query_dp_dual_mode_adaptor()
435 CONN_DATA_DETECT(ddc->link, type2_dongle_buf, in query_dp_dual_mode_adaptor()
442 CONN_DATA_DETECT(ddc->link, type2_dongle_buf, in query_dp_dual_mode_adaptor()
463 static void link_disconnect_sink(struct dc_link *link) in link_disconnect_sink() argument
465 if (link->local_sink) { in link_disconnect_sink()
466 dc_sink_release(link->local_sink); in link_disconnect_sink()
467 link->local_sink = NULL; in link_disconnect_sink()
470 link->dpcd_sink_count = 0; in link_disconnect_sink()
471 //link->dpcd_caps.dpcd_rev.raw = 0; in link_disconnect_sink()
474 static void link_disconnect_remap(struct dc_sink *prev_sink, struct dc_link *link) in link_disconnect_remap() argument
476 dc_sink_release(link->local_sink); in link_disconnect_remap()
477 link->local_sink = prev_sink; in link_disconnect_remap()
480 static void query_hdcp_capability(enum signal_type signal, struct dc_link *link) in query_hdcp_capability() argument
487 memset(link->hdcp_caps.rx_caps.raw, 0, in query_hdcp_capability()
488 sizeof(link->hdcp_caps.rx_caps.raw)); in query_hdcp_capability()
490 if ((link->connector_signal == SIGNAL_TYPE_DISPLAY_PORT && in query_hdcp_capability()
491 link->ddc->transaction_type == in query_hdcp_capability()
493 link->connector_signal == SIGNAL_TYPE_EDP) { in query_hdcp_capability()
494 msg22.data = link->hdcp_caps.rx_caps.raw; in query_hdcp_capability()
495 msg22.length = sizeof(link->hdcp_caps.rx_caps.raw); in query_hdcp_capability()
498 msg22.data = &link->hdcp_caps.rx_caps.fields.version; in query_hdcp_capability()
499 msg22.length = sizeof(link->hdcp_caps.rx_caps.fields.version); in query_hdcp_capability()
503 msg22.link = HDCP_LINK_PRIMARY; in query_hdcp_capability()
505 dc_process_hdcp_msg(signal, link, &msg22); in query_hdcp_capability()
508 msg14.data = &link->hdcp_caps.bcaps.raw; in query_hdcp_capability()
509 msg14.length = sizeof(link->hdcp_caps.bcaps.raw); in query_hdcp_capability()
512 msg14.link = HDCP_LINK_PRIMARY; in query_hdcp_capability()
515 dc_process_hdcp_msg(signal, link, &msg14); in query_hdcp_capability()
519 static void read_current_link_settings_on_detect(struct dc_link *link) in read_current_link_settings_on_detect() argument
531 status = core_link_read_dpcd(link, in read_current_link_settings_on_detect()
541 link->cur_link_settings.lane_count = in read_current_link_settings_on_detect()
549 // Read DPCD 00100h to find if standard link rates are set in read_current_link_settings_on_detect()
550 core_link_read_dpcd(link, DP_LINK_BW_SET, in read_current_link_settings_on_detect()
554 if (link->connector_signal == SIGNAL_TYPE_EDP) { in read_current_link_settings_on_detect()
555 /* If standard link rates are not being used, in read_current_link_settings_on_detect()
556 * Read DPCD 00115h to find the edp link rate set used in read_current_link_settings_on_detect()
558 core_link_read_dpcd(link, DP_LINK_RATE_SET, in read_current_link_settings_on_detect()
562 if (link_rate_set < link->dpcd_caps.edp_supported_link_rates_count) { in read_current_link_settings_on_detect()
563 link->cur_link_settings.link_rate = in read_current_link_settings_on_detect()
564 link->dpcd_caps.edp_supported_link_rates[link_rate_set]; in read_current_link_settings_on_detect()
565 link->cur_link_settings.link_rate_set = link_rate_set; in read_current_link_settings_on_detect()
566 link->cur_link_settings.use_link_rate_set = true; in read_current_link_settings_on_detect()
569 // Link Rate not found. Seamless boot may not work. in read_current_link_settings_on_detect()
573 link->cur_link_settings.link_rate = link_bw_set; in read_current_link_settings_on_detect()
574 link->cur_link_settings.use_link_rate_set = false; in read_current_link_settings_on_detect()
577 core_link_read_dpcd(link, DP_MAX_DOWNSPREAD, in read_current_link_settings_on_detect()
579 link->cur_link_settings.link_spread = in read_current_link_settings_on_detect()
584 static bool detect_dp(struct dc_link *link, in detect_dp() argument
588 struct audio_support *audio_support = &link->dc->res_pool->audio_support; in detect_dp()
590 sink_caps->signal = link_detect_sink_signal_type(link, reason); in detect_dp()
596 if (!detect_dp_sink_caps(link)) in detect_dp()
599 if (is_dp_branch_device(link)) in detect_dp()
601 link->type = dc_connection_sst_branch; in detect_dp()
603 if (link->dc->debug.disable_dp_plus_plus_wa && in detect_dp()
604 link->link_enc->features.flags.bits.IS_UHBR20_CAPABLE) in detect_dp()
608 sink_caps->signal = dp_passive_dongle_detection(link->ddc, in detect_dp()
611 link->dpcd_caps.dongle_type = sink_caps->dongle_type; in detect_dp()
612 link->dpcd_caps.is_dongle_type_one = sink_caps->is_dongle_type_one; in detect_dp()
613 link->dpcd_caps.dpcd_rev.raw = 0; in detect_dp()
631 static bool wait_for_entering_dp_alt_mode(struct dc_link *link) in wait_for_entering_dp_alt_mode() argument
646 DC_LOGGER_INIT(link->ctx->logger); in wait_for_entering_dp_alt_mode()
653 if (!link->link_enc->funcs->is_in_alt_mode) in wait_for_entering_dp_alt_mode()
656 is_in_alt_mode = link->link_enc->funcs->is_in_alt_mode(link->link_enc); in wait_for_entering_dp_alt_mode()
662 enter_timestamp = dm_get_timestamp(link->ctx); in wait_for_entering_dp_alt_mode()
666 /* ask the link if alt mode is enabled, if so return ok */ in wait_for_entering_dp_alt_mode()
667 if (link->link_enc->funcs->is_in_alt_mode(link->link_enc)) { in wait_for_entering_dp_alt_mode()
668 finish_timestamp = dm_get_timestamp(link->ctx); in wait_for_entering_dp_alt_mode()
670 dm_get_elapse_time_in_ns(link->ctx, in wait_for_entering_dp_alt_mode()
678 finish_timestamp = dm_get_timestamp(link->ctx); in wait_for_entering_dp_alt_mode()
679 time_taken_in_ns = dm_get_elapse_time_in_ns(link->ctx, finish_timestamp, in wait_for_entering_dp_alt_mode()
686 static void apply_dpia_mst_dsc_always_on_wa(struct dc_link *link) in apply_dpia_mst_dsc_always_on_wa() argument
691 if (link->ep_type == DISPLAY_ENDPOINT_USB4_DPIA && in apply_dpia_mst_dsc_always_on_wa()
692 link->type == dc_connection_mst_branch && in apply_dpia_mst_dsc_always_on_wa()
693 link->dpcd_caps.branch_dev_id == DP_BRANCH_DEVICE_ID_90CC24 && in apply_dpia_mst_dsc_always_on_wa()
694 link->dpcd_caps.branch_hw_revision == DP_BRANCH_HW_REV_20 && in apply_dpia_mst_dsc_always_on_wa()
695 link->dpcd_caps.dsc_caps.dsc_basic_caps.fields.dsc_support.DSC_SUPPORT && in apply_dpia_mst_dsc_always_on_wa()
696 !link->dc->debug.dpia_debug.bits.disable_mst_dsc_work_around) in apply_dpia_mst_dsc_always_on_wa()
697 link->wa_flags.dpia_mst_dsc_always_on = true; in apply_dpia_mst_dsc_always_on_wa()
699 if (link->ep_type == DISPLAY_ENDPOINT_USB4_DPIA && in apply_dpia_mst_dsc_always_on_wa()
700 link->type == dc_connection_mst_branch && in apply_dpia_mst_dsc_always_on_wa()
701 link->dpcd_caps.branch_dev_id == DP_BRANCH_DEVICE_ID_90CC24 && in apply_dpia_mst_dsc_always_on_wa()
702 link->dpcd_caps.branch_vendor_specific_data[2] == MST_HUB_ID_0x5A && in apply_dpia_mst_dsc_always_on_wa()
703 link->dpcd_caps.dsc_caps.dsc_basic_caps.fields.dsc_support.DSC_SUPPORT && in apply_dpia_mst_dsc_always_on_wa()
704 !link->dc->debug.dpia_debug.bits.disable_mst_dsc_work_around) { in apply_dpia_mst_dsc_always_on_wa()
705 link->wa_flags.dpia_mst_dsc_always_on = true; in apply_dpia_mst_dsc_always_on_wa()
709 static void revert_dpia_mst_dsc_always_on_wa(struct dc_link *link) in revert_dpia_mst_dsc_always_on_wa() argument
712 if (link->ep_type == DISPLAY_ENDPOINT_USB4_DPIA) in revert_dpia_mst_dsc_always_on_wa()
713 link->wa_flags.dpia_mst_dsc_always_on = false; in revert_dpia_mst_dsc_always_on_wa()
716 static bool discover_dp_mst_topology(struct dc_link *link, enum dc_detect_reason reason) in discover_dp_mst_topology() argument
718 DC_LOGGER_INIT(link->ctx->logger); in discover_dp_mst_topology()
720 LINK_INFO("link=%d, mst branch is now Connected\n", in discover_dp_mst_topology()
721 link->link_index); in discover_dp_mst_topology()
723 link->type = dc_connection_mst_branch; in discover_dp_mst_topology()
724 apply_dpia_mst_dsc_always_on_wa(link); in discover_dp_mst_topology()
726 dm_helpers_dp_update_branch_info(link->ctx, link); in discover_dp_mst_topology()
727 if (dm_helpers_dp_mst_start_top_mgr(link->ctx, in discover_dp_mst_topology()
728 link, (reason == DETECT_REASON_BOOT || reason == DETECT_REASON_RESUMEFROMS3S4))) { in discover_dp_mst_topology()
729 link_disconnect_sink(link); in discover_dp_mst_topology()
731 link->type = dc_connection_sst_branch; in discover_dp_mst_topology()
734 return link->type == dc_connection_mst_branch; in discover_dp_mst_topology()
737 bool link_reset_cur_dp_mst_topology(struct dc_link *link) in link_reset_cur_dp_mst_topology() argument
739 DC_LOGGER_INIT(link->ctx->logger); in link_reset_cur_dp_mst_topology()
741 LINK_INFO("link=%d, mst branch is now Disconnected\n", in link_reset_cur_dp_mst_topology()
742 link->link_index); in link_reset_cur_dp_mst_topology()
744 revert_dpia_mst_dsc_always_on_wa(link); in link_reset_cur_dp_mst_topology()
745 return dm_helpers_dp_mst_stop_top_mgr(link->ctx, link); in link_reset_cur_dp_mst_topology()
775 static void verify_link_capability_destructive(struct dc_link *link, in verify_link_capability_destructive() argument
780 should_prepare_phy_clocks_for_link_verification(link->dc, reason); in verify_link_capability_destructive()
783 prepare_phy_clocks_for_destructive_link_verification(link->dc); in verify_link_capability_destructive()
785 if (dc_is_dp_signal(link->local_sink->sink_signal)) { in verify_link_capability_destructive()
787 dp_get_max_link_cap(link); in verify_link_capability_destructive()
788 link_set_all_streams_dpms_off_for_link(link); in verify_link_capability_destructive()
790 link, &known_limit_link_setting, in verify_link_capability_destructive()
797 restore_phy_clocks_for_destructive_link_verification(link->dc); in verify_link_capability_destructive()
800 static void verify_link_capability_non_destructive(struct dc_link *link) in verify_link_capability_non_destructive() argument
802 if (dc_is_dp_signal(link->local_sink->sink_signal)) { in verify_link_capability_non_destructive()
803 if (dc_is_embedded_signal(link->local_sink->sink_signal) || in verify_link_capability_non_destructive()
804 link->ep_type == DISPLAY_ENDPOINT_USB4_DPIA) in verify_link_capability_non_destructive()
805 /* TODO - should we check link encoder's max link caps here? in verify_link_capability_non_destructive()
806 * How do we know which link encoder to check from? in verify_link_capability_non_destructive()
808 link->verified_link_cap = link->reported_link_cap; in verify_link_capability_non_destructive()
810 link->verified_link_cap = dp_get_max_link_cap(link); in verify_link_capability_non_destructive()
814 static bool should_verify_link_capability_destructively(struct dc_link *link, in should_verify_link_capability_destructively() argument
821 if (!link->dc->config.unify_link_enc_assignment) in should_verify_link_capability_destructively()
822 is_link_enc_unavailable = link->link_enc && in should_verify_link_capability_destructively()
823 link->dc->res_pool->funcs->link_encs_assign && in should_verify_link_capability_destructively()
825 link->ctx->dc, in should_verify_link_capability_destructively()
826 link->link_enc->preferred_engine, in should_verify_link_capability_destructively()
827 link); in should_verify_link_capability_destructively()
829 if (dc_is_dp_signal(link->local_sink->sink_signal)) { in should_verify_link_capability_destructively()
830 max_link_cap = dp_get_max_link_cap(link); in should_verify_link_capability_destructively()
833 if (link->dc->debug.skip_detection_link_training || in should_verify_link_capability_destructively()
834 dc_is_embedded_signal(link->local_sink->sink_signal) || in should_verify_link_capability_destructively()
835 (link->ep_type == DISPLAY_ENDPOINT_USB4_DPIA && in should_verify_link_capability_destructively()
836 !link->dc->config.enable_dpia_pre_training)) { in should_verify_link_capability_destructively()
840 if (link->dpcd_caps.is_mst_capable || in should_verify_link_capability_destructively()
850 static void verify_link_capability(struct dc_link *link, struct dc_sink *sink, in verify_link_capability() argument
853 if (should_verify_link_capability_destructively(link, reason)) in verify_link_capability()
854 verify_link_capability_destructive(link, sink, reason); in verify_link_capability()
856 verify_link_capability_non_destructive(link); in verify_link_capability()
860 * detect_link_and_local_sink() - Detect if a sink is attached to a given link
862 * link->local_sink is created or destroyed as needed.
866 static bool detect_link_and_local_sink(struct dc_link *link, in detect_link_and_local_sink() argument
873 struct audio_support *aud_support = &link->dc->res_pool->audio_support; in detect_link_and_local_sink()
876 struct dc_context *dc_ctx = link->ctx; in detect_link_and_local_sink()
884 DC_LOGGER_INIT(link->ctx->logger); in detect_link_and_local_sink()
886 if (dc_is_virtual_signal(link->connector_signal)) in detect_link_and_local_sink()
889 if (((link->connector_signal == SIGNAL_TYPE_LVDS || in detect_link_and_local_sink()
890 link->connector_signal == SIGNAL_TYPE_EDP) && in detect_link_and_local_sink()
891 (!link->dc->config.allow_edp_hotplug_detection)) && in detect_link_and_local_sink()
892 link->local_sink) { in detect_link_and_local_sink()
894 if (link->connector_signal == SIGNAL_TYPE_EDP && in detect_link_and_local_sink()
895 (link->dpcd_sink_ext_caps.bits.oled == 1)) { in detect_link_and_local_sink()
896 dpcd_set_source_specific_data(link); in detect_link_and_local_sink()
898 set_default_brightness_aux(link); in detect_link_and_local_sink()
904 if (!link_detect_connection_type(link, &new_connection_type)) { in detect_link_and_local_sink()
909 prev_sink = link->local_sink; in detect_link_and_local_sink()
912 memcpy(&prev_dpcd_caps, &link->dpcd_caps, sizeof(struct dpcd_caps)); in detect_link_and_local_sink()
915 link_disconnect_sink(link); in detect_link_and_local_sink()
917 link->type = new_connection_type; in detect_link_and_local_sink()
918 link->link_state_valid = false; in detect_link_and_local_sink()
921 switch (link->connector_signal) { in detect_link_and_local_sink()
950 detect_edp_sink_caps(link); in detect_link_and_local_sink()
951 read_current_link_settings_on_detect(link); in detect_link_and_local_sink()
957 link->dpcd_caps.sink_dev_id == DP_BRANCH_DEVICE_ID_0022B9 && in detect_link_and_local_sink()
958 memcmp(&link->dpcd_caps.branch_dev_name, DP_SINK_BRANCH_DEV_NAME_7580, in detect_link_and_local_sink()
959 sizeof(link->dpcd_caps.branch_dev_name)) == 0) { in detect_link_and_local_sink()
962 if (!link->dpcd_caps.set_power_state_capable_edp) in detect_link_and_local_sink()
963 link->wa_flags.dp_keep_receiver_powered = true; in detect_link_and_local_sink()
974 if (link->ep_type == DISPLAY_ENDPOINT_PHY && in detect_link_and_local_sink()
975 link->link_enc->features.flags.bits.DP_IS_USB_C == 1) { in detect_link_and_local_sink()
978 if (!wait_for_entering_dp_alt_mode(link)) in detect_link_and_local_sink()
982 if (!detect_dp(link, &sink_caps, reason)) { in detect_link_and_local_sink()
990 if (link->type == dc_connection_sst_branch && in detect_link_and_local_sink()
991 link->dpcd_caps.sink_count.bits.SINK_COUNT == 0) { in detect_link_and_local_sink()
999 if (link->type == dc_connection_sst_branch && in detect_link_and_local_sink()
1000 is_dp_active_dongle(link) && in detect_link_and_local_sink()
1001 (link->dpcd_caps.dongle_type != in detect_link_and_local_sink()
1005 /* limited link rate to HBR3 for DPIA until we implement USB4 V2 */ in detect_link_and_local_sink()
1006 if (link->ep_type == DISPLAY_ENDPOINT_USB4_DPIA && in detect_link_and_local_sink()
1007 link->reported_link_cap.link_rate > LINK_RATE_HIGH3) in detect_link_and_local_sink()
1008 link->reported_link_cap.link_rate = LINK_RATE_HIGH3; in detect_link_and_local_sink()
1011 * If this is DP over USB4 link then we need to: in detect_link_and_local_sink()
1015 if (link_dp_dpia_set_dptx_usb4_bw_alloc_support(link)) { in detect_link_and_local_sink()
1016 /* update with non reduced link cap if bw allocation mode is supported */ in detect_link_and_local_sink()
1017 if (link->dpia_bw_alloc_config.nrd_max_link_rate && in detect_link_and_local_sink()
1018 link->dpia_bw_alloc_config.nrd_max_lane_count) { in detect_link_and_local_sink()
1019 link->reported_link_cap.link_rate = in detect_link_and_local_sink()
1020 link->dpia_bw_alloc_config.nrd_max_link_rate; in detect_link_and_local_sink()
1021 link->reported_link_cap.lane_count = in detect_link_and_local_sink()
1022 link->dpia_bw_alloc_config.nrd_max_lane_count; in detect_link_and_local_sink()
1031 link->connector_signal); in detect_link_and_local_sink()
1037 if (link->dpcd_caps.sink_count.bits.SINK_COUNT) in detect_link_and_local_sink()
1038 link->dpcd_sink_count = in detect_link_and_local_sink()
1039 link->dpcd_caps.sink_count.bits.SINK_COUNT; in detect_link_and_local_sink()
1041 link->dpcd_sink_count = 1; in detect_link_and_local_sink()
1043 set_ddc_transaction_type(link->ddc, in detect_link_and_local_sink()
1046 link->aux_mode = in detect_link_and_local_sink()
1047 link_is_in_aux_transaction_mode(link->ddc); in detect_link_and_local_sink()
1049 sink_init_data.link = link; in detect_link_and_local_sink()
1060 sink->link->dongle_max_pix_clk = sink_caps.max_hdmi_pixel_clock; in detect_link_and_local_sink()
1064 link->local_sink = sink; in detect_link_and_local_sink()
1066 edid_status = dm_helpers_read_local_edid(link->ctx, in detect_link_and_local_sink()
1067 link, sink); in detect_link_and_local_sink()
1086 if (dc_is_hdmi_signal(link->connector_signal) || in detect_link_and_local_sink()
1087 dc_is_dvi_signal(link->connector_signal)) { in detect_link_and_local_sink()
1094 if (link->type == dc_connection_sst_branch && in detect_link_and_local_sink()
1095 link->dpcd_caps.dongle_type == in detect_link_and_local_sink()
1104 link_disconnect_sink(link); in detect_link_and_local_sink()
1121 link->ctx->dc->debug.hdmi20_disable = true; in detect_link_and_local_sink()
1124 link->dpcd_sink_ext_caps.raw = 0; in detect_link_and_local_sink()
1126 if (dc_is_hdmi_signal(link->connector_signal)) in detect_link_and_local_sink()
1127 read_scdc_caps(link->ddc, link->local_sink); in detect_link_and_local_sink()
1129 if (link->connector_signal == SIGNAL_TYPE_DISPLAY_PORT && in detect_link_and_local_sink()
1134 * two link trainings in detect_link_and_local_sink()
1136 query_hdcp_capability(sink->sink_signal, link); in detect_link_and_local_sink()
1140 link_disconnect_remap(prev_sink, link); in detect_link_and_local_sink()
1144 query_hdcp_capability(sink->sink_signal, link); in detect_link_and_local_sink()
1152 if (link->local_sink && dc_is_dp_signal(sink_caps.signal)) in detect_link_and_local_sink()
1153 dp_trace_init(link); in detect_link_and_local_sink()
1157 CONN_DATA_DETECT(link, in detect_link_and_local_sink()
1196 if (link->connector_signal == SIGNAL_TYPE_EDP) { in detect_link_and_local_sink()
1199 dc_ctx->dc->res_pool->funcs->get_panel_config_defaults(&link->panel_config); in detect_link_and_local_sink()
1201 dm_helpers_init_panel_settings(dc_ctx, &link->panel_config, sink); in detect_link_and_local_sink()
1203 dm_helpers_override_panel_settings(dc_ctx, &link->panel_config); in detect_link_and_local_sink()
1205 //sink only can use supported link rate table, we are foreced to enable it in detect_link_and_local_sink()
1206 if (link->reported_link_cap.link_rate == LINK_RATE_UNKNOWN) in detect_link_and_local_sink()
1207 link->panel_config.ilr.optimize_edp_link_rate = true; in detect_link_and_local_sink()
1208 link->reported_link_cap.link_rate = get_max_edp_link_rate(link); in detect_link_and_local_sink()
1213 link->type = dc_connection_none; in detect_link_and_local_sink()
1215 memset(&link->hdcp_caps, 0, sizeof(struct hdcp_caps)); in detect_link_and_local_sink()
1221 link->dongle_max_pix_clk = 0; in detect_link_and_local_sink()
1223 dc_link_clear_dprx_states(link); in detect_link_and_local_sink()
1224 dp_trace_reset(link); in detect_link_and_local_sink()
1227 LINK_INFO("link=%d, dc_sink_in=%p is now %s prev_sink=%p edid same=%d\n", in detect_link_and_local_sink()
1228 link->link_index, sink, in detect_link_and_local_sink()
1246 bool link_detect_connection_type(struct dc_link *link, enum dc_connection_type *type) in link_detect_connection_type() argument
1250 if (link->connector_signal == SIGNAL_TYPE_LVDS) { in link_detect_connection_type()
1255 if (link->connector_signal == SIGNAL_TYPE_EDP) { in link_detect_connection_type()
1257 if (!link->dc->config.edp_no_power_sequencing) in link_detect_connection_type()
1258 link->dc->hwss.edp_power_control(link, true); in link_detect_connection_type()
1259 link->dc->hwss.edp_wait_for_hpd_ready(link, true); in link_detect_connection_type()
1262 /* Link may not have physical HPD pin. */ in link_detect_connection_type()
1263 if (link->ep_type != DISPLAY_ENDPOINT_PHY) { in link_detect_connection_type()
1264 if (link->is_hpd_pending || !dpia_query_hpd_status(link)) in link_detect_connection_type()
1273 if (!query_hpd_status(link, &is_hpd_high)) in link_detect_connection_type()
1281 if (link->connector_signal == SIGNAL_TYPE_EDP) { in link_detect_connection_type()
1283 if (!link->dc->config.edp_no_power_sequencing) in link_detect_connection_type()
1284 link->dc->hwss.edp_power_control(link, false); in link_detect_connection_type()
1294 bool link_detect(struct dc_link *link, enum dc_detect_reason reason) in link_detect() argument
1298 enum dc_connection_type pre_link_type = link->type; in link_detect()
1300 DC_LOGGER_INIT(link->ctx->logger); in link_detect()
1302 is_local_sink_detect_success = detect_link_and_local_sink(link, reason); in link_detect()
1304 if (is_local_sink_detect_success && link->local_sink) in link_detect()
1305 verify_link_capability(link, link->local_sink, reason); in link_detect()
1308 link->link_index, is_local_sink_detect_success, pre_link_type, link->type); in link_detect()
1310 if (is_local_sink_detect_success && link->local_sink && in link_detect()
1311 dc_is_dp_signal(link->local_sink->sink_signal) && in link_detect()
1312 link->dpcd_caps.is_mst_capable) in link_detect()
1313 is_delegated_to_mst_top_mgr = discover_dp_mst_topology(link, reason); in link_detect()
1316 link->type != dc_connection_mst_branch) in link_detect()
1317 is_delegated_to_mst_top_mgr = link_reset_cur_dp_mst_topology(link); in link_detect()
1322 void link_clear_dprx_states(struct dc_link *link) in link_clear_dprx_states() argument
1324 memset(&link->dprx_states, 0, sizeof(link->dprx_states)); in link_clear_dprx_states()
1327 bool link_is_hdcp14(struct dc_link *link, enum signal_type signal) in link_is_hdcp14() argument
1334 ret = link->hdcp_caps.bcaps.bits.HDCP_CAPABLE; in link_is_hdcp14()
1351 bool link_is_hdcp22(struct dc_link *link, enum signal_type signal) in link_is_hdcp22() argument
1358 ret = (link->hdcp_caps.bcaps.bits.HDCP_CAPABLE && in link_is_hdcp22()
1359 link->hdcp_caps.rx_caps.fields.byte0.hdcp_capable && in link_is_hdcp22()
1360 (link->hdcp_caps.rx_caps.fields.version == 0x2)) ? 1 : 0; in link_is_hdcp22()
1365 ret = (link->hdcp_caps.rx_caps.fields.version == 0x4) ? 1:0; in link_is_hdcp22()
1374 const struct dc_link_status *link_get_status(const struct dc_link *link) in link_get_status() argument
1376 return &link->link_status; in link_get_status()
1396 struct dc_link *link, in link_add_remote_sink() argument
1414 if (!init_data->link) { in link_add_remote_sink()
1428 link, in link_add_remote_sink()
1433 link, in link_add_remote_sink()
1453 void link_remove_remote_sink(struct dc_link *link, struct dc_sink *sink) in link_remove_remote_sink() argument
1457 if (!link->sink_count) { in link_remove_remote_sink()
1462 for (i = 0; i < link->sink_count; i++) { in link_remove_remote_sink()
1463 if (link->remote_sinks[i] == sink) { in link_remove_remote_sink()
1465 link->remote_sinks[i] = NULL; in link_remove_remote_sink()
1468 while (i < link->sink_count - 1) { in link_remove_remote_sink()
1469 link->remote_sinks[i] = link->remote_sinks[i+1]; in link_remove_remote_sink()
1472 link->remote_sinks[i] = NULL; in link_remove_remote_sink()
1473 link->sink_count--; in link_remove_remote_sink()