@@ -5847,6 +5847,333 @@ int intel_dp_hdcp_capable(struct intel_digital_port *intel_dig_port,
5847
5847
return 0 ;
5848
5848
}
5849
5849
5850
+ struct hdcp2_dp_errata_stream_type {
5851
+ u8 msg_id ;
5852
+ u8 stream_type ;
5853
+ } __packed ;
5854
+
5855
+ static struct hdcp2_dp_msg_data {
5856
+ u8 msg_id ;
5857
+ u32 offset ;
5858
+ bool msg_detectable ;
5859
+ u32 timeout ;
5860
+ u32 timeout2 ; /* Added for non_paired situation */
5861
+ } hdcp2_msg_data [] = {
5862
+ {HDCP_2_2_AKE_INIT , DP_HDCP_2_2_AKE_INIT_OFFSET , false, 0 , 0 },
5863
+ {HDCP_2_2_AKE_SEND_CERT , DP_HDCP_2_2_AKE_SEND_CERT_OFFSET ,
5864
+ false, HDCP_2_2_CERT_TIMEOUT_MS , 0 },
5865
+ {HDCP_2_2_AKE_NO_STORED_KM , DP_HDCP_2_2_AKE_NO_STORED_KM_OFFSET ,
5866
+ false, 0 , 0 },
5867
+ {HDCP_2_2_AKE_STORED_KM , DP_HDCP_2_2_AKE_STORED_KM_OFFSET ,
5868
+ false, 0 , 0 },
5869
+ {HDCP_2_2_AKE_SEND_HPRIME , DP_HDCP_2_2_AKE_SEND_HPRIME_OFFSET ,
5870
+ true, HDCP_2_2_HPRIME_PAIRED_TIMEOUT_MS ,
5871
+ HDCP_2_2_HPRIME_NO_PAIRED_TIMEOUT_MS },
5872
+ {HDCP_2_2_AKE_SEND_PAIRING_INFO ,
5873
+ DP_HDCP_2_2_AKE_SEND_PAIRING_INFO_OFFSET , true,
5874
+ HDCP_2_2_PAIRING_TIMEOUT_MS , 0 },
5875
+ {HDCP_2_2_LC_INIT , DP_HDCP_2_2_LC_INIT_OFFSET , false, 0 , 0 },
5876
+ {HDCP_2_2_LC_SEND_LPRIME , DP_HDCP_2_2_LC_SEND_LPRIME_OFFSET ,
5877
+ false, HDCP_2_2_DP_LPRIME_TIMEOUT_MS , 0 },
5878
+ {HDCP_2_2_SKE_SEND_EKS , DP_HDCP_2_2_SKE_SEND_EKS_OFFSET , false,
5879
+ 0 , 0 },
5880
+ {HDCP_2_2_REP_SEND_RECVID_LIST ,
5881
+ DP_HDCP_2_2_REP_SEND_RECVID_LIST_OFFSET , true,
5882
+ HDCP_2_2_RECVID_LIST_TIMEOUT_MS , 0 },
5883
+ {HDCP_2_2_REP_SEND_ACK , DP_HDCP_2_2_REP_SEND_ACK_OFFSET , false,
5884
+ 0 , 0 },
5885
+ {HDCP_2_2_REP_STREAM_MANAGE ,
5886
+ DP_HDCP_2_2_REP_STREAM_MANAGE_OFFSET , false,
5887
+ 0 , 0 },
5888
+ {HDCP_2_2_REP_STREAM_READY , DP_HDCP_2_2_REP_STREAM_READY_OFFSET ,
5889
+ false, HDCP_2_2_STREAM_READY_TIMEOUT_MS , 0 },
5890
+ /* local define to shovel this through the write_2_2 interface */
5891
+ #define HDCP_2_2_ERRATA_DP_STREAM_TYPE 50
5892
+ {HDCP_2_2_ERRATA_DP_STREAM_TYPE ,
5893
+ DP_HDCP_2_2_REG_STREAM_TYPE_OFFSET , false,
5894
+ 0 , 0 },
5895
+ };
5896
+
5897
+ static inline
5898
+ int intel_dp_hdcp2_read_rx_status (struct intel_digital_port * intel_dig_port ,
5899
+ u8 * rx_status )
5900
+ {
5901
+ ssize_t ret ;
5902
+
5903
+ ret = drm_dp_dpcd_read (& intel_dig_port -> dp .aux ,
5904
+ DP_HDCP_2_2_REG_RXSTATUS_OFFSET , rx_status ,
5905
+ HDCP_2_2_DP_RXSTATUS_LEN );
5906
+ if (ret != HDCP_2_2_DP_RXSTATUS_LEN ) {
5907
+ DRM_DEBUG_KMS ("Read bstatus from DP/AUX failed (%zd)\n" , ret );
5908
+ return ret >= 0 ? - EIO : ret ;
5909
+ }
5910
+
5911
+ return 0 ;
5912
+ }
5913
+
5914
+ static
5915
+ int hdcp2_detect_msg_availability (struct intel_digital_port * intel_dig_port ,
5916
+ u8 msg_id , bool * msg_ready )
5917
+ {
5918
+ u8 rx_status ;
5919
+ int ret ;
5920
+
5921
+ * msg_ready = false;
5922
+ ret = intel_dp_hdcp2_read_rx_status (intel_dig_port , & rx_status );
5923
+ if (ret < 0 )
5924
+ return ret ;
5925
+
5926
+ switch (msg_id ) {
5927
+ case HDCP_2_2_AKE_SEND_HPRIME :
5928
+ if (HDCP_2_2_DP_RXSTATUS_H_PRIME (rx_status ))
5929
+ * msg_ready = true;
5930
+ break ;
5931
+ case HDCP_2_2_AKE_SEND_PAIRING_INFO :
5932
+ if (HDCP_2_2_DP_RXSTATUS_PAIRING (rx_status ))
5933
+ * msg_ready = true;
5934
+ break ;
5935
+ case HDCP_2_2_REP_SEND_RECVID_LIST :
5936
+ if (HDCP_2_2_DP_RXSTATUS_READY (rx_status ))
5937
+ * msg_ready = true;
5938
+ break ;
5939
+ default :
5940
+ DRM_ERROR ("Unidentified msg_id: %d\n" , msg_id );
5941
+ return - EINVAL ;
5942
+ }
5943
+
5944
+ return 0 ;
5945
+ }
5946
+
5947
+ static ssize_t
5948
+ intel_dp_hdcp2_wait_for_msg (struct intel_digital_port * intel_dig_port ,
5949
+ struct hdcp2_dp_msg_data * hdcp2_msg_data )
5950
+ {
5951
+ struct intel_dp * dp = & intel_dig_port -> dp ;
5952
+ struct intel_hdcp * hdcp = & dp -> attached_connector -> hdcp ;
5953
+ u8 msg_id = hdcp2_msg_data -> msg_id ;
5954
+ int ret , timeout ;
5955
+ bool msg_ready = false;
5956
+
5957
+ if (msg_id == HDCP_2_2_AKE_SEND_HPRIME && !hdcp -> is_paired )
5958
+ timeout = hdcp2_msg_data -> timeout2 ;
5959
+ else
5960
+ timeout = hdcp2_msg_data -> timeout ;
5961
+
5962
+ /*
5963
+ * There is no way to detect the CERT, LPRIME and STREAM_READY
5964
+ * availability. So Wait for timeout and read the msg.
5965
+ */
5966
+ if (!hdcp2_msg_data -> msg_detectable ) {
5967
+ mdelay (timeout );
5968
+ ret = 0 ;
5969
+ } else {
5970
+ /* TODO: In case if you need to wait on CP_IRQ, do it here */
5971
+ ret = __wait_for (ret =
5972
+ hdcp2_detect_msg_availability (intel_dig_port ,
5973
+ msg_id ,
5974
+ & msg_ready ),
5975
+ !ret && msg_ready , timeout * 1000 ,
5976
+ 1000 , 5 * 1000 );
5977
+
5978
+ if (!msg_ready )
5979
+ ret = - ETIMEDOUT ;
5980
+ }
5981
+
5982
+ if (ret )
5983
+ DRM_DEBUG_KMS ("msg_id %d, ret %d, timeout(mSec): %d\n" ,
5984
+ hdcp2_msg_data -> msg_id , ret , timeout );
5985
+
5986
+ return ret ;
5987
+ }
5988
+
5989
+ static struct hdcp2_dp_msg_data * get_hdcp2_dp_msg_data (u8 msg_id )
5990
+ {
5991
+ int i ;
5992
+
5993
+ for (i = 0 ; i < ARRAY_SIZE (hdcp2_msg_data ); i ++ )
5994
+ if (hdcp2_msg_data [i ].msg_id == msg_id )
5995
+ return & hdcp2_msg_data [i ];
5996
+
5997
+ return NULL ;
5998
+ }
5999
+
6000
+ static
6001
+ int intel_dp_hdcp2_write_msg (struct intel_digital_port * intel_dig_port ,
6002
+ void * buf , size_t size )
6003
+ {
6004
+ unsigned int offset ;
6005
+ u8 * byte = buf ;
6006
+ ssize_t ret , bytes_to_write , len ;
6007
+ struct hdcp2_dp_msg_data * hdcp2_msg_data ;
6008
+
6009
+ hdcp2_msg_data = get_hdcp2_dp_msg_data (* byte );
6010
+ if (!hdcp2_msg_data )
6011
+ return - EINVAL ;
6012
+
6013
+ offset = hdcp2_msg_data -> offset ;
6014
+
6015
+ /* No msg_id in DP HDCP2.2 msgs */
6016
+ bytes_to_write = size - 1 ;
6017
+ byte ++ ;
6018
+
6019
+ while (bytes_to_write ) {
6020
+ len = bytes_to_write > DP_AUX_MAX_PAYLOAD_BYTES ?
6021
+ DP_AUX_MAX_PAYLOAD_BYTES : bytes_to_write ;
6022
+
6023
+ ret = drm_dp_dpcd_write (& intel_dig_port -> dp .aux ,
6024
+ offset , (void * )byte , len );
6025
+ if (ret < 0 )
6026
+ return ret ;
6027
+
6028
+ bytes_to_write -= ret ;
6029
+ byte += ret ;
6030
+ offset += ret ;
6031
+ }
6032
+
6033
+ return size ;
6034
+ }
6035
+
6036
+ static
6037
+ ssize_t get_receiver_id_list_size (struct intel_digital_port * intel_dig_port )
6038
+ {
6039
+ u8 rx_info [HDCP_2_2_RXINFO_LEN ];
6040
+ u32 dev_cnt ;
6041
+ ssize_t ret ;
6042
+
6043
+ ret = drm_dp_dpcd_read (& intel_dig_port -> dp .aux ,
6044
+ DP_HDCP_2_2_REG_RXINFO_OFFSET ,
6045
+ (void * )rx_info , HDCP_2_2_RXINFO_LEN );
6046
+ if (ret != HDCP_2_2_RXINFO_LEN )
6047
+ return ret >= 0 ? - EIO : ret ;
6048
+
6049
+ dev_cnt = (HDCP_2_2_DEV_COUNT_HI (rx_info [0 ]) << 4 |
6050
+ HDCP_2_2_DEV_COUNT_LO (rx_info [1 ]));
6051
+
6052
+ if (dev_cnt > HDCP_2_2_MAX_DEVICE_COUNT )
6053
+ dev_cnt = HDCP_2_2_MAX_DEVICE_COUNT ;
6054
+
6055
+ ret = sizeof (struct hdcp2_rep_send_receiverid_list ) -
6056
+ HDCP_2_2_RECEIVER_IDS_MAX_LEN +
6057
+ (dev_cnt * HDCP_2_2_RECEIVER_ID_LEN );
6058
+
6059
+ return ret ;
6060
+ }
6061
+
6062
+ static
6063
+ int intel_dp_hdcp2_read_msg (struct intel_digital_port * intel_dig_port ,
6064
+ u8 msg_id , void * buf , size_t size )
6065
+ {
6066
+ unsigned int offset ;
6067
+ u8 * byte = buf ;
6068
+ ssize_t ret , bytes_to_recv , len ;
6069
+ struct hdcp2_dp_msg_data * hdcp2_msg_data ;
6070
+
6071
+ hdcp2_msg_data = get_hdcp2_dp_msg_data (msg_id );
6072
+ if (!hdcp2_msg_data )
6073
+ return - EINVAL ;
6074
+ offset = hdcp2_msg_data -> offset ;
6075
+
6076
+ ret = intel_dp_hdcp2_wait_for_msg (intel_dig_port , hdcp2_msg_data );
6077
+ if (ret < 0 )
6078
+ return ret ;
6079
+
6080
+ if (msg_id == HDCP_2_2_REP_SEND_RECVID_LIST ) {
6081
+ ret = get_receiver_id_list_size (intel_dig_port );
6082
+ if (ret < 0 )
6083
+ return ret ;
6084
+
6085
+ size = ret ;
6086
+ }
6087
+ bytes_to_recv = size - 1 ;
6088
+
6089
+ /* DP adaptation msgs has no msg_id */
6090
+ byte ++ ;
6091
+
6092
+ while (bytes_to_recv ) {
6093
+ len = bytes_to_recv > DP_AUX_MAX_PAYLOAD_BYTES ?
6094
+ DP_AUX_MAX_PAYLOAD_BYTES : bytes_to_recv ;
6095
+
6096
+ ret = drm_dp_dpcd_read (& intel_dig_port -> dp .aux , offset ,
6097
+ (void * )byte , len );
6098
+ if (ret < 0 ) {
6099
+ DRM_DEBUG_KMS ("msg_id %d, ret %zd\n" , msg_id , ret );
6100
+ return ret ;
6101
+ }
6102
+
6103
+ bytes_to_recv -= ret ;
6104
+ byte += ret ;
6105
+ offset += ret ;
6106
+ }
6107
+ byte = buf ;
6108
+ * byte = msg_id ;
6109
+
6110
+ return size ;
6111
+ }
6112
+
6113
+ static
6114
+ int intel_dp_hdcp2_config_stream_type (struct intel_digital_port * intel_dig_port ,
6115
+ bool is_repeater , u8 content_type )
6116
+ {
6117
+ struct hdcp2_dp_errata_stream_type stream_type_msg ;
6118
+
6119
+ if (is_repeater )
6120
+ return 0 ;
6121
+
6122
+ /*
6123
+ * Errata for DP: As Stream type is used for encryption, Receiver
6124
+ * should be communicated with stream type for the decryption of the
6125
+ * content.
6126
+ * Repeater will be communicated with stream type as a part of it's
6127
+ * auth later in time.
6128
+ */
6129
+ stream_type_msg .msg_id = HDCP_2_2_ERRATA_DP_STREAM_TYPE ;
6130
+ stream_type_msg .stream_type = content_type ;
6131
+
6132
+ return intel_dp_hdcp2_write_msg (intel_dig_port , & stream_type_msg ,
6133
+ sizeof (stream_type_msg ));
6134
+ }
6135
+
6136
+ static
6137
+ int intel_dp_hdcp2_check_link (struct intel_digital_port * intel_dig_port )
6138
+ {
6139
+ u8 rx_status ;
6140
+ int ret ;
6141
+
6142
+ ret = intel_dp_hdcp2_read_rx_status (intel_dig_port , & rx_status );
6143
+ if (ret )
6144
+ return ret ;
6145
+
6146
+ if (HDCP_2_2_DP_RXSTATUS_REAUTH_REQ (rx_status ))
6147
+ ret = HDCP_REAUTH_REQUEST ;
6148
+ else if (HDCP_2_2_DP_RXSTATUS_LINK_FAILED (rx_status ))
6149
+ ret = HDCP_LINK_INTEGRITY_FAILURE ;
6150
+ else if (HDCP_2_2_DP_RXSTATUS_READY (rx_status ))
6151
+ ret = HDCP_TOPOLOGY_CHANGE ;
6152
+
6153
+ return ret ;
6154
+ }
6155
+
6156
+ static
6157
+ int intel_dp_hdcp2_capable (struct intel_digital_port * intel_dig_port ,
6158
+ bool * capable )
6159
+ {
6160
+ u8 rx_caps [3 ];
6161
+ int ret ;
6162
+
6163
+ * capable = false;
6164
+ ret = drm_dp_dpcd_read (& intel_dig_port -> dp .aux ,
6165
+ DP_HDCP_2_2_REG_RX_CAPS_OFFSET ,
6166
+ rx_caps , HDCP_2_2_RXCAPS_LEN );
6167
+ if (ret != HDCP_2_2_RXCAPS_LEN )
6168
+ return ret >= 0 ? - EIO : ret ;
6169
+
6170
+ if (rx_caps [0 ] == HDCP_2_2_RX_CAPS_VERSION_VAL &&
6171
+ HDCP_2_2_DP_HDCP_CAPABLE (rx_caps [2 ]))
6172
+ * capable = true;
6173
+
6174
+ return 0 ;
6175
+ }
6176
+
5850
6177
static const struct intel_hdcp_shim intel_dp_hdcp_shim = {
5851
6178
.write_an_aksv = intel_dp_hdcp_write_an_aksv ,
5852
6179
.read_bksv = intel_dp_hdcp_read_bksv ,
@@ -5859,6 +6186,12 @@ static const struct intel_hdcp_shim intel_dp_hdcp_shim = {
5859
6186
.toggle_signalling = intel_dp_hdcp_toggle_signalling ,
5860
6187
.check_link = intel_dp_hdcp_check_link ,
5861
6188
.hdcp_capable = intel_dp_hdcp_capable ,
6189
+ .write_2_2_msg = intel_dp_hdcp2_write_msg ,
6190
+ .read_2_2_msg = intel_dp_hdcp2_read_msg ,
6191
+ .config_stream_type = intel_dp_hdcp2_config_stream_type ,
6192
+ .check_2_2_link = intel_dp_hdcp2_check_link ,
6193
+ .hdcp_2_2_capable = intel_dp_hdcp2_capable ,
6194
+ .protocol = HDCP_PROTOCOL_DP ,
5862
6195
};
5863
6196
5864
6197
static void intel_edp_panel_vdd_sanitize (struct intel_dp * intel_dp )
0 commit comments