Commit 3744ee2c authored by Wenjing Liu's avatar Wenjing Liu Committed by Alex Deucher
Browse files

drm/amd/display: no hdcp retry if bksv or ksv list is revoked



[why]
According to the specs when bksv or ksv list fails SRM check,
HDCP TX should abort hdcp immediately.
However with the current code HDCP will be reattampt upto 4 times.

[how]
Add the logic that stop HDCP retry if bksv or ksv list
is revoked.

Signed-off-by: default avatarWenjing Liu <Wenjing.Liu@amd.com>
Reviewed-by: default avatarJun Lei <Jun.Lei@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent c17f7220
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -61,7 +61,8 @@ static uint8_t is_cp_desired_hdcp1(struct mod_hdcp *hdcp)

	return (hdcp->connection.hdcp1_retry_count < MAX_NUM_OF_ATTEMPTS) &&
			is_auth_needed &&
			!hdcp->connection.link.adjust.hdcp1.disable;
			!hdcp->connection.link.adjust.hdcp1.disable &&
			!hdcp->connection.is_hdcp1_revoked;
}

static uint8_t is_cp_desired_hdcp2(struct mod_hdcp *hdcp)
+1 −0
Original line number Diff line number Diff line
@@ -170,6 +170,7 @@ struct mod_hdcp_connection {
	struct mod_hdcp_display displays[MAX_NUM_OF_DISPLAYS];
	uint8_t is_repeater;
	uint8_t is_km_stored;
	uint8_t is_hdcp1_revoked;
	uint8_t is_hdcp2_revoked;
	struct mod_hdcp_trace trace;
	uint8_t hdcp1_retry_count;
+4 −2
Original line number Diff line number Diff line
@@ -210,7 +210,8 @@ enum mod_hdcp_status mod_hdcp_hdcp1_dp_transition(struct mod_hdcp *hdcp,
			fail_and_restart_in_ms(0, &status, output);
			break;
		} else if (input->rx_validation != PASS) {
			if (hdcp->state.stay_count < 2) {
			if (hdcp->state.stay_count < 2 &&
					!hdcp->connection.is_hdcp1_revoked) {
				/* allow 2 additional retries */
				callback_in_ms(0, output);
				increment_stay_counter(hdcp);
@@ -290,7 +291,8 @@ enum mod_hdcp_status mod_hdcp_hdcp1_dp_transition(struct mod_hdcp *hdcp,
			fail_and_restart_in_ms(0, &status, output);
			break;
		} else if (input->ksvlist_vp_validation != PASS) {
			if (hdcp->state.stay_count < 2) {
			if (hdcp->state.stay_count < 2 &&
					!hdcp->connection.is_hdcp1_revoked) {
				/* allow 2 additional retries */
				callback_in_ms(0, output);
				increment_stay_counter(hdcp);
+4 −0
Original line number Diff line number Diff line
@@ -90,10 +90,14 @@ char *mod_hdcp_status_to_str(int32_t status)
		return "MOD_HDCP_STATUS_HDCP1_R0_PRIME_PENDING";
	case MOD_HDCP_STATUS_HDCP1_VALIDATE_RX_FAILURE:
		return "MOD_HDCP_STATUS_HDCP1_VALIDATE_RX_FAILURE";
	case MOD_HDCP_STATUS_HDCP1_BKSV_REVOKED:
		return "MOD_HDCP_STATUS_HDCP1_BKSV_REVOKED";
	case MOD_HDCP_STATUS_HDCP1_KSV_LIST_NOT_READY:
		return "MOD_HDCP_STATUS_HDCP1_KSV_LIST_NOT_READY";
	case MOD_HDCP_STATUS_HDCP1_VALIDATE_KSV_LIST_FAILURE:
		return "MOD_HDCP_STATUS_HDCP1_VALIDATE_KSV_LIST_FAILURE";
	case MOD_HDCP_STATUS_HDCP1_KSV_LIST_REVOKED:
		return "MOD_HDCP_STATUS_HDCP1_KSV_LIST_REVOKED";
	case MOD_HDCP_STATUS_HDCP1_ENABLE_ENCRYPTION:
		return "MOD_HDCP_STATUS_HDCP1_ENABLE_ENCRYPTION";
	case MOD_HDCP_STATUS_HDCP1_ENABLE_STREAM_ENCRYPTION_FAILURE:
+2 −0
Original line number Diff line number Diff line
@@ -56,8 +56,10 @@ enum mod_hdcp_status {
	MOD_HDCP_STATUS_HDCP1_NOT_CAPABLE,
	MOD_HDCP_STATUS_HDCP1_R0_PRIME_PENDING,
	MOD_HDCP_STATUS_HDCP1_VALIDATE_RX_FAILURE,
	MOD_HDCP_STATUS_HDCP1_BKSV_REVOKED,
	MOD_HDCP_STATUS_HDCP1_KSV_LIST_NOT_READY,
	MOD_HDCP_STATUS_HDCP1_VALIDATE_KSV_LIST_FAILURE,
	MOD_HDCP_STATUS_HDCP1_KSV_LIST_REVOKED,
	MOD_HDCP_STATUS_HDCP1_ENABLE_ENCRYPTION,
	MOD_HDCP_STATUS_HDCP1_ENABLE_STREAM_ENCRYPTION_FAILURE,
	MOD_HDCP_STATUS_HDCP1_MAX_CASCADE_EXCEEDED_FAILURE,