Lines Matching full:link
49 struct dp_link_info *link) in dp_aux_link_power_up() argument
54 if (link->revision < 0x11) in dp_aux_link_power_up()
74 struct dp_link_info *link) in dp_aux_link_power_down() argument
79 if (link->revision < 0x11) in dp_aux_link_power_down()
96 static int dp_link_get_period(struct dp_link_private *link, int const addr) in dp_link_get_period() argument
103 if (drm_dp_dpcd_readb(link->aux, addr, &data) < 0) { in dp_link_get_period()
122 static int dp_link_parse_audio_channel_period(struct dp_link_private *link) in dp_link_parse_audio_channel_period() argument
125 struct dp_link_test_audio *req = &link->dp_link.test_audio; in dp_link_parse_audio_channel_period()
127 ret = dp_link_get_period(link, DP_TEST_AUDIO_PERIOD_CH1); in dp_link_parse_audio_channel_period()
132 drm_dbg_dp(link->drm_dev, "test_audio_period_ch_1 = 0x%x\n", ret); in dp_link_parse_audio_channel_period()
134 ret = dp_link_get_period(link, DP_TEST_AUDIO_PERIOD_CH2); in dp_link_parse_audio_channel_period()
139 drm_dbg_dp(link->drm_dev, "test_audio_period_ch_2 = 0x%x\n", ret); in dp_link_parse_audio_channel_period()
142 ret = dp_link_get_period(link, DP_TEST_AUDIO_PERIOD_CH3); in dp_link_parse_audio_channel_period()
147 drm_dbg_dp(link->drm_dev, "test_audio_period_ch_3 = 0x%x\n", ret); in dp_link_parse_audio_channel_period()
149 ret = dp_link_get_period(link, DP_TEST_AUDIO_PERIOD_CH4); in dp_link_parse_audio_channel_period()
154 drm_dbg_dp(link->drm_dev, "test_audio_period_ch_4 = 0x%x\n", ret); in dp_link_parse_audio_channel_period()
156 ret = dp_link_get_period(link, DP_TEST_AUDIO_PERIOD_CH5); in dp_link_parse_audio_channel_period()
161 drm_dbg_dp(link->drm_dev, "test_audio_period_ch_5 = 0x%x\n", ret); in dp_link_parse_audio_channel_period()
163 ret = dp_link_get_period(link, DP_TEST_AUDIO_PERIOD_CH6); in dp_link_parse_audio_channel_period()
168 drm_dbg_dp(link->drm_dev, "test_audio_period_ch_6 = 0x%x\n", ret); in dp_link_parse_audio_channel_period()
170 ret = dp_link_get_period(link, DP_TEST_AUDIO_PERIOD_CH7); in dp_link_parse_audio_channel_period()
175 drm_dbg_dp(link->drm_dev, "test_audio_period_ch_7 = 0x%x\n", ret); in dp_link_parse_audio_channel_period()
177 ret = dp_link_get_period(link, DP_TEST_AUDIO_PERIOD_CH8); in dp_link_parse_audio_channel_period()
182 drm_dbg_dp(link->drm_dev, "test_audio_period_ch_8 = 0x%x\n", ret); in dp_link_parse_audio_channel_period()
187 static int dp_link_parse_audio_pattern_type(struct dp_link_private *link) in dp_link_parse_audio_pattern_type() argument
194 rlen = drm_dp_dpcd_readb(link->aux, in dp_link_parse_audio_pattern_type()
197 DRM_ERROR("failed to read link audio mode. rlen=%zd\n", rlen); in dp_link_parse_audio_pattern_type()
208 link->dp_link.test_audio.test_audio_pattern_type = data; in dp_link_parse_audio_pattern_type()
209 drm_dbg_dp(link->drm_dev, "audio pattern type = 0x%x\n", data); in dp_link_parse_audio_pattern_type()
214 static int dp_link_parse_audio_mode(struct dp_link_private *link) in dp_link_parse_audio_mode() argument
224 rlen = drm_dp_dpcd_readb(link->aux, DP_TEST_AUDIO_MODE, &data); in dp_link_parse_audio_mode()
226 DRM_ERROR("failed to read link audio mode. rlen=%zd\n", rlen); in dp_link_parse_audio_mode()
248 link->dp_link.test_audio.test_audio_sampling_rate = sampling_rate; in dp_link_parse_audio_mode()
249 link->dp_link.test_audio.test_audio_channel_count = channel_count; in dp_link_parse_audio_mode()
250 drm_dbg_dp(link->drm_dev, in dp_link_parse_audio_mode()
257 static int dp_link_parse_audio_pattern_params(struct dp_link_private *link) in dp_link_parse_audio_pattern_params() argument
261 ret = dp_link_parse_audio_mode(link); in dp_link_parse_audio_pattern_params()
265 ret = dp_link_parse_audio_pattern_type(link); in dp_link_parse_audio_pattern_params()
269 ret = dp_link_parse_audio_channel_period(link); in dp_link_parse_audio_pattern_params()
307 static int dp_link_parse_timing_params1(struct dp_link_private *link, in dp_link_parse_timing_params1() argument
316 /* Read the requested video link pattern (Byte 0x221). */ in dp_link_parse_timing_params1()
317 rlen = drm_dp_dpcd_read(link->aux, addr, bp, len); in dp_link_parse_timing_params1()
328 static int dp_link_parse_timing_params2(struct dp_link_private *link, in dp_link_parse_timing_params2() argument
338 /* Read the requested video link pattern (Byte 0x221). */ in dp_link_parse_timing_params2()
339 rlen = drm_dp_dpcd_read(link->aux, addr, bp, len); in dp_link_parse_timing_params2()
351 static int dp_link_parse_timing_params3(struct dp_link_private *link, in dp_link_parse_timing_params3() argument
358 rlen = drm_dp_dpcd_read(link->aux, addr, &bp, len); in dp_link_parse_timing_params3()
370 * @link: Display Port Driver data
372 * Returns 0 if it successfully parses the video link pattern and the link
375 static int dp_link_parse_video_pattern_params(struct dp_link_private *link) in dp_link_parse_video_pattern_params() argument
381 rlen = drm_dp_dpcd_readb(link->aux, DP_TEST_PATTERN, &bp); in dp_link_parse_video_pattern_params()
383 DRM_ERROR("failed to read link video pattern. rlen=%zd\n", in dp_link_parse_video_pattern_params()
389 DRM_ERROR("invalid link video pattern = 0x%x\n", bp); in dp_link_parse_video_pattern_params()
394 link->dp_link.test_video.test_video_pattern = bp; in dp_link_parse_video_pattern_params()
397 rlen = drm_dp_dpcd_readb(link->aux, DP_TEST_MISC0, &bp); in dp_link_parse_video_pattern_params()
399 DRM_ERROR("failed to read link bit depth. rlen=%zd\n", rlen); in dp_link_parse_video_pattern_params()
404 link->dp_link.test_video.test_dyn_range = in dp_link_parse_video_pattern_params()
410 DRM_ERROR("invalid link bit depth = 0x%x\n", bp); in dp_link_parse_video_pattern_params()
415 link->dp_link.test_video.test_bit_depth = bp; in dp_link_parse_video_pattern_params()
418 ret = dp_link_parse_timing_params1(link, DP_TEST_H_TOTAL_HI, 2, in dp_link_parse_video_pattern_params()
419 &link->dp_link.test_video.test_h_total); in dp_link_parse_video_pattern_params()
425 ret = dp_link_parse_timing_params1(link, DP_TEST_V_TOTAL_HI, 2, in dp_link_parse_video_pattern_params()
426 &link->dp_link.test_video.test_v_total); in dp_link_parse_video_pattern_params()
432 ret = dp_link_parse_timing_params1(link, DP_TEST_H_START_HI, 2, in dp_link_parse_video_pattern_params()
433 &link->dp_link.test_video.test_h_start); in dp_link_parse_video_pattern_params()
439 ret = dp_link_parse_timing_params1(link, DP_TEST_V_START_HI, 2, in dp_link_parse_video_pattern_params()
440 &link->dp_link.test_video.test_v_start); in dp_link_parse_video_pattern_params()
446 ret = dp_link_parse_timing_params2(link, DP_TEST_HSYNC_HI, 2, in dp_link_parse_video_pattern_params()
447 &link->dp_link.test_video.test_hsync_pol, in dp_link_parse_video_pattern_params()
448 &link->dp_link.test_video.test_hsync_width); in dp_link_parse_video_pattern_params()
454 ret = dp_link_parse_timing_params2(link, DP_TEST_VSYNC_HI, 2, in dp_link_parse_video_pattern_params()
455 &link->dp_link.test_video.test_vsync_pol, in dp_link_parse_video_pattern_params()
456 &link->dp_link.test_video.test_vsync_width); in dp_link_parse_video_pattern_params()
462 ret = dp_link_parse_timing_params1(link, DP_TEST_H_WIDTH_HI, 2, in dp_link_parse_video_pattern_params()
463 &link->dp_link.test_video.test_h_width); in dp_link_parse_video_pattern_params()
469 ret = dp_link_parse_timing_params1(link, DP_TEST_V_HEIGHT_HI, 2, in dp_link_parse_video_pattern_params()
470 &link->dp_link.test_video.test_v_height); in dp_link_parse_video_pattern_params()
476 ret = dp_link_parse_timing_params3(link, DP_TEST_MISC1, in dp_link_parse_video_pattern_params()
477 &link->dp_link.test_video.test_rr_d); in dp_link_parse_video_pattern_params()
478 link->dp_link.test_video.test_rr_d &= DP_TEST_REFRESH_DENOMINATOR; in dp_link_parse_video_pattern_params()
484 ret = dp_link_parse_timing_params3(link, DP_TEST_REFRESH_RATE_NUMERATOR, in dp_link_parse_video_pattern_params()
485 &link->dp_link.test_video.test_rr_n); in dp_link_parse_video_pattern_params()
491 drm_dbg_dp(link->drm_dev, in dp_link_parse_video_pattern_params()
492 "link video pattern = 0x%x\n" in dp_link_parse_video_pattern_params()
493 "link dynamic range = 0x%x\n" in dp_link_parse_video_pattern_params()
494 "link bit depth = 0x%x\n" in dp_link_parse_video_pattern_params()
505 link->dp_link.test_video.test_video_pattern, in dp_link_parse_video_pattern_params()
506 link->dp_link.test_video.test_dyn_range, in dp_link_parse_video_pattern_params()
507 link->dp_link.test_video.test_bit_depth, in dp_link_parse_video_pattern_params()
508 link->dp_link.test_video.test_h_total, in dp_link_parse_video_pattern_params()
509 link->dp_link.test_video.test_v_total, in dp_link_parse_video_pattern_params()
510 link->dp_link.test_video.test_h_start, in dp_link_parse_video_pattern_params()
511 link->dp_link.test_video.test_v_start, in dp_link_parse_video_pattern_params()
512 link->dp_link.test_video.test_hsync_pol, in dp_link_parse_video_pattern_params()
513 link->dp_link.test_video.test_hsync_width, in dp_link_parse_video_pattern_params()
514 link->dp_link.test_video.test_vsync_pol, in dp_link_parse_video_pattern_params()
515 link->dp_link.test_video.test_vsync_width, in dp_link_parse_video_pattern_params()
516 link->dp_link.test_video.test_h_width, in dp_link_parse_video_pattern_params()
517 link->dp_link.test_video.test_v_height, in dp_link_parse_video_pattern_params()
518 link->dp_link.test_video.test_rr_d, in dp_link_parse_video_pattern_params()
519 link->dp_link.test_video.test_rr_n); in dp_link_parse_video_pattern_params()
525 * dp_link_parse_link_training_params() - parses link training parameters from
527 * @link: Display Port Driver data
529 * Returns 0 if it successfully parses the link rate (Byte 0x219) and lane
532 static int dp_link_parse_link_training_params(struct dp_link_private *link) in dp_link_parse_link_training_params() argument
537 rlen = drm_dp_dpcd_readb(link->aux, DP_TEST_LINK_RATE, &bp); in dp_link_parse_link_training_params()
539 DRM_ERROR("failed to read link rate. rlen=%zd\n", rlen); in dp_link_parse_link_training_params()
544 DRM_ERROR("invalid link rate = 0x%x\n", bp); in dp_link_parse_link_training_params()
548 link->request.test_link_rate = bp; in dp_link_parse_link_training_params()
549 drm_dbg_dp(link->drm_dev, "link rate = 0x%x\n", in dp_link_parse_link_training_params()
550 link->request.test_link_rate); in dp_link_parse_link_training_params()
552 rlen = drm_dp_dpcd_readb(link->aux, DP_TEST_LANE_COUNT, &bp); in dp_link_parse_link_training_params()
564 link->request.test_lane_count = bp; in dp_link_parse_link_training_params()
565 drm_dbg_dp(link->drm_dev, "lane count = 0x%x\n", in dp_link_parse_link_training_params()
566 link->request.test_lane_count); in dp_link_parse_link_training_params()
571 * dp_link_parse_phy_test_params() - parses the phy link parameters
572 * @link: Display Port Driver data
574 * Parses the DPCD (Byte 0x248) for the DP PHY link pattern that is being
577 static int dp_link_parse_phy_test_params(struct dp_link_private *link) in dp_link_parse_phy_test_params() argument
582 rlen = drm_dp_dpcd_readb(link->aux, DP_PHY_TEST_PATTERN, in dp_link_parse_phy_test_params()
585 DRM_ERROR("failed to read phy link pattern. rlen=%zd\n", rlen); in dp_link_parse_phy_test_params()
589 link->dp_link.phy_params.phy_test_pattern_sel = data & 0x07; in dp_link_parse_phy_test_params()
591 drm_dbg_dp(link->drm_dev, "phy_test_pattern_sel = 0x%x\n", data); in dp_link_parse_phy_test_params()
608 * dp_link_is_video_audio_test_requested() - checks for audio/video link request
609 * @link: link requested by the sink
611 * Returns true if the requested link is a permitted audio/video link.
613 static bool dp_link_is_video_audio_test_requested(u32 link) in dp_link_is_video_audio_test_requested() argument
619 return ((link & video_audio_test) && in dp_link_is_video_audio_test_requested()
620 !(link & ~video_audio_test)); in dp_link_is_video_audio_test_requested()
624 * dp_link_parse_request() - parses link request parameters from sink
625 * @link: Display Port Driver data
627 * Parses the DPCD to check if an automated link is requested (Byte 0x201),
628 * and what type of link automation is being requested (Byte 0x218).
630 static int dp_link_parse_request(struct dp_link_private *link) in dp_link_parse_request() argument
638 * whether an automated link has been requested by the sink. in dp_link_parse_request()
640 rlen = drm_dp_dpcd_readb(link->aux, in dp_link_parse_request()
647 drm_dbg_dp(link->drm_dev, "device service irq vector = 0x%x\n", data); in dp_link_parse_request()
650 drm_dbg_dp(link->drm_dev, "no test requested\n"); in dp_link_parse_request()
655 * Read the link request byte (Byte 0x218) to determine what type in dp_link_parse_request()
656 * of automated link has been requested by the sink. in dp_link_parse_request()
658 rlen = drm_dp_dpcd_readb(link->aux, DP_TEST_REQUEST, &data); in dp_link_parse_request()
665 drm_dbg_dp(link->drm_dev, "link 0x%x not supported\n", data); in dp_link_parse_request()
669 drm_dbg_dp(link->drm_dev, "Test:(0x%x) requested\n", data); in dp_link_parse_request()
670 link->request.test_requested = data; in dp_link_parse_request()
671 if (link->request.test_requested == DP_TEST_LINK_PHY_TEST_PATTERN) { in dp_link_parse_request()
672 ret = dp_link_parse_phy_test_params(link); in dp_link_parse_request()
675 ret = dp_link_parse_link_training_params(link); in dp_link_parse_request()
680 if (link->request.test_requested == DP_TEST_LINK_TRAINING) { in dp_link_parse_request()
681 ret = dp_link_parse_link_training_params(link); in dp_link_parse_request()
687 link->request.test_requested)) { in dp_link_parse_request()
688 ret = dp_link_parse_video_pattern_params(link); in dp_link_parse_request()
692 ret = dp_link_parse_audio_pattern_params(link); in dp_link_parse_request()
696 * Send a DP_TEST_ACK if all link parameters are valid, otherwise send in dp_link_parse_request()
700 link->dp_link.test_response = DP_TEST_NAK; in dp_link_parse_request()
702 if (link->request.test_requested != DP_TEST_LINK_EDID_READ) in dp_link_parse_request()
703 link->dp_link.test_response = DP_TEST_ACK; in dp_link_parse_request()
705 link->dp_link.test_response = in dp_link_parse_request()
714 * @dp_link: pointer to link module data
725 struct dp_link_private *link = container_of(dp_link, in dp_link_parse_sink_count() local
728 rlen = drm_dp_dpcd_readb(link->aux, DP_SINK_COUNT, in dp_link_parse_sink_count()
729 &link->dp_link.sink_count); in dp_link_parse_sink_count()
735 cp_ready = link->dp_link.sink_count & DP_SINK_CP_READY; in dp_link_parse_sink_count()
737 link->dp_link.sink_count = in dp_link_parse_sink_count()
738 DP_GET_SINK_COUNT(link->dp_link.sink_count); in dp_link_parse_sink_count()
740 drm_dbg_dp(link->drm_dev, "sink_count = 0x%x, cp_ready = 0x%x\n", in dp_link_parse_sink_count()
741 link->dp_link.sink_count, cp_ready); in dp_link_parse_sink_count()
745 static int dp_link_parse_sink_status_field(struct dp_link_private *link) in dp_link_parse_sink_status_field() argument
749 link->prev_sink_count = link->dp_link.sink_count; in dp_link_parse_sink_status_field()
750 len = dp_link_parse_sink_count(&link->dp_link); in dp_link_parse_sink_status_field()
756 len = drm_dp_dpcd_read_link_status(link->aux, in dp_link_parse_sink_status_field()
757 link->link_status); in dp_link_parse_sink_status_field()
759 DRM_ERROR("DP link status read failed\n"); in dp_link_parse_sink_status_field()
763 return dp_link_parse_request(link); in dp_link_parse_sink_status_field()
768 * @link: Display Port link data
770 * This function will handle new link training requests that are initiated by
771 * the sink. In particular, it will update the requested lane count and link
772 * rate, and then trigger the link retraining procedure.
774 * The function will return 0 if a link training request has been processed,
777 static int dp_link_process_link_training_request(struct dp_link_private *link) in dp_link_process_link_training_request() argument
779 if (link->request.test_requested != DP_TEST_LINK_TRAINING) in dp_link_process_link_training_request()
782 drm_dbg_dp(link->drm_dev, in dp_link_process_link_training_request()
783 "Test:0x%x link rate = 0x%x, lane count = 0x%x\n", in dp_link_process_link_training_request()
785 link->request.test_link_rate, in dp_link_process_link_training_request()
786 link->request.test_lane_count); in dp_link_process_link_training_request()
788 link->dp_link.link_params.num_lanes = link->request.test_lane_count; in dp_link_process_link_training_request()
789 link->dp_link.link_params.rate = in dp_link_process_link_training_request()
790 drm_dp_bw_code_to_link_rate(link->request.test_link_rate); in dp_link_process_link_training_request()
797 struct dp_link_private *link = NULL; in dp_link_send_test_response() local
805 link = container_of(dp_link, struct dp_link_private, dp_link); in dp_link_send_test_response()
807 ret = drm_dp_dpcd_writeb(link->aux, DP_TEST_RESPONSE, in dp_link_send_test_response()
816 struct dp_link_private *link = NULL; in dp_link_psm_config() local
824 link = container_of(dp_link, struct dp_link_private, dp_link); in dp_link_psm_config()
826 mutex_lock(&link->psm_mutex); in dp_link_psm_config()
828 ret = dp_aux_link_power_down(link->aux, link_info); in dp_link_psm_config()
830 ret = dp_aux_link_power_up(link->aux, link_info); in dp_link_psm_config()
838 mutex_unlock(&link->psm_mutex); in dp_link_psm_config()
844 struct dp_link_private *link = NULL; in dp_link_send_edid_checksum() local
852 link = container_of(dp_link, struct dp_link_private, dp_link); in dp_link_send_edid_checksum()
854 ret = drm_dp_dpcd_writeb(link->aux, DP_TEST_EDID_CHECKSUM, in dp_link_send_edid_checksum()
859 static void dp_link_parse_vx_px(struct dp_link_private *link) in dp_link_parse_vx_px() argument
861 drm_dbg_dp(link->drm_dev, "vx: 0=%d, 1=%d, 2=%d, 3=%d\n", in dp_link_parse_vx_px()
862 drm_dp_get_adjust_request_voltage(link->link_status, 0), in dp_link_parse_vx_px()
863 drm_dp_get_adjust_request_voltage(link->link_status, 1), in dp_link_parse_vx_px()
864 drm_dp_get_adjust_request_voltage(link->link_status, 2), in dp_link_parse_vx_px()
865 drm_dp_get_adjust_request_voltage(link->link_status, 3)); in dp_link_parse_vx_px()
867 drm_dbg_dp(link->drm_dev, "px: 0=%d, 1=%d, 2=%d, 3=%d\n", in dp_link_parse_vx_px()
868 drm_dp_get_adjust_request_pre_emphasis(link->link_status, 0), in dp_link_parse_vx_px()
869 drm_dp_get_adjust_request_pre_emphasis(link->link_status, 1), in dp_link_parse_vx_px()
870 drm_dp_get_adjust_request_pre_emphasis(link->link_status, 2), in dp_link_parse_vx_px()
871 drm_dp_get_adjust_request_pre_emphasis(link->link_status, 3)); in dp_link_parse_vx_px()
877 drm_dbg_dp(link->drm_dev, in dp_link_parse_vx_px()
879 link->dp_link.phy_params.v_level, in dp_link_parse_vx_px()
880 link->dp_link.phy_params.p_level); in dp_link_parse_vx_px()
881 link->dp_link.phy_params.v_level = in dp_link_parse_vx_px()
882 drm_dp_get_adjust_request_voltage(link->link_status, 0); in dp_link_parse_vx_px()
883 link->dp_link.phy_params.p_level = in dp_link_parse_vx_px()
884 drm_dp_get_adjust_request_pre_emphasis(link->link_status, 0); in dp_link_parse_vx_px()
886 link->dp_link.phy_params.p_level >>= DP_TRAIN_PRE_EMPHASIS_SHIFT; in dp_link_parse_vx_px()
888 drm_dbg_dp(link->drm_dev, in dp_link_parse_vx_px()
890 link->dp_link.phy_params.v_level, in dp_link_parse_vx_px()
891 link->dp_link.phy_params.p_level); in dp_link_parse_vx_px()
895 * dp_link_process_phy_test_pattern_request() - process new phy link requests
896 * @link: Display Port Driver data
898 * This function will handle new phy link pattern requests that are initiated
899 * by the sink. The function will return 0 if a phy link pattern has been
903 struct dp_link_private *link) in dp_link_process_phy_test_pattern_request() argument
905 if (!(link->request.test_requested & DP_TEST_LINK_PHY_TEST_PATTERN)) { in dp_link_process_phy_test_pattern_request()
906 drm_dbg_dp(link->drm_dev, "no phy test\n"); in dp_link_process_phy_test_pattern_request()
910 if (!is_link_rate_valid(link->request.test_link_rate) || in dp_link_process_phy_test_pattern_request()
911 !is_lane_count_valid(link->request.test_lane_count)) { in dp_link_process_phy_test_pattern_request()
912 DRM_ERROR("Invalid: link rate = 0x%x,lane count = 0x%x\n", in dp_link_process_phy_test_pattern_request()
913 link->request.test_link_rate, in dp_link_process_phy_test_pattern_request()
914 link->request.test_lane_count); in dp_link_process_phy_test_pattern_request()
918 drm_dbg_dp(link->drm_dev, in dp_link_process_phy_test_pattern_request()
920 link->dp_link.link_params.rate, in dp_link_process_phy_test_pattern_request()
921 link->dp_link.link_params.num_lanes); in dp_link_process_phy_test_pattern_request()
923 drm_dbg_dp(link->drm_dev, in dp_link_process_phy_test_pattern_request()
925 link->request.test_link_rate, in dp_link_process_phy_test_pattern_request()
926 link->request.test_lane_count); in dp_link_process_phy_test_pattern_request()
928 link->dp_link.link_params.num_lanes = link->request.test_lane_count; in dp_link_process_phy_test_pattern_request()
929 link->dp_link.link_params.rate = in dp_link_process_phy_test_pattern_request()
930 drm_dp_bw_code_to_link_rate(link->request.test_link_rate); in dp_link_process_phy_test_pattern_request()
932 dp_link_parse_vx_px(link); in dp_link_process_phy_test_pattern_request()
943 * dp_link_process_link_status_update() - processes link status updates
944 * @link: Display Port link module data
946 * This function will check for changes in the link status, e.g. clock
947 * recovery done on all lanes, and trigger link training if there is a
948 * failure/error on the link.
950 * The function will return 0 if the a link status update has been processed,
953 static int dp_link_process_link_status_update(struct dp_link_private *link) in dp_link_process_link_status_update() argument
955 bool channel_eq_done = drm_dp_channel_eq_ok(link->link_status, in dp_link_process_link_status_update()
956 link->dp_link.link_params.num_lanes); in dp_link_process_link_status_update()
958 bool clock_recovery_done = drm_dp_clock_recovery_ok(link->link_status, in dp_link_process_link_status_update()
959 link->dp_link.link_params.num_lanes); in dp_link_process_link_status_update()
961 drm_dbg_dp(link->drm_dev, in dp_link_process_link_status_update()
973 * @link: Display Port Driver data
982 static int dp_link_process_ds_port_status_change(struct dp_link_private *link) in dp_link_process_ds_port_status_change() argument
984 if (get_link_status(link->link_status, DP_LANE_ALIGN_STATUS_UPDATED) & in dp_link_process_ds_port_status_change()
988 if (link->prev_sink_count == link->dp_link.sink_count) in dp_link_process_ds_port_status_change()
993 link->prev_sink_count = link->dp_link.sink_count; in dp_link_process_ds_port_status_change()
998 static bool dp_link_is_video_pattern_requested(struct dp_link_private *link) in dp_link_is_video_pattern_requested() argument
1000 return (link->request.test_requested & DP_TEST_LINK_VIDEO_PATTERN) in dp_link_is_video_pattern_requested()
1001 && !(link->request.test_requested & in dp_link_is_video_pattern_requested()
1005 static bool dp_link_is_audio_pattern_requested(struct dp_link_private *link) in dp_link_is_audio_pattern_requested() argument
1007 return (link->request.test_requested & DP_TEST_LINK_AUDIO_PATTERN); in dp_link_is_audio_pattern_requested()
1010 static void dp_link_reset_data(struct dp_link_private *link) in dp_link_reset_data() argument
1012 link->request = (const struct dp_link_request){ 0 }; in dp_link_reset_data()
1013 link->dp_link.test_video = (const struct dp_link_test_video){ 0 }; in dp_link_reset_data()
1014 link->dp_link.test_video.test_bit_depth = DP_TEST_BIT_DEPTH_UNKNOWN; in dp_link_reset_data()
1015 link->dp_link.test_audio = (const struct dp_link_test_audio){ 0 }; in dp_link_reset_data()
1016 link->dp_link.phy_params.phy_test_pattern_sel = 0; in dp_link_reset_data()
1017 link->dp_link.sink_request = 0; in dp_link_reset_data()
1018 link->dp_link.test_response = 0; in dp_link_reset_data()
1023 * @dp_link: pointer to link module data
1027 * the start of a new link training request or sink status update.
1032 struct dp_link_private *link; in dp_link_process_request() local
1039 link = container_of(dp_link, struct dp_link_private, dp_link); in dp_link_process_request()
1041 dp_link_reset_data(link); in dp_link_process_request()
1043 ret = dp_link_parse_sink_status_field(link); in dp_link_process_request()
1047 if (link->request.test_requested == DP_TEST_LINK_EDID_READ) { in dp_link_process_request()
1049 } else if (!dp_link_process_ds_port_status_change(link)) { in dp_link_process_request()
1051 } else if (!dp_link_process_link_training_request(link)) { in dp_link_process_request()
1053 } else if (!dp_link_process_phy_test_pattern_request(link)) { in dp_link_process_request()
1056 ret = dp_link_process_link_status_update(link); in dp_link_process_request()
1060 if (dp_link_is_video_pattern_requested(link)) { in dp_link_process_request()
1064 if (dp_link_is_audio_pattern_requested(link)) { in dp_link_process_request()
1071 drm_dbg_dp(link->drm_dev, "sink request=%#x", in dp_link_process_request()
1079 struct dp_link_private *link; in dp_link_get_colorimetry_config() local
1086 link = container_of(dp_link, struct dp_link_private, dp_link); in dp_link_get_colorimetry_config()
1092 if (dp_link_is_video_pattern_requested(link)) in dp_link_get_colorimetry_config()
1093 cc = link->dp_link.test_video.test_dyn_range; in dp_link_get_colorimetry_config()
1104 struct dp_link_private *link; in dp_link_adjust_levels() local
1111 link = container_of(dp_link, struct dp_link_private, dp_link); in dp_link_adjust_levels()
1118 drm_dbg_dp(link->drm_dev, in dp_link_adjust_levels()
1135 drm_dbg_dp(link->drm_dev, in dp_link_adjust_levels()
1143 drm_dbg_dp(link->drm_dev, in dp_link_adjust_levels()
1153 drm_dbg_dp(link->drm_dev, in dp_link_adjust_levels()
1160 drm_dbg_dp(link->drm_dev, "adjusted: v_level=%d, p_level=%d\n", in dp_link_adjust_levels()
1204 struct dp_link_private *link; in dp_link_get() local
1212 link = devm_kzalloc(dev, sizeof(*link), GFP_KERNEL); in dp_link_get()
1213 if (!link) in dp_link_get()
1216 link->dev = dev; in dp_link_get()
1217 link->aux = aux; in dp_link_get()
1219 mutex_init(&link->psm_mutex); in dp_link_get()
1220 dp_link = &link->dp_link; in dp_link_get()