aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/4891-Revert-drm-amd-display-make-dm_dp_aux_transfer-retur.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/4891-Revert-drm-amd-display-make-dm_dp_aux_transfer-retur.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.14.71/4891-Revert-drm-amd-display-make-dm_dp_aux_transfer-retur.patch156
1 files changed, 156 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/4891-Revert-drm-amd-display-make-dm_dp_aux_transfer-retur.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/4891-Revert-drm-amd-display-make-dm_dp_aux_transfer-retur.patch
new file mode 100644
index 00000000..ff00801f
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/4891-Revert-drm-amd-display-make-dm_dp_aux_transfer-retur.patch
@@ -0,0 +1,156 @@
+From 2ea2173581cf00e775a13a61b70a4dc2bcb650c8 Mon Sep 17 00:00:00 2001
+From: Harry Wentland <harry.wentland@amd.com>
+Date: Fri, 6 Jul 2018 10:54:33 -0400
+Subject: [PATCH 4891/5725] Revert "drm/amd/display: make dm_dp_aux_transfer
+ return payload bytes instead of size"
+
+This reverts commit cc195141133ac3e767d930bedd8294ceebf1f10b.
+
+This commit was problematic on other OSes. The real solution is to
+leave all the error checking to DRM and don't do it in DC, which is
+addressed by "Return aux replies directly to DRM" later in this patchset.
+
+v2: Add reason for revert.
+
+Signed-off-by: Harry Wentland <harry.wentland@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | 9 ++++-----
+ drivers/gpu/drm/amd/display/dc/core/dc_link_ddc.c | 7 +++----
+ drivers/gpu/drm/amd/display/dc/i2caux/aux_engine.c | 15 +++++++++++++--
+ drivers/gpu/drm/amd/display/dc/i2caux/i2caux.c | 1 -
+ drivers/gpu/drm/amd/display/dc/inc/dc_link_ddc.h | 2 +-
+ 5 files changed, 21 insertions(+), 13 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
+index e3110d6..d48a37a 100644
+--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
+@@ -82,21 +82,20 @@ static ssize_t dm_dp_aux_transfer(struct drm_dp_aux *aux,
+ enum i2c_mot_mode mot = (msg->request & DP_AUX_I2C_MOT) ?
+ I2C_MOT_TRUE : I2C_MOT_FALSE;
+ enum ddc_result res;
+- ssize_t read_bytes;
+
+ if (WARN_ON(msg->size > 16))
+ return -E2BIG;
+
+ switch (msg->request & ~DP_AUX_I2C_MOT) {
+ case DP_AUX_NATIVE_READ:
+- read_bytes = dal_ddc_service_read_dpcd_data(
++ res = dal_ddc_service_read_dpcd_data(
+ TO_DM_AUX(aux)->ddc_service,
+ false,
+ I2C_MOT_UNDEF,
+ msg->address,
+ msg->buffer,
+ msg->size);
+- return read_bytes;
++ break;
+ case DP_AUX_NATIVE_WRITE:
+ res = dal_ddc_service_write_dpcd_data(
+ TO_DM_AUX(aux)->ddc_service,
+@@ -107,14 +106,14 @@ static ssize_t dm_dp_aux_transfer(struct drm_dp_aux *aux,
+ msg->size);
+ break;
+ case DP_AUX_I2C_READ:
+- read_bytes = dal_ddc_service_read_dpcd_data(
++ res = dal_ddc_service_read_dpcd_data(
+ TO_DM_AUX(aux)->ddc_service,
+ true,
+ mot,
+ msg->address,
+ msg->buffer,
+ msg->size);
+- return read_bytes;
++ break;
+ case DP_AUX_I2C_WRITE:
+ res = dal_ddc_service_write_dpcd_data(
+ TO_DM_AUX(aux)->ddc_service,
+diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_ddc.c b/drivers/gpu/drm/amd/display/dc/core/dc_link_ddc.c
+index 49c2fac..d5294798b 100644
+--- a/drivers/gpu/drm/amd/display/dc/core/dc_link_ddc.c
++++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_ddc.c
+@@ -629,7 +629,7 @@ bool dal_ddc_service_query_ddc_data(
+ return ret;
+ }
+
+-ssize_t dal_ddc_service_read_dpcd_data(
++enum ddc_result dal_ddc_service_read_dpcd_data(
+ struct ddc_service *ddc,
+ bool i2c,
+ enum i2c_mot_mode mot,
+@@ -660,9 +660,8 @@ ssize_t dal_ddc_service_read_dpcd_data(
+ if (dal_i2caux_submit_aux_command(
+ ddc->ctx->i2caux,
+ ddc->ddc_pin,
+- &command)) {
+- return (ssize_t)command.payloads->length;
+- }
++ &command))
++ return DDC_RESULT_SUCESSFULL;
+
+ return DDC_RESULT_FAILED_OPERATION;
+ }
+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 1d73096..0afd2fa 100644
+--- a/drivers/gpu/drm/amd/display/dc/i2caux/aux_engine.c
++++ b/drivers/gpu/drm/amd/display/dc/i2caux/aux_engine.c
+@@ -128,8 +128,20 @@ static void process_read_reply(
+ ctx->status =
+ I2CAUX_TRANSACTION_STATUS_FAILED_PROTOCOL_ERROR;
+ ctx->operation_succeeded = false;
++ } else if (ctx->returned_byte < ctx->current_read_length) {
++ ctx->current_read_length -= ctx->returned_byte;
++
++ ctx->offset += ctx->returned_byte;
++
++ ++ctx->invalid_reply_retry_aux_on_ack;
++
++ if (ctx->invalid_reply_retry_aux_on_ack >
++ AUX_INVALID_REPLY_RETRY_COUNTER) {
++ ctx->status =
++ I2CAUX_TRANSACTION_STATUS_FAILED_PROTOCOL_ERROR;
++ ctx->operation_succeeded = false;
++ }
+ } else {
+- ctx->current_read_length = ctx->returned_byte;
+ ctx->status = I2CAUX_TRANSACTION_STATUS_SUCCEEDED;
+ ctx->transaction_complete = true;
+ ctx->operation_succeeded = true;
+@@ -290,7 +302,6 @@ static bool read_command(
+ ctx.operation_succeeded);
+ }
+
+- request->payload.length = ctx.reply.length;
+ return ctx.operation_succeeded;
+ }
+
+diff --git a/drivers/gpu/drm/amd/display/dc/i2caux/i2caux.c b/drivers/gpu/drm/amd/display/dc/i2caux/i2caux.c
+index 14dc8c9..9b0bcc6 100644
+--- a/drivers/gpu/drm/amd/display/dc/i2caux/i2caux.c
++++ b/drivers/gpu/drm/amd/display/dc/i2caux/i2caux.c
+@@ -254,7 +254,6 @@ bool dal_i2caux_submit_aux_command(
+ break;
+ }
+
+- cmd->payloads->length = request.payload.length;
+ ++index_of_payload;
+ }
+
+diff --git a/drivers/gpu/drm/amd/display/dc/inc/dc_link_ddc.h b/drivers/gpu/drm/amd/display/dc/inc/dc_link_ddc.h
+index 090b7a8..0bf73b7 100644
+--- a/drivers/gpu/drm/amd/display/dc/inc/dc_link_ddc.h
++++ b/drivers/gpu/drm/amd/display/dc/inc/dc_link_ddc.h
+@@ -102,7 +102,7 @@ bool dal_ddc_service_query_ddc_data(
+ uint8_t *read_buf,
+ uint32_t read_size);
+
+-ssize_t dal_ddc_service_read_dpcd_data(
++enum ddc_result dal_ddc_service_read_dpcd_data(
+ struct ddc_service *ddc,
+ bool i2c,
+ enum i2c_mot_mode mot,
+--
+2.7.4
+