drm/amd/display: Change AUX NACK behavior
authorIlya Bakoulin <Ilya.Bakoulin@amd.com>
Thu, 4 Aug 2022 17:44:51 +0000 (13:44 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 25 Aug 2022 17:34:40 +0000 (13:34 -0400)
[Why]
Retrying on receiving a NACK can result in long overall EDID read times
in some cases.

[How]
Retry only on DEFER and return immediately on NACK.

Reviewed-by: Aric Cyr <Aric.Cyr@amd.com>
Acked-by: Brian Chang <Brian.Chang@amd.com>
Signed-off-by: Ilya Bakoulin <Ilya.Bakoulin@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dce/dce_aux.c

index 919c2c2..32782ef 100644 (file)
@@ -814,12 +814,6 @@ bool dce_aux_transfer_with_retries(struct ddc_service *ddc,
                                                                "dce_aux_transfer_with_retries: AUX_RET_SUCCESS: AUX_TRANSACTION_REPLY_I2C_OVER_AUX_DEFER");
 
                                retry_on_defer = true;
-                               fallthrough;
-                       case AUX_TRANSACTION_REPLY_I2C_OVER_AUX_NACK:
-                               if (*payload->reply == AUX_TRANSACTION_REPLY_I2C_OVER_AUX_NACK)
-                                       DC_TRACE_LEVEL_MESSAGE(DAL_TRACE_LEVEL_INFORMATION,
-                                                               LOG_FLAG_I2cAux_DceAux,
-                                                               "dce_aux_transfer_with_retries: AUX_RET_SUCCESS: AUX_TRANSACTION_REPLY_I2C_OVER_AUX_NACK");
 
                                if (aux_defer_retries >= AUX_MIN_DEFER_RETRIES
                                                && defer_time_in_ms >= AUX_MAX_DEFER_TIMEOUT_MS) {
@@ -848,7 +842,11 @@ bool dce_aux_transfer_with_retries(struct ddc_service *ddc,
                                        }
                                }
                                break;
-
+                       case AUX_TRANSACTION_REPLY_I2C_OVER_AUX_NACK:
+                               DC_TRACE_LEVEL_MESSAGE(DAL_TRACE_LEVEL_INFORMATION,
+                                                       LOG_FLAG_I2cAux_DceAux,
+                                                       "dce_aux_transfer_with_retries: FAILURE: AUX_TRANSACTION_REPLY_I2C_OVER_AUX_NACK");
+                               goto fail;
                        case AUX_TRANSACTION_REPLY_I2C_DEFER:
                                DC_TRACE_LEVEL_MESSAGE(DAL_TRACE_LEVEL_INFORMATION,
                                                        LOG_FLAG_I2cAux_DceAux,