diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/4532-drm-amd-display-AUX-will-exit-when-HPD-LOW-detected.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.14.71/4532-drm-amd-display-AUX-will-exit-when-HPD-LOW-detected.patch | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/4532-drm-amd-display-AUX-will-exit-when-HPD-LOW-detected.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/4532-drm-amd-display-AUX-will-exit-when-HPD-LOW-detected.patch new file mode 100644 index 00000000..09186ad9 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/4532-drm-amd-display-AUX-will-exit-when-HPD-LOW-detected.patch @@ -0,0 +1,177 @@ +From a54cec55c5d512f336e4a4e5141203c04df376af Mon Sep 17 00:00:00 2001 +From: Hersen Wu <hersenxs.wu@amd.com> +Date: Mon, 23 Apr 2018 19:21:45 -0400 +Subject: [PATCH 4532/5725] drm/amd/display: AUX will exit when HPD LOW + detected + +This change shorten wait time when HPD LOW. With HPD LOW, without this +change, AUX routine delay is 450us. With this change, it is 42us. + +Signed-off-by: Hersen Wu <hersenxs.wu@amd.com> +Reviewed-by: Tony Cheng <Tony.Cheng@amd.com> +Reviewed-by: Harry Wentland <Harry.Wentland@amd.com> +--- + drivers/gpu/drm/amd/display/dc/i2caux/aux_engine.c | 16 ++++++++++++++++ + drivers/gpu/drm/amd/display/dc/i2caux/aux_engine.h | 5 ++++- + .../display/dc/i2caux/dce110/aux_engine_dce110.c | 22 +++++++++++++++++----- + drivers/gpu/drm/amd/display/dc/i2caux/engine.h | 3 ++- + .../drm/amd/display/include/ddc_service_types.h | 3 ++- + 5 files changed, 41 insertions(+), 8 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/dc/i2caux/aux_engine.c b/drivers/gpu/drm/amd/display/dc/i2caux/aux_engine.c +index bb526ad..1d73096 100644 +--- a/drivers/gpu/drm/amd/display/dc/i2caux/aux_engine.c ++++ b/drivers/gpu/drm/amd/display/dc/i2caux/aux_engine.c +@@ -157,6 +157,10 @@ static void process_read_reply( + ctx->operation_succeeded = false; + } + break; ++ case AUX_TRANSACTION_REPLY_HPD_DISCON: ++ ctx->status = I2CAUX_TRANSACTION_STATUS_FAILED_HPD_DISCON; ++ ctx->operation_succeeded = false; ++ break; + default: + ctx->status = I2CAUX_TRANSACTION_STATUS_UNKNOWN; + ctx->operation_succeeded = false; +@@ -215,6 +219,10 @@ static void process_read_request( + * so we should not wait here */ + } + break; ++ case AUX_CHANNEL_OPERATION_FAILED_HPD_DISCON: ++ ctx->status = I2CAUX_TRANSACTION_STATUS_FAILED_HPD_DISCON; ++ ctx->operation_succeeded = false; ++ break; + default: + ctx->status = I2CAUX_TRANSACTION_STATUS_UNKNOWN; + ctx->operation_succeeded = false; +@@ -370,6 +378,10 @@ static void process_write_reply( + ctx->operation_succeeded = false; + } + break; ++ case AUX_TRANSACTION_REPLY_HPD_DISCON: ++ ctx->status = I2CAUX_TRANSACTION_STATUS_FAILED_HPD_DISCON; ++ ctx->operation_succeeded = false; ++ break; + default: + ctx->status = I2CAUX_TRANSACTION_STATUS_UNKNOWN; + ctx->operation_succeeded = false; +@@ -422,6 +434,10 @@ static void process_write_request( + * so we should not wait here */ + } + break; ++ case AUX_CHANNEL_OPERATION_FAILED_HPD_DISCON: ++ ctx->status = I2CAUX_TRANSACTION_STATUS_FAILED_HPD_DISCON; ++ ctx->operation_succeeded = false; ++ break; + default: + ctx->status = I2CAUX_TRANSACTION_STATUS_UNKNOWN; + ctx->operation_succeeded = false; +diff --git a/drivers/gpu/drm/amd/display/dc/i2caux/aux_engine.h b/drivers/gpu/drm/amd/display/dc/i2caux/aux_engine.h +index 8e71324..b9e35d0 100644 +--- a/drivers/gpu/drm/amd/display/dc/i2caux/aux_engine.h ++++ b/drivers/gpu/drm/amd/display/dc/i2caux/aux_engine.h +@@ -51,6 +51,8 @@ enum aux_transaction_reply { + AUX_TRANSACTION_REPLY_I2C_NACK = 0x10, + AUX_TRANSACTION_REPLY_I2C_DEFER = 0x20, + ++ AUX_TRANSACTION_REPLY_HPD_DISCON = 0x40, ++ + AUX_TRANSACTION_REPLY_INVALID = 0xFF + }; + +@@ -64,7 +66,8 @@ enum aux_channel_operation_result { + AUX_CHANNEL_OPERATION_SUCCEEDED, + AUX_CHANNEL_OPERATION_FAILED_REASON_UNKNOWN, + AUX_CHANNEL_OPERATION_FAILED_INVALID_REPLY, +- AUX_CHANNEL_OPERATION_FAILED_TIMEOUT ++ AUX_CHANNEL_OPERATION_FAILED_TIMEOUT, ++ AUX_CHANNEL_OPERATION_FAILED_HPD_DISCON + }; + + struct aux_engine; +diff --git a/drivers/gpu/drm/amd/display/dc/i2caux/dce110/aux_engine_dce110.c b/drivers/gpu/drm/amd/display/dc/i2caux/dce110/aux_engine_dce110.c +index 9053578..2b927f2 100644 +--- a/drivers/gpu/drm/amd/display/dc/i2caux/dce110/aux_engine_dce110.c ++++ b/drivers/gpu/drm/amd/display/dc/i2caux/dce110/aux_engine_dce110.c +@@ -291,6 +291,12 @@ static void process_channel_reply( + value = REG_GET(AUX_SW_STATUS, + AUX_SW_REPLY_BYTE_COUNT, &bytes_replied); + ++ /* in case HPD is LOW, exit AUX transaction */ ++ if ((value & AUX_SW_STATUS__AUX_SW_HPD_DISCON_MASK)) { ++ reply->status = AUX_TRANSACTION_REPLY_HPD_DISCON; ++ return; ++ } ++ + if (bytes_replied) { + uint32_t reply_result; + +@@ -347,8 +353,10 @@ static void process_channel_reply( + * because there was surely an error that was asserted + * that should have been handled + * for hot plug case, this could happens*/ +- if (!(value & AUX_SW_STATUS__AUX_SW_HPD_DISCON_MASK)) ++ if (!(value & AUX_SW_STATUS__AUX_SW_HPD_DISCON_MASK)) { ++ reply->status = AUX_TRANSACTION_REPLY_INVALID; + ASSERT_CRITICAL(false); ++ } + } + } + +@@ -371,6 +379,10 @@ static enum aux_channel_operation_result get_channel_status( + value = REG_WAIT(AUX_SW_STATUS, AUX_SW_DONE, 1, + 10, aux110->timeout_period/10); + ++ /* in case HPD is LOW, exit AUX transaction */ ++ if ((value & AUX_SW_STATUS__AUX_SW_HPD_DISCON_MASK)) ++ return AUX_CHANNEL_OPERATION_FAILED_HPD_DISCON; ++ + /* Note that the following bits are set in 'status.bits' + * during CTS 4.2.1.2 (FW 3.3.1): + * AUX_SW_RX_MIN_COUNT_VIOL, AUX_SW_RX_INVALID_STOP, +@@ -402,10 +414,10 @@ static enum aux_channel_operation_result get_channel_status( + return AUX_CHANNEL_OPERATION_SUCCEEDED; + } + } else { +- /*time_elapsed >= aux_engine->timeout_period */ +- if (!(value & AUX_SW_STATUS__AUX_SW_HPD_DISCON_MASK)) +- ASSERT_CRITICAL(false); +- ++ /*time_elapsed >= aux_engine->timeout_period ++ * AUX_SW_STATUS__AUX_SW_HPD_DISCON = at this point ++ */ ++ ASSERT_CRITICAL(false); + return AUX_CHANNEL_OPERATION_FAILED_TIMEOUT; + } + } +diff --git a/drivers/gpu/drm/amd/display/dc/i2caux/engine.h b/drivers/gpu/drm/amd/display/dc/i2caux/engine.h +index 33de8a8..c110970 100644 +--- a/drivers/gpu/drm/amd/display/dc/i2caux/engine.h ++++ b/drivers/gpu/drm/amd/display/dc/i2caux/engine.h +@@ -53,7 +53,8 @@ enum i2caux_transaction_status { + I2CAUX_TRANSACTION_STATUS_FAILED_INCOMPLETE, + I2CAUX_TRANSACTION_STATUS_FAILED_OPERATION, + I2CAUX_TRANSACTION_STATUS_FAILED_INVALID_OPERATION, +- I2CAUX_TRANSACTION_STATUS_FAILED_BUFFER_OVERFLOW ++ I2CAUX_TRANSACTION_STATUS_FAILED_BUFFER_OVERFLOW, ++ I2CAUX_TRANSACTION_STATUS_FAILED_HPD_DISCON + }; + + struct i2caux_transaction_request { +diff --git a/drivers/gpu/drm/amd/display/include/ddc_service_types.h b/drivers/gpu/drm/amd/display/include/ddc_service_types.h +index 019e7a0..d968956 100644 +--- a/drivers/gpu/drm/amd/display/include/ddc_service_types.h ++++ b/drivers/gpu/drm/amd/display/include/ddc_service_types.h +@@ -40,7 +40,8 @@ enum ddc_result { + DDC_RESULT_FAILED_INCOMPLETE, + DDC_RESULT_FAILED_OPERATION, + DDC_RESULT_FAILED_INVALID_OPERATION, +- DDC_RESULT_FAILED_BUFFER_OVERFLOW ++ DDC_RESULT_FAILED_BUFFER_OVERFLOW, ++ DDC_RESULT_FAILED_HPD_DISCON + }; + + enum ddc_service_type { +-- +2.7.4 + |