Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/i915: Factor out HDCP shim functions from dp for use by dp_mst

These functions are all the same for dp and dp_mst, so move them into a
dedicated file for both sst and mst to use.

Reviewed-by: Ramalingam C <ramalingam.c@intel.com>
Signed-off-by: Sean Paul <seanpaul@chromium.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20191203173638.94919-11-sean@poorly.run #v1
Link: https://patchwork.freedesktop.org/patch/msgid/20191212190230.188505-12-sean@poorly.run #v2
Link: https://patchwork.freedesktop.org/patch/msgid/20200117193103.156821-12-sean@poorly.run #v3
Link: https://patchwork.freedesktop.org/patch/msgid/20200218220242.107265-12-sean@poorly.run #v4
Link: https://patchwork.freedesktop.org/patch/msgid/20200305201236.152307-12-sean@poorly.run #v5
Link: https://patchwork.freedesktop.org/patch/msgid/20200429195502.39919-12-sean@poorly.run #v6
Link: https://patchwork.freedesktop.org/patch/msgid/20200623155907.22961-13-sean@poorly.run #v7

Changes in v2:
-None
Changes in v3:
-Created intel_dp_hdcp.c for the shared functions to live (Ville)
Changes in v4:
-Rebased on new drm logging change
Changes in v5:
-None
Changes in v6:
-None
Changes in v7:
-Rebased patch
Changes in v8:
-None

Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200818153910.27894-13-sean@poorly.run

authored by

Sean Paul and committed by
Ramalingam C
d079b7e4 f1c7a36b

+642 -606
+1
drivers/gpu/drm/i915/Makefile
··· 234 234 display/intel_ddi.o \ 235 235 display/intel_dp.o \ 236 236 display/intel_dp_aux_backlight.o \ 237 + display/intel_dp_hdcp.o \ 237 238 display/intel_dp_link_training.o \ 238 239 display/intel_dp_mst.o \ 239 240 display/intel_dsi.o \
+1 -606
drivers/gpu/drm/i915/display/intel_dp.c
··· 38 38 #include <drm/drm_crtc.h> 39 39 #include <drm/drm_dp_helper.h> 40 40 #include <drm/drm_edid.h> 41 - #include <drm/drm_hdcp.h> 42 41 #include <drm/drm_probe_helper.h> 43 42 44 43 #include "i915_debugfs.h" ··· 6413 6414 edp_panel_vdd_off_sync(intel_dp); 6414 6415 } 6415 6416 6416 - static void intel_dp_hdcp_wait_for_cp_irq(struct intel_hdcp *hdcp, int timeout) 6417 - { 6418 - long ret; 6419 - 6420 - #define C (hdcp->cp_irq_count_cached != atomic_read(&hdcp->cp_irq_count)) 6421 - ret = wait_event_interruptible_timeout(hdcp->cp_irq_queue, C, 6422 - msecs_to_jiffies(timeout)); 6423 - 6424 - if (!ret) 6425 - DRM_DEBUG_KMS("Timedout at waiting for CP_IRQ\n"); 6426 - } 6427 - 6428 - static 6429 - int intel_dp_hdcp_write_an_aksv(struct intel_digital_port *dig_port, 6430 - u8 *an) 6431 - { 6432 - struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); 6433 - u8 aksv[DRM_HDCP_KSV_LEN] = {}; 6434 - ssize_t dpcd_ret; 6435 - 6436 - /* Output An first, that's easy */ 6437 - dpcd_ret = drm_dp_dpcd_write(&dig_port->dp.aux, DP_AUX_HDCP_AN, 6438 - an, DRM_HDCP_AN_LEN); 6439 - if (dpcd_ret != DRM_HDCP_AN_LEN) { 6440 - drm_dbg_kms(&i915->drm, 6441 - "Failed to write An over DP/AUX (%zd)\n", 6442 - dpcd_ret); 6443 - return dpcd_ret >= 0 ? -EIO : dpcd_ret; 6444 - } 6445 - 6446 - /* 6447 - * Since Aksv is Oh-So-Secret, we can't access it in software. So we 6448 - * send an empty buffer of the correct length through the DP helpers. On 6449 - * the other side, in the transfer hook, we'll generate a flag based on 6450 - * the destination address which will tickle the hardware to output the 6451 - * Aksv on our behalf after the header is sent. 6452 - */ 6453 - dpcd_ret = drm_dp_dpcd_write(&dig_port->dp.aux, DP_AUX_HDCP_AKSV, 6454 - aksv, DRM_HDCP_KSV_LEN); 6455 - if (dpcd_ret != DRM_HDCP_KSV_LEN) { 6456 - drm_dbg_kms(&i915->drm, 6457 - "Failed to write Aksv over DP/AUX (%zd)\n", 6458 - dpcd_ret); 6459 - return dpcd_ret >= 0 ? -EIO : dpcd_ret; 6460 - } 6461 - return 0; 6462 - } 6463 - 6464 - static int intel_dp_hdcp_read_bksv(struct intel_digital_port *dig_port, 6465 - u8 *bksv) 6466 - { 6467 - struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); 6468 - ssize_t ret; 6469 - 6470 - ret = drm_dp_dpcd_read(&dig_port->dp.aux, DP_AUX_HDCP_BKSV, bksv, 6471 - DRM_HDCP_KSV_LEN); 6472 - if (ret != DRM_HDCP_KSV_LEN) { 6473 - drm_dbg_kms(&i915->drm, 6474 - "Read Bksv from DP/AUX failed (%zd)\n", ret); 6475 - return ret >= 0 ? -EIO : ret; 6476 - } 6477 - return 0; 6478 - } 6479 - 6480 - static int intel_dp_hdcp_read_bstatus(struct intel_digital_port *dig_port, 6481 - u8 *bstatus) 6482 - { 6483 - struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); 6484 - ssize_t ret; 6485 - 6486 - /* 6487 - * For some reason the HDMI and DP HDCP specs call this register 6488 - * definition by different names. In the HDMI spec, it's called BSTATUS, 6489 - * but in DP it's called BINFO. 6490 - */ 6491 - ret = drm_dp_dpcd_read(&dig_port->dp.aux, DP_AUX_HDCP_BINFO, 6492 - bstatus, DRM_HDCP_BSTATUS_LEN); 6493 - if (ret != DRM_HDCP_BSTATUS_LEN) { 6494 - drm_dbg_kms(&i915->drm, 6495 - "Read bstatus from DP/AUX failed (%zd)\n", ret); 6496 - return ret >= 0 ? -EIO : ret; 6497 - } 6498 - return 0; 6499 - } 6500 - 6501 - static 6502 - int intel_dp_hdcp_read_bcaps(struct intel_digital_port *dig_port, 6503 - u8 *bcaps) 6504 - { 6505 - struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); 6506 - ssize_t ret; 6507 - 6508 - ret = drm_dp_dpcd_read(&dig_port->dp.aux, DP_AUX_HDCP_BCAPS, 6509 - bcaps, 1); 6510 - if (ret != 1) { 6511 - drm_dbg_kms(&i915->drm, 6512 - "Read bcaps from DP/AUX failed (%zd)\n", ret); 6513 - return ret >= 0 ? -EIO : ret; 6514 - } 6515 - 6516 - return 0; 6517 - } 6518 - 6519 - static 6520 - int intel_dp_hdcp_repeater_present(struct intel_digital_port *dig_port, 6521 - bool *repeater_present) 6522 - { 6523 - ssize_t ret; 6524 - u8 bcaps; 6525 - 6526 - ret = intel_dp_hdcp_read_bcaps(dig_port, &bcaps); 6527 - if (ret) 6528 - return ret; 6529 - 6530 - *repeater_present = bcaps & DP_BCAPS_REPEATER_PRESENT; 6531 - return 0; 6532 - } 6533 - 6534 - static 6535 - int intel_dp_hdcp_read_ri_prime(struct intel_digital_port *dig_port, 6536 - u8 *ri_prime) 6537 - { 6538 - struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); 6539 - ssize_t ret; 6540 - 6541 - ret = drm_dp_dpcd_read(&dig_port->dp.aux, DP_AUX_HDCP_RI_PRIME, 6542 - ri_prime, DRM_HDCP_RI_LEN); 6543 - if (ret != DRM_HDCP_RI_LEN) { 6544 - drm_dbg_kms(&i915->drm, "Read Ri' from DP/AUX failed (%zd)\n", 6545 - ret); 6546 - return ret >= 0 ? -EIO : ret; 6547 - } 6548 - return 0; 6549 - } 6550 - 6551 - static 6552 - int intel_dp_hdcp_read_ksv_ready(struct intel_digital_port *dig_port, 6553 - bool *ksv_ready) 6554 - { 6555 - struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); 6556 - ssize_t ret; 6557 - u8 bstatus; 6558 - 6559 - ret = drm_dp_dpcd_read(&dig_port->dp.aux, DP_AUX_HDCP_BSTATUS, 6560 - &bstatus, 1); 6561 - if (ret != 1) { 6562 - drm_dbg_kms(&i915->drm, 6563 - "Read bstatus from DP/AUX failed (%zd)\n", ret); 6564 - return ret >= 0 ? -EIO : ret; 6565 - } 6566 - *ksv_ready = bstatus & DP_BSTATUS_READY; 6567 - return 0; 6568 - } 6569 - 6570 - static 6571 - int intel_dp_hdcp_read_ksv_fifo(struct intel_digital_port *dig_port, 6572 - int num_downstream, u8 *ksv_fifo) 6573 - { 6574 - struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); 6575 - ssize_t ret; 6576 - int i; 6577 - 6578 - /* KSV list is read via 15 byte window (3 entries @ 5 bytes each) */ 6579 - for (i = 0; i < num_downstream; i += 3) { 6580 - size_t len = min(num_downstream - i, 3) * DRM_HDCP_KSV_LEN; 6581 - ret = drm_dp_dpcd_read(&dig_port->dp.aux, 6582 - DP_AUX_HDCP_KSV_FIFO, 6583 - ksv_fifo + i * DRM_HDCP_KSV_LEN, 6584 - len); 6585 - if (ret != len) { 6586 - drm_dbg_kms(&i915->drm, 6587 - "Read ksv[%d] from DP/AUX failed (%zd)\n", 6588 - i, ret); 6589 - return ret >= 0 ? -EIO : ret; 6590 - } 6591 - } 6592 - return 0; 6593 - } 6594 - 6595 - static 6596 - int intel_dp_hdcp_read_v_prime_part(struct intel_digital_port *dig_port, 6597 - int i, u32 *part) 6598 - { 6599 - struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); 6600 - ssize_t ret; 6601 - 6602 - if (i >= DRM_HDCP_V_PRIME_NUM_PARTS) 6603 - return -EINVAL; 6604 - 6605 - ret = drm_dp_dpcd_read(&dig_port->dp.aux, 6606 - DP_AUX_HDCP_V_PRIME(i), part, 6607 - DRM_HDCP_V_PRIME_PART_LEN); 6608 - if (ret != DRM_HDCP_V_PRIME_PART_LEN) { 6609 - drm_dbg_kms(&i915->drm, 6610 - "Read v'[%d] from DP/AUX failed (%zd)\n", i, ret); 6611 - return ret >= 0 ? -EIO : ret; 6612 - } 6613 - return 0; 6614 - } 6615 - 6616 - static 6617 - int intel_dp_hdcp_toggle_signalling(struct intel_digital_port *dig_port, 6618 - enum transcoder cpu_transcoder, 6619 - bool enable) 6620 - { 6621 - /* Not used for single stream DisplayPort setups */ 6622 - return 0; 6623 - } 6624 - 6625 - static 6626 - bool intel_dp_hdcp_check_link(struct intel_digital_port *dig_port) 6627 - { 6628 - struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); 6629 - ssize_t ret; 6630 - u8 bstatus; 6631 - 6632 - ret = drm_dp_dpcd_read(&dig_port->dp.aux, DP_AUX_HDCP_BSTATUS, 6633 - &bstatus, 1); 6634 - if (ret != 1) { 6635 - drm_dbg_kms(&i915->drm, 6636 - "Read bstatus from DP/AUX failed (%zd)\n", ret); 6637 - return false; 6638 - } 6639 - 6640 - return !(bstatus & (DP_BSTATUS_LINK_FAILURE | DP_BSTATUS_REAUTH_REQ)); 6641 - } 6642 - 6643 - static 6644 - int intel_dp_hdcp_capable(struct intel_digital_port *dig_port, 6645 - bool *hdcp_capable) 6646 - { 6647 - ssize_t ret; 6648 - u8 bcaps; 6649 - 6650 - ret = intel_dp_hdcp_read_bcaps(dig_port, &bcaps); 6651 - if (ret) 6652 - return ret; 6653 - 6654 - *hdcp_capable = bcaps & DP_BCAPS_HDCP_CAPABLE; 6655 - return 0; 6656 - } 6657 - 6658 - struct hdcp2_dp_errata_stream_type { 6659 - u8 msg_id; 6660 - u8 stream_type; 6661 - } __packed; 6662 - 6663 - struct hdcp2_dp_msg_data { 6664 - u8 msg_id; 6665 - u32 offset; 6666 - bool msg_detectable; 6667 - u32 timeout; 6668 - u32 timeout2; /* Added for non_paired situation */ 6669 - }; 6670 - 6671 - static const struct hdcp2_dp_msg_data hdcp2_dp_msg_data[] = { 6672 - { HDCP_2_2_AKE_INIT, DP_HDCP_2_2_AKE_INIT_OFFSET, false, 0, 0 }, 6673 - { HDCP_2_2_AKE_SEND_CERT, DP_HDCP_2_2_AKE_SEND_CERT_OFFSET, 6674 - false, HDCP_2_2_CERT_TIMEOUT_MS, 0 }, 6675 - { HDCP_2_2_AKE_NO_STORED_KM, DP_HDCP_2_2_AKE_NO_STORED_KM_OFFSET, 6676 - false, 0, 0 }, 6677 - { HDCP_2_2_AKE_STORED_KM, DP_HDCP_2_2_AKE_STORED_KM_OFFSET, 6678 - false, 0, 0 }, 6679 - { HDCP_2_2_AKE_SEND_HPRIME, DP_HDCP_2_2_AKE_SEND_HPRIME_OFFSET, 6680 - true, HDCP_2_2_HPRIME_PAIRED_TIMEOUT_MS, 6681 - HDCP_2_2_HPRIME_NO_PAIRED_TIMEOUT_MS }, 6682 - { HDCP_2_2_AKE_SEND_PAIRING_INFO, 6683 - DP_HDCP_2_2_AKE_SEND_PAIRING_INFO_OFFSET, true, 6684 - HDCP_2_2_PAIRING_TIMEOUT_MS, 0 }, 6685 - { HDCP_2_2_LC_INIT, DP_HDCP_2_2_LC_INIT_OFFSET, false, 0, 0 }, 6686 - { HDCP_2_2_LC_SEND_LPRIME, DP_HDCP_2_2_LC_SEND_LPRIME_OFFSET, 6687 - false, HDCP_2_2_DP_LPRIME_TIMEOUT_MS, 0 }, 6688 - { HDCP_2_2_SKE_SEND_EKS, DP_HDCP_2_2_SKE_SEND_EKS_OFFSET, false, 6689 - 0, 0 }, 6690 - { HDCP_2_2_REP_SEND_RECVID_LIST, 6691 - DP_HDCP_2_2_REP_SEND_RECVID_LIST_OFFSET, true, 6692 - HDCP_2_2_RECVID_LIST_TIMEOUT_MS, 0 }, 6693 - { HDCP_2_2_REP_SEND_ACK, DP_HDCP_2_2_REP_SEND_ACK_OFFSET, false, 6694 - 0, 0 }, 6695 - { HDCP_2_2_REP_STREAM_MANAGE, 6696 - DP_HDCP_2_2_REP_STREAM_MANAGE_OFFSET, false, 6697 - 0, 0 }, 6698 - { HDCP_2_2_REP_STREAM_READY, DP_HDCP_2_2_REP_STREAM_READY_OFFSET, 6699 - false, HDCP_2_2_STREAM_READY_TIMEOUT_MS, 0 }, 6700 - /* local define to shovel this through the write_2_2 interface */ 6701 - #define HDCP_2_2_ERRATA_DP_STREAM_TYPE 50 6702 - { HDCP_2_2_ERRATA_DP_STREAM_TYPE, 6703 - DP_HDCP_2_2_REG_STREAM_TYPE_OFFSET, false, 6704 - 0, 0 }, 6705 - }; 6706 - 6707 - static int 6708 - intel_dp_hdcp2_read_rx_status(struct intel_digital_port *dig_port, 6709 - u8 *rx_status) 6710 - { 6711 - struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); 6712 - ssize_t ret; 6713 - 6714 - ret = drm_dp_dpcd_read(&dig_port->dp.aux, 6715 - DP_HDCP_2_2_REG_RXSTATUS_OFFSET, rx_status, 6716 - HDCP_2_2_DP_RXSTATUS_LEN); 6717 - if (ret != HDCP_2_2_DP_RXSTATUS_LEN) { 6718 - drm_dbg_kms(&i915->drm, 6719 - "Read bstatus from DP/AUX failed (%zd)\n", ret); 6720 - return ret >= 0 ? -EIO : ret; 6721 - } 6722 - 6723 - return 0; 6724 - } 6725 - 6726 - static 6727 - int hdcp2_detect_msg_availability(struct intel_digital_port *dig_port, 6728 - u8 msg_id, bool *msg_ready) 6729 - { 6730 - u8 rx_status; 6731 - int ret; 6732 - 6733 - *msg_ready = false; 6734 - ret = intel_dp_hdcp2_read_rx_status(dig_port, &rx_status); 6735 - if (ret < 0) 6736 - return ret; 6737 - 6738 - switch (msg_id) { 6739 - case HDCP_2_2_AKE_SEND_HPRIME: 6740 - if (HDCP_2_2_DP_RXSTATUS_H_PRIME(rx_status)) 6741 - *msg_ready = true; 6742 - break; 6743 - case HDCP_2_2_AKE_SEND_PAIRING_INFO: 6744 - if (HDCP_2_2_DP_RXSTATUS_PAIRING(rx_status)) 6745 - *msg_ready = true; 6746 - break; 6747 - case HDCP_2_2_REP_SEND_RECVID_LIST: 6748 - if (HDCP_2_2_DP_RXSTATUS_READY(rx_status)) 6749 - *msg_ready = true; 6750 - break; 6751 - default: 6752 - DRM_ERROR("Unidentified msg_id: %d\n", msg_id); 6753 - return -EINVAL; 6754 - } 6755 - 6756 - return 0; 6757 - } 6758 - 6759 - static ssize_t 6760 - intel_dp_hdcp2_wait_for_msg(struct intel_digital_port *dig_port, 6761 - const struct hdcp2_dp_msg_data *hdcp2_msg_data) 6762 - { 6763 - struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); 6764 - struct intel_dp *dp = &dig_port->dp; 6765 - struct intel_hdcp *hdcp = &dp->attached_connector->hdcp; 6766 - u8 msg_id = hdcp2_msg_data->msg_id; 6767 - int ret, timeout; 6768 - bool msg_ready = false; 6769 - 6770 - if (msg_id == HDCP_2_2_AKE_SEND_HPRIME && !hdcp->is_paired) 6771 - timeout = hdcp2_msg_data->timeout2; 6772 - else 6773 - timeout = hdcp2_msg_data->timeout; 6774 - 6775 - /* 6776 - * There is no way to detect the CERT, LPRIME and STREAM_READY 6777 - * availability. So Wait for timeout and read the msg. 6778 - */ 6779 - if (!hdcp2_msg_data->msg_detectable) { 6780 - mdelay(timeout); 6781 - ret = 0; 6782 - } else { 6783 - /* 6784 - * As we want to check the msg availability at timeout, Ignoring 6785 - * the timeout at wait for CP_IRQ. 6786 - */ 6787 - intel_dp_hdcp_wait_for_cp_irq(hdcp, timeout); 6788 - ret = hdcp2_detect_msg_availability(dig_port, 6789 - msg_id, &msg_ready); 6790 - if (!msg_ready) 6791 - ret = -ETIMEDOUT; 6792 - } 6793 - 6794 - if (ret) 6795 - drm_dbg_kms(&i915->drm, 6796 - "msg_id %d, ret %d, timeout(mSec): %d\n", 6797 - hdcp2_msg_data->msg_id, ret, timeout); 6798 - 6799 - return ret; 6800 - } 6801 - 6802 - static const struct hdcp2_dp_msg_data *get_hdcp2_dp_msg_data(u8 msg_id) 6803 - { 6804 - int i; 6805 - 6806 - for (i = 0; i < ARRAY_SIZE(hdcp2_dp_msg_data); i++) 6807 - if (hdcp2_dp_msg_data[i].msg_id == msg_id) 6808 - return &hdcp2_dp_msg_data[i]; 6809 - 6810 - return NULL; 6811 - } 6812 - 6813 - static 6814 - int intel_dp_hdcp2_write_msg(struct intel_digital_port *dig_port, 6815 - void *buf, size_t size) 6816 - { 6817 - struct intel_dp *dp = &dig_port->dp; 6818 - struct intel_hdcp *hdcp = &dp->attached_connector->hdcp; 6819 - unsigned int offset; 6820 - u8 *byte = buf; 6821 - ssize_t ret, bytes_to_write, len; 6822 - const struct hdcp2_dp_msg_data *hdcp2_msg_data; 6823 - 6824 - hdcp2_msg_data = get_hdcp2_dp_msg_data(*byte); 6825 - if (!hdcp2_msg_data) 6826 - return -EINVAL; 6827 - 6828 - offset = hdcp2_msg_data->offset; 6829 - 6830 - /* No msg_id in DP HDCP2.2 msgs */ 6831 - bytes_to_write = size - 1; 6832 - byte++; 6833 - 6834 - hdcp->cp_irq_count_cached = atomic_read(&hdcp->cp_irq_count); 6835 - 6836 - while (bytes_to_write) { 6837 - len = bytes_to_write > DP_AUX_MAX_PAYLOAD_BYTES ? 6838 - DP_AUX_MAX_PAYLOAD_BYTES : bytes_to_write; 6839 - 6840 - ret = drm_dp_dpcd_write(&dig_port->dp.aux, 6841 - offset, (void *)byte, len); 6842 - if (ret < 0) 6843 - return ret; 6844 - 6845 - bytes_to_write -= ret; 6846 - byte += ret; 6847 - offset += ret; 6848 - } 6849 - 6850 - return size; 6851 - } 6852 - 6853 - static 6854 - ssize_t get_receiver_id_list_size(struct intel_digital_port *dig_port) 6855 - { 6856 - u8 rx_info[HDCP_2_2_RXINFO_LEN]; 6857 - u32 dev_cnt; 6858 - ssize_t ret; 6859 - 6860 - ret = drm_dp_dpcd_read(&dig_port->dp.aux, 6861 - DP_HDCP_2_2_REG_RXINFO_OFFSET, 6862 - (void *)rx_info, HDCP_2_2_RXINFO_LEN); 6863 - if (ret != HDCP_2_2_RXINFO_LEN) 6864 - return ret >= 0 ? -EIO : ret; 6865 - 6866 - dev_cnt = (HDCP_2_2_DEV_COUNT_HI(rx_info[0]) << 4 | 6867 - HDCP_2_2_DEV_COUNT_LO(rx_info[1])); 6868 - 6869 - if (dev_cnt > HDCP_2_2_MAX_DEVICE_COUNT) 6870 - dev_cnt = HDCP_2_2_MAX_DEVICE_COUNT; 6871 - 6872 - ret = sizeof(struct hdcp2_rep_send_receiverid_list) - 6873 - HDCP_2_2_RECEIVER_IDS_MAX_LEN + 6874 - (dev_cnt * HDCP_2_2_RECEIVER_ID_LEN); 6875 - 6876 - return ret; 6877 - } 6878 - 6879 - static 6880 - int intel_dp_hdcp2_read_msg(struct intel_digital_port *dig_port, 6881 - u8 msg_id, void *buf, size_t size) 6882 - { 6883 - struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); 6884 - unsigned int offset; 6885 - u8 *byte = buf; 6886 - ssize_t ret, bytes_to_recv, len; 6887 - const struct hdcp2_dp_msg_data *hdcp2_msg_data; 6888 - 6889 - hdcp2_msg_data = get_hdcp2_dp_msg_data(msg_id); 6890 - if (!hdcp2_msg_data) 6891 - return -EINVAL; 6892 - offset = hdcp2_msg_data->offset; 6893 - 6894 - ret = intel_dp_hdcp2_wait_for_msg(dig_port, hdcp2_msg_data); 6895 - if (ret < 0) 6896 - return ret; 6897 - 6898 - if (msg_id == HDCP_2_2_REP_SEND_RECVID_LIST) { 6899 - ret = get_receiver_id_list_size(dig_port); 6900 - if (ret < 0) 6901 - return ret; 6902 - 6903 - size = ret; 6904 - } 6905 - bytes_to_recv = size - 1; 6906 - 6907 - /* DP adaptation msgs has no msg_id */ 6908 - byte++; 6909 - 6910 - while (bytes_to_recv) { 6911 - len = bytes_to_recv > DP_AUX_MAX_PAYLOAD_BYTES ? 6912 - DP_AUX_MAX_PAYLOAD_BYTES : bytes_to_recv; 6913 - 6914 - ret = drm_dp_dpcd_read(&dig_port->dp.aux, offset, 6915 - (void *)byte, len); 6916 - if (ret < 0) { 6917 - drm_dbg_kms(&i915->drm, "msg_id %d, ret %zd\n", 6918 - msg_id, ret); 6919 - return ret; 6920 - } 6921 - 6922 - bytes_to_recv -= ret; 6923 - byte += ret; 6924 - offset += ret; 6925 - } 6926 - byte = buf; 6927 - *byte = msg_id; 6928 - 6929 - return size; 6930 - } 6931 - 6932 - static 6933 - int intel_dp_hdcp2_config_stream_type(struct intel_digital_port *dig_port, 6934 - bool is_repeater, u8 content_type) 6935 - { 6936 - int ret; 6937 - struct hdcp2_dp_errata_stream_type stream_type_msg; 6938 - 6939 - if (is_repeater) 6940 - return 0; 6941 - 6942 - /* 6943 - * Errata for DP: As Stream type is used for encryption, Receiver 6944 - * should be communicated with stream type for the decryption of the 6945 - * content. 6946 - * Repeater will be communicated with stream type as a part of it's 6947 - * auth later in time. 6948 - */ 6949 - stream_type_msg.msg_id = HDCP_2_2_ERRATA_DP_STREAM_TYPE; 6950 - stream_type_msg.stream_type = content_type; 6951 - 6952 - ret = intel_dp_hdcp2_write_msg(dig_port, &stream_type_msg, 6953 - sizeof(stream_type_msg)); 6954 - 6955 - return ret < 0 ? ret : 0; 6956 - 6957 - } 6958 - 6959 - static 6960 - int intel_dp_hdcp2_check_link(struct intel_digital_port *dig_port) 6961 - { 6962 - u8 rx_status; 6963 - int ret; 6964 - 6965 - ret = intel_dp_hdcp2_read_rx_status(dig_port, &rx_status); 6966 - if (ret) 6967 - return ret; 6968 - 6969 - if (HDCP_2_2_DP_RXSTATUS_REAUTH_REQ(rx_status)) 6970 - ret = HDCP_REAUTH_REQUEST; 6971 - else if (HDCP_2_2_DP_RXSTATUS_LINK_FAILED(rx_status)) 6972 - ret = HDCP_LINK_INTEGRITY_FAILURE; 6973 - else if (HDCP_2_2_DP_RXSTATUS_READY(rx_status)) 6974 - ret = HDCP_TOPOLOGY_CHANGE; 6975 - 6976 - return ret; 6977 - } 6978 - 6979 - static 6980 - int intel_dp_hdcp2_capable(struct intel_digital_port *dig_port, 6981 - bool *capable) 6982 - { 6983 - u8 rx_caps[3]; 6984 - int ret; 6985 - 6986 - *capable = false; 6987 - ret = drm_dp_dpcd_read(&dig_port->dp.aux, 6988 - DP_HDCP_2_2_REG_RX_CAPS_OFFSET, 6989 - rx_caps, HDCP_2_2_RXCAPS_LEN); 6990 - if (ret != HDCP_2_2_RXCAPS_LEN) 6991 - return ret >= 0 ? -EIO : ret; 6992 - 6993 - if (rx_caps[0] == HDCP_2_2_RX_CAPS_VERSION_VAL && 6994 - HDCP_2_2_DP_HDCP_CAPABLE(rx_caps[2])) 6995 - *capable = true; 6996 - 6997 - return 0; 6998 - } 6999 - 7000 - static const struct intel_hdcp_shim intel_dp_hdcp_shim = { 7001 - .write_an_aksv = intel_dp_hdcp_write_an_aksv, 7002 - .read_bksv = intel_dp_hdcp_read_bksv, 7003 - .read_bstatus = intel_dp_hdcp_read_bstatus, 7004 - .repeater_present = intel_dp_hdcp_repeater_present, 7005 - .read_ri_prime = intel_dp_hdcp_read_ri_prime, 7006 - .read_ksv_ready = intel_dp_hdcp_read_ksv_ready, 7007 - .read_ksv_fifo = intel_dp_hdcp_read_ksv_fifo, 7008 - .read_v_prime_part = intel_dp_hdcp_read_v_prime_part, 7009 - .toggle_signalling = intel_dp_hdcp_toggle_signalling, 7010 - .check_link = intel_dp_hdcp_check_link, 7011 - .hdcp_capable = intel_dp_hdcp_capable, 7012 - .write_2_2_msg = intel_dp_hdcp2_write_msg, 7013 - .read_2_2_msg = intel_dp_hdcp2_read_msg, 7014 - .config_stream_type = intel_dp_hdcp2_config_stream_type, 7015 - .check_2_2_link = intel_dp_hdcp2_check_link, 7016 - .hdcp_2_2_capable = intel_dp_hdcp2_capable, 7017 - .protocol = HDCP_PROTOCOL_DP, 7018 - }; 7019 - 7020 6417 static void intel_edp_panel_vdd_sanitize(struct intel_dp *intel_dp) 7021 6418 { 7022 6419 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); ··· 7693 8298 intel_dp_add_properties(intel_dp, connector); 7694 8299 7695 8300 if (is_hdcp_supported(dev_priv, port) && !intel_dp_is_edp(intel_dp)) { 7696 - int ret = intel_hdcp_init(intel_connector, &intel_dp_hdcp_shim); 8301 + int ret = intel_dp_init_hdcp(dig_port, intel_connector); 7697 8302 if (ret) 7698 8303 drm_dbg_kms(&dev_priv->drm, 7699 8304 "HDCP init failed, skipping.\n");
+3
drivers/gpu/drm/i915/display/intel_dp.h
··· 136 136 const struct intel_crtc_state *crtc_state, 137 137 const struct drm_connector_state *conn_state); 138 138 139 + int intel_dp_init_hdcp(struct intel_digital_port *dig_port, 140 + struct intel_connector *intel_connector); 141 + 139 142 #endif /* __INTEL_DP_H__ */
+637
drivers/gpu/drm/i915/display/intel_dp_hdcp.c
··· 1 + /* SPDX-License-Identifier: MIT */ 2 + /* 3 + * Copyright (C) 2020 Google, Inc. 4 + * 5 + * Authors: 6 + * Sean Paul <seanpaul@chromium.org> 7 + */ 8 + 9 + #include <drm/drm_dp_helper.h> 10 + #include <drm/drm_hdcp.h> 11 + #include <drm/drm_print.h> 12 + 13 + #include "intel_display_types.h" 14 + #include "intel_dp.h" 15 + #include "intel_hdcp.h" 16 + 17 + static void intel_dp_hdcp_wait_for_cp_irq(struct intel_hdcp *hdcp, int timeout) 18 + { 19 + long ret; 20 + 21 + #define C (hdcp->cp_irq_count_cached != atomic_read(&hdcp->cp_irq_count)) 22 + ret = wait_event_interruptible_timeout(hdcp->cp_irq_queue, C, 23 + msecs_to_jiffies(timeout)); 24 + 25 + if (!ret) 26 + DRM_DEBUG_KMS("Timedout at waiting for CP_IRQ\n"); 27 + } 28 + 29 + static 30 + int intel_dp_hdcp_write_an_aksv(struct intel_digital_port *dig_port, 31 + u8 *an) 32 + { 33 + struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); 34 + u8 aksv[DRM_HDCP_KSV_LEN] = {}; 35 + ssize_t dpcd_ret; 36 + 37 + /* Output An first, that's easy */ 38 + dpcd_ret = drm_dp_dpcd_write(&dig_port->dp.aux, DP_AUX_HDCP_AN, 39 + an, DRM_HDCP_AN_LEN); 40 + if (dpcd_ret != DRM_HDCP_AN_LEN) { 41 + drm_dbg_kms(&i915->drm, 42 + "Failed to write An over DP/AUX (%zd)\n", 43 + dpcd_ret); 44 + return dpcd_ret >= 0 ? -EIO : dpcd_ret; 45 + } 46 + 47 + /* 48 + * Since Aksv is Oh-So-Secret, we can't access it in software. So we 49 + * send an empty buffer of the correct length through the DP helpers. On 50 + * the other side, in the transfer hook, we'll generate a flag based on 51 + * the destination address which will tickle the hardware to output the 52 + * Aksv on our behalf after the header is sent. 53 + */ 54 + dpcd_ret = drm_dp_dpcd_write(&dig_port->dp.aux, DP_AUX_HDCP_AKSV, 55 + aksv, DRM_HDCP_KSV_LEN); 56 + if (dpcd_ret != DRM_HDCP_KSV_LEN) { 57 + drm_dbg_kms(&i915->drm, 58 + "Failed to write Aksv over DP/AUX (%zd)\n", 59 + dpcd_ret); 60 + return dpcd_ret >= 0 ? -EIO : dpcd_ret; 61 + } 62 + return 0; 63 + } 64 + 65 + static int intel_dp_hdcp_read_bksv(struct intel_digital_port *dig_port, 66 + u8 *bksv) 67 + { 68 + struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); 69 + ssize_t ret; 70 + 71 + ret = drm_dp_dpcd_read(&dig_port->dp.aux, DP_AUX_HDCP_BKSV, bksv, 72 + DRM_HDCP_KSV_LEN); 73 + if (ret != DRM_HDCP_KSV_LEN) { 74 + drm_dbg_kms(&i915->drm, 75 + "Read Bksv from DP/AUX failed (%zd)\n", ret); 76 + return ret >= 0 ? -EIO : ret; 77 + } 78 + return 0; 79 + } 80 + 81 + static int intel_dp_hdcp_read_bstatus(struct intel_digital_port *dig_port, 82 + u8 *bstatus) 83 + { 84 + struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); 85 + ssize_t ret; 86 + 87 + /* 88 + * For some reason the HDMI and DP HDCP specs call this register 89 + * definition by different names. In the HDMI spec, it's called BSTATUS, 90 + * but in DP it's called BINFO. 91 + */ 92 + ret = drm_dp_dpcd_read(&dig_port->dp.aux, DP_AUX_HDCP_BINFO, 93 + bstatus, DRM_HDCP_BSTATUS_LEN); 94 + if (ret != DRM_HDCP_BSTATUS_LEN) { 95 + drm_dbg_kms(&i915->drm, 96 + "Read bstatus from DP/AUX failed (%zd)\n", ret); 97 + return ret >= 0 ? -EIO : ret; 98 + } 99 + return 0; 100 + } 101 + 102 + static 103 + int intel_dp_hdcp_read_bcaps(struct intel_digital_port *dig_port, 104 + u8 *bcaps) 105 + { 106 + struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); 107 + ssize_t ret; 108 + 109 + ret = drm_dp_dpcd_read(&dig_port->dp.aux, DP_AUX_HDCP_BCAPS, 110 + bcaps, 1); 111 + if (ret != 1) { 112 + drm_dbg_kms(&i915->drm, 113 + "Read bcaps from DP/AUX failed (%zd)\n", ret); 114 + return ret >= 0 ? -EIO : ret; 115 + } 116 + 117 + return 0; 118 + } 119 + 120 + static 121 + int intel_dp_hdcp_repeater_present(struct intel_digital_port *dig_port, 122 + bool *repeater_present) 123 + { 124 + ssize_t ret; 125 + u8 bcaps; 126 + 127 + ret = intel_dp_hdcp_read_bcaps(dig_port, &bcaps); 128 + if (ret) 129 + return ret; 130 + 131 + *repeater_present = bcaps & DP_BCAPS_REPEATER_PRESENT; 132 + return 0; 133 + } 134 + 135 + static 136 + int intel_dp_hdcp_read_ri_prime(struct intel_digital_port *dig_port, 137 + u8 *ri_prime) 138 + { 139 + struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); 140 + ssize_t ret; 141 + 142 + ret = drm_dp_dpcd_read(&dig_port->dp.aux, DP_AUX_HDCP_RI_PRIME, 143 + ri_prime, DRM_HDCP_RI_LEN); 144 + if (ret != DRM_HDCP_RI_LEN) { 145 + drm_dbg_kms(&i915->drm, "Read Ri' from DP/AUX failed (%zd)\n", 146 + ret); 147 + return ret >= 0 ? -EIO : ret; 148 + } 149 + return 0; 150 + } 151 + 152 + static 153 + int intel_dp_hdcp_read_ksv_ready(struct intel_digital_port *dig_port, 154 + bool *ksv_ready) 155 + { 156 + struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); 157 + ssize_t ret; 158 + u8 bstatus; 159 + 160 + ret = drm_dp_dpcd_read(&dig_port->dp.aux, DP_AUX_HDCP_BSTATUS, 161 + &bstatus, 1); 162 + if (ret != 1) { 163 + drm_dbg_kms(&i915->drm, 164 + "Read bstatus from DP/AUX failed (%zd)\n", ret); 165 + return ret >= 0 ? -EIO : ret; 166 + } 167 + *ksv_ready = bstatus & DP_BSTATUS_READY; 168 + return 0; 169 + } 170 + 171 + static 172 + int intel_dp_hdcp_read_ksv_fifo(struct intel_digital_port *dig_port, 173 + int num_downstream, u8 *ksv_fifo) 174 + { 175 + struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); 176 + ssize_t ret; 177 + int i; 178 + 179 + /* KSV list is read via 15 byte window (3 entries @ 5 bytes each) */ 180 + for (i = 0; i < num_downstream; i += 3) { 181 + size_t len = min(num_downstream - i, 3) * DRM_HDCP_KSV_LEN; 182 + ret = drm_dp_dpcd_read(&dig_port->dp.aux, 183 + DP_AUX_HDCP_KSV_FIFO, 184 + ksv_fifo + i * DRM_HDCP_KSV_LEN, 185 + len); 186 + if (ret != len) { 187 + drm_dbg_kms(&i915->drm, 188 + "Read ksv[%d] from DP/AUX failed (%zd)\n", 189 + i, ret); 190 + return ret >= 0 ? -EIO : ret; 191 + } 192 + } 193 + return 0; 194 + } 195 + 196 + static 197 + int intel_dp_hdcp_read_v_prime_part(struct intel_digital_port *dig_port, 198 + int i, u32 *part) 199 + { 200 + struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); 201 + ssize_t ret; 202 + 203 + if (i >= DRM_HDCP_V_PRIME_NUM_PARTS) 204 + return -EINVAL; 205 + 206 + ret = drm_dp_dpcd_read(&dig_port->dp.aux, 207 + DP_AUX_HDCP_V_PRIME(i), part, 208 + DRM_HDCP_V_PRIME_PART_LEN); 209 + if (ret != DRM_HDCP_V_PRIME_PART_LEN) { 210 + drm_dbg_kms(&i915->drm, 211 + "Read v'[%d] from DP/AUX failed (%zd)\n", i, ret); 212 + return ret >= 0 ? -EIO : ret; 213 + } 214 + return 0; 215 + } 216 + 217 + static 218 + int intel_dp_hdcp_toggle_signalling(struct intel_digital_port *dig_port, 219 + enum transcoder cpu_transcoder, 220 + bool enable) 221 + { 222 + /* Not used for single stream DisplayPort setups */ 223 + return 0; 224 + } 225 + 226 + static 227 + bool intel_dp_hdcp_check_link(struct intel_digital_port *dig_port) 228 + { 229 + struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); 230 + ssize_t ret; 231 + u8 bstatus; 232 + 233 + ret = drm_dp_dpcd_read(&dig_port->dp.aux, DP_AUX_HDCP_BSTATUS, 234 + &bstatus, 1); 235 + if (ret != 1) { 236 + drm_dbg_kms(&i915->drm, 237 + "Read bstatus from DP/AUX failed (%zd)\n", ret); 238 + return false; 239 + } 240 + 241 + return !(bstatus & (DP_BSTATUS_LINK_FAILURE | DP_BSTATUS_REAUTH_REQ)); 242 + } 243 + 244 + static 245 + int intel_dp_hdcp_capable(struct intel_digital_port *dig_port, 246 + bool *hdcp_capable) 247 + { 248 + ssize_t ret; 249 + u8 bcaps; 250 + 251 + ret = intel_dp_hdcp_read_bcaps(dig_port, &bcaps); 252 + if (ret) 253 + return ret; 254 + 255 + *hdcp_capable = bcaps & DP_BCAPS_HDCP_CAPABLE; 256 + return 0; 257 + } 258 + 259 + struct hdcp2_dp_errata_stream_type { 260 + u8 msg_id; 261 + u8 stream_type; 262 + } __packed; 263 + 264 + struct hdcp2_dp_msg_data { 265 + u8 msg_id; 266 + u32 offset; 267 + bool msg_detectable; 268 + u32 timeout; 269 + u32 timeout2; /* Added for non_paired situation */ 270 + }; 271 + 272 + static const struct hdcp2_dp_msg_data hdcp2_dp_msg_data[] = { 273 + { HDCP_2_2_AKE_INIT, DP_HDCP_2_2_AKE_INIT_OFFSET, false, 0, 0 }, 274 + { HDCP_2_2_AKE_SEND_CERT, DP_HDCP_2_2_AKE_SEND_CERT_OFFSET, 275 + false, HDCP_2_2_CERT_TIMEOUT_MS, 0 }, 276 + { HDCP_2_2_AKE_NO_STORED_KM, DP_HDCP_2_2_AKE_NO_STORED_KM_OFFSET, 277 + false, 0, 0 }, 278 + { HDCP_2_2_AKE_STORED_KM, DP_HDCP_2_2_AKE_STORED_KM_OFFSET, 279 + false, 0, 0 }, 280 + { HDCP_2_2_AKE_SEND_HPRIME, DP_HDCP_2_2_AKE_SEND_HPRIME_OFFSET, 281 + true, HDCP_2_2_HPRIME_PAIRED_TIMEOUT_MS, 282 + HDCP_2_2_HPRIME_NO_PAIRED_TIMEOUT_MS }, 283 + { HDCP_2_2_AKE_SEND_PAIRING_INFO, 284 + DP_HDCP_2_2_AKE_SEND_PAIRING_INFO_OFFSET, true, 285 + HDCP_2_2_PAIRING_TIMEOUT_MS, 0 }, 286 + { HDCP_2_2_LC_INIT, DP_HDCP_2_2_LC_INIT_OFFSET, false, 0, 0 }, 287 + { HDCP_2_2_LC_SEND_LPRIME, DP_HDCP_2_2_LC_SEND_LPRIME_OFFSET, 288 + false, HDCP_2_2_DP_LPRIME_TIMEOUT_MS, 0 }, 289 + { HDCP_2_2_SKE_SEND_EKS, DP_HDCP_2_2_SKE_SEND_EKS_OFFSET, false, 290 + 0, 0 }, 291 + { HDCP_2_2_REP_SEND_RECVID_LIST, 292 + DP_HDCP_2_2_REP_SEND_RECVID_LIST_OFFSET, true, 293 + HDCP_2_2_RECVID_LIST_TIMEOUT_MS, 0 }, 294 + { HDCP_2_2_REP_SEND_ACK, DP_HDCP_2_2_REP_SEND_ACK_OFFSET, false, 295 + 0, 0 }, 296 + { HDCP_2_2_REP_STREAM_MANAGE, 297 + DP_HDCP_2_2_REP_STREAM_MANAGE_OFFSET, false, 298 + 0, 0 }, 299 + { HDCP_2_2_REP_STREAM_READY, DP_HDCP_2_2_REP_STREAM_READY_OFFSET, 300 + false, HDCP_2_2_STREAM_READY_TIMEOUT_MS, 0 }, 301 + /* local define to shovel this through the write_2_2 interface */ 302 + #define HDCP_2_2_ERRATA_DP_STREAM_TYPE 50 303 + { HDCP_2_2_ERRATA_DP_STREAM_TYPE, 304 + DP_HDCP_2_2_REG_STREAM_TYPE_OFFSET, false, 305 + 0, 0 }, 306 + }; 307 + 308 + static int 309 + intel_dp_hdcp2_read_rx_status(struct intel_digital_port *dig_port, 310 + u8 *rx_status) 311 + { 312 + struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); 313 + ssize_t ret; 314 + 315 + ret = drm_dp_dpcd_read(&dig_port->dp.aux, 316 + DP_HDCP_2_2_REG_RXSTATUS_OFFSET, rx_status, 317 + HDCP_2_2_DP_RXSTATUS_LEN); 318 + if (ret != HDCP_2_2_DP_RXSTATUS_LEN) { 319 + drm_dbg_kms(&i915->drm, 320 + "Read bstatus from DP/AUX failed (%zd)\n", ret); 321 + return ret >= 0 ? -EIO : ret; 322 + } 323 + 324 + return 0; 325 + } 326 + 327 + static 328 + int hdcp2_detect_msg_availability(struct intel_digital_port *dig_port, 329 + u8 msg_id, bool *msg_ready) 330 + { 331 + u8 rx_status; 332 + int ret; 333 + 334 + *msg_ready = false; 335 + ret = intel_dp_hdcp2_read_rx_status(dig_port, &rx_status); 336 + if (ret < 0) 337 + return ret; 338 + 339 + switch (msg_id) { 340 + case HDCP_2_2_AKE_SEND_HPRIME: 341 + if (HDCP_2_2_DP_RXSTATUS_H_PRIME(rx_status)) 342 + *msg_ready = true; 343 + break; 344 + case HDCP_2_2_AKE_SEND_PAIRING_INFO: 345 + if (HDCP_2_2_DP_RXSTATUS_PAIRING(rx_status)) 346 + *msg_ready = true; 347 + break; 348 + case HDCP_2_2_REP_SEND_RECVID_LIST: 349 + if (HDCP_2_2_DP_RXSTATUS_READY(rx_status)) 350 + *msg_ready = true; 351 + break; 352 + default: 353 + DRM_ERROR("Unidentified msg_id: %d\n", msg_id); 354 + return -EINVAL; 355 + } 356 + 357 + return 0; 358 + } 359 + 360 + static ssize_t 361 + intel_dp_hdcp2_wait_for_msg(struct intel_digital_port *dig_port, 362 + const struct hdcp2_dp_msg_data *hdcp2_msg_data) 363 + { 364 + struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); 365 + struct intel_dp *dp = &dig_port->dp; 366 + struct intel_hdcp *hdcp = &dp->attached_connector->hdcp; 367 + u8 msg_id = hdcp2_msg_data->msg_id; 368 + int ret, timeout; 369 + bool msg_ready = false; 370 + 371 + if (msg_id == HDCP_2_2_AKE_SEND_HPRIME && !hdcp->is_paired) 372 + timeout = hdcp2_msg_data->timeout2; 373 + else 374 + timeout = hdcp2_msg_data->timeout; 375 + 376 + /* 377 + * There is no way to detect the CERT, LPRIME and STREAM_READY 378 + * availability. So Wait for timeout and read the msg. 379 + */ 380 + if (!hdcp2_msg_data->msg_detectable) { 381 + mdelay(timeout); 382 + ret = 0; 383 + } else { 384 + /* 385 + * As we want to check the msg availability at timeout, Ignoring 386 + * the timeout at wait for CP_IRQ. 387 + */ 388 + intel_dp_hdcp_wait_for_cp_irq(hdcp, timeout); 389 + ret = hdcp2_detect_msg_availability(dig_port, 390 + msg_id, &msg_ready); 391 + if (!msg_ready) 392 + ret = -ETIMEDOUT; 393 + } 394 + 395 + if (ret) 396 + drm_dbg_kms(&i915->drm, 397 + "msg_id %d, ret %d, timeout(mSec): %d\n", 398 + hdcp2_msg_data->msg_id, ret, timeout); 399 + 400 + return ret; 401 + } 402 + 403 + static const struct hdcp2_dp_msg_data *get_hdcp2_dp_msg_data(u8 msg_id) 404 + { 405 + int i; 406 + 407 + for (i = 0; i < ARRAY_SIZE(hdcp2_dp_msg_data); i++) 408 + if (hdcp2_dp_msg_data[i].msg_id == msg_id) 409 + return &hdcp2_dp_msg_data[i]; 410 + 411 + return NULL; 412 + } 413 + 414 + static 415 + int intel_dp_hdcp2_write_msg(struct intel_digital_port *dig_port, 416 + void *buf, size_t size) 417 + { 418 + struct intel_dp *dp = &dig_port->dp; 419 + struct intel_hdcp *hdcp = &dp->attached_connector->hdcp; 420 + unsigned int offset; 421 + u8 *byte = buf; 422 + ssize_t ret, bytes_to_write, len; 423 + const struct hdcp2_dp_msg_data *hdcp2_msg_data; 424 + 425 + hdcp2_msg_data = get_hdcp2_dp_msg_data(*byte); 426 + if (!hdcp2_msg_data) 427 + return -EINVAL; 428 + 429 + offset = hdcp2_msg_data->offset; 430 + 431 + /* No msg_id in DP HDCP2.2 msgs */ 432 + bytes_to_write = size - 1; 433 + byte++; 434 + 435 + hdcp->cp_irq_count_cached = atomic_read(&hdcp->cp_irq_count); 436 + 437 + while (bytes_to_write) { 438 + len = bytes_to_write > DP_AUX_MAX_PAYLOAD_BYTES ? 439 + DP_AUX_MAX_PAYLOAD_BYTES : bytes_to_write; 440 + 441 + ret = drm_dp_dpcd_write(&dig_port->dp.aux, 442 + offset, (void *)byte, len); 443 + if (ret < 0) 444 + return ret; 445 + 446 + bytes_to_write -= ret; 447 + byte += ret; 448 + offset += ret; 449 + } 450 + 451 + return size; 452 + } 453 + 454 + static 455 + ssize_t get_receiver_id_list_size(struct intel_digital_port *dig_port) 456 + { 457 + u8 rx_info[HDCP_2_2_RXINFO_LEN]; 458 + u32 dev_cnt; 459 + ssize_t ret; 460 + 461 + ret = drm_dp_dpcd_read(&dig_port->dp.aux, 462 + DP_HDCP_2_2_REG_RXINFO_OFFSET, 463 + (void *)rx_info, HDCP_2_2_RXINFO_LEN); 464 + if (ret != HDCP_2_2_RXINFO_LEN) 465 + return ret >= 0 ? -EIO : ret; 466 + 467 + dev_cnt = (HDCP_2_2_DEV_COUNT_HI(rx_info[0]) << 4 | 468 + HDCP_2_2_DEV_COUNT_LO(rx_info[1])); 469 + 470 + if (dev_cnt > HDCP_2_2_MAX_DEVICE_COUNT) 471 + dev_cnt = HDCP_2_2_MAX_DEVICE_COUNT; 472 + 473 + ret = sizeof(struct hdcp2_rep_send_receiverid_list) - 474 + HDCP_2_2_RECEIVER_IDS_MAX_LEN + 475 + (dev_cnt * HDCP_2_2_RECEIVER_ID_LEN); 476 + 477 + return ret; 478 + } 479 + 480 + static 481 + int intel_dp_hdcp2_read_msg(struct intel_digital_port *dig_port, 482 + u8 msg_id, void *buf, size_t size) 483 + { 484 + struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); 485 + unsigned int offset; 486 + u8 *byte = buf; 487 + ssize_t ret, bytes_to_recv, len; 488 + const struct hdcp2_dp_msg_data *hdcp2_msg_data; 489 + 490 + hdcp2_msg_data = get_hdcp2_dp_msg_data(msg_id); 491 + if (!hdcp2_msg_data) 492 + return -EINVAL; 493 + offset = hdcp2_msg_data->offset; 494 + 495 + ret = intel_dp_hdcp2_wait_for_msg(dig_port, hdcp2_msg_data); 496 + if (ret < 0) 497 + return ret; 498 + 499 + if (msg_id == HDCP_2_2_REP_SEND_RECVID_LIST) { 500 + ret = get_receiver_id_list_size(dig_port); 501 + if (ret < 0) 502 + return ret; 503 + 504 + size = ret; 505 + } 506 + bytes_to_recv = size - 1; 507 + 508 + /* DP adaptation msgs has no msg_id */ 509 + byte++; 510 + 511 + while (bytes_to_recv) { 512 + len = bytes_to_recv > DP_AUX_MAX_PAYLOAD_BYTES ? 513 + DP_AUX_MAX_PAYLOAD_BYTES : bytes_to_recv; 514 + 515 + ret = drm_dp_dpcd_read(&dig_port->dp.aux, offset, 516 + (void *)byte, len); 517 + if (ret < 0) { 518 + drm_dbg_kms(&i915->drm, "msg_id %d, ret %zd\n", 519 + msg_id, ret); 520 + return ret; 521 + } 522 + 523 + bytes_to_recv -= ret; 524 + byte += ret; 525 + offset += ret; 526 + } 527 + byte = buf; 528 + *byte = msg_id; 529 + 530 + return size; 531 + } 532 + 533 + static 534 + int intel_dp_hdcp2_config_stream_type(struct intel_digital_port *dig_port, 535 + bool is_repeater, u8 content_type) 536 + { 537 + int ret; 538 + struct hdcp2_dp_errata_stream_type stream_type_msg; 539 + 540 + if (is_repeater) 541 + return 0; 542 + 543 + /* 544 + * Errata for DP: As Stream type is used for encryption, Receiver 545 + * should be communicated with stream type for the decryption of the 546 + * content. 547 + * Repeater will be communicated with stream type as a part of it's 548 + * auth later in time. 549 + */ 550 + stream_type_msg.msg_id = HDCP_2_2_ERRATA_DP_STREAM_TYPE; 551 + stream_type_msg.stream_type = content_type; 552 + 553 + ret = intel_dp_hdcp2_write_msg(dig_port, &stream_type_msg, 554 + sizeof(stream_type_msg)); 555 + 556 + return ret < 0 ? ret : 0; 557 + 558 + } 559 + 560 + static 561 + int intel_dp_hdcp2_check_link(struct intel_digital_port *dig_port) 562 + { 563 + u8 rx_status; 564 + int ret; 565 + 566 + ret = intel_dp_hdcp2_read_rx_status(dig_port, &rx_status); 567 + if (ret) 568 + return ret; 569 + 570 + if (HDCP_2_2_DP_RXSTATUS_REAUTH_REQ(rx_status)) 571 + ret = HDCP_REAUTH_REQUEST; 572 + else if (HDCP_2_2_DP_RXSTATUS_LINK_FAILED(rx_status)) 573 + ret = HDCP_LINK_INTEGRITY_FAILURE; 574 + else if (HDCP_2_2_DP_RXSTATUS_READY(rx_status)) 575 + ret = HDCP_TOPOLOGY_CHANGE; 576 + 577 + return ret; 578 + } 579 + 580 + static 581 + int intel_dp_hdcp2_capable(struct intel_digital_port *dig_port, 582 + bool *capable) 583 + { 584 + u8 rx_caps[3]; 585 + int ret; 586 + 587 + *capable = false; 588 + ret = drm_dp_dpcd_read(&dig_port->dp.aux, 589 + DP_HDCP_2_2_REG_RX_CAPS_OFFSET, 590 + rx_caps, HDCP_2_2_RXCAPS_LEN); 591 + if (ret != HDCP_2_2_RXCAPS_LEN) 592 + return ret >= 0 ? -EIO : ret; 593 + 594 + if (rx_caps[0] == HDCP_2_2_RX_CAPS_VERSION_VAL && 595 + HDCP_2_2_DP_HDCP_CAPABLE(rx_caps[2])) 596 + *capable = true; 597 + 598 + return 0; 599 + } 600 + 601 + static const struct intel_hdcp_shim intel_dp_hdcp_shim = { 602 + .write_an_aksv = intel_dp_hdcp_write_an_aksv, 603 + .read_bksv = intel_dp_hdcp_read_bksv, 604 + .read_bstatus = intel_dp_hdcp_read_bstatus, 605 + .repeater_present = intel_dp_hdcp_repeater_present, 606 + .read_ri_prime = intel_dp_hdcp_read_ri_prime, 607 + .read_ksv_ready = intel_dp_hdcp_read_ksv_ready, 608 + .read_ksv_fifo = intel_dp_hdcp_read_ksv_fifo, 609 + .read_v_prime_part = intel_dp_hdcp_read_v_prime_part, 610 + .toggle_signalling = intel_dp_hdcp_toggle_signalling, 611 + .check_link = intel_dp_hdcp_check_link, 612 + .hdcp_capable = intel_dp_hdcp_capable, 613 + .write_2_2_msg = intel_dp_hdcp2_write_msg, 614 + .read_2_2_msg = intel_dp_hdcp2_read_msg, 615 + .config_stream_type = intel_dp_hdcp2_config_stream_type, 616 + .check_2_2_link = intel_dp_hdcp2_check_link, 617 + .hdcp_2_2_capable = intel_dp_hdcp2_capable, 618 + .protocol = HDCP_PROTOCOL_DP, 619 + }; 620 + 621 + int intel_dp_init_hdcp(struct intel_digital_port *dig_port, 622 + struct intel_connector *intel_connector) 623 + { 624 + struct drm_device *dev = intel_connector->base.dev; 625 + struct drm_i915_private *dev_priv = to_i915(dev); 626 + struct intel_encoder *intel_encoder = &dig_port->base; 627 + enum port port = intel_encoder->port; 628 + struct intel_dp *intel_dp = &dig_port->dp; 629 + 630 + if (!is_hdcp_supported(dev_priv, port)) 631 + return 0; 632 + 633 + if (!intel_dp_is_edp(intel_dp)) 634 + return intel_hdcp_init(intel_connector, &intel_dp_hdcp_shim); 635 + 636 + return 0; 637 + }