diff options
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.patch | 141 |
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 + |