Lines Matching +full:dp +full:- +full:connector

1 /* SPDX-License-Identifier: MIT */
40 static void intel_dp_hdcp_wait_for_cp_irq(struct intel_connector *connector, in intel_dp_hdcp_wait_for_cp_irq() argument
43 struct intel_digital_port *dig_port = intel_attached_dig_port(connector); in intel_dp_hdcp_wait_for_cp_irq()
44 struct intel_dp *dp = &dig_port->dp; in intel_dp_hdcp_wait_for_cp_irq() local
45 struct intel_hdcp *hdcp = &dp->attached_connector->hdcp; in intel_dp_hdcp_wait_for_cp_irq()
48 #define C (hdcp->cp_irq_count_cached != atomic_read(&hdcp->cp_irq_count)) in intel_dp_hdcp_wait_for_cp_irq()
49 ret = wait_event_interruptible_timeout(hdcp->cp_irq_queue, C, in intel_dp_hdcp_wait_for_cp_irq()
53 drm_dbg_kms(connector->base.dev, in intel_dp_hdcp_wait_for_cp_irq()
66 dpcd_ret = drm_dp_dpcd_write(&dig_port->dp.aux, DP_AUX_HDCP_AN, in intel_dp_hdcp_write_an_aksv()
69 drm_dbg_kms(display->drm, in intel_dp_hdcp_write_an_aksv()
70 "Failed to write An over DP/AUX (%zd)\n", in intel_dp_hdcp_write_an_aksv()
72 return dpcd_ret >= 0 ? -EIO : dpcd_ret; in intel_dp_hdcp_write_an_aksv()
76 * Since Aksv is Oh-So-Secret, we can't access it in software. So we in intel_dp_hdcp_write_an_aksv()
77 * send an empty buffer of the correct length through the DP helpers. On in intel_dp_hdcp_write_an_aksv()
82 dpcd_ret = drm_dp_dpcd_write(&dig_port->dp.aux, DP_AUX_HDCP_AKSV, in intel_dp_hdcp_write_an_aksv()
85 drm_dbg_kms(display->drm, in intel_dp_hdcp_write_an_aksv()
86 "Failed to write Aksv over DP/AUX (%zd)\n", in intel_dp_hdcp_write_an_aksv()
88 return dpcd_ret >= 0 ? -EIO : dpcd_ret; in intel_dp_hdcp_write_an_aksv()
99 ret = drm_dp_dpcd_read(&dig_port->dp.aux, DP_AUX_HDCP_BKSV, bksv, in intel_dp_hdcp_read_bksv()
102 drm_dbg_kms(display->drm, in intel_dp_hdcp_read_bksv()
103 "Read Bksv from DP/AUX failed (%zd)\n", ret); in intel_dp_hdcp_read_bksv()
104 return ret >= 0 ? -EIO : ret; in intel_dp_hdcp_read_bksv()
116 * For some reason the HDMI and DP HDCP specs call this register in intel_dp_hdcp_read_bstatus()
118 * but in DP it's called BINFO. in intel_dp_hdcp_read_bstatus()
120 ret = drm_dp_dpcd_read(&dig_port->dp.aux, DP_AUX_HDCP_BINFO, in intel_dp_hdcp_read_bstatus()
123 drm_dbg_kms(display->drm, in intel_dp_hdcp_read_bstatus()
124 "Read bstatus from DP/AUX failed (%zd)\n", ret); in intel_dp_hdcp_read_bstatus()
125 return ret >= 0 ? -EIO : ret; in intel_dp_hdcp_read_bstatus()
140 drm_dbg_kms(display->drm, in intel_dp_hdcp_read_bcaps()
141 "Read bcaps from DP/AUX failed (%zd)\n", ret); in intel_dp_hdcp_read_bcaps()
142 return ret >= 0 ? -EIO : ret; in intel_dp_hdcp_read_bcaps()
156 ret = intel_dp_hdcp_read_bcaps(&dig_port->dp.aux, display, &bcaps); in intel_dp_hdcp_repeater_present()
171 ret = drm_dp_dpcd_read(&dig_port->dp.aux, DP_AUX_HDCP_RI_PRIME, in intel_dp_hdcp_read_ri_prime()
174 drm_dbg_kms(display->drm, in intel_dp_hdcp_read_ri_prime()
175 "Read Ri' from DP/AUX failed (%zd)\n", in intel_dp_hdcp_read_ri_prime()
177 return ret >= 0 ? -EIO : ret; in intel_dp_hdcp_read_ri_prime()
190 ret = drm_dp_dpcd_read(&dig_port->dp.aux, DP_AUX_HDCP_BSTATUS, in intel_dp_hdcp_read_ksv_ready()
193 drm_dbg_kms(display->drm, in intel_dp_hdcp_read_ksv_ready()
194 "Read bstatus from DP/AUX failed (%zd)\n", ret); in intel_dp_hdcp_read_ksv_ready()
195 return ret >= 0 ? -EIO : ret; in intel_dp_hdcp_read_ksv_ready()
211 size_t len = min(num_downstream - i, 3) * DRM_HDCP_KSV_LEN; in intel_dp_hdcp_read_ksv_fifo()
212 ret = drm_dp_dpcd_read(&dig_port->dp.aux, in intel_dp_hdcp_read_ksv_fifo()
217 drm_dbg_kms(display->drm, in intel_dp_hdcp_read_ksv_fifo()
218 "Read ksv[%d] from DP/AUX failed (%zd)\n", in intel_dp_hdcp_read_ksv_fifo()
220 return ret >= 0 ? -EIO : ret; in intel_dp_hdcp_read_ksv_fifo()
234 return -EINVAL; in intel_dp_hdcp_read_v_prime_part()
236 ret = drm_dp_dpcd_read(&dig_port->dp.aux, in intel_dp_hdcp_read_v_prime_part()
240 drm_dbg_kms(display->drm, in intel_dp_hdcp_read_v_prime_part()
241 "Read v'[%d] from DP/AUX failed (%zd)\n", i, ret); in intel_dp_hdcp_read_v_prime_part()
242 return ret >= 0 ? -EIO : ret; in intel_dp_hdcp_read_v_prime_part()
258 struct intel_connector *connector) in intel_dp_hdcp_check_link() argument
264 ret = drm_dp_dpcd_read(&dig_port->dp.aux, DP_AUX_HDCP_BSTATUS, in intel_dp_hdcp_check_link()
267 drm_dbg_kms(display->drm, in intel_dp_hdcp_check_link()
268 "Read bstatus from DP/AUX failed (%zd)\n", ret); in intel_dp_hdcp_check_link()
283 ret = intel_dp_hdcp_read_bcaps(&dig_port->dp.aux, display, &bcaps); in intel_dp_hdcp_get_capability()
343 intel_dp_hdcp2_read_rx_status(struct intel_connector *connector, in intel_dp_hdcp2_read_rx_status() argument
346 struct intel_display *display = to_intel_display(connector); in intel_dp_hdcp2_read_rx_status()
347 struct intel_digital_port *dig_port = intel_attached_dig_port(connector); in intel_dp_hdcp2_read_rx_status()
348 struct drm_dp_aux *aux = &dig_port->dp.aux; in intel_dp_hdcp2_read_rx_status()
355 drm_dbg_kms(display->drm, in intel_dp_hdcp2_read_rx_status()
356 "Read bstatus from DP/AUX failed (%zd)\n", ret); in intel_dp_hdcp2_read_rx_status()
357 return ret >= 0 ? -EIO : ret; in intel_dp_hdcp2_read_rx_status()
364 int hdcp2_detect_msg_availability(struct intel_connector *connector, in hdcp2_detect_msg_availability() argument
371 ret = intel_dp_hdcp2_read_rx_status(connector, &rx_status); in hdcp2_detect_msg_availability()
389 drm_err(connector->base.dev, in hdcp2_detect_msg_availability()
391 return -EINVAL; in hdcp2_detect_msg_availability()
398 intel_dp_hdcp2_wait_for_msg(struct intel_connector *connector, in intel_dp_hdcp2_wait_for_msg() argument
401 struct intel_display *display = to_intel_display(connector); in intel_dp_hdcp2_wait_for_msg()
402 struct intel_digital_port *dig_port = intel_attached_dig_port(connector); in intel_dp_hdcp2_wait_for_msg()
403 struct intel_dp *dp = &dig_port->dp; in intel_dp_hdcp2_wait_for_msg() local
404 struct intel_hdcp *hdcp = &dp->attached_connector->hdcp; in intel_dp_hdcp2_wait_for_msg()
405 u8 msg_id = hdcp2_msg_data->msg_id; in intel_dp_hdcp2_wait_for_msg()
409 if (msg_id == HDCP_2_2_AKE_SEND_HPRIME && !hdcp->is_paired) in intel_dp_hdcp2_wait_for_msg()
410 timeout = hdcp2_msg_data->timeout2; in intel_dp_hdcp2_wait_for_msg()
412 timeout = hdcp2_msg_data->timeout; in intel_dp_hdcp2_wait_for_msg()
418 if (!hdcp2_msg_data->msg_detectable) { in intel_dp_hdcp2_wait_for_msg()
426 intel_dp_hdcp_wait_for_cp_irq(connector, timeout); in intel_dp_hdcp2_wait_for_msg()
427 ret = hdcp2_detect_msg_availability(connector, msg_id, in intel_dp_hdcp2_wait_for_msg()
430 ret = -ETIMEDOUT; in intel_dp_hdcp2_wait_for_msg()
434 drm_dbg_kms(display->drm, in intel_dp_hdcp2_wait_for_msg()
436 hdcp2_msg_data->msg_id, ret, timeout); in intel_dp_hdcp2_wait_for_msg()
453 int intel_dp_hdcp2_write_msg(struct intel_connector *connector, in intel_dp_hdcp2_write_msg() argument
459 struct intel_digital_port *dig_port = intel_attached_dig_port(connector); in intel_dp_hdcp2_write_msg()
460 struct drm_dp_aux *aux = &dig_port->dp.aux; in intel_dp_hdcp2_write_msg()
465 return -EINVAL; in intel_dp_hdcp2_write_msg()
467 offset = hdcp2_msg_data->offset; in intel_dp_hdcp2_write_msg()
469 /* No msg_id in DP HDCP2.2 msgs */ in intel_dp_hdcp2_write_msg()
470 bytes_to_write = size - 1; in intel_dp_hdcp2_write_msg()
482 bytes_to_write -= ret; in intel_dp_hdcp2_write_msg()
491 ssize_t get_receiver_id_list_rx_info(struct intel_connector *connector, in get_receiver_id_list_rx_info() argument
494 struct intel_digital_port *dig_port = intel_attached_dig_port(connector); in get_receiver_id_list_rx_info()
495 struct drm_dp_aux *aux = &dig_port->dp.aux; in get_receiver_id_list_rx_info()
503 return ret >= 0 ? -EIO : ret; in get_receiver_id_list_rx_info()
515 int intel_dp_hdcp2_read_msg(struct intel_connector *connector, in intel_dp_hdcp2_read_msg() argument
518 struct intel_display *display = to_intel_display(connector); in intel_dp_hdcp2_read_msg()
519 struct intel_digital_port *dig_port = intel_attached_dig_port(connector); in intel_dp_hdcp2_read_msg()
520 struct drm_dp_aux *aux = &dig_port->dp.aux; in intel_dp_hdcp2_read_msg()
521 struct intel_dp *dp = &dig_port->dp; in intel_dp_hdcp2_read_msg() local
522 struct intel_hdcp *hdcp = &dp->attached_connector->hdcp; in intel_dp_hdcp2_read_msg()
533 return -EINVAL; in intel_dp_hdcp2_read_msg()
534 offset = hdcp2_msg_data->offset; in intel_dp_hdcp2_read_msg()
536 ret = intel_dp_hdcp2_wait_for_msg(connector, hdcp2_msg_data); in intel_dp_hdcp2_read_msg()
540 hdcp->cp_irq_count_cached = atomic_read(&hdcp->cp_irq_count); in intel_dp_hdcp2_read_msg()
542 /* DP adaptation msgs has no msg_id */ in intel_dp_hdcp2_read_msg()
546 ret = get_receiver_id_list_rx_info(connector, &dev_cnt, byte); in intel_dp_hdcp2_read_msg()
551 size = sizeof(struct hdcp2_rep_send_receiverid_list) - in intel_dp_hdcp2_read_msg()
552 HDCP_2_2_RXINFO_LEN - HDCP_2_2_RECEIVER_IDS_MAX_LEN + in intel_dp_hdcp2_read_msg()
557 bytes_to_recv = size - 1; in intel_dp_hdcp2_read_msg()
564 if (bytes_to_recv == size - 1 && hdcp2_msg_data->msg_read_timeout > 0) { in intel_dp_hdcp2_read_msg()
566 hdcp2_msg_data->msg_read_timeout); in intel_dp_hdcp2_read_msg()
572 drm_dbg_kms(display->drm, "msg_id %d, ret %zd\n", in intel_dp_hdcp2_read_msg()
577 bytes_to_recv -= ret; in intel_dp_hdcp2_read_msg()
582 if (hdcp2_msg_data->msg_read_timeout > 0) { in intel_dp_hdcp2_read_msg()
585 drm_dbg_kms(display->drm, in intel_dp_hdcp2_read_msg()
587 msg_id, hdcp2_msg_data->msg_read_timeout); in intel_dp_hdcp2_read_msg()
588 return -ETIMEDOUT; in intel_dp_hdcp2_read_msg()
599 int intel_dp_hdcp2_config_stream_type(struct intel_connector *connector, in intel_dp_hdcp2_config_stream_type() argument
609 * Errata for DP: As Stream type is used for encryption, Receiver in intel_dp_hdcp2_config_stream_type()
618 ret = intel_dp_hdcp2_write_msg(connector, &stream_type_msg, in intel_dp_hdcp2_config_stream_type()
627 struct intel_connector *connector) in intel_dp_hdcp2_check_link() argument
632 ret = intel_dp_hdcp2_read_rx_status(connector, in intel_dp_hdcp2_check_link()
667 return ret >= 0 ? -EIO : ret; in _intel_dp_hdcp2_get_capability()
680 int intel_dp_hdcp2_get_capability(struct intel_connector *connector, in intel_dp_hdcp2_get_capability() argument
687 if (!intel_attached_encoder(connector)) in intel_dp_hdcp2_get_capability()
688 return -EINVAL; in intel_dp_hdcp2_get_capability()
690 dig_port = intel_attached_dig_port(connector); in intel_dp_hdcp2_get_capability()
691 aux = &dig_port->dp.aux; in intel_dp_hdcp2_get_capability()
697 int intel_dp_hdcp_get_remote_capability(struct intel_connector *connector, in intel_dp_hdcp_get_remote_capability() argument
701 struct intel_display *display = to_intel_display(connector); in intel_dp_hdcp_get_remote_capability()
708 if (!connector->mst.dp) in intel_dp_hdcp_get_remote_capability()
709 return -EINVAL; in intel_dp_hdcp_get_remote_capability()
711 aux = &connector->mst.port->aux; in intel_dp_hdcp_get_remote_capability()
714 drm_dbg_kms(display->drm, in intel_dp_hdcp_get_remote_capability()
747 intel_dp_mst_toggle_hdcp_stream_select(struct intel_connector *connector, in intel_dp_mst_toggle_hdcp_stream_select() argument
750 struct intel_display *display = to_intel_display(connector); in intel_dp_mst_toggle_hdcp_stream_select()
751 struct intel_digital_port *dig_port = intel_attached_dig_port(connector); in intel_dp_mst_toggle_hdcp_stream_select()
752 struct intel_hdcp *hdcp = &connector->hdcp; in intel_dp_mst_toggle_hdcp_stream_select()
755 ret = intel_ddi_toggle_hdcp_bits(&dig_port->base, in intel_dp_mst_toggle_hdcp_stream_select()
756 hdcp->stream_transcoder, enable, in intel_dp_mst_toggle_hdcp_stream_select()
759 drm_err(display->drm, "%s HDCP stream select failed (%d)\n", in intel_dp_mst_toggle_hdcp_stream_select()
765 intel_dp_mst_hdcp_stream_encryption(struct intel_connector *connector, in intel_dp_mst_hdcp_stream_encryption() argument
768 struct intel_display *display = to_intel_display(connector); in intel_dp_mst_hdcp_stream_encryption()
769 struct intel_digital_port *dig_port = intel_attached_dig_port(connector); in intel_dp_mst_hdcp_stream_encryption()
770 struct intel_hdcp *hdcp = &connector->hdcp; in intel_dp_mst_hdcp_stream_encryption()
771 enum port port = dig_port->base.port; in intel_dp_mst_hdcp_stream_encryption()
772 enum transcoder cpu_transcoder = hdcp->stream_transcoder; in intel_dp_mst_hdcp_stream_encryption()
776 ret = intel_dp_mst_toggle_hdcp_stream_select(connector, enable); in intel_dp_mst_hdcp_stream_encryption()
782 return -EINVAL; in intel_dp_mst_hdcp_stream_encryption()
788 drm_err(display->drm, "Timed out waiting for transcoder: %s stream encryption %s\n", in intel_dp_mst_hdcp_stream_encryption()
790 return -ETIMEDOUT; in intel_dp_mst_hdcp_stream_encryption()
797 intel_dp_mst_hdcp2_stream_encryption(struct intel_connector *connector, in intel_dp_mst_hdcp2_stream_encryption() argument
800 struct intel_display *display = to_intel_display(connector); in intel_dp_mst_hdcp2_stream_encryption()
801 struct intel_digital_port *dig_port = intel_attached_dig_port(connector); in intel_dp_mst_hdcp2_stream_encryption()
802 struct hdcp_port_data *data = &dig_port->hdcp.port_data; in intel_dp_mst_hdcp2_stream_encryption()
803 struct intel_hdcp *hdcp = &connector->hdcp; in intel_dp_mst_hdcp2_stream_encryption()
804 enum transcoder cpu_transcoder = hdcp->stream_transcoder; in intel_dp_mst_hdcp2_stream_encryption()
806 enum port port = dig_port->base.port; in intel_dp_mst_hdcp2_stream_encryption()
809 drm_WARN_ON(display->drm, enable && in intel_dp_mst_hdcp2_stream_encryption()
811 & AUTH_STREAM_TYPE) != data->streams[0].stream_type); in intel_dp_mst_hdcp2_stream_encryption()
813 ret = intel_dp_mst_toggle_hdcp_stream_select(connector, enable); in intel_dp_mst_hdcp2_stream_encryption()
822 drm_err(display->drm, "Timed out waiting for transcoder: %s stream encryption %s\n", in intel_dp_mst_hdcp2_stream_encryption()
824 return -ETIMEDOUT; in intel_dp_mst_hdcp2_stream_encryption()
832 struct intel_connector *connector) in intel_dp_mst_hdcp2_check_link() argument
834 struct intel_hdcp *hdcp = &connector->hdcp; in intel_dp_mst_hdcp2_check_link()
838 * We do need to do the Link Check only for the connector involved with in intel_dp_mst_hdcp2_check_link()
840 * We can re-use the hdcp->is_repeater flag to know that the connector in intel_dp_mst_hdcp2_check_link()
843 if (hdcp->is_repeater) { in intel_dp_mst_hdcp2_check_link()
844 ret = intel_dp_hdcp2_check_link(dig_port, connector); in intel_dp_mst_hdcp2_check_link()
879 struct intel_encoder *intel_encoder = &dig_port->base; in intel_dp_hdcp_init()
880 enum port port = intel_encoder->port; in intel_dp_hdcp_init()
881 struct intel_dp *intel_dp = &dig_port->dp; in intel_dp_hdcp_init()
886 if (intel_connector->mst.dp) in intel_dp_hdcp_init()