mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-18 00:24:58 +08:00
drm/amd/display: add authentication_complete in hdcp output
[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>
This commit is contained in:
parent
56aca23093
commit
0a95fab36a
@ -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);
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
@ -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 ||
|
||||
|
@ -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) {
|
||||
|
@ -106,78 +106,6 @@
|
||||
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)
|
||||
|
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user