[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: Bhawanpreet Lakha <bhawanpreet.la...@amd.com>
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |  2 +-
 .../drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.c    | 15 ++++++++++++---
 .../drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.h    |  2 +-
 .../amd/display/modules/hdcp/hdcp2_transition.c   |  2 +-
 .../gpu/drm/amd/display/modules/hdcp/hdcp_psp.c   |  7 +++++--
 .../gpu/drm/amd/display/modules/inc/mod_hdcp.h    | 11 +++++++++--
 6 files changed, 29 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 0bb212e47766..482cde62b555 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -6352,7 +6352,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))
                        hdcp_update_display(
                                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
                                                                                
                         : false);
        }
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.c
index ca12362e799a..6c4b3134e786 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.c
@@ -86,7 +86,7 @@ static void process_output(struct hdcp_workqueue *hdcp_work)
 void hdcp_update_display(struct hdcp_workqueue *hdcp_work,
                         unsigned int link_index,
                         struct amdgpu_dm_connector *aconnector,
-                        bool disable_type1,
+                        uint8_t content_type,
                         bool enable_encryption)
 {
        struct hdcp_workqueue *hdcp_w = &hdcp_work[link_index];
@@ -104,9 +104,18 @@ void hdcp_update_display(struct hdcp_workqueue *hdcp_work,
                memcpy(display, query.display, sizeof(struct mod_hdcp_display));
                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) {
                        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.hdcp1.disable = 0;
+                               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.hdcp1.disable = 1;
+                               hdcp_w->link.adjust.hdcp2.force_type = 
MOD_HDCP_FORCE_TYPE_1;
+                       }
+
                        schedule_delayed_work(&hdcp_w->property_validate_dwork,
                                              
msecs_to_jiffies(DRM_HDCP_CHECK_PERIOD_MS));
                } else {
@@ -304,7 +313,7 @@ static void update_config(void *handle, struct 
cp_psp_stream_config *config)
        display->adjust.disable = 1;
        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)
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.h 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.h
index 71e121f037cb..6abde86bce4a 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.h
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.h
@@ -57,7 +57,7 @@ struct hdcp_workqueue {
 void hdcp_update_display(struct hdcp_workqueue *hdcp_work,
                         unsigned int link_index,
                         struct amdgpu_dm_connector *aconnector,
-                        bool disable_type1,
+                        uint8_t content_type,
                         bool enable_encryption);
 
 void hdcp_reset_display(struct hdcp_workqueue *work, unsigned int link_index);
diff --git a/drivers/gpu/drm/amd/display/modules/hdcp/hdcp2_transition.c 
b/drivers/gpu/drm/amd/display/modules/hdcp/hdcp2_transition.c
index 94a0e5fa931b..e8043c903a84 100644
--- a/drivers/gpu/drm/amd/display/modules/hdcp/hdcp2_transition.c
+++ b/drivers/gpu/drm/amd/display/modules/hdcp/hdcp2_transition.c
@@ -570,7 +570,7 @@ enum mod_hdcp_status mod_hdcp_hdcp2_dp_transition(struct 
mod_hdcp *hdcp,
                        break;
                } else if (input->link_integrity_check_dp != PASS) {
                        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);
                        break;
                } else if (event_ctx->rx_id_list_ready && conn->is_repeater) {
diff --git a/drivers/gpu/drm/amd/display/modules/hdcp/hdcp_psp.c 
b/drivers/gpu/drm/amd/display/modules/hdcp/hdcp_psp.c
index 4a6b95d7b44e..afaef4c98790 100644
--- a/drivers/gpu/drm/amd/display/modules/hdcp/hdcp_psp.c
+++ b/drivers/gpu/drm/amd/display/modules/hdcp/hdcp_psp.c
@@ -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;
 
-       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 
=
                        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 
=
                        TA_HDCP2_CONTENT_TYPE_NEGOTIATION_TYPE__MAX_SUPPORTED;
 
diff --git a/drivers/gpu/drm/amd/display/modules/inc/mod_hdcp.h 
b/drivers/gpu/drm/amd/display/modules/inc/mod_hdcp.h
index 97ecbf5bfec1..ff2bb2bfbb53 100644
--- a/drivers/gpu/drm/amd/display/modules/inc/mod_hdcp.h
+++ b/drivers/gpu/drm/amd/display/modules/inc/mod_hdcp.h
@@ -158,12 +158,18 @@ struct mod_hdcp_link_adjustment_hdcp1 {
        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 {
        uint8_t disable                 : 1;
-       uint8_t disable_type1           : 1;
+       uint8_t force_type              : 2;
        uint8_t force_no_stored_km      : 1;
        uint8_t increase_h_prime_timeout: 1;
-       uint8_t reserved                : 4;
+       uint8_t reserved                : 3;
 };
 
 struct mod_hdcp_link_adjustment {
@@ -185,6 +191,7 @@ struct mod_hdcp_trace {
 enum mod_hdcp_encryption_status {
        MOD_HDCP_ENCRYPTION_STATUS_HDCP_OFF = 0,
        MOD_HDCP_ENCRYPTION_STATUS_HDCP1_ON,
+       MOD_HDCP_ENCRYPTION_STATUS_HDCP2_ON,
        MOD_HDCP_ENCRYPTION_STATUS_HDCP2_TYPE0_ON,
        MOD_HDCP_ENCRYPTION_STATUS_HDCP2_TYPE1_ON
 };
-- 
2.17.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to