drm/amd/display: add authentication_complete in hdcp output
authorWenjing Liu <wenjing.liu@amd.com>
Mon, 26 Jul 2021 18:59:03 +0000 (14:59 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 9 Aug 2021 19:43:33 +0000 (15:43 -0400)
[why]
DM needs to be notified when hdcp module has completed
authentication attempt.

Reviewed-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com>
Reviewed-by: George Shen <George.Shen@amd.com>
Acked-by: Anson Jacob <Anson.Jacob@amd.com>
Signed-off-by: Wenjing Liu <wenjing.liu@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/modules/hdcp/hdcp.c
drivers/gpu/drm/amd/display/modules/hdcp/hdcp.h
drivers/gpu/drm/amd/display/modules/hdcp/hdcp1_transition.c
drivers/gpu/drm/amd/display/modules/hdcp/hdcp2_transition.c
drivers/gpu/drm/amd/display/modules/hdcp/hdcp_log.c
drivers/gpu/drm/amd/display/modules/hdcp/hdcp_log.h
drivers/gpu/drm/amd/display/modules/inc/mod_hdcp.h

index 06d60f031a0680bf799035697ad2fb654e8c2498..3e81850a7ffe3a8364c521561e9275b374f5023e 100644 (file)
@@ -145,6 +145,7 @@ static enum mod_hdcp_status transition(struct mod_hdcp *hdcp,
                        } else {
                                callback_in_ms(0, output);
                                set_state_id(hdcp, output, HDCP_CP_NOT_DESIRED);
+                               set_auth_complete(hdcp, output);
                        }
                else if (is_hdmi_dvi_sl_hdcp(hdcp))
                        if (is_cp_desired_hdcp2(hdcp)) {
@@ -156,10 +157,12 @@ static enum mod_hdcp_status transition(struct mod_hdcp *hdcp,
                        } else {
                                callback_in_ms(0, output);
                                set_state_id(hdcp, output, HDCP_CP_NOT_DESIRED);
+                               set_auth_complete(hdcp, output);
                        }
                else {
                        callback_in_ms(0, output);
                        set_state_id(hdcp, output, HDCP_CP_NOT_DESIRED);
+                       set_auth_complete(hdcp, output);
                }
        } else if (is_in_cp_not_desired_state(hdcp)) {
                increment_stay_counter(hdcp);
@@ -520,7 +523,7 @@ enum mod_hdcp_status mod_hdcp_process_event(struct mod_hdcp *hdcp,
 
        /* reset authentication if needed */
        if (trans_status == MOD_HDCP_STATUS_RESET_NEEDED) {
-               HDCP_FULL_DDC_TRACE(hdcp);
+               mod_hdcp_log_ddc_trace(hdcp);
                reset_status = reset_authentication(hdcp, output);
                if (reset_status != MOD_HDCP_STATUS_SUCCESS)
                        push_error_status(hdcp, reset_status);
index 7123f0915706cd721c9e309533465dedaa1dc40e..399fbca8947bdaa7e4e6b6065f71f6448e668b07 100644 (file)
@@ -324,6 +324,7 @@ enum mod_hdcp_status mod_hdcp_hdcp2_dp_transition(struct mod_hdcp *hdcp,
 /* log functions */
 void mod_hdcp_dump_binary_message(uint8_t *msg, uint32_t msg_size,
                uint8_t *buf, uint32_t buf_size);
+void mod_hdcp_log_ddc_trace(struct mod_hdcp *hdcp);
 /* TODO: add adjustment log */
 
 /* psp functions */
@@ -494,6 +495,13 @@ static inline void set_watchdog_in_ms(struct mod_hdcp *hdcp, uint16_t time,
        output->watchdog_timer_delay = time;
 }
 
+static inline void set_auth_complete(struct mod_hdcp *hdcp,
+               struct mod_hdcp_output *output)
+{
+       output->auth_complete = 1;
+       mod_hdcp_log_ddc_trace(hdcp);
+}
+
 /* connection topology helpers */
 static inline uint8_t is_display_active(struct mod_hdcp_display *display)
 {
index 3dda8c1d83fc0154b7703d80c1fe008e9c381827..7f011196ce98a0b8c5021d0883994fb139f213c4 100644 (file)
@@ -89,7 +89,7 @@ enum mod_hdcp_status mod_hdcp_hdcp1_transition(struct mod_hdcp *hdcp,
                } else {
                        callback_in_ms(0, output);
                        set_state_id(hdcp, output, H1_A45_AUTHENTICATED);
-                       HDCP_FULL_DDC_TRACE(hdcp);
+                       set_auth_complete(hdcp, output);
                }
                break;
        case H1_A45_AUTHENTICATED:
@@ -137,7 +137,7 @@ enum mod_hdcp_status mod_hdcp_hdcp1_transition(struct mod_hdcp *hdcp,
                }
                callback_in_ms(0, output);
                set_state_id(hdcp, output, H1_A45_AUTHENTICATED);
-               HDCP_FULL_DDC_TRACE(hdcp);
+               set_auth_complete(hdcp, output);
                break;
        default:
                status = MOD_HDCP_STATUS_INVALID_STATE;
@@ -239,7 +239,7 @@ enum mod_hdcp_status mod_hdcp_hdcp1_dp_transition(struct mod_hdcp *hdcp,
                        set_state_id(hdcp, output, D1_A6_WAIT_FOR_READY);
                } else {
                        set_state_id(hdcp, output, D1_A4_AUTHENTICATED);
-                       HDCP_FULL_DDC_TRACE(hdcp);
+                       set_auth_complete(hdcp, output);
                }
                break;
        case D1_A4_AUTHENTICATED:
@@ -311,7 +311,7 @@ enum mod_hdcp_status mod_hdcp_hdcp1_dp_transition(struct mod_hdcp *hdcp,
                        break;
                }
                set_state_id(hdcp, output, D1_A4_AUTHENTICATED);
-               HDCP_FULL_DDC_TRACE(hdcp);
+               set_auth_complete(hdcp, output);
                break;
        default:
                fail_and_restart_in_ms(0, &status, output);
index 70cb230d8f56c17a187a5d57ce32b7c0ece67e8b..1f4095b2640971684a391b36ab22649b3a3fca45 100644 (file)
@@ -242,7 +242,7 @@ enum mod_hdcp_status mod_hdcp_hdcp2_transition(struct mod_hdcp *hdcp,
                }
                callback_in_ms(0, output);
                set_state_id(hdcp, output, H2_A5_AUTHENTICATED);
-               HDCP_FULL_DDC_TRACE(hdcp);
+               set_auth_complete(hdcp, output);
                break;
        case H2_A5_AUTHENTICATED:
                if (input->rxstatus_read == FAIL ||
@@ -559,7 +559,7 @@ enum mod_hdcp_status mod_hdcp_hdcp2_dp_transition(struct mod_hdcp *hdcp,
                        break;
                }
                set_state_id(hdcp, output, D2_A5_AUTHENTICATED);
-               HDCP_FULL_DDC_TRACE(hdcp);
+               set_auth_complete(hdcp, output);
                break;
        case D2_A5_AUTHENTICATED:
                if (input->rxstatus_read == FAIL ||
index 1a0f7c3dc96490c0c65e549f0ad18efaf7169ec7..6b3b5f610907d7b4e8787055ff5500986d79b6fb 100644 (file)
@@ -51,6 +51,80 @@ void mod_hdcp_dump_binary_message(uint8_t *msg, uint32_t msg_size,
        }
 }
 
+void mod_hdcp_log_ddc_trace(struct mod_hdcp *hdcp)
+{
+       if (is_hdcp1(hdcp)) {
+               HDCP_DDC_READ_TRACE(hdcp, "BKSV", hdcp->auth.msg.hdcp1.bksv,
+                               sizeof(hdcp->auth.msg.hdcp1.bksv));
+               HDCP_DDC_READ_TRACE(hdcp, "BCAPS", &hdcp->auth.msg.hdcp1.bcaps,
+                               sizeof(hdcp->auth.msg.hdcp1.bcaps));
+               HDCP_DDC_READ_TRACE(hdcp, "BSTATUS",
+                               (uint8_t *)&hdcp->auth.msg.hdcp1.bstatus,
+                               sizeof(hdcp->auth.msg.hdcp1.bstatus));
+               HDCP_DDC_WRITE_TRACE(hdcp, "AN", hdcp->auth.msg.hdcp1.an,
+                               sizeof(hdcp->auth.msg.hdcp1.an));
+               HDCP_DDC_WRITE_TRACE(hdcp, "AKSV", hdcp->auth.msg.hdcp1.aksv,
+                               sizeof(hdcp->auth.msg.hdcp1.aksv));
+               HDCP_DDC_WRITE_TRACE(hdcp, "AINFO", &hdcp->auth.msg.hdcp1.ainfo,
+                               sizeof(hdcp->auth.msg.hdcp1.ainfo));
+               HDCP_DDC_READ_TRACE(hdcp, "RI' / R0'",
+                               (uint8_t *)&hdcp->auth.msg.hdcp1.r0p,
+                               sizeof(hdcp->auth.msg.hdcp1.r0p));
+               HDCP_DDC_READ_TRACE(hdcp, "BINFO",
+                               (uint8_t *)&hdcp->auth.msg.hdcp1.binfo_dp,
+                               sizeof(hdcp->auth.msg.hdcp1.binfo_dp));
+               HDCP_DDC_READ_TRACE(hdcp, "KSVLIST", hdcp->auth.msg.hdcp1.ksvlist,
+                               hdcp->auth.msg.hdcp1.ksvlist_size);
+               HDCP_DDC_READ_TRACE(hdcp, "V'", hdcp->auth.msg.hdcp1.vp,
+                               sizeof(hdcp->auth.msg.hdcp1.vp));
+       } else if (is_hdcp2(hdcp)) {
+               HDCP_DDC_READ_TRACE(hdcp, "HDCP2Version",
+                               &hdcp->auth.msg.hdcp2.hdcp2version_hdmi,
+                               sizeof(hdcp->auth.msg.hdcp2.hdcp2version_hdmi));
+               HDCP_DDC_READ_TRACE(hdcp, "Rx Caps", hdcp->auth.msg.hdcp2.rxcaps_dp,
+                               sizeof(hdcp->auth.msg.hdcp2.rxcaps_dp));
+               HDCP_DDC_WRITE_TRACE(hdcp, "AKE Init", hdcp->auth.msg.hdcp2.ake_init,
+                               sizeof(hdcp->auth.msg.hdcp2.ake_init));
+               HDCP_DDC_READ_TRACE(hdcp, "AKE Cert", hdcp->auth.msg.hdcp2.ake_cert,
+                               sizeof(hdcp->auth.msg.hdcp2.ake_cert));
+               HDCP_DDC_WRITE_TRACE(hdcp, "Stored KM",
+                               hdcp->auth.msg.hdcp2.ake_stored_km,
+                               sizeof(hdcp->auth.msg.hdcp2.ake_stored_km));
+               HDCP_DDC_WRITE_TRACE(hdcp, "No Stored KM",
+                               hdcp->auth.msg.hdcp2.ake_no_stored_km,
+                               sizeof(hdcp->auth.msg.hdcp2.ake_no_stored_km));
+               HDCP_DDC_READ_TRACE(hdcp, "H'", hdcp->auth.msg.hdcp2.ake_h_prime,
+                               sizeof(hdcp->auth.msg.hdcp2.ake_h_prime));
+               HDCP_DDC_READ_TRACE(hdcp, "Pairing Info",
+                               hdcp->auth.msg.hdcp2.ake_pairing_info,
+                               sizeof(hdcp->auth.msg.hdcp2.ake_pairing_info));
+               HDCP_DDC_WRITE_TRACE(hdcp, "LC Init", hdcp->auth.msg.hdcp2.lc_init,
+                               sizeof(hdcp->auth.msg.hdcp2.lc_init));
+               HDCP_DDC_READ_TRACE(hdcp, "L'", hdcp->auth.msg.hdcp2.lc_l_prime,
+                               sizeof(hdcp->auth.msg.hdcp2.lc_l_prime));
+               HDCP_DDC_WRITE_TRACE(hdcp, "Exchange KS", hdcp->auth.msg.hdcp2.ske_eks,
+                               sizeof(hdcp->auth.msg.hdcp2.ske_eks));
+               HDCP_DDC_READ_TRACE(hdcp, "Rx Status",
+                               (uint8_t *)&hdcp->auth.msg.hdcp2.rxstatus,
+                               sizeof(hdcp->auth.msg.hdcp2.rxstatus));
+               HDCP_DDC_READ_TRACE(hdcp, "Rx Id List",
+                               hdcp->auth.msg.hdcp2.rx_id_list,
+                               hdcp->auth.msg.hdcp2.rx_id_list_size);
+               HDCP_DDC_WRITE_TRACE(hdcp, "Rx Id List Ack",
+                               hdcp->auth.msg.hdcp2.repeater_auth_ack,
+                               sizeof(hdcp->auth.msg.hdcp2.repeater_auth_ack));
+               HDCP_DDC_WRITE_TRACE(hdcp, "Content Stream Management",
+                               hdcp->auth.msg.hdcp2.repeater_auth_stream_manage,
+                               hdcp->auth.msg.hdcp2.stream_manage_size);
+               HDCP_DDC_READ_TRACE(hdcp, "Stream Ready",
+                               hdcp->auth.msg.hdcp2.repeater_auth_stream_ready,
+                               sizeof(hdcp->auth.msg.hdcp2.repeater_auth_stream_ready));
+               HDCP_DDC_WRITE_TRACE(hdcp, "Content Stream Type",
+                               hdcp->auth.msg.hdcp2.content_stream_type_dp,
+                               sizeof(hdcp->auth.msg.hdcp2.content_stream_type_dp));
+       }
+}
+
 char *mod_hdcp_status_to_str(int32_t status)
 {
        switch (status) {
index 47f8ee2832ff09716a623c8919f20840f60debf5..eb6f9b9c504a251e7e0c0da0d42dffb9ee518133 100644 (file)
                                hdcp->config.index, msg_name,\
                                hdcp->buf); \
 } while (0)
-#define HDCP_FULL_DDC_TRACE(hdcp) do { \
-       if (is_hdcp1(hdcp)) { \
-               HDCP_DDC_READ_TRACE(hdcp, "BKSV", hdcp->auth.msg.hdcp1.bksv, \
-                               sizeof(hdcp->auth.msg.hdcp1.bksv)); \
-               HDCP_DDC_READ_TRACE(hdcp, "BCAPS", &hdcp->auth.msg.hdcp1.bcaps, \
-                               sizeof(hdcp->auth.msg.hdcp1.bcaps)); \
-               HDCP_DDC_READ_TRACE(hdcp, "BSTATUS", \
-                               (uint8_t *)&hdcp->auth.msg.hdcp1.bstatus, \
-                               sizeof(hdcp->auth.msg.hdcp1.bstatus)); \
-               HDCP_DDC_WRITE_TRACE(hdcp, "AN", hdcp->auth.msg.hdcp1.an, \
-                               sizeof(hdcp->auth.msg.hdcp1.an)); \
-               HDCP_DDC_WRITE_TRACE(hdcp, "AKSV", hdcp->auth.msg.hdcp1.aksv, \
-                               sizeof(hdcp->auth.msg.hdcp1.aksv)); \
-               HDCP_DDC_WRITE_TRACE(hdcp, "AINFO", &hdcp->auth.msg.hdcp1.ainfo, \
-                               sizeof(hdcp->auth.msg.hdcp1.ainfo)); \
-               HDCP_DDC_READ_TRACE(hdcp, "RI' / R0'", \
-                               (uint8_t *)&hdcp->auth.msg.hdcp1.r0p, \
-                               sizeof(hdcp->auth.msg.hdcp1.r0p)); \
-               HDCP_DDC_READ_TRACE(hdcp, "BINFO", \
-                               (uint8_t *)&hdcp->auth.msg.hdcp1.binfo_dp, \
-                               sizeof(hdcp->auth.msg.hdcp1.binfo_dp)); \
-               HDCP_DDC_READ_TRACE(hdcp, "KSVLIST", hdcp->auth.msg.hdcp1.ksvlist, \
-                               hdcp->auth.msg.hdcp1.ksvlist_size); \
-               HDCP_DDC_READ_TRACE(hdcp, "V'", hdcp->auth.msg.hdcp1.vp, \
-                               sizeof(hdcp->auth.msg.hdcp1.vp)); \
-       } else { \
-               HDCP_DDC_READ_TRACE(hdcp, "HDCP2Version", \
-                               &hdcp->auth.msg.hdcp2.hdcp2version_hdmi, \
-                               sizeof(hdcp->auth.msg.hdcp2.hdcp2version_hdmi)); \
-               HDCP_DDC_READ_TRACE(hdcp, "Rx Caps", hdcp->auth.msg.hdcp2.rxcaps_dp, \
-                               sizeof(hdcp->auth.msg.hdcp2.rxcaps_dp)); \
-               HDCP_DDC_WRITE_TRACE(hdcp, "AKE Init", hdcp->auth.msg.hdcp2.ake_init, \
-                               sizeof(hdcp->auth.msg.hdcp2.ake_init)); \
-               HDCP_DDC_READ_TRACE(hdcp, "AKE Cert", hdcp->auth.msg.hdcp2.ake_cert, \
-                               sizeof(hdcp->auth.msg.hdcp2.ake_cert)); \
-               HDCP_DDC_WRITE_TRACE(hdcp, "Stored KM", \
-                               hdcp->auth.msg.hdcp2.ake_stored_km, \
-                               sizeof(hdcp->auth.msg.hdcp2.ake_stored_km)); \
-               HDCP_DDC_WRITE_TRACE(hdcp, "No Stored KM", \
-                               hdcp->auth.msg.hdcp2.ake_no_stored_km, \
-                               sizeof(hdcp->auth.msg.hdcp2.ake_no_stored_km)); \
-               HDCP_DDC_READ_TRACE(hdcp, "H'", hdcp->auth.msg.hdcp2.ake_h_prime, \
-                               sizeof(hdcp->auth.msg.hdcp2.ake_h_prime)); \
-               HDCP_DDC_READ_TRACE(hdcp, "Pairing Info", \
-                               hdcp->auth.msg.hdcp2.ake_pairing_info, \
-                               sizeof(hdcp->auth.msg.hdcp2.ake_pairing_info)); \
-               HDCP_DDC_WRITE_TRACE(hdcp, "LC Init", hdcp->auth.msg.hdcp2.lc_init, \
-                               sizeof(hdcp->auth.msg.hdcp2.lc_init)); \
-               HDCP_DDC_READ_TRACE(hdcp, "L'", hdcp->auth.msg.hdcp2.lc_l_prime, \
-                               sizeof(hdcp->auth.msg.hdcp2.lc_l_prime)); \
-               HDCP_DDC_WRITE_TRACE(hdcp, "Exchange KS", hdcp->auth.msg.hdcp2.ske_eks, \
-                               sizeof(hdcp->auth.msg.hdcp2.ske_eks)); \
-               HDCP_DDC_READ_TRACE(hdcp, "Rx Status", \
-                               (uint8_t *)&hdcp->auth.msg.hdcp2.rxstatus, \
-                               sizeof(hdcp->auth.msg.hdcp2.rxstatus)); \
-               HDCP_DDC_READ_TRACE(hdcp, "Rx Id List", \
-                               hdcp->auth.msg.hdcp2.rx_id_list, \
-                               hdcp->auth.msg.hdcp2.rx_id_list_size); \
-               HDCP_DDC_WRITE_TRACE(hdcp, "Rx Id List Ack", \
-                               hdcp->auth.msg.hdcp2.repeater_auth_ack, \
-                               sizeof(hdcp->auth.msg.hdcp2.repeater_auth_ack)); \
-               HDCP_DDC_WRITE_TRACE(hdcp, "Content Stream Management", \
-                               hdcp->auth.msg.hdcp2.repeater_auth_stream_manage, \
-                               hdcp->auth.msg.hdcp2.stream_manage_size); \
-               HDCP_DDC_READ_TRACE(hdcp, "Stream Ready", \
-                               hdcp->auth.msg.hdcp2.repeater_auth_stream_ready, \
-                               sizeof(hdcp->auth.msg.hdcp2.repeater_auth_stream_ready)); \
-               HDCP_DDC_WRITE_TRACE(hdcp, "Content Stream Type", \
-                               hdcp->auth.msg.hdcp2.content_stream_type_dp, \
-                               sizeof(hdcp->auth.msg.hdcp2.content_stream_type_dp)); \
-       } \
-} while (0)
 #define HDCP_TOP_ADD_DISPLAY_TRACE(hdcp, i) \
                HDCP_LOG_TOP(hdcp, "[Link %d]\tadd display %d", \
                                hdcp->config.index, i)
index a6eb86de8d5c77ffbd863a2c1ea6f52a86c4cec1..f37101f5a7777b9def3c5b1691ddbfcceccd2956 100644 (file)
@@ -225,6 +225,7 @@ struct mod_hdcp_output {
        uint8_t watchdog_timer_stop;
        uint16_t callback_delay;
        uint16_t watchdog_timer_delay;
+       uint8_t auth_complete;
 };
 
 /* used to represent per display info */