Lines Matching +full:pre +full:- +full:emphasis

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__
53 if (link->revision < 0x11) in dp_aux_link_power_up()
78 if (link->revision < 0x11) in dp_aux_link_power_down()
102 if (drm_dp_dpcd_readb(link->aux, addr, &data) < 0) { in dp_link_get_period()
104 ret = -EINVAL; in dp_link_get_period()
108 /* Period - Bits 3:0 */ in dp_link_get_period()
112 ret = -EINVAL; in dp_link_get_period()
124 struct dp_link_test_audio *req = &link->dp_link.test_audio; in dp_link_parse_audio_channel_period()
127 if (ret == -EINVAL) in dp_link_parse_audio_channel_period()
130 req->test_audio_period_ch_1 = ret; in dp_link_parse_audio_channel_period()
134 if (ret == -EINVAL) in dp_link_parse_audio_channel_period()
137 req->test_audio_period_ch_2 = ret; in dp_link_parse_audio_channel_period()
142 if (ret == -EINVAL) in dp_link_parse_audio_channel_period()
145 req->test_audio_period_ch_3 = ret; in dp_link_parse_audio_channel_period()
149 if (ret == -EINVAL) in dp_link_parse_audio_channel_period()
152 req->test_audio_period_ch_4 = ret; in dp_link_parse_audio_channel_period()
156 if (ret == -EINVAL) in dp_link_parse_audio_channel_period()
159 req->test_audio_period_ch_5 = ret; in dp_link_parse_audio_channel_period()
163 if (ret == -EINVAL) in dp_link_parse_audio_channel_period()
166 req->test_audio_period_ch_6 = ret; in dp_link_parse_audio_channel_period()
170 if (ret == -EINVAL) in dp_link_parse_audio_channel_period()
173 req->test_audio_period_ch_7 = ret; in dp_link_parse_audio_channel_period()
177 if (ret == -EINVAL) in dp_link_parse_audio_channel_period()
180 req->test_audio_period_ch_8 = ret; in dp_link_parse_audio_channel_period()
193 rlen = drm_dp_dpcd_readb(link->aux, in dp_link_parse_audio_pattern_type()
200 /* Audio Pattern Type - Bits 7:0 */ in dp_link_parse_audio_pattern_type()
203 ret = -EINVAL; in dp_link_parse_audio_pattern_type()
207 link->dp_link.test_audio.test_audio_pattern_type = data; in dp_link_parse_audio_pattern_type()
223 rlen = drm_dp_dpcd_readb(link->aux, DP_TEST_AUDIO_MODE, &data); in dp_link_parse_audio_mode()
229 /* Sampling Rate - Bits 3:0 */ in dp_link_parse_audio_mode()
234 ret = -EINVAL; in dp_link_parse_audio_mode()
238 /* Channel Count - Bits 7:4 */ in dp_link_parse_audio_mode()
243 ret = -EINVAL; in dp_link_parse_audio_mode()
247 link->dp_link.test_audio.test_audio_sampling_rate = sampling_rate; in dp_link_parse_audio_mode()
248 link->dp_link.test_audio.test_audio_channel_count = channel_count; in dp_link_parse_audio_mode()
287 * dp_link_is_bit_depth_valid() - validates the bit depth requested
312 return -EINVAL; in dp_link_parse_timing_params1()
315 rlen = drm_dp_dpcd_read(link->aux, addr, bp, len); in dp_link_parse_timing_params1()
318 return -EINVAL; in dp_link_parse_timing_params1()
334 return -EINVAL; in dp_link_parse_timing_params2()
337 rlen = drm_dp_dpcd_read(link->aux, addr, bp, len); in dp_link_parse_timing_params2()
340 return -EINVAL; in dp_link_parse_timing_params2()
356 rlen = drm_dp_dpcd_read(link->aux, addr, &bp, len); in dp_link_parse_timing_params3()
359 return -EINVAL; in dp_link_parse_timing_params3()
367 * dp_link_parse_video_pattern_params() - parses video pattern parameters from DPCD
379 rlen = drm_dp_dpcd_readb(link->aux, DP_TEST_PATTERN, &bp); in dp_link_parse_video_pattern_params()
388 ret = -EINVAL; in dp_link_parse_video_pattern_params()
392 link->dp_link.test_video.test_video_pattern = bp; in dp_link_parse_video_pattern_params()
395 rlen = drm_dp_dpcd_readb(link->aux, DP_TEST_MISC0, &bp); in dp_link_parse_video_pattern_params()
402 link->dp_link.test_video.test_dyn_range = in dp_link_parse_video_pattern_params()
409 ret = -EINVAL; in dp_link_parse_video_pattern_params()
413 link->dp_link.test_video.test_bit_depth = bp; in dp_link_parse_video_pattern_params()
417 &link->dp_link.test_video.test_h_total); in dp_link_parse_video_pattern_params()
424 &link->dp_link.test_video.test_v_total); in dp_link_parse_video_pattern_params()
431 &link->dp_link.test_video.test_h_start); in dp_link_parse_video_pattern_params()
438 &link->dp_link.test_video.test_v_start); in dp_link_parse_video_pattern_params()
445 &link->dp_link.test_video.test_hsync_pol, in dp_link_parse_video_pattern_params()
446 &link->dp_link.test_video.test_hsync_width); in dp_link_parse_video_pattern_params()
453 &link->dp_link.test_video.test_vsync_pol, in dp_link_parse_video_pattern_params()
454 &link->dp_link.test_video.test_vsync_width); in dp_link_parse_video_pattern_params()
461 &link->dp_link.test_video.test_h_width); in dp_link_parse_video_pattern_params()
468 &link->dp_link.test_video.test_v_height); in dp_link_parse_video_pattern_params()
475 &link->dp_link.test_video.test_rr_d); in dp_link_parse_video_pattern_params()
476 link->dp_link.test_video.test_rr_d &= DP_TEST_REFRESH_DENOMINATOR; in dp_link_parse_video_pattern_params()
483 &link->dp_link.test_video.test_rr_n); in dp_link_parse_video_pattern_params()
502 link->dp_link.test_video.test_video_pattern, in dp_link_parse_video_pattern_params()
503 link->dp_link.test_video.test_dyn_range, in dp_link_parse_video_pattern_params()
504 link->dp_link.test_video.test_bit_depth, in dp_link_parse_video_pattern_params()
505 link->dp_link.test_video.test_h_total, in dp_link_parse_video_pattern_params()
506 link->dp_link.test_video.test_v_total, in dp_link_parse_video_pattern_params()
507 link->dp_link.test_video.test_h_start, in dp_link_parse_video_pattern_params()
508 link->dp_link.test_video.test_v_start, in dp_link_parse_video_pattern_params()
509 link->dp_link.test_video.test_hsync_pol, in dp_link_parse_video_pattern_params()
510 link->dp_link.test_video.test_hsync_width, in dp_link_parse_video_pattern_params()
511 link->dp_link.test_video.test_vsync_pol, in dp_link_parse_video_pattern_params()
512 link->dp_link.test_video.test_vsync_width, in dp_link_parse_video_pattern_params()
513 link->dp_link.test_video.test_h_width, in dp_link_parse_video_pattern_params()
514 link->dp_link.test_video.test_v_height, in dp_link_parse_video_pattern_params()
515 link->dp_link.test_video.test_rr_d, in dp_link_parse_video_pattern_params()
516 link->dp_link.test_video.test_rr_n); in dp_link_parse_video_pattern_params()
522 * dp_link_parse_link_training_params() - parses link training parameters from
534 rlen = drm_dp_dpcd_readb(link->aux, DP_TEST_LINK_RATE, &bp); in dp_link_parse_link_training_params()
542 return -EINVAL; in dp_link_parse_link_training_params()
545 link->request.test_link_rate = bp; in dp_link_parse_link_training_params()
546 DRM_DEBUG_DP("link rate = 0x%x\n", link->request.test_link_rate); in dp_link_parse_link_training_params()
548 rlen = drm_dp_dpcd_readb(link->aux, DP_TEST_LANE_COUNT, &bp); in dp_link_parse_link_training_params()
557 return -EINVAL; in dp_link_parse_link_training_params()
560 link->request.test_lane_count = bp; in dp_link_parse_link_training_params()
561 DRM_DEBUG_DP("lane count = 0x%x\n", link->request.test_lane_count); in dp_link_parse_link_training_params()
566 * dp_link_parse_phy_test_params() - parses the phy link parameters
577 rlen = drm_dp_dpcd_readb(link->aux, DP_PHY_TEST_PATTERN, in dp_link_parse_phy_test_params()
584 link->dp_link.phy_params.phy_test_pattern_sel = data & 0x07; in dp_link_parse_phy_test_params()
598 return -EINVAL; in dp_link_parse_phy_test_params()
603 * dp_link_is_video_audio_test_requested() - checks for audio/video link request
619 * dp_link_parse_request() - parses link request parameters from sink
635 rlen = drm_dp_dpcd_readb(link->aux, in dp_link_parse_request()
653 rlen = drm_dp_dpcd_readb(link->aux, DP_TEST_REQUEST, &data); in dp_link_parse_request()
665 link->request.test_requested = data; in dp_link_parse_request()
666 if (link->request.test_requested == DP_TEST_LINK_PHY_TEST_PATTERN) { in dp_link_parse_request()
675 if (link->request.test_requested == DP_TEST_LINK_TRAINING) { in dp_link_parse_request()
682 link->request.test_requested)) { in dp_link_parse_request()
695 link->dp_link.test_response = DP_TEST_NAK; in dp_link_parse_request()
697 if (link->request.test_requested != DP_TEST_LINK_EDID_READ) in dp_link_parse_request()
698 link->dp_link.test_response = DP_TEST_ACK; in dp_link_parse_request()
700 link->dp_link.test_response = in dp_link_parse_request()
708 * dp_link_parse_sink_count() - parses the sink count
723 rlen = drm_dp_dpcd_readb(link->aux, DP_SINK_COUNT, in dp_link_parse_sink_count()
724 &link->dp_link.sink_count); in dp_link_parse_sink_count()
730 cp_ready = link->dp_link.sink_count & DP_SINK_CP_READY; in dp_link_parse_sink_count()
732 link->dp_link.sink_count = in dp_link_parse_sink_count()
733 DP_GET_SINK_COUNT(link->dp_link.sink_count); in dp_link_parse_sink_count()
736 link->dp_link.sink_count, cp_ready); in dp_link_parse_sink_count()
744 link->prev_sink_count = link->dp_link.sink_count; in dp_link_parse_sink_status_field()
745 dp_link_parse_sink_count(&link->dp_link); in dp_link_parse_sink_status_field()
747 len = drm_dp_dpcd_read_link_status(link->aux, in dp_link_parse_sink_status_field()
748 link->link_status); in dp_link_parse_sink_status_field()
755 * dp_link_process_link_training_request() - processes new training requests
763 * otherwise it will return -EINVAL.
767 if (link->request.test_requested != DP_TEST_LINK_TRAINING) in dp_link_process_link_training_request()
768 return -EINVAL; in dp_link_process_link_training_request()
772 link->request.test_link_rate, in dp_link_process_link_training_request()
773 link->request.test_lane_count); in dp_link_process_link_training_request()
775 link->dp_link.link_params.num_lanes = link->request.test_lane_count; in dp_link_process_link_training_request()
776 link->dp_link.link_params.rate = in dp_link_process_link_training_request()
777 drm_dp_bw_code_to_link_rate(link->request.test_link_rate); in dp_link_process_link_training_request()
794 ret = drm_dp_dpcd_writeb(link->aux, DP_TEST_RESPONSE, in dp_link_send_test_response()
795 dp_link->test_response); in dp_link_send_test_response()
808 return -EINVAL; in dp_link_psm_config()
813 mutex_lock(&link->psm_mutex); in dp_link_psm_config()
815 ret = dp_aux_link_power_down(link->aux, link_info); in dp_link_psm_config()
817 ret = dp_aux_link_power_up(link->aux, link_info); in dp_link_psm_config()
823 dp_link->psm_enabled = enable; in dp_link_psm_config()
825 mutex_unlock(&link->psm_mutex); in dp_link_psm_config()
841 ret = drm_dp_dpcd_writeb(link->aux, DP_TEST_EDID_CHECKSUM, in dp_link_send_edid_checksum()
849 drm_dp_get_adjust_request_voltage(link->link_status, 0), in dp_link_parse_vx_px()
850 drm_dp_get_adjust_request_voltage(link->link_status, 1), in dp_link_parse_vx_px()
851 drm_dp_get_adjust_request_voltage(link->link_status, 2), in dp_link_parse_vx_px()
852 drm_dp_get_adjust_request_voltage(link->link_status, 3)); in dp_link_parse_vx_px()
855 drm_dp_get_adjust_request_pre_emphasis(link->link_status, 0), in dp_link_parse_vx_px()
856 drm_dp_get_adjust_request_pre_emphasis(link->link_status, 1), in dp_link_parse_vx_px()
857 drm_dp_get_adjust_request_pre_emphasis(link->link_status, 2), in dp_link_parse_vx_px()
858 drm_dp_get_adjust_request_pre_emphasis(link->link_status, 3)); in dp_link_parse_vx_px()
861 * Update the voltage and pre-emphasis levels as per DPCD request in dp_link_parse_vx_px()
865 link->dp_link.phy_params.v_level, in dp_link_parse_vx_px()
866 link->dp_link.phy_params.p_level); in dp_link_parse_vx_px()
867 link->dp_link.phy_params.v_level = in dp_link_parse_vx_px()
868 drm_dp_get_adjust_request_voltage(link->link_status, 0); in dp_link_parse_vx_px()
869 link->dp_link.phy_params.p_level = in dp_link_parse_vx_px()
870 drm_dp_get_adjust_request_pre_emphasis(link->link_status, 0); in dp_link_parse_vx_px()
872 link->dp_link.phy_params.p_level >>= DP_TRAIN_PRE_EMPHASIS_SHIFT; in dp_link_parse_vx_px()
875 link->dp_link.phy_params.v_level, in dp_link_parse_vx_px()
876 link->dp_link.phy_params.p_level); in dp_link_parse_vx_px()
880 * dp_link_process_phy_test_pattern_request() - process new phy link requests
885 * processed, otherwise it will return -EINVAL.
890 if (!(link->request.test_requested & DP_TEST_LINK_PHY_TEST_PATTERN)) { in dp_link_process_phy_test_pattern_request()
892 return -EINVAL; in dp_link_process_phy_test_pattern_request()
895 if (!is_link_rate_valid(link->request.test_link_rate) || in dp_link_process_phy_test_pattern_request()
896 !is_lane_count_valid(link->request.test_lane_count)) { in dp_link_process_phy_test_pattern_request()
898 link->request.test_link_rate, in dp_link_process_phy_test_pattern_request()
899 link->request.test_lane_count); in dp_link_process_phy_test_pattern_request()
900 return -EINVAL; in dp_link_process_phy_test_pattern_request()
904 link->dp_link.link_params.rate, in dp_link_process_phy_test_pattern_request()
905 link->dp_link.link_params.num_lanes); in dp_link_process_phy_test_pattern_request()
908 link->request.test_link_rate, in dp_link_process_phy_test_pattern_request()
909 link->request.test_lane_count); in dp_link_process_phy_test_pattern_request()
911 link->dp_link.link_params.num_lanes = link->request.test_lane_count; in dp_link_process_phy_test_pattern_request()
912 link->dp_link.link_params.rate = in dp_link_process_phy_test_pattern_request()
913 drm_dp_bw_code_to_link_rate(link->request.test_link_rate); in dp_link_process_phy_test_pattern_request()
922 return link_status[r - DP_LANE0_1_STATUS]; in get_link_status()
926 * dp_link_process_link_status_update() - processes link status updates
934 * otherwise it will return -EINVAL.
938 bool channel_eq_done = drm_dp_channel_eq_ok(link->link_status, in dp_link_process_link_status_update()
939 link->dp_link.link_params.num_lanes); in dp_link_process_link_status_update()
941 bool clock_recovery_done = drm_dp_clock_recovery_ok(link->link_status, in dp_link_process_link_status_update()
942 link->dp_link.link_params.num_lanes); in dp_link_process_link_status_update()
948 return -EINVAL; in dp_link_process_link_status_update()
955 * dp_link_process_ds_port_status_change() - process port status changes
963 * processed, otherwise it will return -EINVAL.
967 if (get_link_status(link->link_status, DP_LANE_ALIGN_STATUS_UPDATED) & in dp_link_process_ds_port_status_change()
971 if (link->prev_sink_count == link->dp_link.sink_count) in dp_link_process_ds_port_status_change()
972 return -EINVAL; in dp_link_process_ds_port_status_change()
976 link->prev_sink_count = link->dp_link.sink_count; in dp_link_process_ds_port_status_change()
983 return (link->request.test_requested & DP_TEST_LINK_VIDEO_PATTERN) in dp_link_is_video_pattern_requested()
984 && !(link->request.test_requested & in dp_link_is_video_pattern_requested()
990 return (link->request.test_requested & DP_TEST_LINK_AUDIO_PATTERN); in dp_link_is_audio_pattern_requested()
995 link->request = (const struct dp_link_request){ 0 }; in dp_link_reset_data()
996 link->dp_link.test_video = (const struct dp_link_test_video){ 0 }; in dp_link_reset_data()
997 link->dp_link.test_video.test_bit_depth = DP_TEST_BIT_DEPTH_UNKNOWN; in dp_link_reset_data()
998 link->dp_link.test_audio = (const struct dp_link_test_audio){ 0 }; in dp_link_reset_data()
999 link->dp_link.phy_params.phy_test_pattern_sel = 0; in dp_link_reset_data()
1000 link->dp_link.sink_request = 0; in dp_link_reset_data()
1001 link->dp_link.test_response = 0; in dp_link_reset_data()
1005 * dp_link_process_request() - handle HPD IRQ transition to HIGH
1019 return -EINVAL; in dp_link_process_request()
1028 if (link->request.test_requested == DP_TEST_LINK_EDID_READ) { in dp_link_process_request()
1029 dp_link->sink_request |= DP_TEST_LINK_EDID_READ; in dp_link_process_request()
1031 dp_link->sink_request |= DS_PORT_STATUS_CHANGED; in dp_link_process_request()
1033 dp_link->sink_request |= DP_TEST_LINK_TRAINING; in dp_link_process_request()
1035 dp_link->sink_request |= DP_TEST_LINK_PHY_TEST_PATTERN; in dp_link_process_request()
1039 dp_link->sink_request |= DP_LINK_STATUS_UPDATED; in dp_link_process_request()
1043 dp_link->sink_request |= DP_TEST_LINK_VIDEO_PATTERN; in dp_link_process_request()
1046 dp_link->sink_request |= DP_TEST_LINK_AUDIO_PATTERN; in dp_link_process_request()
1047 ret = -EINVAL; in dp_link_process_request()
1052 DRM_DEBUG_DP("sink request=%#x", dp_link->sink_request); in dp_link_process_request()
1063 return -EINVAL; in dp_link_get_colorimetry_config()
1073 cc = link->dp_link.test_video.test_dyn_range; in dp_link_get_colorimetry_config()
1087 return -EINVAL; in dp_link_adjust_levels()
1091 for (i = 0; i < dp_link->link_params.num_lanes; i++) { in dp_link_adjust_levels()
1103 dp_link->phy_params.v_level = v_max >> DP_TRAIN_VOLTAGE_SWING_SHIFT; in dp_link_adjust_levels()
1104 dp_link->phy_params.p_level = p_max >> DP_TRAIN_PRE_EMPHASIS_SHIFT; in dp_link_adjust_levels()
1107 * Adjust the voltage swing and pre-emphasis level combination to within in dp_link_adjust_levels()
1110 if (dp_link->phy_params.v_level > DP_TRAIN_VOLTAGE_SWING_MAX) { in dp_link_adjust_levels()
1112 dp_link->phy_params.v_level, in dp_link_adjust_levels()
1114 dp_link->phy_params.v_level = DP_TRAIN_VOLTAGE_SWING_MAX; in dp_link_adjust_levels()
1117 if (dp_link->phy_params.p_level > DP_TRAIN_PRE_EMPHASIS_MAX) { in dp_link_adjust_levels()
1119 dp_link->phy_params.p_level, in dp_link_adjust_levels()
1121 dp_link->phy_params.p_level = DP_TRAIN_PRE_EMPHASIS_MAX; in dp_link_adjust_levels()
1124 if ((dp_link->phy_params.p_level > DP_TRAIN_PRE_EMPHASIS_LVL_1) in dp_link_adjust_levels()
1125 && (dp_link->phy_params.v_level == in dp_link_adjust_levels()
1128 dp_link->phy_params.p_level, in dp_link_adjust_levels()
1130 dp_link->phy_params.p_level = DP_TRAIN_PRE_EMPHASIS_LVL_1; in dp_link_adjust_levels()
1134 dp_link->phy_params.v_level, dp_link->phy_params.p_level); in dp_link_adjust_levels()
1141 dp_link->phy_params.v_level = 0; in dp_link_reset_phy_params_vx_px()
1142 dp_link->phy_params.p_level = 0; in dp_link_reset_phy_params_vx_px()
1182 return ERR_PTR(-EINVAL); in dp_link_get()
1187 return ERR_PTR(-ENOMEM); in dp_link_get()
1189 link->dev = dev; in dp_link_get()
1190 link->aux = aux; in dp_link_get()
1192 mutex_init(&link->psm_mutex); in dp_link_get()
1193 dp_link = &link->dp_link; in dp_link_get()