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: Wenjing Liu <Wenjing.Liu@amd.com> Reviewed-by: Jun Lei <Jun.Lei@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
committed by
Alex Deucher
parent
c17f7220f5
commit
3744ee2c29
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user