@@ -294,37 +294,39 @@ struct hdcp2_dp_msg_data {
294
294
bool msg_detectable ;
295
295
u32 timeout ;
296
296
u32 timeout2 ; /* Added for non_paired situation */
297
+ /* Timeout to read entire msg */
298
+ u32 msg_read_timeout ;
297
299
};
298
300
299
301
static const struct hdcp2_dp_msg_data hdcp2_dp_msg_data [] = {
300
- { HDCP_2_2_AKE_INIT , DP_HDCP_2_2_AKE_INIT_OFFSET , false, 0 , 0 },
302
+ { HDCP_2_2_AKE_INIT , DP_HDCP_2_2_AKE_INIT_OFFSET , false, 0 , 0 , 0 },
301
303
{ HDCP_2_2_AKE_SEND_CERT , DP_HDCP_2_2_AKE_SEND_CERT_OFFSET ,
302
- false, HDCP_2_2_CERT_TIMEOUT_MS , 0 },
304
+ false, HDCP_2_2_CERT_TIMEOUT_MS , 0 , HDCP_2_2_DP_CERT_READ_TIMEOUT_MS },
303
305
{ HDCP_2_2_AKE_NO_STORED_KM , DP_HDCP_2_2_AKE_NO_STORED_KM_OFFSET ,
304
- false, 0 , 0 },
306
+ false, 0 , 0 , 0 },
305
307
{ HDCP_2_2_AKE_STORED_KM , DP_HDCP_2_2_AKE_STORED_KM_OFFSET ,
306
- false, 0 , 0 },
308
+ false, 0 , 0 , 0 },
307
309
{ HDCP_2_2_AKE_SEND_HPRIME , DP_HDCP_2_2_AKE_SEND_HPRIME_OFFSET ,
308
310
true, HDCP_2_2_HPRIME_PAIRED_TIMEOUT_MS ,
309
- HDCP_2_2_HPRIME_NO_PAIRED_TIMEOUT_MS },
311
+ HDCP_2_2_HPRIME_NO_PAIRED_TIMEOUT_MS , HDCP_2_2_DP_HPRIME_READ_TIMEOUT_MS },
310
312
{ HDCP_2_2_AKE_SEND_PAIRING_INFO ,
311
313
DP_HDCP_2_2_AKE_SEND_PAIRING_INFO_OFFSET , true,
312
- HDCP_2_2_PAIRING_TIMEOUT_MS , 0 },
313
- { HDCP_2_2_LC_INIT , DP_HDCP_2_2_LC_INIT_OFFSET , false, 0 , 0 },
314
+ HDCP_2_2_PAIRING_TIMEOUT_MS , 0 , HDCP_2_2_DP_PAIRING_READ_TIMEOUT_MS },
315
+ { HDCP_2_2_LC_INIT , DP_HDCP_2_2_LC_INIT_OFFSET , false, 0 , 0 , 0 },
314
316
{ HDCP_2_2_LC_SEND_LPRIME , DP_HDCP_2_2_LC_SEND_LPRIME_OFFSET ,
315
- false, HDCP_2_2_DP_LPRIME_TIMEOUT_MS , 0 },
317
+ false, HDCP_2_2_DP_LPRIME_TIMEOUT_MS , 0 , 0 },
316
318
{ HDCP_2_2_SKE_SEND_EKS , DP_HDCP_2_2_SKE_SEND_EKS_OFFSET , false,
317
- 0 , 0 },
319
+ 0 , 0 , 0 },
318
320
{ HDCP_2_2_REP_SEND_RECVID_LIST ,
319
321
DP_HDCP_2_2_REP_SEND_RECVID_LIST_OFFSET , true,
320
- HDCP_2_2_RECVID_LIST_TIMEOUT_MS , 0 },
322
+ HDCP_2_2_RECVID_LIST_TIMEOUT_MS , 0 , 0 },
321
323
{ HDCP_2_2_REP_SEND_ACK , DP_HDCP_2_2_REP_SEND_ACK_OFFSET , false,
322
- 0 , 0 },
324
+ 0 , 0 , 0 },
323
325
{ HDCP_2_2_REP_STREAM_MANAGE ,
324
326
DP_HDCP_2_2_REP_STREAM_MANAGE_OFFSET , false,
325
- 0 , 0 },
327
+ 0 , 0 , 0 },
326
328
{ HDCP_2_2_REP_STREAM_READY , DP_HDCP_2_2_REP_STREAM_READY_OFFSET ,
327
- false, HDCP_2_2_STREAM_READY_TIMEOUT_MS , 0 },
329
+ false, HDCP_2_2_STREAM_READY_TIMEOUT_MS , 0 , 0 },
328
330
/* local define to shovel this through the write_2_2 interface */
329
331
#define HDCP_2_2_ERRATA_DP_STREAM_TYPE 50
330
332
{ HDCP_2_2_ERRATA_DP_STREAM_TYPE ,
@@ -530,6 +532,8 @@ int intel_dp_hdcp2_read_msg(struct intel_digital_port *dig_port,
530
532
u8 * byte = buf ;
531
533
ssize_t ret , bytes_to_recv , len ;
532
534
const struct hdcp2_dp_msg_data * hdcp2_msg_data ;
535
+ ktime_t msg_end ;
536
+ bool msg_expired ;
533
537
534
538
hdcp2_msg_data = get_hdcp2_dp_msg_data (msg_id );
535
539
if (!hdcp2_msg_data )
@@ -556,6 +560,11 @@ int intel_dp_hdcp2_read_msg(struct intel_digital_port *dig_port,
556
560
len = bytes_to_recv > DP_AUX_MAX_PAYLOAD_BYTES ?
557
561
DP_AUX_MAX_PAYLOAD_BYTES : bytes_to_recv ;
558
562
563
+ /* Entire msg read timeout since initiate of msg read */
564
+ if (bytes_to_recv == size - 1 && hdcp2_msg_data -> msg_read_timeout > 0 )
565
+ msg_end = ktime_add_ms (ktime_get_raw (),
566
+ hdcp2_msg_data -> msg_read_timeout );
567
+
559
568
ret = drm_dp_dpcd_read (& dig_port -> dp .aux , offset ,
560
569
(void * )byte , len );
561
570
if (ret < 0 ) {
@@ -568,6 +577,16 @@ int intel_dp_hdcp2_read_msg(struct intel_digital_port *dig_port,
568
577
byte += ret ;
569
578
offset += ret ;
570
579
}
580
+
581
+ if (hdcp2_msg_data -> msg_read_timeout > 0 ) {
582
+ msg_expired = ktime_after (ktime_get_raw (), msg_end );
583
+ if (msg_expired ) {
584
+ drm_dbg_kms (& i915 -> drm , "msg_id %d, entire msg read timeout(mSec): %d\n" ,
585
+ msg_id , hdcp2_msg_data -> msg_read_timeout );
586
+ return - ETIMEDOUT ;
587
+ }
588
+ }
589
+
571
590
byte = buf ;
572
591
* byte = msg_id ;
573
592
0 commit comments