drm/i915/hdcp: Adjust timeout for read in DPMST Scenario
authorSuraj Kandpal <suraj.kandpal@intel.com>
Mon, 28 Aug 2023 06:34:01 +0000 (12:04 +0530)
committerUma Shankar <uma.shankar@intel.com>
Tue, 29 Aug 2023 08:21:41 +0000 (13:51 +0530)
For dpmst hdcp scenario increase the message timeout based
on the number of ports connected as each port needs to be
validated and each will take the prescribed amount of time
for the respective msg_id and total timeout will be
original_timeout * num_ports.

--v2
-Add justification for Adjusting the timeout [Arun]

Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
Reviewed-by: Arun R Murthy <arun.r.murthy@intel.com>
Signed-off-by: Uma Shankar <uma.shankar@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230828063401.600414-5-suraj.kandpal@intel.com
drivers/gpu/drm/i915/display/intel_dp_hdcp.c

index df68fd8f2eed7e96dc09df865ce0dd4de5a26632..b0cfe759d3e5b366272a152ada04ccb601959bf7 100644 (file)
@@ -560,9 +560,15 @@ int intel_dp_hdcp2_read_msg(struct intel_connector *connector,
                      DP_AUX_MAX_PAYLOAD_BYTES : bytes_to_recv;
 
                /* Entire msg read timeout since initiate of msg read */
-               if (bytes_to_recv == size - 1 && hdcp2_msg_data->msg_read_timeout > 0)
-                       msg_end = ktime_add_ms(ktime_get_raw(),
-                                              hdcp2_msg_data->msg_read_timeout);
+               if (bytes_to_recv == size - 1 && hdcp2_msg_data->msg_read_timeout > 0) {
+                       if (intel_encoder_is_mst(connector->encoder))
+                               msg_end = ktime_add_ms(ktime_get_raw(),
+                                                      hdcp2_msg_data->msg_read_timeout *
+                                                      connector->port->parent->num_ports);
+                       else
+                               msg_end = ktime_add_ms(ktime_get_raw(),
+                                                      hdcp2_msg_data->msg_read_timeout);
+               }
 
                ret = drm_dp_dpcd_read(aux, offset,
                                       (void *)byte, len);