aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/4365-drm-amd-display-Don-t-return-ddc-result-and-read_byt.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/4365-drm-amd-display-Don-t-return-ddc-result-and-read_byt.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.14.71/4365-drm-amd-display-Don-t-return-ddc-result-and-read_byt.patch141
1 files changed, 141 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/4365-drm-amd-display-Don-t-return-ddc-result-and-read_byt.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/4365-drm-amd-display-Don-t-return-ddc-result-and-read_byt.patch
new file mode 100644
index 00000000..d3f95179
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/4365-drm-amd-display-Don-t-return-ddc-result-and-read_byt.patch
@@ -0,0 +1,141 @@
+From a1cae4e31f769e95aaafb9b98357a70d499fa362 Mon Sep 17 00:00:00 2001
+From: Harry Wentland <harry.wentland@amd.com>
+Date: Tue, 24 Apr 2018 10:49:20 -0400
+Subject: [PATCH 4365/5725] drm/amd/display: Don't return ddc result and
+ read_bytes in same return value
+
+The two ranges overlap.
+
+Signed-off-by: Harry Wentland <harry.wentland@amd.com>
+Acked-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ .../drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | 20 ++++++++++++--------
+ drivers/gpu/drm/amd/display/dc/core/dc_link_ddc.c | 10 +++++++---
+ drivers/gpu/drm/amd/display/dc/inc/dc_link_ddc.h | 5 +++--
+ 3 files changed, 22 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..559bd2a 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,22 @@ 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;
++ uint32_t read_bytes = msg->size;
+
+ 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;
++ msg->size,
++ &read_bytes);
++ break;
+ case DP_AUX_NATIVE_WRITE:
+ res = dal_ddc_service_write_dpcd_data(
+ TO_DM_AUX(aux)->ddc_service,
+@@ -107,14 +108,15 @@ 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;
++ msg->size,
++ &read_bytes);
++ break;
+ case DP_AUX_I2C_WRITE:
+ res = dal_ddc_service_write_dpcd_data(
+ TO_DM_AUX(aux)->ddc_service,
+@@ -136,7 +138,9 @@ static ssize_t dm_dp_aux_transfer(struct drm_dp_aux *aux,
+ r == DDC_RESULT_SUCESSFULL);
+ #endif
+
+- return msg->size;
++ if (res != DDC_RESULT_SUCESSFULL)
++ return -EIO;
++ return read_bytes;
+ }
+
+ static enum drm_connector_status
+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..ae48d60 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,13 +629,14 @@ 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,
+ uint32_t address,
+ uint8_t *data,
+- uint32_t len)
++ uint32_t len,
++ uint32_t *read)
+ {
+ struct aux_payload read_payload = {
+ .i2c_over_aux = i2c,
+@@ -652,6 +653,8 @@ ssize_t dal_ddc_service_read_dpcd_data(
+ .mot = mot
+ };
+
++ *read = 0;
++
+ if (len > DEFAULT_AUX_MAX_DATA_SIZE) {
+ BREAK_TO_DEBUGGER();
+ return DDC_RESULT_FAILED_INVALID_OPERATION;
+@@ -661,7 +664,8 @@ ssize_t dal_ddc_service_read_dpcd_data(
+ ddc->ctx->i2caux,
+ ddc->ddc_pin,
+ &command)) {
+- return (ssize_t)command.payloads->length;
++ *read = command.payloads->length;
++ return DDC_RESULT_SUCESSFULL;
+ }
+
+ return DDC_RESULT_FAILED_OPERATION;
+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..30b3a08 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,13 +102,14 @@ 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,
+ uint32_t address,
+ uint8_t *data,
+- uint32_t len);
++ uint32_t len,
++ uint32_t *read);
+
+ enum ddc_result dal_ddc_service_write_dpcd_data(
+ struct ddc_service *ddc,
+--
+2.7.4
+