Commit 23eb4191 authored by Bhawanpreet Lakha's avatar Bhawanpreet Lakha Committed by Alex Deucher

drm/amd/display: add force Type0/1 flag

[Why]
Before we had a disable_type1 flag, this forced HDCP 2.2 to type0
There was no way to force type1.

[How]
Remove disable_type1 flag and instead add a flag to force type0/1.
Signed-off-by: default avatarBhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Reviewed-by: default avatarHarry Wentland <harry.wentland@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent b1abe558
...@@ -6838,7 +6838,7 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state) ...@@ -6838,7 +6838,7 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
if (is_content_protection_different(new_con_state, old_con_state, connector, adev->dm.hdcp_workqueue)) if (is_content_protection_different(new_con_state, old_con_state, connector, adev->dm.hdcp_workqueue))
hdcp_update_display( hdcp_update_display(
adev->dm.hdcp_workqueue, aconnector->dc_link->link_index, aconnector, adev->dm.hdcp_workqueue, aconnector->dc_link->link_index, aconnector,
new_con_state->hdcp_content_type == DRM_MODE_HDCP_CONTENT_TYPE0 ? true : false, new_con_state->hdcp_content_type,
new_con_state->content_protection == DRM_MODE_CONTENT_PROTECTION_DESIRED ? true new_con_state->content_protection == DRM_MODE_CONTENT_PROTECTION_DESIRED ? true
: false); : false);
} }
......
...@@ -90,7 +90,7 @@ static void process_output(struct hdcp_workqueue *hdcp_work) ...@@ -90,7 +90,7 @@ static void process_output(struct hdcp_workqueue *hdcp_work)
void hdcp_update_display(struct hdcp_workqueue *hdcp_work, void hdcp_update_display(struct hdcp_workqueue *hdcp_work,
unsigned int link_index, unsigned int link_index,
struct amdgpu_dm_connector *aconnector, struct amdgpu_dm_connector *aconnector,
bool disable_type1, uint8_t content_type,
bool enable_encryption) bool enable_encryption)
{ {
struct hdcp_workqueue *hdcp_w = &hdcp_work[link_index]; struct hdcp_workqueue *hdcp_w = &hdcp_work[link_index];
...@@ -108,9 +108,15 @@ void hdcp_update_display(struct hdcp_workqueue *hdcp_work, ...@@ -108,9 +108,15 @@ void hdcp_update_display(struct hdcp_workqueue *hdcp_work,
memcpy(display, query.display, sizeof(struct mod_hdcp_display)); memcpy(display, query.display, sizeof(struct mod_hdcp_display));
mod_hdcp_remove_display(&hdcp_w->hdcp, aconnector->base.index, &hdcp_w->output); mod_hdcp_remove_display(&hdcp_w->hdcp, aconnector->base.index, &hdcp_w->output);
hdcp_w->link.adjust.hdcp2.force_type = MOD_HDCP_FORCE_TYPE_0;
if (enable_encryption) { if (enable_encryption) {
display->adjust.disable = 0; display->adjust.disable = 0;
hdcp_w->link.adjust.hdcp2.disable_type1 = disable_type1; if (content_type == DRM_MODE_HDCP_CONTENT_TYPE0)
hdcp_w->link.adjust.hdcp2.force_type = MOD_HDCP_FORCE_TYPE_0;
else if (content_type == DRM_MODE_HDCP_CONTENT_TYPE1)
hdcp_w->link.adjust.hdcp2.force_type = MOD_HDCP_FORCE_TYPE_1;
schedule_delayed_work(&hdcp_w->property_validate_dwork, schedule_delayed_work(&hdcp_w->property_validate_dwork,
msecs_to_jiffies(DRM_HDCP_CHECK_PERIOD_MS)); msecs_to_jiffies(DRM_HDCP_CHECK_PERIOD_MS));
} else { } else {
...@@ -308,7 +314,7 @@ static void update_config(void *handle, struct cp_psp_stream_config *config) ...@@ -308,7 +314,7 @@ static void update_config(void *handle, struct cp_psp_stream_config *config)
display->adjust.disable = 1; display->adjust.disable = 1;
link->adjust.auth_delay = 2; link->adjust.auth_delay = 2;
hdcp_update_display(hdcp_work, link_index, aconnector, false, false); hdcp_update_display(hdcp_work, link_index, aconnector, DRM_MODE_HDCP_CONTENT_TYPE0, false);
} }
struct hdcp_workqueue *hdcp_create_workqueue(void *psp_context, struct cp_psp *cp_psp, struct dc *dc) struct hdcp_workqueue *hdcp_create_workqueue(void *psp_context, struct cp_psp *cp_psp, struct dc *dc)
......
...@@ -57,7 +57,7 @@ struct hdcp_workqueue { ...@@ -57,7 +57,7 @@ struct hdcp_workqueue {
void hdcp_update_display(struct hdcp_workqueue *hdcp_work, void hdcp_update_display(struct hdcp_workqueue *hdcp_work,
unsigned int link_index, unsigned int link_index,
struct amdgpu_dm_connector *aconnector, struct amdgpu_dm_connector *aconnector,
bool disable_type1, uint8_t content_type,
bool enable_encryption); bool enable_encryption);
void hdcp_reset_display(struct hdcp_workqueue *work, unsigned int link_index); void hdcp_reset_display(struct hdcp_workqueue *work, unsigned int link_index);
......
...@@ -570,7 +570,7 @@ enum mod_hdcp_status mod_hdcp_hdcp2_dp_transition(struct mod_hdcp *hdcp, ...@@ -570,7 +570,7 @@ enum mod_hdcp_status mod_hdcp_hdcp2_dp_transition(struct mod_hdcp *hdcp,
break; break;
} else if (input->link_integrity_check_dp != PASS) { } else if (input->link_integrity_check_dp != PASS) {
if (hdcp->connection.hdcp2_retry_count >= 1) if (hdcp->connection.hdcp2_retry_count >= 1)
adjust->hdcp2.disable_type1 = 1; adjust->hdcp2.force_type = MOD_HDCP_FORCE_TYPE_0;
fail_and_restart_in_ms(0, &status, output); fail_and_restart_in_ms(0, &status, output);
break; break;
} else if (event_ctx->rx_id_list_ready && conn->is_repeater) { } else if (event_ctx->rx_id_list_ready && conn->is_repeater) {
......
...@@ -358,10 +358,13 @@ enum mod_hdcp_status mod_hdcp_hdcp2_create_session(struct mod_hdcp *hdcp) ...@@ -358,10 +358,13 @@ enum mod_hdcp_status mod_hdcp_hdcp2_create_session(struct mod_hdcp *hdcp)
hdcp_cmd->in_msg.hdcp2_create_session_v2.display_handle = display->index; hdcp_cmd->in_msg.hdcp2_create_session_v2.display_handle = display->index;
if (hdcp->connection.link.adjust.hdcp2.disable_type1) if (hdcp->connection.link.adjust.hdcp2.force_type == MOD_HDCP_FORCE_TYPE_0)
hdcp_cmd->in_msg.hdcp2_create_session_v2.negotiate_content_type = hdcp_cmd->in_msg.hdcp2_create_session_v2.negotiate_content_type =
TA_HDCP2_CONTENT_TYPE_NEGOTIATION_TYPE__FORCE_TYPE0; TA_HDCP2_CONTENT_TYPE_NEGOTIATION_TYPE__FORCE_TYPE0;
else else if (hdcp->connection.link.adjust.hdcp2.force_type == MOD_HDCP_FORCE_TYPE_1)
hdcp_cmd->in_msg.hdcp2_create_session_v2.negotiate_content_type =
TA_HDCP2_CONTENT_TYPE_NEGOTIATION_TYPE__FORCE_TYPE1;
else if (hdcp->connection.link.adjust.hdcp2.force_type == MOD_HDCP_FORCE_TYPE_MAX)
hdcp_cmd->in_msg.hdcp2_create_session_v2.negotiate_content_type = hdcp_cmd->in_msg.hdcp2_create_session_v2.negotiate_content_type =
TA_HDCP2_CONTENT_TYPE_NEGOTIATION_TYPE__MAX_SUPPORTED; TA_HDCP2_CONTENT_TYPE_NEGOTIATION_TYPE__MAX_SUPPORTED;
......
...@@ -158,12 +158,18 @@ struct mod_hdcp_link_adjustment_hdcp1 { ...@@ -158,12 +158,18 @@ struct mod_hdcp_link_adjustment_hdcp1 {
uint8_t reserved : 6; uint8_t reserved : 6;
}; };
enum mod_hdcp_force_hdcp_type {
MOD_HDCP_FORCE_TYPE_MAX = 0,
MOD_HDCP_FORCE_TYPE_0,
MOD_HDCP_FORCE_TYPE_1
};
struct mod_hdcp_link_adjustment_hdcp2 { struct mod_hdcp_link_adjustment_hdcp2 {
uint8_t disable : 1; uint8_t disable : 1;
uint8_t disable_type1 : 1; uint8_t force_type : 2;
uint8_t force_no_stored_km : 1; uint8_t force_no_stored_km : 1;
uint8_t increase_h_prime_timeout: 1; uint8_t increase_h_prime_timeout: 1;
uint8_t reserved : 4; uint8_t reserved : 3;
}; };
struct mod_hdcp_link_adjustment { struct mod_hdcp_link_adjustment {
...@@ -185,6 +191,7 @@ struct mod_hdcp_trace { ...@@ -185,6 +191,7 @@ struct mod_hdcp_trace {
enum mod_hdcp_encryption_status { enum mod_hdcp_encryption_status {
MOD_HDCP_ENCRYPTION_STATUS_HDCP_OFF = 0, MOD_HDCP_ENCRYPTION_STATUS_HDCP_OFF = 0,
MOD_HDCP_ENCRYPTION_STATUS_HDCP1_ON, MOD_HDCP_ENCRYPTION_STATUS_HDCP1_ON,
MOD_HDCP_ENCRYPTION_STATUS_HDCP2_ON,
MOD_HDCP_ENCRYPTION_STATUS_HDCP2_TYPE0_ON, MOD_HDCP_ENCRYPTION_STATUS_HDCP2_TYPE0_ON,
MOD_HDCP_ENCRYPTION_STATUS_HDCP2_TYPE1_ON MOD_HDCP_ENCRYPTION_STATUS_HDCP2_TYPE1_ON
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment