Lines Matching refs:intel_dp
111 bool intel_dp_is_edp(struct intel_dp *intel_dp) in intel_dp_is_edp() argument
113 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); in intel_dp_is_edp()
118 static void intel_dp_unset_edid(struct intel_dp *intel_dp);
119 static int intel_dp_dsc_compute_bpp(struct intel_dp *intel_dp, u8 dsc_max_bpc);
127 static void intel_dp_set_default_sink_rates(struct intel_dp *intel_dp) in intel_dp_set_default_sink_rates() argument
129 intel_dp->sink_rates[0] = 162000; in intel_dp_set_default_sink_rates()
130 intel_dp->num_sink_rates = 1; in intel_dp_set_default_sink_rates()
134 static void intel_dp_set_dpcd_sink_rates(struct intel_dp *intel_dp) in intel_dp_set_dpcd_sink_rates() argument
142 if (drm_dp_has_quirk(&intel_dp->desc, DP_DPCD_QUIRK_CAN_DO_MAX_LINK_RATE_3_24_GBPS)) { in intel_dp_set_dpcd_sink_rates()
146 memcpy(intel_dp->sink_rates, quirk_rates, sizeof(quirk_rates)); in intel_dp_set_dpcd_sink_rates()
147 intel_dp->num_sink_rates = ARRAY_SIZE(quirk_rates); in intel_dp_set_dpcd_sink_rates()
155 max_rate = drm_dp_bw_code_to_link_rate(intel_dp->dpcd[DP_MAX_LINK_RATE]); in intel_dp_set_dpcd_sink_rates()
156 max_lttpr_rate = drm_dp_lttpr_max_link_rate(intel_dp->lttpr_common_caps); in intel_dp_set_dpcd_sink_rates()
163 intel_dp->sink_rates[i] = dp_rates[i]; in intel_dp_set_dpcd_sink_rates()
170 if (intel_dp->dpcd[DP_MAIN_LINK_CHANNEL_CODING] & DP_CAP_ANSI_128B132B) { in intel_dp_set_dpcd_sink_rates()
173 BUILD_BUG_ON(ARRAY_SIZE(intel_dp->sink_rates) < ARRAY_SIZE(dp_rates) + 3); in intel_dp_set_dpcd_sink_rates()
175 drm_dp_dpcd_readb(&intel_dp->aux, in intel_dp_set_dpcd_sink_rates()
178 if (drm_dp_lttpr_count(intel_dp->lttpr_common_caps)) { in intel_dp_set_dpcd_sink_rates()
180 if (intel_dp->lttpr_common_caps[0] >= 0x20 && in intel_dp_set_dpcd_sink_rates()
181 intel_dp->lttpr_common_caps[DP_MAIN_LINK_CHANNEL_CODING_PHY_REPEATER - in intel_dp_set_dpcd_sink_rates()
185 uhbr_rates &= intel_dp->lttpr_common_caps[DP_PHY_REPEATER_128B132B_RATES - in intel_dp_set_dpcd_sink_rates()
194 intel_dp->sink_rates[i++] = 1000000; in intel_dp_set_dpcd_sink_rates()
196 intel_dp->sink_rates[i++] = 1350000; in intel_dp_set_dpcd_sink_rates()
198 intel_dp->sink_rates[i++] = 2000000; in intel_dp_set_dpcd_sink_rates()
201 intel_dp->num_sink_rates = i; in intel_dp_set_dpcd_sink_rates()
204 static void intel_dp_set_sink_rates(struct intel_dp *intel_dp) in intel_dp_set_sink_rates() argument
206 struct intel_connector *connector = intel_dp->attached_connector; in intel_dp_set_sink_rates()
207 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); in intel_dp_set_sink_rates()
210 intel_dp_set_dpcd_sink_rates(intel_dp); in intel_dp_set_sink_rates()
212 if (intel_dp->num_sink_rates) in intel_dp_set_sink_rates()
215 drm_err(&dp_to_i915(intel_dp)->drm, in intel_dp_set_sink_rates()
220 intel_dp_set_default_sink_rates(intel_dp); in intel_dp_set_sink_rates()
223 static void intel_dp_set_default_max_sink_lane_count(struct intel_dp *intel_dp) in intel_dp_set_default_max_sink_lane_count() argument
225 intel_dp->max_sink_lane_count = 1; in intel_dp_set_default_max_sink_lane_count()
228 static void intel_dp_set_max_sink_lane_count(struct intel_dp *intel_dp) in intel_dp_set_max_sink_lane_count() argument
230 struct intel_connector *connector = intel_dp->attached_connector; in intel_dp_set_max_sink_lane_count()
231 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); in intel_dp_set_max_sink_lane_count()
234 intel_dp->max_sink_lane_count = drm_dp_max_lane_count(intel_dp->dpcd); in intel_dp_set_max_sink_lane_count()
236 switch (intel_dp->max_sink_lane_count) { in intel_dp_set_max_sink_lane_count()
243 drm_err(&dp_to_i915(intel_dp)->drm, in intel_dp_set_max_sink_lane_count()
247 intel_dp->max_sink_lane_count); in intel_dp_set_max_sink_lane_count()
249 intel_dp_set_default_max_sink_lane_count(intel_dp); in intel_dp_set_max_sink_lane_count()
267 static int intel_dp_common_len_rate_limit(const struct intel_dp *intel_dp, in intel_dp_common_len_rate_limit() argument
270 return intel_dp_rate_limit_len(intel_dp->common_rates, in intel_dp_common_len_rate_limit()
271 intel_dp->num_common_rates, max_rate); in intel_dp_common_len_rate_limit()
274 static int intel_dp_common_rate(struct intel_dp *intel_dp, int index) in intel_dp_common_rate() argument
276 if (drm_WARN_ON(&dp_to_i915(intel_dp)->drm, in intel_dp_common_rate()
277 index < 0 || index >= intel_dp->num_common_rates)) in intel_dp_common_rate()
280 return intel_dp->common_rates[index]; in intel_dp_common_rate()
284 static int intel_dp_max_common_rate(struct intel_dp *intel_dp) in intel_dp_max_common_rate() argument
286 return intel_dp_common_rate(intel_dp, intel_dp->num_common_rates - 1); in intel_dp_max_common_rate()
301 static int intel_dp_max_common_lane_count(struct intel_dp *intel_dp) in intel_dp_max_common_lane_count() argument
303 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); in intel_dp_max_common_lane_count()
305 int sink_max = intel_dp->max_sink_lane_count; in intel_dp_max_common_lane_count()
307 int lttpr_max = drm_dp_lttpr_max_lane_count(intel_dp->lttpr_common_caps); in intel_dp_max_common_lane_count()
315 int intel_dp_max_lane_count(struct intel_dp *intel_dp) in intel_dp_max_lane_count() argument
317 switch (intel_dp->max_link_lane_count) { in intel_dp_max_lane_count()
321 return intel_dp->max_link_lane_count; in intel_dp_max_lane_count()
323 MISSING_CASE(intel_dp->max_link_lane_count); in intel_dp_max_lane_count()
387 bool intel_dp_can_bigjoiner(struct intel_dp *intel_dp) in intel_dp_can_bigjoiner() argument
389 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); in intel_dp_can_bigjoiner()
398 static int dg2_max_source_rate(struct intel_dp *intel_dp) in dg2_max_source_rate() argument
400 return intel_dp_is_edp(intel_dp) ? 810000 : 1350000; in dg2_max_source_rate()
403 static int icl_max_source_rate(struct intel_dp *intel_dp) in icl_max_source_rate() argument
405 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); in icl_max_source_rate()
409 if (intel_phy_is_combo(dev_priv, phy) && !intel_dp_is_edp(intel_dp)) in icl_max_source_rate()
415 static int ehl_max_source_rate(struct intel_dp *intel_dp) in ehl_max_source_rate() argument
417 if (intel_dp_is_edp(intel_dp)) in ehl_max_source_rate()
423 static int vbt_max_link_rate(struct intel_dp *intel_dp) in vbt_max_link_rate() argument
425 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; in vbt_max_link_rate()
430 if (intel_dp_is_edp(intel_dp)) { in vbt_max_link_rate()
431 struct intel_connector *connector = intel_dp->attached_connector; in vbt_max_link_rate()
444 intel_dp_set_source_rates(struct intel_dp *intel_dp) in intel_dp_set_source_rates() argument
463 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); in intel_dp_set_source_rates()
470 intel_dp->source_rates || intel_dp->num_source_rates); in intel_dp_set_source_rates()
476 max_rate = dg2_max_source_rate(intel_dp); in intel_dp_set_source_rates()
481 max_rate = ehl_max_source_rate(intel_dp); in intel_dp_set_source_rates()
483 max_rate = icl_max_source_rate(intel_dp); in intel_dp_set_source_rates()
499 vbt_max_rate = vbt_max_link_rate(intel_dp); in intel_dp_set_source_rates()
508 intel_dp->source_rates = source_rates; in intel_dp_set_source_rates()
509 intel_dp->num_source_rates = size; in intel_dp_set_source_rates()
547 static void intel_dp_set_common_rates(struct intel_dp *intel_dp) in intel_dp_set_common_rates() argument
549 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_dp_set_common_rates()
552 !intel_dp->num_source_rates || !intel_dp->num_sink_rates); in intel_dp_set_common_rates()
554 intel_dp->num_common_rates = intersect_rates(intel_dp->source_rates, in intel_dp_set_common_rates()
555 intel_dp->num_source_rates, in intel_dp_set_common_rates()
556 intel_dp->sink_rates, in intel_dp_set_common_rates()
557 intel_dp->num_sink_rates, in intel_dp_set_common_rates()
558 intel_dp->common_rates); in intel_dp_set_common_rates()
561 if (drm_WARN_ON(&i915->drm, intel_dp->num_common_rates == 0)) { in intel_dp_set_common_rates()
562 intel_dp->common_rates[0] = 162000; in intel_dp_set_common_rates()
563 intel_dp->num_common_rates = 1; in intel_dp_set_common_rates()
567 static bool intel_dp_link_params_valid(struct intel_dp *intel_dp, int link_rate, in intel_dp_link_params_valid() argument
576 link_rate > intel_dp->max_link_rate) in intel_dp_link_params_valid()
580 lane_count > intel_dp_max_lane_count(intel_dp)) in intel_dp_link_params_valid()
586 static bool intel_dp_can_link_train_fallback_for_edp(struct intel_dp *intel_dp, in intel_dp_can_link_train_fallback_for_edp() argument
592 intel_panel_preferred_fixed_mode(intel_dp->attached_connector); in intel_dp_can_link_train_fallback_for_edp()
603 int intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp, in intel_dp_get_link_train_fallback_values() argument
606 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_dp_get_link_train_fallback_values()
613 if (intel_dp->is_mst) { in intel_dp_get_link_train_fallback_values()
618 if (intel_dp_is_edp(intel_dp) && !intel_dp->use_max_params) { in intel_dp_get_link_train_fallback_values()
621 intel_dp->use_max_params = true; in intel_dp_get_link_train_fallback_values()
625 index = intel_dp_rate_index(intel_dp->common_rates, in intel_dp_get_link_train_fallback_values()
626 intel_dp->num_common_rates, in intel_dp_get_link_train_fallback_values()
629 if (intel_dp_is_edp(intel_dp) && in intel_dp_get_link_train_fallback_values()
630 !intel_dp_can_link_train_fallback_for_edp(intel_dp, in intel_dp_get_link_train_fallback_values()
631 intel_dp_common_rate(intel_dp, index - 1), in intel_dp_get_link_train_fallback_values()
637 intel_dp->max_link_rate = intel_dp_common_rate(intel_dp, index - 1); in intel_dp_get_link_train_fallback_values()
638 intel_dp->max_link_lane_count = lane_count; in intel_dp_get_link_train_fallback_values()
640 if (intel_dp_is_edp(intel_dp) && in intel_dp_get_link_train_fallback_values()
641 !intel_dp_can_link_train_fallback_for_edp(intel_dp, in intel_dp_get_link_train_fallback_values()
642 intel_dp_max_common_rate(intel_dp), in intel_dp_get_link_train_fallback_values()
648 intel_dp->max_link_rate = intel_dp_max_common_rate(intel_dp); in intel_dp_get_link_train_fallback_values()
649 intel_dp->max_link_lane_count = lane_count >> 1; in intel_dp_get_link_train_fallback_values()
740 static u8 intel_dp_dsc_get_slice_count(struct intel_dp *intel_dp, in intel_dp_dsc_get_slice_count() argument
744 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_dp_dsc_get_slice_count()
755 max_slice_width = drm_dp_dsc_sink_max_slice_width(intel_dp->dsc_dpcd); in intel_dp_dsc_get_slice_count()
772 drm_dp_dsc_sink_max_slice_count(intel_dp->dsc_dpcd, false)) in intel_dp_dsc_get_slice_count()
792 struct intel_dp *intel_dp = intel_attached_dp(connector); in intel_dp_output_format() local
797 if (intel_dp->dfp.rgb_to_ycbcr && in intel_dp_output_format()
798 intel_dp->dfp.ycbcr_444_to_420) in intel_dp_output_format()
801 if (intel_dp->dfp.ycbcr_444_to_420) in intel_dp_output_format()
858 static int intel_dp_max_tmds_clock(struct intel_dp *intel_dp) in intel_dp_max_tmds_clock() argument
860 struct intel_connector *connector = intel_dp->attached_connector; in intel_dp_max_tmds_clock()
862 int max_tmds_clock = intel_dp->dfp.max_tmds_clock; in intel_dp_max_tmds_clock()
872 intel_dp_tmds_clock_valid(struct intel_dp *intel_dp, in intel_dp_tmds_clock_valid() argument
883 min_tmds_clock = intel_dp->dfp.min_tmds_clock; in intel_dp_tmds_clock_valid()
884 max_tmds_clock = intel_dp_max_tmds_clock(intel_dp); in intel_dp_tmds_clock_valid()
900 struct intel_dp *intel_dp = intel_attached_dp(connector); in intel_dp_mode_valid_downstream() local
906 if (intel_dp->dfp.pcon_max_frl_bw) { in intel_dp_mode_valid_downstream()
913 max_frl_bw = intel_dp->dfp.pcon_max_frl_bw; in intel_dp_mode_valid_downstream()
924 if (intel_dp->dfp.max_dotclock && in intel_dp_mode_valid_downstream()
925 target_clock > intel_dp->dfp.max_dotclock) in intel_dp_mode_valid_downstream()
931 status = intel_dp_tmds_clock_valid(intel_dp, target_clock, in intel_dp_mode_valid_downstream()
940 status = intel_dp_tmds_clock_valid(intel_dp, target_clock, in intel_dp_mode_valid_downstream()
949 static bool intel_dp_need_bigjoiner(struct intel_dp *intel_dp, in intel_dp_need_bigjoiner() argument
952 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_dp_need_bigjoiner()
954 if (!intel_dp_can_bigjoiner(intel_dp)) in intel_dp_need_bigjoiner()
965 struct intel_dp *intel_dp = intel_attached_dp(connector); in intel_dp_mode_valid() local
983 if (intel_dp_is_edp(intel_dp) && fixed_mode) { in intel_dp_mode_valid()
994 if (intel_dp_need_bigjoiner(intel_dp, mode->hdisplay, target_clock)) { in intel_dp_mode_valid()
1001 max_link_clock = intel_dp_max_link_rate(intel_dp); in intel_dp_mode_valid()
1002 max_lanes = intel_dp_max_lane_count(intel_dp); in intel_dp_mode_valid()
1016 drm_dp_sink_supports_dsc(intel_dp->dsc_dpcd)) { in intel_dp_mode_valid()
1021 int pipe_bpp = intel_dp_dsc_compute_bpp(intel_dp, U8_MAX); in intel_dp_mode_valid()
1023 if (intel_dp_is_edp(intel_dp)) { in intel_dp_mode_valid()
1025 drm_edp_dsc_sink_output_bpp(intel_dp->dsc_dpcd) >> 4; in intel_dp_mode_valid()
1027 drm_dp_dsc_sink_max_slice_count(intel_dp->dsc_dpcd, in intel_dp_mode_valid()
1029 } else if (drm_dp_sink_supports_fec(intel_dp->fec_capable)) { in intel_dp_mode_valid()
1039 intel_dp_dsc_get_slice_count(intel_dp, in intel_dp_mode_valid()
1091 static void intel_dp_print_rates(struct intel_dp *intel_dp) in intel_dp_print_rates() argument
1093 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_dp_print_rates()
1100 intel_dp->source_rates, intel_dp->num_source_rates); in intel_dp_print_rates()
1104 intel_dp->sink_rates, intel_dp->num_sink_rates); in intel_dp_print_rates()
1108 intel_dp->common_rates, intel_dp->num_common_rates); in intel_dp_print_rates()
1113 intel_dp_max_link_rate(struct intel_dp *intel_dp) in intel_dp_max_link_rate() argument
1117 len = intel_dp_common_len_rate_limit(intel_dp, intel_dp->max_link_rate); in intel_dp_max_link_rate()
1119 return intel_dp_common_rate(intel_dp, len - 1); in intel_dp_max_link_rate()
1122 int intel_dp_rate_select(struct intel_dp *intel_dp, int rate) in intel_dp_rate_select() argument
1124 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_dp_rate_select()
1125 int i = intel_dp_rate_index(intel_dp->sink_rates, in intel_dp_rate_select()
1126 intel_dp->num_sink_rates, rate); in intel_dp_rate_select()
1134 void intel_dp_compute_rate(struct intel_dp *intel_dp, int port_clock, in intel_dp_compute_rate() argument
1138 if (intel_dp->use_rate_select) { in intel_dp_compute_rate()
1141 intel_dp_rate_select(intel_dp, port_clock); in intel_dp_compute_rate()
1148 static bool intel_dp_source_supports_fec(struct intel_dp *intel_dp, in intel_dp_source_supports_fec() argument
1151 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); in intel_dp_source_supports_fec()
1163 static bool intel_dp_supports_fec(struct intel_dp *intel_dp, in intel_dp_supports_fec() argument
1166 return intel_dp_source_supports_fec(intel_dp, pipe_config) && in intel_dp_supports_fec()
1167 drm_dp_sink_supports_fec(intel_dp->fec_capable); in intel_dp_supports_fec()
1170 static bool intel_dp_supports_dsc(struct intel_dp *intel_dp, in intel_dp_supports_dsc() argument
1177 drm_dp_sink_supports_dsc(intel_dp->dsc_dpcd); in intel_dp_supports_dsc()
1180 static bool intel_dp_is_ycbcr420(struct intel_dp *intel_dp, in intel_dp_is_ycbcr420() argument
1185 intel_dp->dfp.ycbcr_444_to_420); in intel_dp_is_ycbcr420()
1188 static int intel_dp_hdmi_compute_bpc(struct intel_dp *intel_dp, in intel_dp_hdmi_compute_bpc() argument
1192 bool ycbcr420_output = intel_dp_is_ycbcr420(intel_dp, crtc_state); in intel_dp_hdmi_compute_bpc()
1212 intel_dp->has_hdmi_sink, ycbcr420_output) && in intel_dp_hdmi_compute_bpc()
1213 intel_dp_tmds_clock_valid(intel_dp, clock, bpc, ycbcr420_output, in intel_dp_hdmi_compute_bpc()
1221 static int intel_dp_max_bpp(struct intel_dp *intel_dp, in intel_dp_max_bpp() argument
1225 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); in intel_dp_max_bpp()
1226 struct intel_connector *intel_connector = intel_dp->attached_connector; in intel_dp_max_bpp()
1231 if (intel_dp->dfp.max_bpc) in intel_dp_max_bpp()
1232 bpc = min_t(int, bpc, intel_dp->dfp.max_bpc); in intel_dp_max_bpp()
1234 if (intel_dp->dfp.min_tmds_clock) { in intel_dp_max_bpp()
1237 max_hdmi_bpc = intel_dp_hdmi_compute_bpc(intel_dp, crtc_state, bpc, in intel_dp_max_bpp()
1246 if (intel_dp_is_edp(intel_dp)) { in intel_dp_max_bpp()
1263 intel_dp_adjust_compliance_config(struct intel_dp *intel_dp, in intel_dp_adjust_compliance_config() argument
1267 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_dp_adjust_compliance_config()
1270 if (intel_dp->compliance.test_data.bpc != 0) { in intel_dp_adjust_compliance_config()
1271 int bpp = 3 * intel_dp->compliance.test_data.bpc; in intel_dp_adjust_compliance_config()
1280 if (intel_dp->compliance.test_type == DP_TEST_LINK_TRAINING) { in intel_dp_adjust_compliance_config()
1286 if (intel_dp_link_params_valid(intel_dp, intel_dp->compliance.test_link_rate, in intel_dp_adjust_compliance_config()
1287 intel_dp->compliance.test_lane_count)) { in intel_dp_adjust_compliance_config()
1288 index = intel_dp_rate_index(intel_dp->common_rates, in intel_dp_adjust_compliance_config()
1289 intel_dp->num_common_rates, in intel_dp_adjust_compliance_config()
1290 intel_dp->compliance.test_link_rate); in intel_dp_adjust_compliance_config()
1293 intel_dp->compliance.test_link_rate; in intel_dp_adjust_compliance_config()
1295 intel_dp->compliance.test_lane_count; in intel_dp_adjust_compliance_config()
1327 intel_dp_compute_link_config_wide(struct intel_dp *intel_dp, in intel_dp_compute_link_config_wide() argument
1340 for (i = 0; i < intel_dp->num_common_rates; i++) { in intel_dp_compute_link_config_wide()
1341 link_rate = intel_dp_common_rate(intel_dp, i); in intel_dp_compute_link_config_wide()
1366 static int intel_dp_dsc_compute_bpp(struct intel_dp *intel_dp, u8 max_req_bpc) in intel_dp_dsc_compute_bpp() argument
1368 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_dp_dsc_compute_bpp()
1379 num_bpc = drm_dp_dsc_sink_supported_input_bpcs(intel_dp->dsc_dpcd, in intel_dp_dsc_compute_bpp()
1389 static int intel_dp_source_dsc_version_minor(struct intel_dp *intel_dp) in intel_dp_source_dsc_version_minor() argument
1391 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_dp_source_dsc_version_minor()
1396 static int intel_dp_sink_dsc_version_minor(struct intel_dp *intel_dp) in intel_dp_sink_dsc_version_minor() argument
1398 return (intel_dp->dsc_dpcd[DP_DSC_REV - DP_DSC_SUPPORT] & DP_DSC_MINOR_MASK) >> in intel_dp_sink_dsc_version_minor()
1406 struct intel_dp *intel_dp = enc_to_intel_dp(encoder); in intel_dp_dsc_compute_params() local
1437 (intel_dp->dsc_dpcd[DP_DSC_REV - DP_DSC_SUPPORT] & in intel_dp_dsc_compute_params()
1440 min(intel_dp_source_dsc_version_minor(intel_dp), in intel_dp_dsc_compute_params()
1441 intel_dp_sink_dsc_version_minor(intel_dp)); in intel_dp_dsc_compute_params()
1443 vdsc_cfg->convert_rgb = intel_dp->dsc_dpcd[DP_DSC_DEC_COLOR_FORMAT_CAP - DP_DSC_SUPPORT] & in intel_dp_dsc_compute_params()
1446 line_buf_depth = drm_dp_dsc_sink_line_buf_depth(intel_dp->dsc_dpcd); in intel_dp_dsc_compute_params()
1461 intel_dp->dsc_dpcd[DP_DSC_BLK_PREDICTION_SUPPORT - DP_DSC_SUPPORT] & in intel_dp_dsc_compute_params()
1467 static int intel_dp_dsc_compute_config(struct intel_dp *intel_dp, in intel_dp_dsc_compute_config() argument
1472 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); in intel_dp_dsc_compute_config()
1479 pipe_config->fec_enable = !intel_dp_is_edp(intel_dp) && in intel_dp_dsc_compute_config()
1480 intel_dp_supports_fec(intel_dp, pipe_config); in intel_dp_dsc_compute_config()
1482 if (!intel_dp_supports_dsc(intel_dp, pipe_config)) in intel_dp_dsc_compute_config()
1485 pipe_bpp = intel_dp_dsc_compute_bpp(intel_dp, conn_state->max_requested_bpc); in intel_dp_dsc_compute_config()
1487 if (intel_dp->force_dsc_bpc) { in intel_dp_dsc_compute_config()
1488 pipe_bpp = intel_dp->force_dsc_bpc * 3; in intel_dp_dsc_compute_config()
1508 if (intel_dp_is_edp(intel_dp)) { in intel_dp_dsc_compute_config()
1510 min_t(u16, drm_edp_dsc_sink_output_bpp(intel_dp->dsc_dpcd) >> 4, in intel_dp_dsc_compute_config()
1513 drm_dp_dsc_sink_max_slice_count(intel_dp->dsc_dpcd, in intel_dp_dsc_compute_config()
1528 intel_dp_dsc_get_slice_count(intel_dp, in intel_dp_dsc_compute_config()
1589 struct intel_dp *intel_dp = enc_to_intel_dp(encoder); in intel_dp_compute_link_config() local
1594 limits.min_rate = intel_dp_common_rate(intel_dp, 0); in intel_dp_compute_link_config()
1595 limits.max_rate = intel_dp_max_link_rate(intel_dp); in intel_dp_compute_link_config()
1598 limits.max_lane_count = intel_dp_max_lane_count(intel_dp); in intel_dp_compute_link_config()
1601 limits.max_bpp = intel_dp_max_bpp(intel_dp, pipe_config, respect_downstream_limits); in intel_dp_compute_link_config()
1603 if (intel_dp->use_max_params) { in intel_dp_compute_link_config()
1616 intel_dp_adjust_compliance_config(intel_dp, pipe_config, &limits); in intel_dp_compute_link_config()
1623 if (intel_dp_need_bigjoiner(intel_dp, adjusted_mode->crtc_hdisplay, in intel_dp_compute_link_config()
1638 ret = intel_dp_compute_link_config_wide(intel_dp, pipe_config, conn_state, &limits); in intel_dp_compute_link_config()
1640 if (ret || joiner_needs_dsc || intel_dp->force_dsc_en) { in intel_dp_compute_link_config()
1643 str_yes_no(intel_dp->force_dsc_en)); in intel_dp_compute_link_config()
1644 ret = intel_dp_dsc_compute_config(intel_dp, pipe_config, in intel_dp_compute_link_config()
1802 static void intel_dp_compute_vsc_sdp(struct intel_dp *intel_dp, in intel_dp_compute_vsc_sdp() argument
1821 void intel_dp_compute_psr_vsc_sdp(struct intel_dp *intel_dp, in intel_dp_compute_psr_vsc_sdp() argument
1829 if (intel_dp->psr.colorimetry_support && in intel_dp_compute_psr_vsc_sdp()
1856 intel_dp_compute_hdr_metadata_infoframe_sdp(struct intel_dp *intel_dp, in intel_dp_compute_hdr_metadata_infoframe_sdp() argument
1861 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); in intel_dp_compute_hdr_metadata_infoframe_sdp()
1958 struct intel_dp *intel_dp = enc_to_intel_dp(encoder); in intel_dp_has_audio() local
1966 return intel_dp->has_audio; in intel_dp_has_audio()
1978 struct intel_dp *intel_dp = enc_to_intel_dp(encoder); in intel_dp_compute_output_format() local
1979 struct intel_connector *connector = intel_dp->attached_connector; in intel_dp_compute_output_format()
1989 if (ycbcr_420_only && !intel_dp_is_ycbcr420(intel_dp, crtc_state)) { in intel_dp_compute_output_format()
1998 if (intel_dp_is_ycbcr420(intel_dp, crtc_state) || in intel_dp_compute_output_format()
2018 struct intel_dp *intel_dp = enc_to_intel_dp(encoder); in intel_dp_compute_config() local
2020 struct intel_connector *connector = intel_dp->attached_connector; in intel_dp_compute_config()
2029 if (intel_dp_is_edp(intel_dp) && fixed_mode) { in intel_dp_compute_config()
2058 if ((intel_dp_is_edp(intel_dp) && fixed_mode) || in intel_dp_compute_config()
2074 if (intel_dp->mso_link_count) { in intel_dp_compute_config()
2075 int n = intel_dp->mso_link_count; in intel_dp_compute_config()
2076 int overlap = intel_dp->mso_pixel_overlap; in intel_dp_compute_config()
2109 intel_psr_compute_config(intel_dp, pipe_config, conn_state); in intel_dp_compute_config()
2111 intel_dp_compute_vsc_sdp(intel_dp, pipe_config, conn_state); in intel_dp_compute_config()
2112 intel_dp_compute_hdr_metadata_infoframe_sdp(intel_dp, pipe_config, conn_state); in intel_dp_compute_config()
2117 void intel_dp_set_link_params(struct intel_dp *intel_dp, in intel_dp_set_link_params() argument
2120 memset(intel_dp->train_set, 0, sizeof(intel_dp->train_set)); in intel_dp_set_link_params()
2121 intel_dp->link_trained = false; in intel_dp_set_link_params()
2122 intel_dp->link_rate = link_rate; in intel_dp_set_link_params()
2123 intel_dp->lane_count = lane_count; in intel_dp_set_link_params()
2126 static void intel_dp_reset_max_link_params(struct intel_dp *intel_dp) in intel_dp_reset_max_link_params() argument
2128 intel_dp->max_link_lane_count = intel_dp_max_common_lane_count(intel_dp); in intel_dp_reset_max_link_params()
2129 intel_dp->max_link_rate = intel_dp_max_common_rate(intel_dp); in intel_dp_reset_max_link_params()
2136 struct intel_dp *intel_dp = enc_to_intel_dp(to_intel_encoder(conn_state->best_encoder)); in intel_edp_backlight_on() local
2137 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_edp_backlight_on()
2139 if (!intel_dp_is_edp(intel_dp)) in intel_edp_backlight_on()
2145 intel_pps_backlight_on(intel_dp); in intel_edp_backlight_on()
2151 struct intel_dp *intel_dp = enc_to_intel_dp(to_intel_encoder(old_conn_state->best_encoder)); in intel_edp_backlight_off() local
2152 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_edp_backlight_off()
2154 if (!intel_dp_is_edp(intel_dp)) in intel_edp_backlight_off()
2159 intel_pps_backlight_off(intel_dp); in intel_edp_backlight_off()
2163 static bool downstream_hpd_needs_d0(struct intel_dp *intel_dp) in downstream_hpd_needs_d0() argument
2173 return intel_dp->dpcd[DP_DPCD_REV] == 0x11 && in downstream_hpd_needs_d0()
2174 drm_dp_is_branch(intel_dp->dpcd) && in downstream_hpd_needs_d0()
2175 intel_dp->downstream_ports[0] & DP_DS_PORT_HPD; in downstream_hpd_needs_d0()
2178 void intel_dp_sink_set_decompression_state(struct intel_dp *intel_dp, in intel_dp_sink_set_decompression_state() argument
2182 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_dp_sink_set_decompression_state()
2188 ret = drm_dp_dpcd_writeb(&intel_dp->aux, DP_DSC_ENABLE, in intel_dp_sink_set_decompression_state()
2197 intel_edp_init_source_oui(struct intel_dp *intel_dp, bool careful) in intel_edp_init_source_oui() argument
2199 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_edp_init_source_oui()
2208 if (drm_dp_dpcd_read(&intel_dp->aux, DP_SOURCE_OUI, buf, sizeof(buf)) < 0) in intel_edp_init_source_oui()
2215 if (drm_dp_dpcd_write(&intel_dp->aux, DP_SOURCE_OUI, oui, sizeof(oui)) < 0) in intel_edp_init_source_oui()
2218 intel_dp->last_oui_write = jiffies; in intel_edp_init_source_oui()
2221 void intel_dp_wait_source_oui(struct intel_dp *intel_dp) in intel_dp_wait_source_oui() argument
2223 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_dp_wait_source_oui()
2226 wait_remaining_ms_from_jiffies(intel_dp->last_oui_write, 30); in intel_dp_wait_source_oui()
2230 void intel_dp_set_power(struct intel_dp *intel_dp, u8 mode) in intel_dp_set_power() argument
2232 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; in intel_dp_set_power()
2237 if (intel_dp->dpcd[DP_DPCD_REV] < 0x11) in intel_dp_set_power()
2241 if (downstream_hpd_needs_d0(intel_dp)) in intel_dp_set_power()
2244 ret = drm_dp_dpcd_writeb(&intel_dp->aux, DP_SET_POWER, mode); in intel_dp_set_power()
2246 struct intel_lspcon *lspcon = dp_to_lspcon(intel_dp); in intel_dp_set_power()
2248 lspcon_resume(dp_to_dig_port(intel_dp)); in intel_dp_set_power()
2251 if (intel_dp_is_edp(intel_dp)) in intel_dp_set_power()
2252 intel_edp_init_source_oui(intel_dp, false); in intel_dp_set_power()
2259 ret = drm_dp_dpcd_writeb(&intel_dp->aux, DP_SET_POWER, mode); in intel_dp_set_power()
2276 intel_dp_get_dpcd(struct intel_dp *intel_dp);
2289 struct intel_dp *intel_dp = enc_to_intel_dp(encoder); in intel_dp_sync_state() local
2298 if (intel_dp->dpcd[DP_DPCD_REV] == 0) in intel_dp_sync_state()
2299 intel_dp_get_dpcd(intel_dp); in intel_dp_sync_state()
2301 intel_dp_reset_max_link_params(intel_dp); in intel_dp_sync_state()
2308 struct intel_dp *intel_dp = enc_to_intel_dp(encoder); in intel_dp_initial_fastset_check() local
2314 if (intel_dp_rate_index(intel_dp->source_rates, intel_dp->num_source_rates, in intel_dp_initial_fastset_check()
2334 if (CAN_PSR(intel_dp)) { in intel_dp_initial_fastset_check()
2343 static void intel_dp_get_pcon_dsc_cap(struct intel_dp *intel_dp) in intel_dp_get_pcon_dsc_cap() argument
2345 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_dp_get_pcon_dsc_cap()
2349 memset(intel_dp->pcon_dsc_dpcd, 0, sizeof(intel_dp->pcon_dsc_dpcd)); in intel_dp_get_pcon_dsc_cap()
2351 if (drm_dp_dpcd_read(&intel_dp->aux, DP_PCON_DSC_ENCODER, in intel_dp_get_pcon_dsc_cap()
2352 intel_dp->pcon_dsc_dpcd, in intel_dp_get_pcon_dsc_cap()
2353 sizeof(intel_dp->pcon_dsc_dpcd)) < 0) in intel_dp_get_pcon_dsc_cap()
2358 (int)sizeof(intel_dp->pcon_dsc_dpcd), intel_dp->pcon_dsc_dpcd); in intel_dp_get_pcon_dsc_cap()
2393 static int intel_dp_hdmi_sink_max_frl(struct intel_dp *intel_dp) in intel_dp_hdmi_sink_max_frl() argument
2395 struct intel_connector *intel_connector = intel_dp->attached_connector; in intel_dp_hdmi_sink_max_frl()
2416 intel_dp_pcon_is_frl_trained(struct intel_dp *intel_dp, in intel_dp_pcon_is_frl_trained() argument
2419 if (drm_dp_pcon_hdmi_link_active(&intel_dp->aux) && in intel_dp_pcon_is_frl_trained()
2420 drm_dp_pcon_hdmi_link_mode(&intel_dp->aux, frl_trained_mask) == DP_PCON_HDMI_MODE_FRL && in intel_dp_pcon_is_frl_trained()
2427 static int intel_dp_pcon_start_frl_training(struct intel_dp *intel_dp) in intel_dp_pcon_start_frl_training() argument
2432 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_dp_pcon_start_frl_training()
2437 max_pcon_frl_bw = intel_dp->dfp.pcon_max_frl_bw; in intel_dp_pcon_start_frl_training()
2440 max_edid_frl_bw = intel_dp_hdmi_sink_max_frl(intel_dp); in intel_dp_pcon_start_frl_training()
2451 if (intel_dp_pcon_is_frl_trained(intel_dp, max_frl_bw_mask, &frl_trained_mask)) in intel_dp_pcon_start_frl_training()
2454 ret = drm_dp_pcon_frl_prepare(&intel_dp->aux, false); in intel_dp_pcon_start_frl_training()
2458 wait_for(is_active = drm_dp_pcon_is_frl_ready(&intel_dp->aux) == true, TIMEOUT_FRL_READY_MS); in intel_dp_pcon_start_frl_training()
2463 ret = drm_dp_pcon_frl_configure_1(&intel_dp->aux, max_frl_bw, in intel_dp_pcon_start_frl_training()
2467 ret = drm_dp_pcon_frl_configure_2(&intel_dp->aux, max_frl_bw_mask, in intel_dp_pcon_start_frl_training()
2471 ret = drm_dp_pcon_frl_enable(&intel_dp->aux); in intel_dp_pcon_start_frl_training()
2479 intel_dp_pcon_is_frl_trained(intel_dp, max_frl_bw_mask, &frl_trained_mask), in intel_dp_pcon_start_frl_training()
2487 intel_dp->frl.trained_rate_gbps = intel_dp_pcon_get_frl_mask(frl_trained_mask); in intel_dp_pcon_start_frl_training()
2488 intel_dp->frl.is_trained = true; in intel_dp_pcon_start_frl_training()
2489 drm_dbg(&i915->drm, "FRL trained with : %d Gbps\n", intel_dp->frl.trained_rate_gbps); in intel_dp_pcon_start_frl_training()
2494 static bool intel_dp_is_hdmi_2_1_sink(struct intel_dp *intel_dp) in intel_dp_is_hdmi_2_1_sink() argument
2496 if (drm_dp_is_branch(intel_dp->dpcd) && in intel_dp_is_hdmi_2_1_sink()
2497 intel_dp->has_hdmi_sink && in intel_dp_is_hdmi_2_1_sink()
2498 intel_dp_hdmi_sink_max_frl(intel_dp) > 0) in intel_dp_is_hdmi_2_1_sink()
2505 int intel_dp_pcon_set_tmds_mode(struct intel_dp *intel_dp) in intel_dp_pcon_set_tmds_mode() argument
2513 ret = drm_dp_dpcd_writeb(&intel_dp->aux, DP_PCON_HDMI_LINK_CONFIG_1, buf); in intel_dp_pcon_set_tmds_mode()
2519 ret = drm_dp_dpcd_writeb(&intel_dp->aux, DP_PCON_HDMI_LINK_CONFIG_1, buf); in intel_dp_pcon_set_tmds_mode()
2526 void intel_dp_check_frl_training(struct intel_dp *intel_dp) in intel_dp_check_frl_training() argument
2528 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); in intel_dp_check_frl_training()
2535 if (!(intel_dp->downstream_ports[2] & DP_PCON_SOURCE_CTL_MODE) || in intel_dp_check_frl_training()
2536 !intel_dp_is_hdmi_2_1_sink(intel_dp) || in intel_dp_check_frl_training()
2537 intel_dp->frl.is_trained) in intel_dp_check_frl_training()
2540 if (intel_dp_pcon_start_frl_training(intel_dp) < 0) { in intel_dp_check_frl_training()
2544 ret = intel_dp_pcon_set_tmds_mode(intel_dp); in intel_dp_check_frl_training()
2545 mode = drm_dp_pcon_hdmi_link_mode(&intel_dp->aux, NULL); in intel_dp_check_frl_training()
2563 intel_dp_pcon_dsc_enc_slices(struct intel_dp *intel_dp, in intel_dp_pcon_dsc_enc_slices() argument
2566 struct intel_connector *intel_connector = intel_dp->attached_connector; in intel_dp_pcon_dsc_enc_slices()
2570 int pcon_max_slices = drm_dp_pcon_dsc_max_slices(intel_dp->pcon_dsc_dpcd); in intel_dp_pcon_dsc_enc_slices()
2571 int pcon_max_slice_width = drm_dp_pcon_dsc_max_slice_width(intel_dp->pcon_dsc_dpcd); in intel_dp_pcon_dsc_enc_slices()
2579 intel_dp_pcon_dsc_enc_bpp(struct intel_dp *intel_dp, in intel_dp_pcon_dsc_enc_bpp() argument
2583 struct intel_connector *intel_connector = intel_dp->attached_connector; in intel_dp_pcon_dsc_enc_bpp()
2587 int pcon_fractional_bpp = drm_dp_pcon_dsc_bpp_incr(intel_dp->pcon_dsc_dpcd); in intel_dp_pcon_dsc_enc_bpp()
2597 intel_dp_pcon_dsc_configure(struct intel_dp *intel_dp, in intel_dp_pcon_dsc_configure() argument
2606 struct intel_connector *intel_connector = intel_dp->attached_connector; in intel_dp_pcon_dsc_configure()
2607 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_dp_pcon_dsc_configure()
2611 if (!intel_dp_is_hdmi_2_1_sink(intel_dp)) in intel_dp_pcon_dsc_configure()
2619 if (!drm_dp_pcon_enc_is_dsc_1_2(intel_dp->pcon_dsc_dpcd) || in intel_dp_pcon_dsc_configure()
2627 num_slices = intel_dp_pcon_dsc_enc_slices(intel_dp, crtc_state); in intel_dp_pcon_dsc_configure()
2634 bits_per_pixel = intel_dp_pcon_dsc_enc_bpp(intel_dp, crtc_state, in intel_dp_pcon_dsc_configure()
2646 ret = drm_dp_pcon_pps_override_param(&intel_dp->aux, pps_param); in intel_dp_pcon_dsc_configure()
2651 void intel_dp_configure_protocol_converter(struct intel_dp *intel_dp, in intel_dp_configure_protocol_converter() argument
2654 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_dp_configure_protocol_converter()
2657 if (intel_dp->dpcd[DP_DPCD_REV] < 0x13) in intel_dp_configure_protocol_converter()
2660 if (!drm_dp_is_branch(intel_dp->dpcd)) in intel_dp_configure_protocol_converter()
2663 tmp = intel_dp->has_hdmi_sink ? in intel_dp_configure_protocol_converter()
2666 if (drm_dp_dpcd_writeb(&intel_dp->aux, in intel_dp_configure_protocol_converter()
2669 str_enable_disable(intel_dp->has_hdmi_sink)); in intel_dp_configure_protocol_converter()
2672 intel_dp->dfp.ycbcr_444_to_420 ? DP_CONVERSION_TO_YCBCR420_ENABLE : 0; in intel_dp_configure_protocol_converter()
2674 if (drm_dp_dpcd_writeb(&intel_dp->aux, in intel_dp_configure_protocol_converter()
2678 str_enable_disable(intel_dp->dfp.ycbcr_444_to_420)); in intel_dp_configure_protocol_converter()
2680 tmp = intel_dp->dfp.rgb_to_ycbcr ? in intel_dp_configure_protocol_converter()
2683 if (drm_dp_pcon_convert_rgb_to_ycbcr(&intel_dp->aux, tmp) < 0) in intel_dp_configure_protocol_converter()
2690 bool intel_dp_get_colorimetry_status(struct intel_dp *intel_dp) in intel_dp_get_colorimetry_status() argument
2694 if (drm_dp_dpcd_readb(&intel_dp->aux, DP_DPRX_FEATURE_ENUMERATION_LIST, in intel_dp_get_colorimetry_status()
2700 static void intel_dp_get_dsc_sink_cap(struct intel_dp *intel_dp) in intel_dp_get_dsc_sink_cap() argument
2702 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_dp_get_dsc_sink_cap()
2708 memset(intel_dp->dsc_dpcd, 0, sizeof(intel_dp->dsc_dpcd)); in intel_dp_get_dsc_sink_cap()
2711 intel_dp->fec_capable = 0; in intel_dp_get_dsc_sink_cap()
2714 if (intel_dp->dpcd[DP_DPCD_REV] >= 0x14 || in intel_dp_get_dsc_sink_cap()
2715 intel_dp->edp_dpcd[0] >= DP_EDP_14) { in intel_dp_get_dsc_sink_cap()
2716 if (drm_dp_dpcd_read(&intel_dp->aux, DP_DSC_SUPPORT, in intel_dp_get_dsc_sink_cap()
2717 intel_dp->dsc_dpcd, in intel_dp_get_dsc_sink_cap()
2718 sizeof(intel_dp->dsc_dpcd)) < 0) in intel_dp_get_dsc_sink_cap()
2724 (int)sizeof(intel_dp->dsc_dpcd), in intel_dp_get_dsc_sink_cap()
2725 intel_dp->dsc_dpcd); in intel_dp_get_dsc_sink_cap()
2728 if (!intel_dp_is_edp(intel_dp) && in intel_dp_get_dsc_sink_cap()
2729 drm_dp_dpcd_readb(&intel_dp->aux, DP_FEC_CAPABILITY, in intel_dp_get_dsc_sink_cap()
2730 &intel_dp->fec_capable) < 0) in intel_dp_get_dsc_sink_cap()
2735 intel_dp->fec_capable); in intel_dp_get_dsc_sink_cap()
2742 struct intel_dp *intel_dp = intel_attached_dp(connector); in intel_edp_mso_mode_fixup() local
2744 int n = intel_dp->mso_link_count; in intel_edp_mso_mode_fixup()
2745 int overlap = intel_dp->mso_pixel_overlap; in intel_edp_mso_mode_fixup()
2767 struct intel_dp *intel_dp = enc_to_intel_dp(encoder); in intel_edp_fixup_vbt_bpp() local
2768 struct intel_connector *connector = intel_dp->attached_connector; in intel_edp_fixup_vbt_bpp()
2791 static void intel_edp_mso_init(struct intel_dp *intel_dp) in intel_edp_mso_init() argument
2793 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_edp_mso_init()
2794 struct intel_connector *connector = intel_dp->attached_connector; in intel_edp_mso_init()
2798 if (intel_dp->edp_dpcd[0] < DP_EDP_14) in intel_edp_mso_init()
2801 if (drm_dp_dpcd_readb(&intel_dp->aux, DP_EDP_MSO_LINK_CAPABILITIES, &mso) != 1) { in intel_edp_mso_init()
2808 if (mso % 2 || mso > drm_dp_max_lane_count(intel_dp->dpcd)) { in intel_edp_mso_init()
2815 mso, drm_dp_max_lane_count(intel_dp->dpcd) / mso, in intel_edp_mso_init()
2823 intel_dp->mso_link_count = mso; in intel_edp_mso_init()
2824 intel_dp->mso_pixel_overlap = mso ? info->mso_pixel_overlap : 0; in intel_edp_mso_init()
2828 intel_edp_init_dpcd(struct intel_dp *intel_dp) in intel_edp_init_dpcd() argument
2831 to_i915(dp_to_dig_port(intel_dp)->base.base.dev); in intel_edp_init_dpcd()
2834 drm_WARN_ON(&dev_priv->drm, intel_dp->dpcd[DP_DPCD_REV] != 0); in intel_edp_init_dpcd()
2836 if (drm_dp_read_dpcd_caps(&intel_dp->aux, intel_dp->dpcd) != 0) in intel_edp_init_dpcd()
2839 drm_dp_read_desc(&intel_dp->aux, &intel_dp->desc, in intel_edp_init_dpcd()
2840 drm_dp_is_branch(intel_dp->dpcd)); in intel_edp_init_dpcd()
2851 if (drm_dp_dpcd_read(&intel_dp->aux, DP_EDP_DPCD_REV, in intel_edp_init_dpcd()
2852 intel_dp->edp_dpcd, sizeof(intel_dp->edp_dpcd)) == in intel_edp_init_dpcd()
2853 sizeof(intel_dp->edp_dpcd)) { in intel_edp_init_dpcd()
2855 (int)sizeof(intel_dp->edp_dpcd), in intel_edp_init_dpcd()
2856 intel_dp->edp_dpcd); in intel_edp_init_dpcd()
2858 intel_dp->use_max_params = intel_dp->edp_dpcd[0] < DP_EDP_14; in intel_edp_init_dpcd()
2865 intel_psr_init_dpcd(intel_dp); in intel_edp_init_dpcd()
2868 intel_dp->num_sink_rates = 0; in intel_edp_init_dpcd()
2871 if (intel_dp->edp_dpcd[0] >= DP_EDP_14) { in intel_edp_init_dpcd()
2875 drm_dp_dpcd_read(&intel_dp->aux, DP_SUPPORTED_LINK_RATES, in intel_edp_init_dpcd()
2890 intel_dp->sink_rates[i] = (val * 200) / 10; in intel_edp_init_dpcd()
2892 intel_dp->num_sink_rates = i; in intel_edp_init_dpcd()
2899 if (intel_dp->num_sink_rates) in intel_edp_init_dpcd()
2900 intel_dp->use_rate_select = true; in intel_edp_init_dpcd()
2902 intel_dp_set_sink_rates(intel_dp); in intel_edp_init_dpcd()
2903 intel_dp_set_max_sink_lane_count(intel_dp); in intel_edp_init_dpcd()
2907 intel_dp_get_dsc_sink_cap(intel_dp); in intel_edp_init_dpcd()
2913 intel_edp_init_source_oui(intel_dp, true); in intel_edp_init_dpcd()
2919 intel_dp_has_sink_count(struct intel_dp *intel_dp) in intel_dp_has_sink_count() argument
2921 if (!intel_dp->attached_connector) in intel_dp_has_sink_count()
2924 return drm_dp_read_sink_count_cap(&intel_dp->attached_connector->base, in intel_dp_has_sink_count()
2925 intel_dp->dpcd, in intel_dp_has_sink_count()
2926 &intel_dp->desc); in intel_dp_has_sink_count()
2930 intel_dp_get_dpcd(struct intel_dp *intel_dp) in intel_dp_get_dpcd() argument
2934 if (intel_dp_init_lttpr_and_dprx_caps(intel_dp) < 0) in intel_dp_get_dpcd()
2941 if (!intel_dp_is_edp(intel_dp)) { in intel_dp_get_dpcd()
2942 drm_dp_read_desc(&intel_dp->aux, &intel_dp->desc, in intel_dp_get_dpcd()
2943 drm_dp_is_branch(intel_dp->dpcd)); in intel_dp_get_dpcd()
2945 intel_dp_set_sink_rates(intel_dp); in intel_dp_get_dpcd()
2946 intel_dp_set_max_sink_lane_count(intel_dp); in intel_dp_get_dpcd()
2947 intel_dp_set_common_rates(intel_dp); in intel_dp_get_dpcd()
2950 if (intel_dp_has_sink_count(intel_dp)) { in intel_dp_get_dpcd()
2951 ret = drm_dp_read_sink_count(&intel_dp->aux); in intel_dp_get_dpcd()
2960 intel_dp->sink_count = ret; in intel_dp_get_dpcd()
2969 if (!intel_dp->sink_count) in intel_dp_get_dpcd()
2973 return drm_dp_read_downstream_info(&intel_dp->aux, intel_dp->dpcd, in intel_dp_get_dpcd()
2974 intel_dp->downstream_ports) == 0; in intel_dp_get_dpcd()
2978 intel_dp_can_mst(struct intel_dp *intel_dp) in intel_dp_can_mst() argument
2980 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_dp_can_mst()
2983 intel_dp_mst_source_support(intel_dp) && in intel_dp_can_mst()
2984 drm_dp_read_mst_cap(&intel_dp->aux, intel_dp->dpcd); in intel_dp_can_mst()
2988 intel_dp_configure_mst(struct intel_dp *intel_dp) in intel_dp_configure_mst() argument
2990 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_dp_configure_mst()
2992 &dp_to_dig_port(intel_dp)->base; in intel_dp_configure_mst()
2993 bool sink_can_mst = drm_dp_read_mst_cap(&intel_dp->aux, intel_dp->dpcd); in intel_dp_configure_mst()
2998 str_yes_no(intel_dp_mst_source_support(intel_dp)), in intel_dp_configure_mst()
3002 if (!intel_dp_mst_source_support(intel_dp)) in intel_dp_configure_mst()
3005 intel_dp->is_mst = sink_can_mst && in intel_dp_configure_mst()
3008 drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr, in intel_dp_configure_mst()
3009 intel_dp->is_mst); in intel_dp_configure_mst()
3013 intel_dp_get_sink_irq_esi(struct intel_dp *intel_dp, u8 *esi) in intel_dp_get_sink_irq_esi() argument
3015 return drm_dp_dpcd_read(&intel_dp->aux, DP_SINK_COUNT_ESI, esi, 4) == 4; in intel_dp_get_sink_irq_esi()
3018 static bool intel_dp_ack_sink_irq_esi(struct intel_dp *intel_dp, u8 esi[4]) in intel_dp_ack_sink_irq_esi() argument
3023 if (drm_dp_dpcd_write(&intel_dp->aux, DP_SINK_COUNT_ESI + 1, in intel_dp_ack_sink_irq_esi()
3464 static u8 intel_dp_autotest_link_training(struct intel_dp *intel_dp) in intel_dp_autotest_link_training() argument
3466 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_dp_autotest_link_training()
3474 status = drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_LANE_COUNT, in intel_dp_autotest_link_training()
3483 status = drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_LINK_RATE, in intel_dp_autotest_link_training()
3492 if (!intel_dp_link_params_valid(intel_dp, test_link_rate, in intel_dp_autotest_link_training()
3496 intel_dp->compliance.test_lane_count = test_lane_count; in intel_dp_autotest_link_training()
3497 intel_dp->compliance.test_link_rate = test_link_rate; in intel_dp_autotest_link_training()
3502 static u8 intel_dp_autotest_video_pattern(struct intel_dp *intel_dp) in intel_dp_autotest_video_pattern() argument
3504 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_dp_autotest_video_pattern()
3511 status = drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_PATTERN, in intel_dp_autotest_video_pattern()
3520 status = drm_dp_dpcd_read(&intel_dp->aux, DP_TEST_H_WIDTH_HI, in intel_dp_autotest_video_pattern()
3527 status = drm_dp_dpcd_read(&intel_dp->aux, DP_TEST_V_HEIGHT_HI, in intel_dp_autotest_video_pattern()
3534 status = drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_MISC0, in intel_dp_autotest_video_pattern()
3546 intel_dp->compliance.test_data.bpc = 6; in intel_dp_autotest_video_pattern()
3549 intel_dp->compliance.test_data.bpc = 8; in intel_dp_autotest_video_pattern()
3555 intel_dp->compliance.test_data.video_pattern = test_pattern; in intel_dp_autotest_video_pattern()
3556 intel_dp->compliance.test_data.hdisplay = be16_to_cpu(h_width); in intel_dp_autotest_video_pattern()
3557 intel_dp->compliance.test_data.vdisplay = be16_to_cpu(v_height); in intel_dp_autotest_video_pattern()
3559 intel_dp->compliance.test_active = true; in intel_dp_autotest_video_pattern()
3564 static u8 intel_dp_autotest_edid(struct intel_dp *intel_dp) in intel_dp_autotest_edid() argument
3566 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_dp_autotest_edid()
3568 struct intel_connector *intel_connector = intel_dp->attached_connector; in intel_dp_autotest_edid()
3573 intel_dp->aux.i2c_defer_count > 6) { in intel_dp_autotest_edid()
3581 if (intel_dp->aux.i2c_nack_count > 0 || in intel_dp_autotest_edid()
3582 intel_dp->aux.i2c_defer_count > 0) in intel_dp_autotest_edid()
3585 intel_dp->aux.i2c_nack_count, in intel_dp_autotest_edid()
3586 intel_dp->aux.i2c_defer_count); in intel_dp_autotest_edid()
3587 intel_dp->compliance.test_data.edid = INTEL_DP_RESOLUTION_FAILSAFE; in intel_dp_autotest_edid()
3596 if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_EDID_CHECKSUM, in intel_dp_autotest_edid()
3602 intel_dp->compliance.test_data.edid = INTEL_DP_RESOLUTION_PREFERRED; in intel_dp_autotest_edid()
3606 intel_dp->compliance.test_active = true; in intel_dp_autotest_edid()
3611 static void intel_dp_phy_pattern_update(struct intel_dp *intel_dp, in intel_dp_phy_pattern_update() argument
3615 to_i915(dp_to_dig_port(intel_dp)->base.base.dev); in intel_dp_phy_pattern_update()
3617 &intel_dp->compliance.test_data.phytest; in intel_dp_phy_pattern_update()
3679 intel_dp_autotest_phy_ddi_disable(struct intel_dp *intel_dp, in intel_dp_autotest_phy_ddi_disable() argument
3682 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); in intel_dp_autotest_phy_ddi_disable()
3706 intel_dp_autotest_phy_ddi_enable(struct intel_dp *intel_dp, in intel_dp_autotest_phy_ddi_enable() argument
3709 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); in intel_dp_autotest_phy_ddi_enable()
3733 static void intel_dp_process_phy_request(struct intel_dp *intel_dp, in intel_dp_process_phy_request() argument
3736 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_dp_process_phy_request()
3738 &intel_dp->compliance.test_data.phytest; in intel_dp_process_phy_request()
3741 if (drm_dp_dpcd_read_phy_link_status(&intel_dp->aux, DP_PHY_DPRX, in intel_dp_process_phy_request()
3748 intel_dp_get_adjust_train(intel_dp, crtc_state, DP_PHY_DPRX, in intel_dp_process_phy_request()
3751 intel_dp_autotest_phy_ddi_disable(intel_dp, crtc_state); in intel_dp_process_phy_request()
3753 intel_dp_set_signal_levels(intel_dp, crtc_state, DP_PHY_DPRX); in intel_dp_process_phy_request()
3755 intel_dp_phy_pattern_update(intel_dp, crtc_state); in intel_dp_process_phy_request()
3757 intel_dp_autotest_phy_ddi_enable(intel_dp, crtc_state); in intel_dp_process_phy_request()
3759 drm_dp_dpcd_write(&intel_dp->aux, DP_TRAINING_LANE0_SET, in intel_dp_process_phy_request()
3760 intel_dp->train_set, crtc_state->lane_count); in intel_dp_process_phy_request()
3762 drm_dp_set_phy_test_pattern(&intel_dp->aux, data, in intel_dp_process_phy_request()
3766 static u8 intel_dp_autotest_phy_pattern(struct intel_dp *intel_dp) in intel_dp_autotest_phy_pattern() argument
3768 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_dp_autotest_phy_pattern()
3770 &intel_dp->compliance.test_data.phytest; in intel_dp_autotest_phy_pattern()
3772 if (drm_dp_get_phy_test_pattern(&intel_dp->aux, data)) { in intel_dp_autotest_phy_pattern()
3778 intel_dp->compliance.test_active = true; in intel_dp_autotest_phy_pattern()
3783 static void intel_dp_handle_test_request(struct intel_dp *intel_dp) in intel_dp_handle_test_request() argument
3785 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_dp_handle_test_request()
3790 status = drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_REQUEST, &request); in intel_dp_handle_test_request()
3800 response = intel_dp_autotest_link_training(intel_dp); in intel_dp_handle_test_request()
3804 response = intel_dp_autotest_video_pattern(intel_dp); in intel_dp_handle_test_request()
3808 response = intel_dp_autotest_edid(intel_dp); in intel_dp_handle_test_request()
3812 response = intel_dp_autotest_phy_pattern(intel_dp); in intel_dp_handle_test_request()
3821 intel_dp->compliance.test_type = request; in intel_dp_handle_test_request()
3824 status = drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_RESPONSE, response); in intel_dp_handle_test_request()
3830 static bool intel_dp_link_ok(struct intel_dp *intel_dp, in intel_dp_link_ok() argument
3833 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; in intel_dp_link_ok()
3835 bool uhbr = intel_dp->link_rate >= 1000000; in intel_dp_link_ok()
3840 intel_dp->lane_count); in intel_dp_link_ok()
3842 ok = drm_dp_channel_eq_ok(link_status, intel_dp->lane_count); in intel_dp_link_ok()
3847 intel_dp_dump_link_status(intel_dp, DP_PHY_DPRX, link_status); in intel_dp_link_ok()
3857 intel_dp_mst_hpd_irq(struct intel_dp *intel_dp, u8 *esi, u8 *ack) in intel_dp_mst_hpd_irq() argument
3861 drm_dp_mst_hpd_irq(&intel_dp->mst_mgr, esi, &handled); in intel_dp_mst_hpd_irq()
3866 intel_hdcp_handle_cp_irq(intel_dp->attached_connector); in intel_dp_mst_hpd_irq()
3871 static bool intel_dp_mst_link_status(struct intel_dp *intel_dp) in intel_dp_mst_link_status() argument
3873 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; in intel_dp_mst_link_status()
3878 if (drm_dp_dpcd_read(&intel_dp->aux, DP_LANE0_1_STATUS_ESI, link_status, in intel_dp_mst_link_status()
3886 return intel_dp_link_ok(intel_dp, link_status); in intel_dp_mst_link_status()
3903 intel_dp_check_mst_status(struct intel_dp *intel_dp) in intel_dp_check_mst_status() argument
3905 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_dp_check_mst_status()
3908 drm_WARN_ON_ONCE(&i915->drm, intel_dp->active_mst_links < 0); in intel_dp_check_mst_status()
3914 if (!intel_dp_get_sink_irq_esi(intel_dp, esi)) { in intel_dp_check_mst_status()
3924 if (intel_dp->active_mst_links > 0 && link_ok && in intel_dp_check_mst_status()
3926 if (!intel_dp_mst_link_status(intel_dp)) in intel_dp_check_mst_status()
3931 intel_dp_mst_hpd_irq(intel_dp, esi, ack); in intel_dp_check_mst_status()
3936 if (!intel_dp_ack_sink_irq_esi(intel_dp, ack)) in intel_dp_check_mst_status()
3944 intel_dp_handle_hdmi_link_status_change(struct intel_dp *intel_dp) in intel_dp_handle_hdmi_link_status_change() argument
3949 is_active = drm_dp_pcon_hdmi_link_active(&intel_dp->aux); in intel_dp_handle_hdmi_link_status_change()
3950 if (intel_dp->frl.is_trained && !is_active) { in intel_dp_handle_hdmi_link_status_change()
3951 if (drm_dp_dpcd_readb(&intel_dp->aux, DP_PCON_HDMI_LINK_CONFIG_1, &buf) < 0) in intel_dp_handle_hdmi_link_status_change()
3955 if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_PCON_HDMI_LINK_CONFIG_1, buf) < 0) in intel_dp_handle_hdmi_link_status_change()
3958 drm_dp_pcon_hdmi_frl_link_error_count(&intel_dp->aux, &intel_dp->attached_connector->base); in intel_dp_handle_hdmi_link_status_change()
3960 intel_dp->frl.is_trained = false; in intel_dp_handle_hdmi_link_status_change()
3963 intel_dp_check_frl_training(intel_dp); in intel_dp_handle_hdmi_link_status_change()
3968 intel_dp_needs_link_retrain(struct intel_dp *intel_dp) in intel_dp_needs_link_retrain() argument
3972 if (!intel_dp->link_trained) in intel_dp_needs_link_retrain()
3983 if (intel_psr_enabled(intel_dp)) in intel_dp_needs_link_retrain()
3986 if (drm_dp_dpcd_read_phy_link_status(&intel_dp->aux, DP_PHY_DPRX, in intel_dp_needs_link_retrain()
3998 if (!intel_dp_link_params_valid(intel_dp, intel_dp->link_rate, in intel_dp_needs_link_retrain()
3999 intel_dp->lane_count)) in intel_dp_needs_link_retrain()
4003 return !intel_dp_link_ok(intel_dp, link_status); in intel_dp_needs_link_retrain()
4006 static bool intel_dp_has_connector(struct intel_dp *intel_dp, in intel_dp_has_connector() argument
4009 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_dp_has_connector()
4017 encoder = &dp_to_dig_port(intel_dp)->base; in intel_dp_has_connector()
4023 encoder = &intel_dp->mst_encoders[pipe]->base; in intel_dp_has_connector()
4031 static int intel_dp_prep_link_retrain(struct intel_dp *intel_dp, in intel_dp_prep_link_retrain() argument
4035 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_dp_prep_link_retrain()
4042 if (!intel_dp_needs_link_retrain(intel_dp)) in intel_dp_prep_link_retrain()
4052 if (!intel_dp_has_connector(intel_dp, conn_state)) in intel_dp_prep_link_retrain()
4078 if (!intel_dp_needs_link_retrain(intel_dp)) in intel_dp_prep_link_retrain()
4084 static bool intel_dp_is_connected(struct intel_dp *intel_dp) in intel_dp_is_connected() argument
4086 struct intel_connector *connector = intel_dp->attached_connector; in intel_dp_is_connected()
4089 intel_dp->is_mst; in intel_dp_is_connected()
4096 struct intel_dp *intel_dp = enc_to_intel_dp(encoder); in intel_dp_retrain_link() local
4101 if (!intel_dp_is_connected(intel_dp)) in intel_dp_retrain_link()
4109 ret = intel_dp_prep_link_retrain(intel_dp, ctx, &pipe_mask); in intel_dp_retrain_link()
4140 intel_dp_check_frl_training(intel_dp); in intel_dp_retrain_link()
4141 intel_dp_pcon_dsc_configure(intel_dp, crtc_state); in intel_dp_retrain_link()
4142 intel_dp_start_link_train(intel_dp, crtc_state); in intel_dp_retrain_link()
4143 intel_dp_stop_link_train(intel_dp, crtc_state); in intel_dp_retrain_link()
4163 static int intel_dp_prep_phy_test(struct intel_dp *intel_dp, in intel_dp_prep_phy_test() argument
4167 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_dp_prep_phy_test()
4181 if (!intel_dp_has_connector(intel_dp, conn_state)) in intel_dp_prep_phy_test()
4214 struct intel_dp *intel_dp = enc_to_intel_dp(encoder); in intel_dp_do_phy_test() local
4224 ret = intel_dp_prep_phy_test(intel_dp, ctx, &pipe_mask); in intel_dp_do_phy_test()
4244 intel_dp_process_phy_request(intel_dp, crtc_state); in intel_dp_do_phy_test()
4275 static void intel_dp_check_device_service_irq(struct intel_dp *intel_dp) in intel_dp_check_device_service_irq() argument
4277 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_dp_check_device_service_irq()
4280 if (intel_dp->dpcd[DP_DPCD_REV] < 0x11) in intel_dp_check_device_service_irq()
4283 if (drm_dp_dpcd_readb(&intel_dp->aux, in intel_dp_check_device_service_irq()
4287 drm_dp_dpcd_writeb(&intel_dp->aux, DP_DEVICE_SERVICE_IRQ_VECTOR, val); in intel_dp_check_device_service_irq()
4290 intel_dp_handle_test_request(intel_dp); in intel_dp_check_device_service_irq()
4293 intel_hdcp_handle_cp_irq(intel_dp->attached_connector); in intel_dp_check_device_service_irq()
4299 static void intel_dp_check_link_service_irq(struct intel_dp *intel_dp) in intel_dp_check_link_service_irq() argument
4303 if (intel_dp->dpcd[DP_DPCD_REV] < 0x11) in intel_dp_check_link_service_irq()
4306 if (drm_dp_dpcd_readb(&intel_dp->aux, in intel_dp_check_link_service_irq()
4310 if (drm_dp_dpcd_writeb(&intel_dp->aux, in intel_dp_check_link_service_irq()
4315 intel_dp_handle_hdmi_link_status_change(intel_dp); in intel_dp_check_link_service_irq()
4332 intel_dp_short_pulse(struct intel_dp *intel_dp) in intel_dp_short_pulse() argument
4334 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); in intel_dp_short_pulse()
4335 u8 old_sink_count = intel_dp->sink_count; in intel_dp_short_pulse()
4342 memset(&intel_dp->compliance, 0, sizeof(intel_dp->compliance)); in intel_dp_short_pulse()
4350 ret = intel_dp_get_dpcd(intel_dp); in intel_dp_short_pulse()
4352 if ((old_sink_count != intel_dp->sink_count) || !ret) { in intel_dp_short_pulse()
4357 intel_dp_check_device_service_irq(intel_dp); in intel_dp_short_pulse()
4358 intel_dp_check_link_service_irq(intel_dp); in intel_dp_short_pulse()
4361 drm_dp_cec_irq(&intel_dp->aux); in intel_dp_short_pulse()
4364 if (intel_dp_needs_link_retrain(intel_dp)) in intel_dp_short_pulse()
4367 intel_psr_short_pulse(intel_dp); in intel_dp_short_pulse()
4369 switch (intel_dp->compliance.test_type) { in intel_dp_short_pulse()
4393 intel_dp_detect_dpcd(struct intel_dp *intel_dp) in intel_dp_detect_dpcd() argument
4395 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_dp_detect_dpcd()
4396 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); in intel_dp_detect_dpcd()
4397 u8 *dpcd = intel_dp->dpcd; in intel_dp_detect_dpcd()
4400 if (drm_WARN_ON(&i915->drm, intel_dp_is_edp(intel_dp))) in intel_dp_detect_dpcd()
4405 if (!intel_dp_get_dpcd(intel_dp)) in intel_dp_detect_dpcd()
4413 if (intel_dp_has_sink_count(intel_dp) && in intel_dp_detect_dpcd()
4414 intel_dp->downstream_ports[0] & DP_DS_PORT_HPD) { in intel_dp_detect_dpcd()
4415 return intel_dp->sink_count ? in intel_dp_detect_dpcd()
4419 if (intel_dp_can_mst(intel_dp)) in intel_dp_detect_dpcd()
4423 if (drm_probe_ddc(&intel_dp->aux.ddc)) in intel_dp_detect_dpcd()
4427 if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11) { in intel_dp_detect_dpcd()
4428 type = intel_dp->downstream_ports[0] & DP_DS_PORT_TYPE_MASK; in intel_dp_detect_dpcd()
4433 type = intel_dp->dpcd[DP_DOWNSTREAMPORT_PRESENT] & in intel_dp_detect_dpcd()
4446 edp_detect(struct intel_dp *intel_dp) in edp_detect() argument
4476 intel_dp_get_edid(struct intel_dp *intel_dp) in intel_dp_get_edid() argument
4478 struct intel_connector *intel_connector = intel_dp->attached_connector; in intel_dp_get_edid()
4489 &intel_dp->aux.ddc); in intel_dp_get_edid()
4493 intel_dp_update_dfp(struct intel_dp *intel_dp, in intel_dp_update_dfp() argument
4496 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_dp_update_dfp()
4497 struct intel_connector *connector = intel_dp->attached_connector; in intel_dp_update_dfp()
4499 intel_dp->dfp.max_bpc = in intel_dp_update_dfp()
4500 drm_dp_downstream_max_bpc(intel_dp->dpcd, in intel_dp_update_dfp()
4501 intel_dp->downstream_ports, edid); in intel_dp_update_dfp()
4503 intel_dp->dfp.max_dotclock = in intel_dp_update_dfp()
4504 drm_dp_downstream_max_dotclock(intel_dp->dpcd, in intel_dp_update_dfp()
4505 intel_dp->downstream_ports); in intel_dp_update_dfp()
4507 intel_dp->dfp.min_tmds_clock = in intel_dp_update_dfp()
4508 drm_dp_downstream_min_tmds_clock(intel_dp->dpcd, in intel_dp_update_dfp()
4509 intel_dp->downstream_ports, in intel_dp_update_dfp()
4511 intel_dp->dfp.max_tmds_clock = in intel_dp_update_dfp()
4512 drm_dp_downstream_max_tmds_clock(intel_dp->dpcd, in intel_dp_update_dfp()
4513 intel_dp->downstream_ports, in intel_dp_update_dfp()
4516 intel_dp->dfp.pcon_max_frl_bw = in intel_dp_update_dfp()
4517 drm_dp_get_pcon_max_frl_bw(intel_dp->dpcd, in intel_dp_update_dfp()
4518 intel_dp->downstream_ports); in intel_dp_update_dfp()
4523 intel_dp->dfp.max_bpc, in intel_dp_update_dfp()
4524 intel_dp->dfp.max_dotclock, in intel_dp_update_dfp()
4525 intel_dp->dfp.min_tmds_clock, in intel_dp_update_dfp()
4526 intel_dp->dfp.max_tmds_clock, in intel_dp_update_dfp()
4527 intel_dp->dfp.pcon_max_frl_bw); in intel_dp_update_dfp()
4529 intel_dp_get_pcon_dsc_cap(intel_dp); in intel_dp_update_dfp()
4533 intel_dp_update_420(struct intel_dp *intel_dp) in intel_dp_update_420() argument
4535 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_dp_update_420()
4536 struct intel_connector *connector = intel_dp->attached_connector; in intel_dp_update_420()
4550 is_branch = drm_dp_is_branch(intel_dp->dpcd); in intel_dp_update_420()
4552 drm_dp_downstream_420_passthrough(intel_dp->dpcd, in intel_dp_update_420()
4553 intel_dp->downstream_ports); in intel_dp_update_420()
4556 dp_to_dig_port(intel_dp)->lspcon.active || in intel_dp_update_420()
4557 drm_dp_downstream_444_to_420_conversion(intel_dp->dpcd, in intel_dp_update_420()
4558 intel_dp->downstream_ports); in intel_dp_update_420()
4559 rgb_to_ycbcr = drm_dp_downstream_rgb_to_ycbcr_conversion(intel_dp->dpcd, in intel_dp_update_420()
4560 intel_dp->downstream_ports, in intel_dp_update_420()
4566 intel_dp->dfp.rgb_to_ycbcr = true; in intel_dp_update_420()
4567 intel_dp->dfp.ycbcr_444_to_420 = true; in intel_dp_update_420()
4571 intel_dp->dfp.ycbcr_444_to_420 = in intel_dp_update_420()
4579 intel_dp->dfp.ycbcr_444_to_420 = ycbcr_444_to_420; in intel_dp_update_420()
4587 str_yes_no(intel_dp->dfp.rgb_to_ycbcr), in intel_dp_update_420()
4589 str_yes_no(intel_dp->dfp.ycbcr_444_to_420)); in intel_dp_update_420()
4593 intel_dp_set_edid(struct intel_dp *intel_dp) in intel_dp_set_edid() argument
4595 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_dp_set_edid()
4596 struct intel_connector *connector = intel_dp->attached_connector; in intel_dp_set_edid()
4600 intel_dp_unset_edid(intel_dp); in intel_dp_set_edid()
4601 edid = intel_dp_get_edid(intel_dp); in intel_dp_set_edid()
4609 intel_dp_update_dfp(intel_dp, edid); in intel_dp_set_edid()
4610 intel_dp_update_420(intel_dp); in intel_dp_set_edid()
4613 intel_dp->has_hdmi_sink = drm_detect_hdmi_monitor(edid); in intel_dp_set_edid()
4614 intel_dp->has_audio = drm_detect_monitor_audio(edid); in intel_dp_set_edid()
4617 drm_dp_cec_set_edid(&intel_dp->aux, edid); in intel_dp_set_edid()
4621 intel_dp_unset_edid(struct intel_dp *intel_dp) in intel_dp_unset_edid() argument
4623 struct intel_connector *connector = intel_dp->attached_connector; in intel_dp_unset_edid()
4625 drm_dp_cec_unset_edid(&intel_dp->aux); in intel_dp_unset_edid()
4629 intel_dp->has_hdmi_sink = false; in intel_dp_unset_edid()
4630 intel_dp->has_audio = false; in intel_dp_unset_edid()
4632 intel_dp->dfp.max_bpc = 0; in intel_dp_unset_edid()
4633 intel_dp->dfp.max_dotclock = 0; in intel_dp_unset_edid()
4634 intel_dp->dfp.min_tmds_clock = 0; in intel_dp_unset_edid()
4635 intel_dp->dfp.max_tmds_clock = 0; in intel_dp_unset_edid()
4637 intel_dp->dfp.pcon_max_frl_bw = 0; in intel_dp_unset_edid()
4639 intel_dp->dfp.ycbcr_444_to_420 = false; in intel_dp_unset_edid()
4652 struct intel_dp *intel_dp = intel_attached_dp(to_intel_connector(connector)); in intel_dp_detect() local
4653 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); in intel_dp_detect()
4666 if (intel_dp_is_edp(intel_dp)) in intel_dp_detect()
4667 status = edp_detect(intel_dp); in intel_dp_detect()
4669 status = intel_dp_detect_dpcd(intel_dp); in intel_dp_detect()
4674 memset(&intel_dp->compliance, 0, sizeof(intel_dp->compliance)); in intel_dp_detect()
4675 memset(intel_dp->dsc_dpcd, 0, sizeof(intel_dp->dsc_dpcd)); in intel_dp_detect()
4677 if (intel_dp->is_mst) { in intel_dp_detect()
4680 intel_dp->is_mst, in intel_dp_detect()
4681 intel_dp->mst_mgr.mst_state); in intel_dp_detect()
4682 intel_dp->is_mst = false; in intel_dp_detect()
4683 drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr, in intel_dp_detect()
4684 intel_dp->is_mst); in intel_dp_detect()
4692 intel_dp_get_dsc_sink_cap(intel_dp); in intel_dp_detect()
4694 intel_dp_configure_mst(intel_dp); in intel_dp_detect()
4700 if (intel_dp->reset_link_params || intel_dp->is_mst) { in intel_dp_detect()
4701 intel_dp_reset_max_link_params(intel_dp); in intel_dp_detect()
4702 intel_dp->reset_link_params = false; in intel_dp_detect()
4705 intel_dp_print_rates(intel_dp); in intel_dp_detect()
4707 if (intel_dp->is_mst) { in intel_dp_detect()
4721 if (!intel_dp_is_edp(intel_dp)) { in intel_dp_detect()
4734 intel_dp->aux.i2c_nack_count = 0; in intel_dp_detect()
4735 intel_dp->aux.i2c_defer_count = 0; in intel_dp_detect()
4737 intel_dp_set_edid(intel_dp); in intel_dp_detect()
4738 if (intel_dp_is_edp(intel_dp) || in intel_dp_detect()
4742 intel_dp_check_device_service_irq(intel_dp); in intel_dp_detect()
4745 if (status != connector_status_connected && !intel_dp->is_mst) in intel_dp_detect()
4746 intel_dp_unset_edid(intel_dp); in intel_dp_detect()
4754 if (!intel_dp_is_edp(intel_dp)) in intel_dp_detect()
4757 intel_dp->dpcd, in intel_dp_detect()
4758 intel_dp->downstream_ports); in intel_dp_detect()
4765 struct intel_dp *intel_dp = intel_attached_dp(to_intel_connector(connector)); in intel_dp_force() local
4766 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); in intel_dp_force()
4775 intel_dp_unset_edid(intel_dp); in intel_dp_force()
4782 intel_dp_set_edid(intel_dp); in intel_dp_force()
4805 struct intel_dp *intel_dp = intel_attached_dp(intel_connector); in intel_dp_get_modes() local
4809 intel_dp->dpcd, in intel_dp_get_modes()
4810 intel_dp->downstream_ports); in intel_dp_get_modes()
4824 struct intel_dp *intel_dp = intel_attached_dp(to_intel_connector(connector)); in intel_dp_connector_register() local
4825 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); in intel_dp_connector_register()
4834 intel_dp->aux.name, connector->kdev->kobj.name); in intel_dp_connector_register()
4836 intel_dp->aux.dev = connector->kdev; in intel_dp_connector_register()
4837 ret = drm_dp_aux_register(&intel_dp->aux); in intel_dp_connector_register()
4839 drm_dp_cec_register_connector(&intel_dp->aux, connector); in intel_dp_connector_register()
4860 struct intel_dp *intel_dp = intel_attached_dp(to_intel_connector(connector)); in intel_dp_connector_unregister() local
4862 drm_dp_cec_unregister_connector(&intel_dp->aux); in intel_dp_connector_unregister()
4863 drm_dp_aux_unregister(&intel_dp->aux); in intel_dp_connector_unregister()
4870 struct intel_dp *intel_dp = &dig_port->dp; in intel_dp_encoder_flush_work() local
4874 intel_pps_vdd_off_sync(intel_dp); in intel_dp_encoder_flush_work()
4876 intel_dp_aux_fini(intel_dp); in intel_dp_encoder_flush_work()
4881 struct intel_dp *intel_dp = enc_to_intel_dp(intel_encoder); in intel_dp_encoder_suspend() local
4883 intel_pps_vdd_off_sync(intel_dp); in intel_dp_encoder_suspend()
4888 struct intel_dp *intel_dp = enc_to_intel_dp(intel_encoder); in intel_dp_encoder_shutdown() local
4890 intel_pps_wait_power_cycle(intel_dp); in intel_dp_encoder_shutdown()
5008 struct intel_dp *intel_dp = enc_to_intel_dp(intel_conn->encoder); in intel_dp_connector_atomic_check() local
5015 if (intel_dp_mst_source_support(intel_dp)) { in intel_dp_connector_atomic_check()
5016 ret = drm_dp_mst_root_conn_atomic_check(conn_state, &intel_dp->mst_mgr); in intel_dp_connector_atomic_check()
5075 struct intel_dp *intel_dp = &dig_port->dp; in intel_dp_hpd_pulse() local
5078 (long_hpd || !intel_pps_have_panel_power_or_vdd(intel_dp))) { in intel_dp_hpd_pulse()
5099 intel_dp->reset_link_params = true; in intel_dp_hpd_pulse()
5103 if (intel_dp->is_mst) { in intel_dp_hpd_pulse()
5104 if (!intel_dp_check_mst_status(intel_dp)) in intel_dp_hpd_pulse()
5106 } else if (!intel_dp_short_pulse(intel_dp)) { in intel_dp_hpd_pulse()
5149 intel_dp_add_properties(struct intel_dp *intel_dp, struct drm_connector *connector) in intel_dp_add_properties() argument
5152 enum port port = dp_to_dig_port(intel_dp)->base.port; in intel_dp_add_properties()
5154 if (!intel_dp_is_edp(intel_dp)) in intel_dp_add_properties()
5177 if (intel_dp_is_edp(intel_dp)) { in intel_dp_add_properties()
5195 intel_edp_add_properties(struct intel_dp *intel_dp) in intel_edp_add_properties() argument
5197 struct intel_connector *connector = intel_dp->attached_connector; in intel_edp_add_properties()
5211 static bool intel_edp_init_connector(struct intel_dp *intel_dp, in intel_edp_init_connector() argument
5214 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); in intel_edp_init_connector()
5218 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; in intel_edp_init_connector()
5223 if (!intel_dp_is_edp(intel_dp)) in intel_edp_init_connector()
5241 intel_pps_init(intel_dp); in intel_edp_init_connector()
5244 has_dpcd = intel_edp_init_dpcd(intel_dp); in intel_edp_init_connector()
5254 edid = drm_get_edid(connector, &intel_dp->aux.ddc); in intel_edp_init_connector()
5283 intel_edp_mso_init(intel_dp); in intel_edp_init_connector()
5301 pipe = vlv_active_pipe(intel_dp); in intel_edp_init_connector()
5304 pipe = intel_dp->pps.pps_pipe; in intel_edp_init_connector()
5318 intel_edp_add_properties(intel_dp); in intel_edp_init_connector()
5320 intel_pps_init_late(intel_dp); in intel_edp_init_connector()
5325 intel_pps_vdd_off_sync(intel_dp); in intel_edp_init_connector()
5358 struct intel_dp *intel_dp = &dig_port->dp; in intel_dp_init_connector() local
5376 intel_dp->reset_link_params = true; in intel_dp_init_connector()
5377 intel_dp->pps.pps_pipe = INVALID_PIPE; in intel_dp_init_connector()
5378 intel_dp->pps.active_pipe = INVALID_PIPE; in intel_dp_init_connector()
5381 intel_dp->DP = intel_de_read(dev_priv, intel_dp->output_reg); in intel_dp_init_connector()
5382 intel_dp->attached_connector = intel_connector; in intel_dp_init_connector()
5402 intel_dp_set_default_sink_rates(intel_dp); in intel_dp_init_connector()
5403 intel_dp_set_default_max_sink_lane_count(intel_dp); in intel_dp_init_connector()
5406 intel_dp->pps.active_pipe = vlv_active_pipe(intel_dp); in intel_dp_init_connector()
5422 intel_dp_aux_init(intel_dp); in intel_dp_init_connector()
5431 if (!intel_edp_init_connector(intel_dp, intel_connector)) { in intel_dp_init_connector()
5432 intel_dp_aux_fini(intel_dp); in intel_dp_init_connector()
5436 intel_dp_set_source_rates(intel_dp); in intel_dp_init_connector()
5437 intel_dp_set_common_rates(intel_dp); in intel_dp_init_connector()
5438 intel_dp_reset_max_link_params(intel_dp); in intel_dp_init_connector()
5444 intel_dp_add_properties(intel_dp, connector); in intel_dp_init_connector()
5446 if (is_hdcp_supported(dev_priv, port) && !intel_dp_is_edp(intel_dp)) { in intel_dp_init_connector()
5463 intel_dp->frl.is_trained = false; in intel_dp_init_connector()
5464 intel_dp->frl.trained_rate_gbps = 0; in intel_dp_init_connector()
5466 intel_psr_init(intel_dp); in intel_dp_init_connector()
5484 struct intel_dp *intel_dp; in intel_dp_mst_suspend() local
5489 intel_dp = enc_to_intel_dp(encoder); in intel_dp_mst_suspend()
5491 if (!intel_dp_mst_source_support(intel_dp)) in intel_dp_mst_suspend()
5494 if (intel_dp->is_mst) in intel_dp_mst_suspend()
5495 drm_dp_mst_topology_mgr_suspend(&intel_dp->mst_mgr); in intel_dp_mst_suspend()
5507 struct intel_dp *intel_dp; in intel_dp_mst_resume() local
5513 intel_dp = enc_to_intel_dp(encoder); in intel_dp_mst_resume()
5515 if (!intel_dp_mst_source_support(intel_dp)) in intel_dp_mst_resume()
5518 ret = drm_dp_mst_topology_mgr_resume(&intel_dp->mst_mgr, in intel_dp_mst_resume()
5521 intel_dp->is_mst = false; in intel_dp_mst_resume()
5522 drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr, in intel_dp_mst_resume()