Commit 0a95fab3 authored by Wenjing Liu's avatar Wenjing Liu Committed by Alex Deucher
Browse files

drm/amd/display: add authentication_complete in hdcp output



[why]
DM needs to be notified when hdcp module has completed
authentication attempt.

Reviewed-by: default avatarBhawanpreet Lakha <bhawanpreet.lakha@amd.com>
Reviewed-by: default avatarGeorge Shen <George.Shen@amd.com>
Acked-by: default avatarAnson Jacob <Anson.Jacob@amd.com>
Signed-off-by: default avatarWenjing Liu <wenjing.liu@amd.com>
Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 56aca230
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -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);
+8 −0
Original line number Diff line number Diff line
@@ -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)
{
+4 −4
Original line number Diff line number Diff line
@@ -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);
+2 −2
Original line number Diff line number Diff line
@@ -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 ||
+74 −0
Original line number Diff line number Diff line
@@ -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) {
Loading