]> www.infradead.org Git - users/hch/misc.git/commitdiff
drm/amd/display: Add HDCP policy control
authorOleh Kuzhylnyi <okuzhyln@amd.com>
Mon, 18 Aug 2025 11:19:29 +0000 (13:19 +0200)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 5 Sep 2025 21:38:40 +0000 (17:38 -0400)
[Why]
DM should be able to control HDCP retry limit via configurable
parameter.

[How]
Expose a retry_limit parameter for controlling the maximum number of
retries and lift the hardcode out to DM.

Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Reviewed-by: Aric Cyr <aric.cyr@amd.com>
Signed-off-by: Oleh Kuzhylnyi <okuzhyln@amd.com>
Signed-off-by: Wayne Lin <wayne.lin@amd.com>
Tested-by: Dan Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.c
drivers/gpu/drm/amd/display/modules/hdcp/hdcp.c
drivers/gpu/drm/amd/display/modules/inc/mod_hdcp.h

index 437174d4fed55cfc1c78b2271653f98a99fcabff..58e084f525266c5f6e4c194ab220f0daf68f7dc4 100644 (file)
@@ -223,6 +223,7 @@ void hdcp_update_display(struct hdcp_workqueue *hdcp_work,
                display_adjust.disable = MOD_HDCP_DISPLAY_NOT_DISABLE;
 
                link_adjust.auth_delay = 2;
+               link_adjust.retry_limit = MAX_NUM_OF_ATTEMPTS;
 
                if (content_type == DRM_MODE_HDCP_CONTENT_TYPE0) {
                        link_adjust.hdcp2.force_type = MOD_HDCP_FORCE_TYPE_0;
@@ -572,6 +573,7 @@ static void update_config(void *handle, struct cp_psp_stream_config *config)
        link->dp.usb4_enabled = config->usb4_enabled;
        display->adjust.disable = MOD_HDCP_DISPLAY_DISABLE_AUTHENTICATION;
        link->adjust.auth_delay = 2;
+       link->adjust.retry_limit = MAX_NUM_OF_ATTEMPTS;
        link->adjust.hdcp1.disable = 0;
        hdcp_w->encryption_status[display->index] = MOD_HDCP_ENCRYPTION_STATUS_HDCP_OFF;
 
index 5e01c6e24cbc8c0c881af655ebb1cb8ea2cd7e6e..c760216a6240506c6f0605d107ada067df766df5 100644 (file)
@@ -29,6 +29,7 @@ static void push_error_status(struct mod_hdcp *hdcp,
                enum mod_hdcp_status status)
 {
        struct mod_hdcp_trace *trace = &hdcp->connection.trace;
+       const uint8_t retry_limit = hdcp->connection.link.adjust.retry_limit;
 
        if (trace->error_count < MAX_NUM_OF_ERROR_TRACE) {
                trace->errors[trace->error_count].status = status;
@@ -39,11 +40,11 @@ static void push_error_status(struct mod_hdcp *hdcp,
 
        if (is_hdcp1(hdcp)) {
                hdcp->connection.hdcp1_retry_count++;
-               if (hdcp->connection.hdcp1_retry_count == MAX_NUM_OF_ATTEMPTS)
+               if (hdcp->connection.hdcp1_retry_count == retry_limit)
                        hdcp->connection.link.adjust.hdcp1.disable = 1;
        } else if (is_hdcp2(hdcp)) {
                hdcp->connection.hdcp2_retry_count++;
-               if (hdcp->connection.hdcp2_retry_count == MAX_NUM_OF_ATTEMPTS)
+               if (hdcp->connection.hdcp2_retry_count == retry_limit)
                        hdcp->connection.link.adjust.hdcp2.disable = 1;
        }
 }
index c42468bb70ac7667978d15f009b670ab6041ac3d..b51ddf2846df8e2ccb9fac10ad1cb627fd7ae718 100644 (file)
@@ -220,6 +220,7 @@ struct mod_hdcp_link_adjustment_hdcp2 {
 
 struct mod_hdcp_link_adjustment {
        uint8_t auth_delay;
+       uint8_t retry_limit;
        struct mod_hdcp_link_adjustment_hdcp1 hdcp1;
        struct mod_hdcp_link_adjustment_hdcp2 hdcp2;
 };