From: Wenjing Liu <[email protected]>

[why]
There are some new changes for HDCP2 firmware locality check. The
implementation doesn't perfectly fit the intended design and clarity.

1. Clarify and consolidate variable responsibilities.
The previous implementation introduced the following variables:
- config.ddc.funcs.atomic_write_poll_read_i2c (optional pointer)
- hdcp->config.ddc.funcs.atomic_write_poll_read_aux (optional pointer)
- hdcp->connection.link.adjust.hdcp2.force_sw_locality_check (bool)
- hdcp->config.debug.lc_enable_sw_fallback (bool)
- use_fw (bool)
They will be used together to determine two operations:
- Whether to use FW locality check
- Whether to use SW fallback on FW locality check failure
The refactor streamlines this by introducing two variables in the hdcp2
link adjustment, while ensuring function pointers are always assigned
and remain independent from policy decisions:
- use_fw_locality_check (bool) -> true if fw locality should be used.
- use_sw_locality_fallback (bool) -> true to reset use_fw_locality_check
back to false and retry on fw locality check failure.

2. Mixed meanings of l_prime_read transition input
l_prime_read originally means if l_prime is read when sw locality check
is used. When FW locality check is used, l_prime_read means if lc init
write, l prime poll and l_prime read combo operation is successful. The
mix of meanings is confusing. The refactor introduces a new variable
l_prime_combo_read to isolate the second meaning into its own variable.

3. Missing specific error code on firmware locality error.
The original change reuses the generic DDC failure error code when
firmware fails to return locality check result. This is not ideal as
DDC failure indicates an error occurred during an I2C/AUX transaction.
FW locality failure could be caused by polling timeout in firmware or
failure to acquire firmware access. Which sits at a higher level of
abstraction above DDC hardware. An incorrect error code could mislead
the debug into a wrong direction.

4. Adding macros to simplify the process of adding new error codes.
Currently, to add an error code, the developer needs to add both the
enum and the string translation. This is error prone and can lead to
inconsistencies. The refactor adds a macro to automatically add the
string translation based on the enum.

5. Correcting misplaced comments. The previous implementation of the
firmware locality check resulted in some comments in hdcp2_transition
being incorrectly positioned. This refactor relocates those comments to
their appropriate locations for better clarity.

Reviewed-by: Aric Cyr <[email protected]>
Signed-off-by: Wenjing Liu <[email protected]>
Signed-off-by: Ray Wu <[email protected]>
---
 .../amd/display/amdgpu_dm/amdgpu_dm_hdcp.c    |  18 +--
 .../gpu/drm/amd/display/modules/hdcp/hdcp.h   |   1 +
 .../display/modules/hdcp/hdcp2_execution.c    |  68 +++------
 .../display/modules/hdcp/hdcp2_transition.c   |  61 ++++----
 .../drm/amd/display/modules/hdcp/hdcp_ddc.c   |   2 +-
 .../drm/amd/display/modules/hdcp/hdcp_log.c   | 123 +---------------
 .../drm/amd/display/modules/inc/mod_hdcp.h    | 134 +++++++++---------
 7 files changed, 136 insertions(+), 271 deletions(-)

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 38eeb1211cca..b680a3547856 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
@@ -201,6 +201,7 @@ void hdcp_update_display(struct hdcp_workqueue *hdcp_work,
        struct mod_hdcp_link_adjustment link_adjust;
        struct mod_hdcp_display_adjustment display_adjust;
        unsigned int conn_index = aconnector->base.index;
+       const struct dc *dc = aconnector->dc_link->dc;
 
        guard(mutex)(&hdcp_w->mutex);
        drm_connector_get(&aconnector->base);
@@ -231,6 +232,9 @@ void hdcp_update_display(struct hdcp_workqueue *hdcp_work,
                        link_adjust.hdcp1.disable = 1;
                        link_adjust.hdcp2.force_type = MOD_HDCP_FORCE_TYPE_1;
                }
+               link_adjust.hdcp2.use_fw_locality_check =
+                               (dc->caps.fused_io_supported || 
dc->debug.hdcp_lc_force_fw_enable);
+               link_adjust.hdcp2.use_sw_locality_fallback = 
dc->debug.hdcp_lc_enable_sw_fallback;
 
                schedule_delayed_work(&hdcp_w->property_validate_dwork,
                                      
msecs_to_jiffies(DRM_HDCP_CHECK_PERIOD_MS));
@@ -534,6 +538,7 @@ static void update_config(void *handle, struct 
cp_psp_stream_config *config)
        struct hdcp_workqueue *hdcp_w = &hdcp_work[link_index];
        struct dc_sink *sink = NULL;
        bool link_is_hdcp14 = false;
+       const struct dc *dc = aconnector->dc_link->dc;
 
        if (config->dpms_off) {
                hdcp_remove_display(hdcp_work, link_index, aconnector);
@@ -575,6 +580,8 @@ static void update_config(void *handle, struct 
cp_psp_stream_config *config)
        link->adjust.auth_delay = 2;
        link->adjust.retry_limit = MAX_NUM_OF_ATTEMPTS;
        link->adjust.hdcp1.disable = 0;
+       link->adjust.hdcp2.use_fw_locality_check = (dc->caps.fused_io_supported 
|| dc->debug.hdcp_lc_force_fw_enable);
+       link->adjust.hdcp2.use_sw_locality_fallback = 
dc->debug.hdcp_lc_enable_sw_fallback;
        hdcp_w->encryption_status[display->index] = 
MOD_HDCP_ENCRYPTION_STATUS_HDCP_OFF;
 
        DRM_DEBUG_DRIVER("[HDCP_DM] display %d, CP %d, type %d\n", 
aconnector->base.index,
@@ -786,15 +793,8 @@ struct hdcp_workqueue *hdcp_create_workqueue(struct 
amdgpu_device *adev,
                ddc_funcs->read_i2c = lp_read_i2c;
                ddc_funcs->write_dpcd = lp_write_dpcd;
                ddc_funcs->read_dpcd = lp_read_dpcd;
-
-               config->debug.lc_enable_sw_fallback = 
dc->debug.hdcp_lc_enable_sw_fallback;
-               if (dc->caps.fused_io_supported || 
dc->debug.hdcp_lc_force_fw_enable) {
-                       ddc_funcs->atomic_write_poll_read_i2c = 
lp_atomic_write_poll_read_i2c;
-                       ddc_funcs->atomic_write_poll_read_aux = 
lp_atomic_write_poll_read_aux;
-               } else {
-                       ddc_funcs->atomic_write_poll_read_i2c = NULL;
-                       ddc_funcs->atomic_write_poll_read_aux = NULL;
-               }
+               ddc_funcs->atomic_write_poll_read_i2c = 
lp_atomic_write_poll_read_i2c;
+               ddc_funcs->atomic_write_poll_read_aux = 
lp_atomic_write_poll_read_aux;
 
                memset(hdcp_work[i].aconnector, 0,
                       sizeof(struct amdgpu_dm_connector *) *
diff --git a/drivers/gpu/drm/amd/display/modules/hdcp/hdcp.h 
b/drivers/gpu/drm/amd/display/modules/hdcp/hdcp.h
index b883d626f1c3..26a351a184f3 100644
--- a/drivers/gpu/drm/amd/display/modules/hdcp/hdcp.h
+++ b/drivers/gpu/drm/amd/display/modules/hdcp/hdcp.h
@@ -88,6 +88,7 @@ struct mod_hdcp_transition_input_hdcp2 {
        uint8_t lc_init_write;
        uint8_t l_prime_available_poll;
        uint8_t l_prime_read;
+       uint8_t l_prime_combo_read;
        uint8_t l_prime_validation;
        uint8_t eks_prepare;
        uint8_t eks_write;
diff --git a/drivers/gpu/drm/amd/display/modules/hdcp/hdcp2_execution.c 
b/drivers/gpu/drm/amd/display/modules/hdcp/hdcp2_execution.c
index 5628f0ef73fd..27500abf9fee 100644
--- a/drivers/gpu/drm/amd/display/modules/hdcp/hdcp2_execution.c
+++ b/drivers/gpu/drm/amd/display/modules/hdcp/hdcp2_execution.c
@@ -465,54 +465,11 @@ static enum mod_hdcp_status validate_h_prime(struct 
mod_hdcp *hdcp,
        return status;
 }
 
-static enum mod_hdcp_status locality_check_sw(struct mod_hdcp *hdcp,
-               struct mod_hdcp_event_context *event_ctx,
-               struct mod_hdcp_transition_input_hdcp2 *input)
-{
-       enum mod_hdcp_status status = MOD_HDCP_STATUS_SUCCESS;
-
-       if (!mod_hdcp_execute_and_set(mod_hdcp_write_lc_init,
-                       &input->lc_init_write, &status,
-                        hdcp, "lc_init_write"))
-               goto out;
-       if (is_dp_hdcp(hdcp))
-               msleep(16);
-       else
-               if (!mod_hdcp_execute_and_set(poll_l_prime_available,
-                               &input->l_prime_available_poll, &status,
-                               hdcp, "l_prime_available_poll"))
-                       goto out;
-       if (!mod_hdcp_execute_and_set(mod_hdcp_read_l_prime,
-                       &input->l_prime_read, &status,
-                       hdcp, "l_prime_read"))
-               goto out;
-out:
-       return status;
-}
-
-static enum mod_hdcp_status locality_check_fw(struct mod_hdcp *hdcp,
-               struct mod_hdcp_event_context *event_ctx,
-               struct mod_hdcp_transition_input_hdcp2 *input)
-{
-       enum mod_hdcp_status status = MOD_HDCP_STATUS_SUCCESS;
-
-       if (!mod_hdcp_execute_and_set(mod_hdcp_write_poll_read_lc_fw,
-                       &input->l_prime_read, &status,
-                       hdcp, "l_prime_read"))
-               goto out;
-
-out:
-       return status;
-}
-
 static enum mod_hdcp_status locality_check(struct mod_hdcp *hdcp,
                struct mod_hdcp_event_context *event_ctx,
                struct mod_hdcp_transition_input_hdcp2 *input)
 {
        enum mod_hdcp_status status = MOD_HDCP_STATUS_SUCCESS;
-       const bool use_fw = hdcp->config.ddc.funcs.atomic_write_poll_read_i2c
-                       && hdcp->config.ddc.funcs.atomic_write_poll_read_aux
-                       && 
!hdcp->connection.link.adjust.hdcp2.force_sw_locality_check;
 
        if (event_ctx->event != MOD_HDCP_EVENT_CALLBACK) {
                event_ctx->unexpected_event = 1;
@@ -524,9 +481,28 @@ static enum mod_hdcp_status locality_check(struct mod_hdcp 
*hdcp,
                        hdcp, "lc_init_prepare"))
                goto out;
 
-       status = (use_fw ? locality_check_fw : locality_check_sw)(hdcp, 
event_ctx, input);
-       if (status != MOD_HDCP_STATUS_SUCCESS)
-               goto out;
+       if (hdcp->connection.link.adjust.hdcp2.use_fw_locality_check) {
+               if (!mod_hdcp_execute_and_set(mod_hdcp_write_poll_read_lc_fw,
+                               &input->l_prime_combo_read, &status,
+                               hdcp, "l_prime_combo_read"))
+                       goto out;
+       } else {
+               if (!mod_hdcp_execute_and_set(mod_hdcp_write_lc_init,
+                               &input->lc_init_write, &status,
+                               hdcp, "lc_init_write"))
+                       goto out;
+               if (is_dp_hdcp(hdcp))
+                       msleep(16);
+               else
+                       if (!mod_hdcp_execute_and_set(poll_l_prime_available,
+                                       &input->l_prime_available_poll, &status,
+                                       hdcp, "l_prime_available_poll"))
+                               goto out;
+               if (!mod_hdcp_execute_and_set(mod_hdcp_read_l_prime,
+                               &input->l_prime_read, &status,
+                               hdcp, "l_prime_read"))
+                       goto out;
+       }
 
        if (!mod_hdcp_execute_and_set(mod_hdcp_hdcp2_validate_l_prime,
                        &input->l_prime_validation, &status,
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 89ffb89e1932..9316312a4df5 100644
--- a/drivers/gpu/drm/amd/display/modules/hdcp/hdcp2_transition.c
+++ b/drivers/gpu/drm/amd/display/modules/hdcp/hdcp2_transition.c
@@ -184,31 +184,33 @@ enum mod_hdcp_status mod_hdcp_hdcp2_transition(struct 
mod_hdcp *hdcp,
                callback_in_ms(0, output);
                set_state_id(hdcp, output, H2_A2_LOCALITY_CHECK);
                break;
-       case H2_A2_LOCALITY_CHECK: {
-               const bool use_fw = 
hdcp->config.ddc.funcs.atomic_write_poll_read_i2c
-                               && !adjust->hdcp2.force_sw_locality_check;
-
-               /*
-                * 1A-05: consider disconnection after LC init a failure
-                * 1A-13-1: consider invalid l' a failure
-                * 1A-13-2: consider l' timeout a failure
-                */
+       case H2_A2_LOCALITY_CHECK:
+               /* 1A-05: consider disconnection after LC init a failure */
                if (hdcp->state.stay_count > 10 ||
-                               input->lc_init_prepare != PASS ||
-                               (!use_fw && input->lc_init_write != PASS) ||
-                               (!use_fw && input->l_prime_available_poll != 
PASS)) {
+                               input->lc_init_prepare != PASS) {
                        fail_and_restart_in_ms(0, &status, output);
                        break;
-               } else if (input->l_prime_read != PASS) {
-                       if (use_fw && hdcp->config.debug.lc_enable_sw_fallback) 
{
-                               adjust->hdcp2.force_sw_locality_check = true;
+               } else if (adjust->hdcp2.use_fw_locality_check &&
+                               input->l_prime_combo_read != PASS) {
+                       /* 1A-13-2: consider l' timeout a failure */
+                       if (adjust->hdcp2.use_sw_locality_fallback) {
+                               /* switch to software locality check */
+                               adjust->hdcp2.use_fw_locality_check = 0;
                                callback_in_ms(0, output);
+                               increment_stay_counter(hdcp);
                                break;
                        }
-
+                       fail_and_restart_in_ms(0, &status, output);
+                       break;
+               } else if (!adjust->hdcp2.use_fw_locality_check &&
+                                       (input->lc_init_write != PASS ||
+                                       input->l_prime_available_poll != PASS ||
+                                       input->l_prime_read != PASS)) {
+                       /* 1A-13-2: consider l' timeout a failure */
                        fail_and_restart_in_ms(0, &status, output);
                        break;
                } else if (input->l_prime_validation != PASS) {
+                       /* 1A-13-1: consider invalid l' a failure */
                        callback_in_ms(0, output);
                        increment_stay_counter(hdcp);
                        break;
@@ -216,7 +218,6 @@ enum mod_hdcp_status mod_hdcp_hdcp2_transition(struct 
mod_hdcp *hdcp,
                callback_in_ms(0, output);
                set_state_id(hdcp, output, 
H2_A3_EXCHANGE_KS_AND_TEST_FOR_REPEATER);
                break;
-       }
        case H2_A3_EXCHANGE_KS_AND_TEST_FOR_REPEATER:
                if (input->eks_prepare != PASS ||
                                input->eks_write != PASS) {
@@ -510,26 +511,29 @@ enum mod_hdcp_status mod_hdcp_hdcp2_dp_transition(struct 
mod_hdcp *hdcp,
                callback_in_ms(0, output);
                set_state_id(hdcp, output, D2_A2_LOCALITY_CHECK);
                break;
-       case D2_A2_LOCALITY_CHECK: {
-               const bool use_fw = 
hdcp->config.ddc.funcs.atomic_write_poll_read_aux
-                               && !adjust->hdcp2.force_sw_locality_check;
-
+       case D2_A2_LOCALITY_CHECK:
                if (hdcp->state.stay_count > 10 ||
-                               input->lc_init_prepare != PASS ||
-                               (!use_fw && input->lc_init_write != PASS)) {
-                       /* 1A-12: consider invalid l' a failure */
+                               input->lc_init_prepare != PASS) {
                        fail_and_restart_in_ms(0, &status, output);
                        break;
-               } else if (input->l_prime_read != PASS) {
-                       if (use_fw && hdcp->config.debug.lc_enable_sw_fallback) 
{
-                               adjust->hdcp2.force_sw_locality_check = true;
+               } else if (adjust->hdcp2.use_fw_locality_check &&
+                               input->l_prime_combo_read != PASS) {
+                       if (adjust->hdcp2.use_sw_locality_fallback) {
+                               /* switch to software locality check */
+                               adjust->hdcp2.use_fw_locality_check = 0;
                                callback_in_ms(0, output);
+                               increment_stay_counter(hdcp);
                                break;
                        }
-
+                       fail_and_restart_in_ms(0, &status, output);
+                       break;
+               } else if (!adjust->hdcp2.use_fw_locality_check &&
+                                       (input->lc_init_write != PASS ||
+                                       input->l_prime_read != PASS)) {
                        fail_and_restart_in_ms(0, &status, output);
                        break;
                } else if (input->l_prime_validation != PASS) {
+                       /* 1A-12: consider invalid l' a failure */
                        callback_in_ms(0, output);
                        increment_stay_counter(hdcp);
                        break;
@@ -537,7 +541,6 @@ enum mod_hdcp_status mod_hdcp_hdcp2_dp_transition(struct 
mod_hdcp *hdcp,
                callback_in_ms(0, output);
                set_state_id(hdcp, output, 
D2_A34_EXCHANGE_KS_AND_TEST_FOR_REPEATER);
                break;
-       }
        case D2_A34_EXCHANGE_KS_AND_TEST_FOR_REPEATER:
                if (input->eks_prepare != PASS ||
                                input->eks_write != PASS) {
diff --git a/drivers/gpu/drm/amd/display/modules/hdcp/hdcp_ddc.c 
b/drivers/gpu/drm/amd/display/modules/hdcp/hdcp_ddc.c
index 2e6408579194..0ca39873f807 100644
--- a/drivers/gpu/drm/amd/display/modules/hdcp/hdcp_ddc.c
+++ b/drivers/gpu/drm/amd/display/modules/hdcp/hdcp_ddc.c
@@ -758,6 +758,6 @@ enum mod_hdcp_status mod_hdcp_write_poll_read_lc_fw(struct 
mod_hdcp *hdcp)
 {
        const bool success = (is_dp_hdcp(hdcp) ? write_stall_read_lc_fw_aux : 
write_poll_read_lc_fw_i2c)(hdcp);
 
-       return success ? MOD_HDCP_STATUS_SUCCESS : MOD_HDCP_STATUS_DDC_FAILURE;
+       return success ? MOD_HDCP_STATUS_SUCCESS : 
MOD_HDCP_STATUS_HDCP2_LOCALITY_COMBO_READ_FAILURE;
 }
 
diff --git a/drivers/gpu/drm/amd/display/modules/hdcp/hdcp_log.c 
b/drivers/gpu/drm/amd/display/modules/hdcp/hdcp_log.c
index 6b3b5f610907..409a7d0e70fa 100644
--- a/drivers/gpu/drm/amd/display/modules/hdcp/hdcp_log.c
+++ b/drivers/gpu/drm/amd/display/modules/hdcp/hdcp_log.c
@@ -125,129 +125,12 @@ void mod_hdcp_log_ddc_trace(struct mod_hdcp *hdcp)
        }
 }
 
+#define CASE_FORMAT(entry) case entry: return #entry;
+
 char *mod_hdcp_status_to_str(int32_t status)
 {
        switch (status) {
-       case MOD_HDCP_STATUS_SUCCESS:
-               return "MOD_HDCP_STATUS_SUCCESS";
-       case MOD_HDCP_STATUS_FAILURE:
-               return "MOD_HDCP_STATUS_FAILURE";
-       case MOD_HDCP_STATUS_RESET_NEEDED:
-               return "MOD_HDCP_STATUS_RESET_NEEDED";
-       case MOD_HDCP_STATUS_DISPLAY_OUT_OF_BOUND:
-               return "MOD_HDCP_STATUS_DISPLAY_OUT_OF_BOUND";
-       case MOD_HDCP_STATUS_DISPLAY_NOT_FOUND:
-               return "MOD_HDCP_STATUS_DISPLAY_NOT_FOUND";
-       case MOD_HDCP_STATUS_INVALID_STATE:
-               return "MOD_HDCP_STATUS_INVALID_STATE";
-       case MOD_HDCP_STATUS_NOT_IMPLEMENTED:
-               return "MOD_HDCP_STATUS_NOT_IMPLEMENTED";
-       case MOD_HDCP_STATUS_INTERNAL_POLICY_FAILURE:
-               return "MOD_HDCP_STATUS_INTERNAL_POLICY_FAILURE";
-       case MOD_HDCP_STATUS_UPDATE_TOPOLOGY_FAILURE:
-               return "MOD_HDCP_STATUS_UPDATE_TOPOLOGY_FAILURE";
-       case MOD_HDCP_STATUS_CREATE_PSP_SERVICE_FAILURE:
-               return "MOD_HDCP_STATUS_CREATE_PSP_SERVICE_FAILURE";
-       case MOD_HDCP_STATUS_DESTROY_PSP_SERVICE_FAILURE:
-               return "MOD_HDCP_STATUS_DESTROY_PSP_SERVICE_FAILURE";
-       case MOD_HDCP_STATUS_HDCP1_CREATE_SESSION_FAILURE:
-               return "MOD_HDCP_STATUS_HDCP1_CREATE_SESSION_FAILURE";
-       case MOD_HDCP_STATUS_HDCP1_DESTROY_SESSION_FAILURE:
-               return "MOD_HDCP_STATUS_HDCP1_DESTROY_SESSION_FAILURE";
-       case MOD_HDCP_STATUS_HDCP1_VALIDATE_ENCRYPTION_FAILURE:
-               return "MOD_HDCP_STATUS_HDCP1_VALIDATE_ENCRYPTION_FAILURE";
-       case MOD_HDCP_STATUS_HDCP1_NOT_HDCP_REPEATER:
-               return "MOD_HDCP_STATUS_HDCP1_NOT_HDCP_REPEATER";
-       case MOD_HDCP_STATUS_HDCP1_NOT_CAPABLE:
-               return "MOD_HDCP_STATUS_HDCP1_NOT_CAPABLE";
-       case MOD_HDCP_STATUS_HDCP1_R0_PRIME_PENDING:
-               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_FAILURE:
-               return "MOD_HDCP_STATUS_HDCP1_ENABLE_ENCRYPTION_FAILURE";
-       case MOD_HDCP_STATUS_HDCP1_ENABLE_STREAM_ENCRYPTION_FAILURE:
-               return "MOD_HDCP_STATUS_HDCP1_ENABLE_STREAM_ENCRYPTION_FAILURE";
-       case MOD_HDCP_STATUS_HDCP1_MAX_CASCADE_EXCEEDED_FAILURE:
-               return "MOD_HDCP_STATUS_HDCP1_MAX_CASCADE_EXCEEDED_FAILURE";
-       case MOD_HDCP_STATUS_HDCP1_MAX_DEVS_EXCEEDED_FAILURE:
-               return "MOD_HDCP_STATUS_HDCP1_MAX_DEVS_EXCEEDED_FAILURE";
-       case MOD_HDCP_STATUS_HDCP1_DEVICE_COUNT_MISMATCH_FAILURE:
-               return "MOD_HDCP_STATUS_HDCP1_DEVICE_COUNT_MISMATCH_FAILURE";
-       case MOD_HDCP_STATUS_HDCP1_LINK_INTEGRITY_FAILURE:
-               return "MOD_HDCP_STATUS_HDCP1_LINK_INTEGRITY_FAILURE";
-       case MOD_HDCP_STATUS_HDCP1_REAUTH_REQUEST_ISSUED:
-               return "MOD_HDCP_STATUS_HDCP1_REAUTH_REQUEST_ISSUED";
-       case MOD_HDCP_STATUS_HDCP1_LINK_MAINTENANCE_FAILURE:
-               return "MOD_HDCP_STATUS_HDCP1_LINK_MAINTENANCE_FAILURE";
-       case MOD_HDCP_STATUS_HDCP1_INVALID_BKSV:
-               return "MOD_HDCP_STATUS_HDCP1_INVALID_BKSV";
-       case MOD_HDCP_STATUS_DDC_FAILURE:
-               return "MOD_HDCP_STATUS_DDC_FAILURE";
-       case MOD_HDCP_STATUS_INVALID_OPERATION:
-               return "MOD_HDCP_STATUS_INVALID_OPERATION";
-       case MOD_HDCP_STATUS_HDCP2_NOT_CAPABLE:
-               return "MOD_HDCP_STATUS_HDCP2_NOT_CAPABLE";
-       case MOD_HDCP_STATUS_HDCP2_CREATE_SESSION_FAILURE:
-               return "MOD_HDCP_STATUS_HDCP2_CREATE_SESSION_FAILURE";
-       case MOD_HDCP_STATUS_HDCP2_DESTROY_SESSION_FAILURE:
-               return "MOD_HDCP_STATUS_HDCP2_DESTROY_SESSION_FAILURE";
-       case MOD_HDCP_STATUS_HDCP2_PREP_AKE_INIT_FAILURE:
-               return "MOD_HDCP_STATUS_HDCP2_PREP_AKE_INIT_FAILURE";
-       case MOD_HDCP_STATUS_HDCP2_AKE_CERT_PENDING:
-               return "MOD_HDCP_STATUS_HDCP2_AKE_CERT_PENDING";
-       case MOD_HDCP_STATUS_HDCP2_H_PRIME_PENDING:
-               return "MOD_HDCP_STATUS_HDCP2_H_PRIME_PENDING";
-       case MOD_HDCP_STATUS_HDCP2_PAIRING_INFO_PENDING:
-               return "MOD_HDCP_STATUS_HDCP2_PAIRING_INFO_PENDING";
-       case MOD_HDCP_STATUS_HDCP2_VALIDATE_AKE_CERT_FAILURE:
-               return "MOD_HDCP_STATUS_HDCP2_VALIDATE_AKE_CERT_FAILURE";
-       case MOD_HDCP_STATUS_HDCP2_AKE_CERT_REVOKED:
-               return "MOD_HDCP_STATUS_HDCP2_AKE_CERT_REVOKED";
-       case MOD_HDCP_STATUS_HDCP2_VALIDATE_H_PRIME_FAILURE:
-               return "MOD_HDCP_STATUS_HDCP2_VALIDATE_H_PRIME_FAILURE";
-       case MOD_HDCP_STATUS_HDCP2_VALIDATE_PAIRING_INFO_FAILURE:
-               return "MOD_HDCP_STATUS_HDCP2_VALIDATE_PAIRING_INFO_FAILURE";
-       case MOD_HDCP_STATUS_HDCP2_PREP_LC_INIT_FAILURE:
-               return "MOD_HDCP_STATUS_HDCP2_PREP_LC_INIT_FAILURE";
-       case MOD_HDCP_STATUS_HDCP2_L_PRIME_PENDING:
-               return "MOD_HDCP_STATUS_HDCP2_L_PRIME_PENDING";
-       case MOD_HDCP_STATUS_HDCP2_VALIDATE_L_PRIME_FAILURE:
-               return "MOD_HDCP_STATUS_HDCP2_VALIDATE_L_PRIME_FAILURE";
-       case MOD_HDCP_STATUS_HDCP2_PREP_EKS_FAILURE:
-               return "MOD_HDCP_STATUS_HDCP2_PREP_EKS_FAILURE";
-       case MOD_HDCP_STATUS_HDCP2_ENABLE_ENCRYPTION_FAILURE:
-               return "MOD_HDCP_STATUS_HDCP2_ENABLE_ENCRYPTION_FAILURE";
-       case MOD_HDCP_STATUS_HDCP2_VALIDATE_RX_ID_LIST_FAILURE:
-               return "MOD_HDCP_STATUS_HDCP2_VALIDATE_RX_ID_LIST_FAILURE";
-       case MOD_HDCP_STATUS_HDCP2_RX_ID_LIST_REVOKED:
-               return "MOD_HDCP_STATUS_HDCP2_RX_ID_LIST_REVOKED";
-       case MOD_HDCP_STATUS_HDCP2_RX_ID_LIST_NOT_READY:
-               return "MOD_HDCP_STATUS_HDCP2_RX_ID_LIST_NOT_READY";
-       case MOD_HDCP_STATUS_HDCP2_ENABLE_STREAM_ENCRYPTION_FAILURE:
-               return "MOD_HDCP_STATUS_HDCP2_ENABLE_STREAM_ENCRYPTION_FAILURE";
-       case MOD_HDCP_STATUS_HDCP2_STREAM_READY_PENDING:
-               return "MOD_HDCP_STATUS_HDCP2_STREAM_READY_PENDING";
-       case MOD_HDCP_STATUS_HDCP2_VALIDATE_STREAM_READY_FAILURE:
-               return "MOD_HDCP_STATUS_HDCP2_VALIDATE_STREAM_READY_FAILURE";
-       case MOD_HDCP_STATUS_HDCP2_PREPARE_STREAM_MANAGEMENT_FAILURE:
-               return 
"MOD_HDCP_STATUS_HDCP2_PREPARE_STREAM_MANAGEMENT_FAILURE";
-       case MOD_HDCP_STATUS_HDCP2_REAUTH_REQUEST:
-               return "MOD_HDCP_STATUS_HDCP2_REAUTH_REQUEST";
-       case MOD_HDCP_STATUS_HDCP2_REAUTH_LINK_INTEGRITY_FAILURE:
-               return "MOD_HDCP_STATUS_HDCP2_REAUTH_LINK_INTEGRITY_FAILURE";
-       case MOD_HDCP_STATUS_HDCP2_DEVICE_COUNT_MISMATCH_FAILURE:
-               return "MOD_HDCP_STATUS_HDCP2_DEVICE_COUNT_MISMATCH_FAILURE";
-       case MOD_HDCP_STATUS_UNSUPPORTED_PSP_VER_FAILURE:
-               return "MOD_HDCP_STATUS_UNSUPPORTED_PSP_VER_FAILURE";
+       MOD_HDCP_STATUS_LIST(CASE_FORMAT)
        default:
                return "MOD_HDCP_STATUS_UNKNOWN";
        }
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 46e52fb3a118..835467225458 100644
--- a/drivers/gpu/drm/amd/display/modules/inc/mod_hdcp.h
+++ b/drivers/gpu/drm/amd/display/modules/inc/mod_hdcp.h
@@ -35,69 +35,74 @@ struct mod_hdcp;
 #define MAX_NUM_OF_DISPLAYS 6
 #define MAX_NUM_OF_ATTEMPTS 4
 #define MAX_NUM_OF_ERROR_TRACE 10
+#define MOD_HDCP_STATUS_LIST(FORMAT) \
+       FORMAT(MOD_HDCP_STATUS_SUCCESS) \
+       FORMAT(MOD_HDCP_STATUS_FAILURE) \
+       FORMAT(MOD_HDCP_STATUS_RESET_NEEDED) \
+       FORMAT(MOD_HDCP_STATUS_DISPLAY_OUT_OF_BOUND) \
+       FORMAT(MOD_HDCP_STATUS_DISPLAY_NOT_FOUND) \
+       FORMAT(MOD_HDCP_STATUS_INVALID_STATE) \
+       FORMAT(MOD_HDCP_STATUS_NOT_IMPLEMENTED) \
+       FORMAT(MOD_HDCP_STATUS_INTERNAL_POLICY_FAILURE) \
+       FORMAT(MOD_HDCP_STATUS_UPDATE_TOPOLOGY_FAILURE) \
+       FORMAT(MOD_HDCP_STATUS_CREATE_PSP_SERVICE_FAILURE) \
+       FORMAT(MOD_HDCP_STATUS_DESTROY_PSP_SERVICE_FAILURE) \
+       FORMAT(MOD_HDCP_STATUS_HDCP1_CREATE_SESSION_FAILURE) \
+       FORMAT(MOD_HDCP_STATUS_HDCP1_DESTROY_SESSION_FAILURE) \
+       FORMAT(MOD_HDCP_STATUS_HDCP1_VALIDATE_ENCRYPTION_FAILURE) \
+       FORMAT(MOD_HDCP_STATUS_HDCP1_NOT_HDCP_REPEATER) \
+       FORMAT(MOD_HDCP_STATUS_HDCP1_NOT_CAPABLE) \
+       FORMAT(MOD_HDCP_STATUS_HDCP1_R0_PRIME_PENDING) \
+       FORMAT(MOD_HDCP_STATUS_HDCP1_VALIDATE_RX_FAILURE) \
+       FORMAT(MOD_HDCP_STATUS_HDCP1_BKSV_REVOKED) \
+       FORMAT(MOD_HDCP_STATUS_HDCP1_KSV_LIST_NOT_READY) \
+       FORMAT(MOD_HDCP_STATUS_HDCP1_VALIDATE_KSV_LIST_FAILURE) \
+       FORMAT(MOD_HDCP_STATUS_HDCP1_KSV_LIST_REVOKED) \
+       FORMAT(MOD_HDCP_STATUS_HDCP1_ENABLE_ENCRYPTION_FAILURE) \
+       FORMAT(MOD_HDCP_STATUS_HDCP1_ENABLE_STREAM_ENCRYPTION_FAILURE) \
+       FORMAT(MOD_HDCP_STATUS_HDCP1_MAX_CASCADE_EXCEEDED_FAILURE) \
+       FORMAT(MOD_HDCP_STATUS_HDCP1_MAX_DEVS_EXCEEDED_FAILURE) \
+       FORMAT(MOD_HDCP_STATUS_HDCP1_DEVICE_COUNT_MISMATCH_FAILURE) \
+       FORMAT(MOD_HDCP_STATUS_HDCP1_LINK_INTEGRITY_FAILURE) \
+       FORMAT(MOD_HDCP_STATUS_HDCP1_REAUTH_REQUEST_ISSUED) \
+       FORMAT(MOD_HDCP_STATUS_HDCP1_LINK_MAINTENANCE_FAILURE) \
+       FORMAT(MOD_HDCP_STATUS_HDCP1_INVALID_BKSV) \
+       FORMAT(MOD_HDCP_STATUS_DDC_FAILURE) /* TODO: specific errors */ \
+       FORMAT(MOD_HDCP_STATUS_INVALID_OPERATION) \
+       FORMAT(MOD_HDCP_STATUS_HDCP2_NOT_CAPABLE) \
+       FORMAT(MOD_HDCP_STATUS_HDCP2_CREATE_SESSION_FAILURE) \
+       FORMAT(MOD_HDCP_STATUS_HDCP2_DESTROY_SESSION_FAILURE) \
+       FORMAT(MOD_HDCP_STATUS_HDCP2_PREP_AKE_INIT_FAILURE) \
+       FORMAT(MOD_HDCP_STATUS_HDCP2_AKE_CERT_PENDING) \
+       FORMAT(MOD_HDCP_STATUS_HDCP2_H_PRIME_PENDING) \
+       FORMAT(MOD_HDCP_STATUS_HDCP2_PAIRING_INFO_PENDING) \
+       FORMAT(MOD_HDCP_STATUS_HDCP2_VALIDATE_AKE_CERT_FAILURE) \
+       FORMAT(MOD_HDCP_STATUS_HDCP2_AKE_CERT_REVOKED) \
+       FORMAT(MOD_HDCP_STATUS_HDCP2_VALIDATE_H_PRIME_FAILURE) \
+       FORMAT(MOD_HDCP_STATUS_HDCP2_VALIDATE_PAIRING_INFO_FAILURE) \
+       FORMAT(MOD_HDCP_STATUS_HDCP2_PREP_LC_INIT_FAILURE) \
+       FORMAT(MOD_HDCP_STATUS_HDCP2_L_PRIME_PENDING) \
+       FORMAT(MOD_HDCP_STATUS_HDCP2_VALIDATE_L_PRIME_FAILURE) \
+       FORMAT(MOD_HDCP_STATUS_HDCP2_PREP_EKS_FAILURE) \
+       FORMAT(MOD_HDCP_STATUS_HDCP2_ENABLE_ENCRYPTION_FAILURE) \
+       FORMAT(MOD_HDCP_STATUS_HDCP2_RX_ID_LIST_NOT_READY) \
+       FORMAT(MOD_HDCP_STATUS_HDCP2_VALIDATE_RX_ID_LIST_FAILURE) \
+       FORMAT(MOD_HDCP_STATUS_HDCP2_RX_ID_LIST_REVOKED) \
+       FORMAT(MOD_HDCP_STATUS_HDCP2_ENABLE_STREAM_ENCRYPTION_FAILURE) \
+       FORMAT(MOD_HDCP_STATUS_HDCP2_STREAM_READY_PENDING) \
+       FORMAT(MOD_HDCP_STATUS_HDCP2_VALIDATE_STREAM_READY_FAILURE) \
+       FORMAT(MOD_HDCP_STATUS_HDCP2_PREPARE_STREAM_MANAGEMENT_FAILURE) \
+       FORMAT(MOD_HDCP_STATUS_HDCP2_REAUTH_REQUEST) \
+       FORMAT(MOD_HDCP_STATUS_HDCP2_REAUTH_LINK_INTEGRITY_FAILURE) \
+       FORMAT(MOD_HDCP_STATUS_HDCP2_DEVICE_COUNT_MISMATCH_FAILURE) \
+       FORMAT(MOD_HDCP_STATUS_UNSUPPORTED_PSP_VER_FAILURE) \
+       FORMAT(MOD_HDCP_STATUS_HDCP2_LOCALITY_COMBO_READ_FAILURE)
+
+#define ENUM_FORMAT(entry) entry,
 
 /* detailed return status */
 enum mod_hdcp_status {
-       MOD_HDCP_STATUS_SUCCESS = 0,
-       MOD_HDCP_STATUS_FAILURE,
-       MOD_HDCP_STATUS_RESET_NEEDED,
-       MOD_HDCP_STATUS_DISPLAY_OUT_OF_BOUND,
-       MOD_HDCP_STATUS_DISPLAY_NOT_FOUND,
-       MOD_HDCP_STATUS_INVALID_STATE,
-       MOD_HDCP_STATUS_NOT_IMPLEMENTED,
-       MOD_HDCP_STATUS_INTERNAL_POLICY_FAILURE,
-       MOD_HDCP_STATUS_UPDATE_TOPOLOGY_FAILURE,
-       MOD_HDCP_STATUS_CREATE_PSP_SERVICE_FAILURE,
-       MOD_HDCP_STATUS_DESTROY_PSP_SERVICE_FAILURE,
-       MOD_HDCP_STATUS_HDCP1_CREATE_SESSION_FAILURE,
-       MOD_HDCP_STATUS_HDCP1_DESTROY_SESSION_FAILURE,
-       MOD_HDCP_STATUS_HDCP1_VALIDATE_ENCRYPTION_FAILURE,
-       MOD_HDCP_STATUS_HDCP1_NOT_HDCP_REPEATER,
-       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_FAILURE,
-       MOD_HDCP_STATUS_HDCP1_ENABLE_STREAM_ENCRYPTION_FAILURE,
-       MOD_HDCP_STATUS_HDCP1_MAX_CASCADE_EXCEEDED_FAILURE,
-       MOD_HDCP_STATUS_HDCP1_MAX_DEVS_EXCEEDED_FAILURE,
-       MOD_HDCP_STATUS_HDCP1_DEVICE_COUNT_MISMATCH_FAILURE,
-       MOD_HDCP_STATUS_HDCP1_LINK_INTEGRITY_FAILURE,
-       MOD_HDCP_STATUS_HDCP1_REAUTH_REQUEST_ISSUED,
-       MOD_HDCP_STATUS_HDCP1_LINK_MAINTENANCE_FAILURE,
-       MOD_HDCP_STATUS_HDCP1_INVALID_BKSV,
-       MOD_HDCP_STATUS_DDC_FAILURE, /* TODO: specific errors */
-       MOD_HDCP_STATUS_INVALID_OPERATION,
-       MOD_HDCP_STATUS_HDCP2_NOT_CAPABLE,
-       MOD_HDCP_STATUS_HDCP2_CREATE_SESSION_FAILURE,
-       MOD_HDCP_STATUS_HDCP2_DESTROY_SESSION_FAILURE,
-       MOD_HDCP_STATUS_HDCP2_PREP_AKE_INIT_FAILURE,
-       MOD_HDCP_STATUS_HDCP2_AKE_CERT_PENDING,
-       MOD_HDCP_STATUS_HDCP2_H_PRIME_PENDING,
-       MOD_HDCP_STATUS_HDCP2_PAIRING_INFO_PENDING,
-       MOD_HDCP_STATUS_HDCP2_VALIDATE_AKE_CERT_FAILURE,
-       MOD_HDCP_STATUS_HDCP2_AKE_CERT_REVOKED,
-       MOD_HDCP_STATUS_HDCP2_VALIDATE_H_PRIME_FAILURE,
-       MOD_HDCP_STATUS_HDCP2_VALIDATE_PAIRING_INFO_FAILURE,
-       MOD_HDCP_STATUS_HDCP2_PREP_LC_INIT_FAILURE,
-       MOD_HDCP_STATUS_HDCP2_L_PRIME_PENDING,
-       MOD_HDCP_STATUS_HDCP2_VALIDATE_L_PRIME_FAILURE,
-       MOD_HDCP_STATUS_HDCP2_PREP_EKS_FAILURE,
-       MOD_HDCP_STATUS_HDCP2_ENABLE_ENCRYPTION_FAILURE,
-       MOD_HDCP_STATUS_HDCP2_RX_ID_LIST_NOT_READY,
-       MOD_HDCP_STATUS_HDCP2_VALIDATE_RX_ID_LIST_FAILURE,
-       MOD_HDCP_STATUS_HDCP2_RX_ID_LIST_REVOKED,
-       MOD_HDCP_STATUS_HDCP2_ENABLE_STREAM_ENCRYPTION_FAILURE,
-       MOD_HDCP_STATUS_HDCP2_STREAM_READY_PENDING,
-       MOD_HDCP_STATUS_HDCP2_VALIDATE_STREAM_READY_FAILURE,
-       MOD_HDCP_STATUS_HDCP2_PREPARE_STREAM_MANAGEMENT_FAILURE,
-       MOD_HDCP_STATUS_HDCP2_REAUTH_REQUEST,
-       MOD_HDCP_STATUS_HDCP2_REAUTH_LINK_INTEGRITY_FAILURE,
-       MOD_HDCP_STATUS_HDCP2_DEVICE_COUNT_MISMATCH_FAILURE,
-       MOD_HDCP_STATUS_UNSUPPORTED_PSP_VER_FAILURE,
+       MOD_HDCP_STATUS_LIST(ENUM_FORMAT)
 };
 
 struct mod_hdcp_displayport {
@@ -214,8 +219,9 @@ struct mod_hdcp_link_adjustment_hdcp2 {
        uint8_t force_type              : 2;
        uint8_t force_no_stored_km      : 1;
        uint8_t increase_h_prime_timeout: 1;
-       uint8_t force_sw_locality_check : 1;
-       uint8_t reserved                : 2;
+       uint8_t use_fw_locality_check   : 1;
+       uint8_t use_sw_locality_fallback: 1;
+       uint8_t reserved                : 1;
 };
 
 struct mod_hdcp_link_adjustment {
@@ -317,10 +323,6 @@ struct mod_hdcp_display_query {
 struct mod_hdcp_config {
        struct mod_hdcp_psp psp;
        struct mod_hdcp_ddc ddc;
-       struct {
-               uint8_t lc_enable_sw_fallback : 1;
-               uint8_t reserved : 7;
-       } debug;
        uint8_t index;
 };
 
-- 
2.43.0


Reply via email to