Lines Matching +full:display +full:- +full:depth
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
6 #define pr_fmt(fmt) "[drm-dp] %s: " fmt, __func__
58 if (link->revision < 0x11) in msm_dp_aux_link_power_up()
85 if (link->revision < 0x11) in msm_dp_aux_link_power_down()
109 if (drm_dp_dpcd_readb(link->aux, addr, &data) < 0) { in msm_dp_link_get_period()
111 ret = -EINVAL; in msm_dp_link_get_period()
115 /* Period - Bits 3:0 */ in msm_dp_link_get_period()
119 ret = -EINVAL; in msm_dp_link_get_period()
131 struct msm_dp_link_test_audio *req = &link->msm_dp_link.test_audio; in msm_dp_link_parse_audio_channel_period()
134 if (ret == -EINVAL) in msm_dp_link_parse_audio_channel_period()
137 req->test_audio_period_ch_1 = ret; in msm_dp_link_parse_audio_channel_period()
138 drm_dbg_dp(link->drm_dev, "test_audio_period_ch_1 = 0x%x\n", ret); in msm_dp_link_parse_audio_channel_period()
141 if (ret == -EINVAL) in msm_dp_link_parse_audio_channel_period()
144 req->test_audio_period_ch_2 = ret; in msm_dp_link_parse_audio_channel_period()
145 drm_dbg_dp(link->drm_dev, "test_audio_period_ch_2 = 0x%x\n", ret); in msm_dp_link_parse_audio_channel_period()
149 if (ret == -EINVAL) in msm_dp_link_parse_audio_channel_period()
152 req->test_audio_period_ch_3 = ret; in msm_dp_link_parse_audio_channel_period()
153 drm_dbg_dp(link->drm_dev, "test_audio_period_ch_3 = 0x%x\n", ret); in msm_dp_link_parse_audio_channel_period()
156 if (ret == -EINVAL) in msm_dp_link_parse_audio_channel_period()
159 req->test_audio_period_ch_4 = ret; in msm_dp_link_parse_audio_channel_period()
160 drm_dbg_dp(link->drm_dev, "test_audio_period_ch_4 = 0x%x\n", ret); in msm_dp_link_parse_audio_channel_period()
163 if (ret == -EINVAL) in msm_dp_link_parse_audio_channel_period()
166 req->test_audio_period_ch_5 = ret; in msm_dp_link_parse_audio_channel_period()
167 drm_dbg_dp(link->drm_dev, "test_audio_period_ch_5 = 0x%x\n", ret); in msm_dp_link_parse_audio_channel_period()
170 if (ret == -EINVAL) in msm_dp_link_parse_audio_channel_period()
173 req->test_audio_period_ch_6 = ret; in msm_dp_link_parse_audio_channel_period()
174 drm_dbg_dp(link->drm_dev, "test_audio_period_ch_6 = 0x%x\n", ret); in msm_dp_link_parse_audio_channel_period()
177 if (ret == -EINVAL) in msm_dp_link_parse_audio_channel_period()
180 req->test_audio_period_ch_7 = ret; in msm_dp_link_parse_audio_channel_period()
181 drm_dbg_dp(link->drm_dev, "test_audio_period_ch_7 = 0x%x\n", ret); in msm_dp_link_parse_audio_channel_period()
184 if (ret == -EINVAL) in msm_dp_link_parse_audio_channel_period()
187 req->test_audio_period_ch_8 = ret; in msm_dp_link_parse_audio_channel_period()
188 drm_dbg_dp(link->drm_dev, "test_audio_period_ch_8 = 0x%x\n", ret); in msm_dp_link_parse_audio_channel_period()
200 rlen = drm_dp_dpcd_readb(link->aux, in msm_dp_link_parse_audio_pattern_type()
207 /* Audio Pattern Type - Bits 7:0 */ in msm_dp_link_parse_audio_pattern_type()
210 ret = -EINVAL; in msm_dp_link_parse_audio_pattern_type()
214 link->msm_dp_link.test_audio.test_audio_pattern_type = data; in msm_dp_link_parse_audio_pattern_type()
215 drm_dbg_dp(link->drm_dev, "audio pattern type = 0x%x\n", data); in msm_dp_link_parse_audio_pattern_type()
230 rlen = drm_dp_dpcd_readb(link->aux, DP_TEST_AUDIO_MODE, &data); in msm_dp_link_parse_audio_mode()
236 /* Sampling Rate - Bits 3:0 */ in msm_dp_link_parse_audio_mode()
241 ret = -EINVAL; in msm_dp_link_parse_audio_mode()
245 /* Channel Count - Bits 7:4 */ in msm_dp_link_parse_audio_mode()
250 ret = -EINVAL; in msm_dp_link_parse_audio_mode()
254 link->msm_dp_link.test_audio.test_audio_sampling_rate = sampling_rate; in msm_dp_link_parse_audio_mode()
255 link->msm_dp_link.test_audio.test_audio_channel_count = channel_count; in msm_dp_link_parse_audio_mode()
256 drm_dbg_dp(link->drm_dev, in msm_dp_link_parse_audio_mode()
295 * msm_dp_link_is_bit_depth_valid() - validates the bit depth requested
296 * @tbd: bit depth requested by the sink
298 * Returns true if the requested bit depth is supported.
320 return -EINVAL; in msm_dp_link_parse_timing_params1()
323 rlen = drm_dp_dpcd_read(link->aux, addr, bp, len); in msm_dp_link_parse_timing_params1()
326 return -EINVAL; in msm_dp_link_parse_timing_params1()
342 return -EINVAL; in msm_dp_link_parse_timing_params2()
345 rlen = drm_dp_dpcd_read(link->aux, addr, bp, len); in msm_dp_link_parse_timing_params2()
348 return -EINVAL; in msm_dp_link_parse_timing_params2()
364 rlen = drm_dp_dpcd_read(link->aux, addr, &bp, len); in msm_dp_link_parse_timing_params3()
367 return -EINVAL; in msm_dp_link_parse_timing_params3()
375 * msm_dp_link_parse_video_pattern_params() - parses video pattern parameters from DPCD
376 * @link: Display Port Driver data
379 * bit depth requested by the sink and, and if the values parsed are valid.
387 rlen = drm_dp_dpcd_readb(link->aux, DP_TEST_PATTERN, &bp); in msm_dp_link_parse_video_pattern_params()
396 ret = -EINVAL; in msm_dp_link_parse_video_pattern_params()
400 link->msm_dp_link.test_video.test_video_pattern = bp; in msm_dp_link_parse_video_pattern_params()
402 /* Read the requested color bit depth and dynamic range (Byte 0x232) */ in msm_dp_link_parse_video_pattern_params()
403 rlen = drm_dp_dpcd_readb(link->aux, DP_TEST_MISC0, &bp); in msm_dp_link_parse_video_pattern_params()
405 DRM_ERROR("failed to read link bit depth. rlen=%zd\n", rlen); in msm_dp_link_parse_video_pattern_params()
410 link->msm_dp_link.test_video.test_dyn_range = in msm_dp_link_parse_video_pattern_params()
413 /* Color bit depth */ in msm_dp_link_parse_video_pattern_params()
416 DRM_ERROR("invalid link bit depth = 0x%x\n", bp); in msm_dp_link_parse_video_pattern_params()
417 ret = -EINVAL; in msm_dp_link_parse_video_pattern_params()
421 link->msm_dp_link.test_video.test_bit_depth = bp; in msm_dp_link_parse_video_pattern_params()
425 &link->msm_dp_link.test_video.test_h_total); in msm_dp_link_parse_video_pattern_params()
432 &link->msm_dp_link.test_video.test_v_total); in msm_dp_link_parse_video_pattern_params()
439 &link->msm_dp_link.test_video.test_h_start); in msm_dp_link_parse_video_pattern_params()
446 &link->msm_dp_link.test_video.test_v_start); in msm_dp_link_parse_video_pattern_params()
453 &link->msm_dp_link.test_video.test_hsync_pol, in msm_dp_link_parse_video_pattern_params()
454 &link->msm_dp_link.test_video.test_hsync_width); in msm_dp_link_parse_video_pattern_params()
461 &link->msm_dp_link.test_video.test_vsync_pol, in msm_dp_link_parse_video_pattern_params()
462 &link->msm_dp_link.test_video.test_vsync_width); in msm_dp_link_parse_video_pattern_params()
469 &link->msm_dp_link.test_video.test_h_width); in msm_dp_link_parse_video_pattern_params()
476 &link->msm_dp_link.test_video.test_v_height); in msm_dp_link_parse_video_pattern_params()
483 &link->msm_dp_link.test_video.test_rr_d); in msm_dp_link_parse_video_pattern_params()
484 link->msm_dp_link.test_video.test_rr_d &= DP_TEST_REFRESH_DENOMINATOR; in msm_dp_link_parse_video_pattern_params()
491 &link->msm_dp_link.test_video.test_rr_n); in msm_dp_link_parse_video_pattern_params()
497 drm_dbg_dp(link->drm_dev, in msm_dp_link_parse_video_pattern_params()
500 "link bit depth = 0x%x\n" in msm_dp_link_parse_video_pattern_params()
511 link->msm_dp_link.test_video.test_video_pattern, in msm_dp_link_parse_video_pattern_params()
512 link->msm_dp_link.test_video.test_dyn_range, in msm_dp_link_parse_video_pattern_params()
513 link->msm_dp_link.test_video.test_bit_depth, in msm_dp_link_parse_video_pattern_params()
514 link->msm_dp_link.test_video.test_h_total, in msm_dp_link_parse_video_pattern_params()
515 link->msm_dp_link.test_video.test_v_total, in msm_dp_link_parse_video_pattern_params()
516 link->msm_dp_link.test_video.test_h_start, in msm_dp_link_parse_video_pattern_params()
517 link->msm_dp_link.test_video.test_v_start, in msm_dp_link_parse_video_pattern_params()
518 link->msm_dp_link.test_video.test_hsync_pol, in msm_dp_link_parse_video_pattern_params()
519 link->msm_dp_link.test_video.test_hsync_width, in msm_dp_link_parse_video_pattern_params()
520 link->msm_dp_link.test_video.test_vsync_pol, in msm_dp_link_parse_video_pattern_params()
521 link->msm_dp_link.test_video.test_vsync_width, in msm_dp_link_parse_video_pattern_params()
522 link->msm_dp_link.test_video.test_h_width, in msm_dp_link_parse_video_pattern_params()
523 link->msm_dp_link.test_video.test_v_height, in msm_dp_link_parse_video_pattern_params()
524 link->msm_dp_link.test_video.test_rr_d, in msm_dp_link_parse_video_pattern_params()
525 link->msm_dp_link.test_video.test_rr_n); in msm_dp_link_parse_video_pattern_params()
531 * msm_dp_link_parse_link_training_params() - parses link training parameters from
533 * @link: Display Port Driver data
543 rlen = drm_dp_dpcd_readb(link->aux, DP_TEST_LINK_RATE, &bp); in msm_dp_link_parse_link_training_params()
551 return -EINVAL; in msm_dp_link_parse_link_training_params()
554 link->request.test_link_rate = bp; in msm_dp_link_parse_link_training_params()
555 drm_dbg_dp(link->drm_dev, "link rate = 0x%x\n", in msm_dp_link_parse_link_training_params()
556 link->request.test_link_rate); in msm_dp_link_parse_link_training_params()
558 rlen = drm_dp_dpcd_readb(link->aux, DP_TEST_LANE_COUNT, &bp); in msm_dp_link_parse_link_training_params()
567 return -EINVAL; in msm_dp_link_parse_link_training_params()
570 link->request.test_lane_count = bp; in msm_dp_link_parse_link_training_params()
571 drm_dbg_dp(link->drm_dev, "lane count = 0x%x\n", in msm_dp_link_parse_link_training_params()
572 link->request.test_lane_count); in msm_dp_link_parse_link_training_params()
577 * msm_dp_link_parse_phy_test_params() - parses the phy link parameters
578 * @link: Display Port Driver data
588 rlen = drm_dp_dpcd_readb(link->aux, DP_PHY_TEST_PATTERN, in msm_dp_link_parse_phy_test_params()
595 link->msm_dp_link.phy_params.phy_test_pattern_sel = data & 0x07; in msm_dp_link_parse_phy_test_params()
597 drm_dbg_dp(link->drm_dev, "phy_test_pattern_sel = 0x%x\n", data); in msm_dp_link_parse_phy_test_params()
609 return -EINVAL; in msm_dp_link_parse_phy_test_params()
614 * msm_dp_link_is_video_audio_test_requested() - checks for audio/video link request
630 * msm_dp_link_parse_request() - parses link request parameters from sink
631 * @link: Display Port Driver data
646 rlen = drm_dp_dpcd_readb(link->aux, in msm_dp_link_parse_request()
653 drm_dbg_dp(link->drm_dev, "device service irq vector = 0x%x\n", data); in msm_dp_link_parse_request()
656 drm_dbg_dp(link->drm_dev, "no test requested\n"); in msm_dp_link_parse_request()
664 rlen = drm_dp_dpcd_readb(link->aux, DP_TEST_REQUEST, &data); in msm_dp_link_parse_request()
671 drm_dbg_dp(link->drm_dev, "link 0x%x not supported\n", data); in msm_dp_link_parse_request()
675 drm_dbg_dp(link->drm_dev, "Test:(0x%x) requested\n", data); in msm_dp_link_parse_request()
676 link->request.test_requested = data; in msm_dp_link_parse_request()
677 if (link->request.test_requested == DP_TEST_LINK_PHY_TEST_PATTERN) { in msm_dp_link_parse_request()
686 if (link->request.test_requested == DP_TEST_LINK_TRAINING) { in msm_dp_link_parse_request()
693 link->request.test_requested)) { in msm_dp_link_parse_request()
706 link->msm_dp_link.test_response = DP_TEST_NAK; in msm_dp_link_parse_request()
708 if (link->request.test_requested != DP_TEST_LINK_EDID_READ) in msm_dp_link_parse_request()
709 link->msm_dp_link.test_response = DP_TEST_ACK; in msm_dp_link_parse_request()
711 link->msm_dp_link.test_response = in msm_dp_link_parse_request()
722 link->prev_sink_count = link->msm_dp_link.sink_count; in msm_dp_link_parse_sink_status_field()
723 ret = drm_dp_read_sink_count(link->aux); in msm_dp_link_parse_sink_status_field()
728 link->msm_dp_link.sink_count = ret; in msm_dp_link_parse_sink_status_field()
730 ret = drm_dp_dpcd_read_link_status(link->aux, in msm_dp_link_parse_sink_status_field()
731 link->link_status); in msm_dp_link_parse_sink_status_field()
741 * msm_dp_link_process_link_training_request() - processes new training requests
742 * @link: Display Port link data
749 * otherwise it will return -EINVAL.
753 if (link->request.test_requested != DP_TEST_LINK_TRAINING) in msm_dp_link_process_link_training_request()
754 return -EINVAL; in msm_dp_link_process_link_training_request()
756 drm_dbg_dp(link->drm_dev, in msm_dp_link_process_link_training_request()
759 link->request.test_link_rate, in msm_dp_link_process_link_training_request()
760 link->request.test_lane_count); in msm_dp_link_process_link_training_request()
762 link->msm_dp_link.link_params.num_lanes = link->request.test_lane_count; in msm_dp_link_process_link_training_request()
763 link->msm_dp_link.link_params.rate = in msm_dp_link_process_link_training_request()
764 drm_dp_bw_code_to_link_rate(link->request.test_link_rate); in msm_dp_link_process_link_training_request()
781 ret = drm_dp_dpcd_writeb(link->aux, DP_TEST_RESPONSE, in msm_dp_link_send_test_response()
782 msm_dp_link->test_response); in msm_dp_link_send_test_response()
795 return -EINVAL; in msm_dp_link_psm_config()
800 mutex_lock(&link->psm_mutex); in msm_dp_link_psm_config()
802 ret = msm_dp_aux_link_power_down(link->aux, link_info); in msm_dp_link_psm_config()
804 ret = msm_dp_aux_link_power_up(link->aux, link_info); in msm_dp_link_psm_config()
810 mutex_unlock(&link->psm_mutex); in msm_dp_link_psm_config()
826 ret = drm_dp_dpcd_writeb(link->aux, DP_TEST_EDID_CHECKSUM, in msm_dp_link_send_edid_checksum()
833 drm_dbg_dp(link->drm_dev, "vx: 0=%d, 1=%d, 2=%d, 3=%d\n", in msm_dp_link_parse_vx_px()
834 drm_dp_get_adjust_request_voltage(link->link_status, 0), in msm_dp_link_parse_vx_px()
835 drm_dp_get_adjust_request_voltage(link->link_status, 1), in msm_dp_link_parse_vx_px()
836 drm_dp_get_adjust_request_voltage(link->link_status, 2), in msm_dp_link_parse_vx_px()
837 drm_dp_get_adjust_request_voltage(link->link_status, 3)); in msm_dp_link_parse_vx_px()
839 drm_dbg_dp(link->drm_dev, "px: 0=%d, 1=%d, 2=%d, 3=%d\n", in msm_dp_link_parse_vx_px()
840 drm_dp_get_adjust_request_pre_emphasis(link->link_status, 0), in msm_dp_link_parse_vx_px()
841 drm_dp_get_adjust_request_pre_emphasis(link->link_status, 1), in msm_dp_link_parse_vx_px()
842 drm_dp_get_adjust_request_pre_emphasis(link->link_status, 2), in msm_dp_link_parse_vx_px()
843 drm_dp_get_adjust_request_pre_emphasis(link->link_status, 3)); in msm_dp_link_parse_vx_px()
846 * Update the voltage and pre-emphasis levels as per DPCD request in msm_dp_link_parse_vx_px()
849 drm_dbg_dp(link->drm_dev, in msm_dp_link_parse_vx_px()
851 link->msm_dp_link.phy_params.v_level, in msm_dp_link_parse_vx_px()
852 link->msm_dp_link.phy_params.p_level); in msm_dp_link_parse_vx_px()
853 link->msm_dp_link.phy_params.v_level = in msm_dp_link_parse_vx_px()
854 drm_dp_get_adjust_request_voltage(link->link_status, 0); in msm_dp_link_parse_vx_px()
855 link->msm_dp_link.phy_params.p_level = in msm_dp_link_parse_vx_px()
856 drm_dp_get_adjust_request_pre_emphasis(link->link_status, 0); in msm_dp_link_parse_vx_px()
858 link->msm_dp_link.phy_params.p_level >>= DP_TRAIN_PRE_EMPHASIS_SHIFT; in msm_dp_link_parse_vx_px()
860 drm_dbg_dp(link->drm_dev, in msm_dp_link_parse_vx_px()
862 link->msm_dp_link.phy_params.v_level, in msm_dp_link_parse_vx_px()
863 link->msm_dp_link.phy_params.p_level); in msm_dp_link_parse_vx_px()
867 * msm_dp_link_process_phy_test_pattern_request() - process new phy link requests
868 * @link: Display Port Driver data
872 * processed, otherwise it will return -EINVAL.
877 if (!(link->request.test_requested & DP_TEST_LINK_PHY_TEST_PATTERN)) { in msm_dp_link_process_phy_test_pattern_request()
878 drm_dbg_dp(link->drm_dev, "no phy test\n"); in msm_dp_link_process_phy_test_pattern_request()
879 return -EINVAL; in msm_dp_link_process_phy_test_pattern_request()
882 if (!is_link_rate_valid(link->request.test_link_rate) || in msm_dp_link_process_phy_test_pattern_request()
883 !is_lane_count_valid(link->request.test_lane_count)) { in msm_dp_link_process_phy_test_pattern_request()
885 link->request.test_link_rate, in msm_dp_link_process_phy_test_pattern_request()
886 link->request.test_lane_count); in msm_dp_link_process_phy_test_pattern_request()
887 return -EINVAL; in msm_dp_link_process_phy_test_pattern_request()
890 drm_dbg_dp(link->drm_dev, in msm_dp_link_process_phy_test_pattern_request()
892 link->msm_dp_link.link_params.rate, in msm_dp_link_process_phy_test_pattern_request()
893 link->msm_dp_link.link_params.num_lanes); in msm_dp_link_process_phy_test_pattern_request()
895 drm_dbg_dp(link->drm_dev, in msm_dp_link_process_phy_test_pattern_request()
897 link->request.test_link_rate, in msm_dp_link_process_phy_test_pattern_request()
898 link->request.test_lane_count); in msm_dp_link_process_phy_test_pattern_request()
900 link->msm_dp_link.link_params.num_lanes = link->request.test_lane_count; in msm_dp_link_process_phy_test_pattern_request()
901 link->msm_dp_link.link_params.rate = in msm_dp_link_process_phy_test_pattern_request()
902 drm_dp_bw_code_to_link_rate(link->request.test_link_rate); in msm_dp_link_process_phy_test_pattern_request()
913 drm_dp_dpcd_read(link->aux, DP_PSR_ERROR_STATUS, &status, 1); in msm_dp_link_read_psr_error_status()
931 drm_dp_dpcd_read(link->aux, DP_PSR_ESI, &status, 1); in msm_dp_link_psr_capability_changed()
934 drm_dbg_dp(link->drm_dev, "PSR Capability Change\n"); in msm_dp_link_psr_capability_changed()
943 return link_status[r - DP_LANE0_1_STATUS]; in get_link_status()
947 * msm_dp_link_process_link_status_update() - processes link status updates
948 * @link: Display Port link module data
955 * otherwise it will return -EINVAL.
959 bool channel_eq_done = drm_dp_channel_eq_ok(link->link_status, in msm_dp_link_process_link_status_update()
960 link->msm_dp_link.link_params.num_lanes); in msm_dp_link_process_link_status_update()
962 bool clock_recovery_done = drm_dp_clock_recovery_ok(link->link_status, in msm_dp_link_process_link_status_update()
963 link->msm_dp_link.link_params.num_lanes); in msm_dp_link_process_link_status_update()
965 drm_dbg_dp(link->drm_dev, in msm_dp_link_process_link_status_update()
970 return -EINVAL; in msm_dp_link_process_link_status_update()
976 * msm_dp_link_process_ds_port_status_change() - process port status changes
977 * @link: Display Port Driver data
984 * processed, otherwise it will return -EINVAL.
988 if (get_link_status(link->link_status, DP_LANE_ALIGN_STATUS_UPDATED) & in msm_dp_link_process_ds_port_status_change()
992 if (link->prev_sink_count == link->msm_dp_link.sink_count) in msm_dp_link_process_ds_port_status_change()
993 return -EINVAL; in msm_dp_link_process_ds_port_status_change()
997 link->prev_sink_count = link->msm_dp_link.sink_count; in msm_dp_link_process_ds_port_status_change()
1004 return (link->request.test_requested & DP_TEST_LINK_VIDEO_PATTERN) in msm_dp_link_is_video_pattern_requested()
1005 && !(link->request.test_requested & in msm_dp_link_is_video_pattern_requested()
1011 return (link->request.test_requested & DP_TEST_LINK_AUDIO_PATTERN); in msm_dp_link_is_audio_pattern_requested()
1016 link->request = (const struct msm_dp_link_request){ 0 }; in msm_dp_link_reset_data()
1017 link->msm_dp_link.test_video = (const struct msm_dp_link_test_video){ 0 }; in msm_dp_link_reset_data()
1018 link->msm_dp_link.test_video.test_bit_depth = DP_TEST_BIT_DEPTH_UNKNOWN; in msm_dp_link_reset_data()
1019 link->msm_dp_link.test_audio = (const struct msm_dp_link_test_audio){ 0 }; in msm_dp_link_reset_data()
1020 link->msm_dp_link.phy_params.phy_test_pattern_sel = 0; in msm_dp_link_reset_data()
1021 link->msm_dp_link.sink_request = 0; in msm_dp_link_reset_data()
1022 link->msm_dp_link.test_response = 0; in msm_dp_link_reset_data()
1026 * msm_dp_link_process_request() - handle HPD IRQ transition to HIGH
1040 return -EINVAL; in msm_dp_link_process_request()
1051 if (link->request.test_requested == DP_TEST_LINK_EDID_READ) { in msm_dp_link_process_request()
1052 msm_dp_link->sink_request |= DP_TEST_LINK_EDID_READ; in msm_dp_link_process_request()
1054 msm_dp_link->sink_request |= DS_PORT_STATUS_CHANGED; in msm_dp_link_process_request()
1056 msm_dp_link->sink_request |= DP_TEST_LINK_TRAINING; in msm_dp_link_process_request()
1058 msm_dp_link->sink_request |= DP_TEST_LINK_PHY_TEST_PATTERN; in msm_dp_link_process_request()
1062 drm_dbg_dp(link->drm_dev, "PSR Capability changed\n"); in msm_dp_link_process_request()
1066 msm_dp_link->sink_request |= DP_LINK_STATUS_UPDATED; in msm_dp_link_process_request()
1070 msm_dp_link->sink_request |= DP_TEST_LINK_VIDEO_PATTERN; in msm_dp_link_process_request()
1073 msm_dp_link->sink_request |= DP_TEST_LINK_AUDIO_PATTERN; in msm_dp_link_process_request()
1074 ret = -EINVAL; in msm_dp_link_process_request()
1079 drm_dbg_dp(link->drm_dev, "sink request=%#x\n", in msm_dp_link_process_request()
1080 msm_dp_link->sink_request); in msm_dp_link_process_request()
1091 return -EINVAL; in msm_dp_link_get_colorimetry_config()
1101 if (link->msm_dp_link.test_video.test_dyn_range & in msm_dp_link_get_colorimetry_config()
1118 return -EINVAL; in msm_dp_link_adjust_levels()
1124 for (i = 0; i < msm_dp_link->link_params.num_lanes; i++) { in msm_dp_link_adjust_levels()
1128 drm_dbg_dp(link->drm_dev, in msm_dp_link_adjust_levels()
1137 msm_dp_link->phy_params.v_level = v_max >> DP_TRAIN_VOLTAGE_SWING_SHIFT; in msm_dp_link_adjust_levels()
1138 msm_dp_link->phy_params.p_level = p_max >> DP_TRAIN_PRE_EMPHASIS_SHIFT; in msm_dp_link_adjust_levels()
1141 * Adjust the voltage swing and pre-emphasis level combination to within in msm_dp_link_adjust_levels()
1144 if (msm_dp_link->phy_params.v_level > DP_TRAIN_LEVEL_MAX) { in msm_dp_link_adjust_levels()
1145 drm_dbg_dp(link->drm_dev, in msm_dp_link_adjust_levels()
1147 msm_dp_link->phy_params.v_level, in msm_dp_link_adjust_levels()
1149 msm_dp_link->phy_params.v_level = DP_TRAIN_LEVEL_MAX; in msm_dp_link_adjust_levels()
1152 if (msm_dp_link->phy_params.p_level > DP_TRAIN_LEVEL_MAX) { in msm_dp_link_adjust_levels()
1153 drm_dbg_dp(link->drm_dev, in msm_dp_link_adjust_levels()
1155 msm_dp_link->phy_params.p_level, in msm_dp_link_adjust_levels()
1157 msm_dp_link->phy_params.p_level = DP_TRAIN_LEVEL_MAX; in msm_dp_link_adjust_levels()
1160 max_p_level = DP_TRAIN_LEVEL_MAX - msm_dp_link->phy_params.v_level; in msm_dp_link_adjust_levels()
1161 if (msm_dp_link->phy_params.p_level > max_p_level) { in msm_dp_link_adjust_levels()
1162 drm_dbg_dp(link->drm_dev, in msm_dp_link_adjust_levels()
1164 msm_dp_link->phy_params.p_level, in msm_dp_link_adjust_levels()
1166 msm_dp_link->phy_params.p_level = max_p_level; in msm_dp_link_adjust_levels()
1169 drm_dbg_dp(link->drm_dev, "adjusted: v_level=%d, p_level=%d\n", in msm_dp_link_adjust_levels()
1170 msm_dp_link->phy_params.v_level, msm_dp_link->phy_params.p_level); in msm_dp_link_adjust_levels()
1177 msm_dp_link->phy_params.v_level = 0; in msm_dp_link_reset_phy_params_vx_px()
1178 msm_dp_link->phy_params.p_level = 0; in msm_dp_link_reset_phy_params_vx_px()
1190 * 1. Test bit depth is bit depth per color component in msm_dp_link_get_test_bits_depth()
1204 drm_dbg_dp(link->drm_dev, "bpp=%d not supported, use bpc=8\n", in msm_dp_link_get_test_bits_depth()
1225 cnt = of_property_count_u64_elems(endpoint, "link-frequencies"); in msm_dp_link_link_frequencies()
1228 of_property_read_u64_index(endpoint, "link-frequencies", in msm_dp_link_link_frequencies()
1229 cnt - 1, &frequency); in msm_dp_link_link_frequencies()
1240 * Always populate msm_dp_link->lane_map with 4 lanes.
1241 * - Use DTS "data-lanes" if present; otherwise fall back to default mapping.
1242 * - For partial definitions, fill remaining entries with unused lanes in
1247 struct device_node *of_node = dev->of_node; in msm_dp_link_lane_map()
1249 int cnt = msm_dp_link->max_dp_lanes; in msm_dp_link_lane_map()
1253 int i, j = 0, ret = -EINVAL; in msm_dp_link_lane_map()
1255 endpoint = of_graph_get_endpoint_by_regs(of_node, 1, -1); in msm_dp_link_lane_map()
1257 ret = of_property_read_u32_array(endpoint, "data-lanes", tmp, cnt); in msm_dp_link_lane_map()
1259 dev_dbg(dev, "endpoint data-lanes read failed (ret=%d)\n", ret); in msm_dp_link_lane_map()
1263 ret = of_property_read_u32_array(of_node, "data-lanes", tmp, cnt); in msm_dp_link_lane_map()
1265 dev_info(dev, "data-lanes not defined, set to default\n"); in msm_dp_link_lane_map()
1272 dev_err(dev, "data-lanes[%d]=%u out of range\n", i, tmp[i]); in msm_dp_link_lane_map()
1273 return -EINVAL; in msm_dp_link_lane_map()
1289 dev_dbg(dev, "data-lanes count %d <%d %d %d %d>\n", cnt, map[0], map[1], map[2], map[3]); in msm_dp_link_lane_map()
1290 memcpy(msm_dp_link->lane_map, map, sizeof(map)); in msm_dp_link_lane_map()
1296 struct device_node *of_node = dev->of_node; in msm_dp_link_parse_dt()
1300 * data-lanes is the property of msm_dp_out endpoint in msm_dp_link_parse_dt()
1304 /* legacy code, data-lanes is the property of mdss_dp node */ in msm_dp_link_parse_dt()
1309 msm_dp_link->max_dp_lanes = cnt; in msm_dp_link_parse_dt()
1311 msm_dp_link->max_dp_lanes = DP_MAX_NUM_DP_LANES; /* 4 lanes */ in msm_dp_link_parse_dt()
1314 dev_err(dev, "failed to parse data-lanes\n"); in msm_dp_link_parse_dt()
1315 return -EINVAL; in msm_dp_link_parse_dt()
1318 msm_dp_link->max_dp_link_rate = msm_dp_link_link_frequencies(of_node); in msm_dp_link_parse_dt()
1319 if (!msm_dp_link->max_dp_link_rate) in msm_dp_link_parse_dt()
1320 msm_dp_link->max_dp_link_rate = DP_LINK_RATE_HBR2; in msm_dp_link_parse_dt()
1333 return ERR_PTR(-EINVAL); in msm_dp_link_get()
1338 return ERR_PTR(-ENOMEM); in msm_dp_link_get()
1340 link->aux = aux; in msm_dp_link_get()
1342 mutex_init(&link->psm_mutex); in msm_dp_link_get()
1343 msm_dp_link = &link->msm_dp_link; in msm_dp_link_get()