diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/4715-Revert-drm-amd-display-Don-t-return-ddc-result-and-r.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.14.71/4715-Revert-drm-amd-display-Don-t-return-ddc-result-and-r.patch | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/4715-Revert-drm-amd-display-Don-t-return-ddc-result-and-r.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/4715-Revert-drm-amd-display-Don-t-return-ddc-result-and-r.patch new file mode 100644 index 00000000..dc708c8f --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/4715-Revert-drm-amd-display-Don-t-return-ddc-result-and-r.patch @@ -0,0 +1,151 @@ +From fdb158543496f6cf08f58aea7b75a95bcb68fb4a Mon Sep 17 00:00:00 2001 +From: Alex Deucher <alexander.deucher@amd.com> +Date: Tue, 10 Jul 2018 12:56:45 -0500 +Subject: [PATCH 4715/5725] Revert "drm/amd/display: Don't return ddc result + and read_bytes in same return value" + +This reverts commit 018d82e5f02ef3583411bcaa4e00c69786f46f19. + +This breaks DDC in certain cases. Revert for 4.18 and previous kernels. +For 4.19, this is fixed with the following more extensive patches: +drm/amd/display: Serialize is_dp_sink_present +drm/amd/display: Break out function to simply read aux reply +drm/amd/display: Return aux replies directly to DRM +drm/amd/display: Right shift AUX reply value sooner than later +drm/amd/display: Read AUX channel even if only status byte is returned + +Link: https://lists.freedesktop.org/archives/amd-gfx/2018-July/023788.html +Acked-by: Harry Wentland <harry.wentland@amd.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +Cc: stable@vger.kernel.org +--- + .../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, 13 insertions(+), 22 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 559bd2a..e3110d6 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,22 +82,21 @@ 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; +- uint32_t read_bytes = msg->size; ++ ssize_t read_bytes; + + if (WARN_ON(msg->size > 16)) + return -E2BIG; + + switch (msg->request & ~DP_AUX_I2C_MOT) { + case DP_AUX_NATIVE_READ: +- res = dal_ddc_service_read_dpcd_data( ++ read_bytes = dal_ddc_service_read_dpcd_data( + TO_DM_AUX(aux)->ddc_service, + false, + I2C_MOT_UNDEF, + msg->address, + msg->buffer, +- msg->size, +- &read_bytes); +- break; ++ msg->size); ++ return read_bytes; + case DP_AUX_NATIVE_WRITE: + res = dal_ddc_service_write_dpcd_data( + TO_DM_AUX(aux)->ddc_service, +@@ -108,15 +107,14 @@ static ssize_t dm_dp_aux_transfer(struct drm_dp_aux *aux, + msg->size); + break; + case DP_AUX_I2C_READ: +- res = dal_ddc_service_read_dpcd_data( ++ read_bytes = dal_ddc_service_read_dpcd_data( + TO_DM_AUX(aux)->ddc_service, + true, + mot, + msg->address, + msg->buffer, +- msg->size, +- &read_bytes); +- break; ++ msg->size); ++ return read_bytes; + case DP_AUX_I2C_WRITE: + res = dal_ddc_service_write_dpcd_data( + TO_DM_AUX(aux)->ddc_service, +@@ -138,9 +136,7 @@ static ssize_t dm_dp_aux_transfer(struct drm_dp_aux *aux, + r == DDC_RESULT_SUCESSFULL); + #endif + +- if (res != DDC_RESULT_SUCESSFULL) +- return -EIO; +- return read_bytes; ++ return msg->size; + } + + 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 ae48d60..49c2fac 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,14 +629,13 @@ bool dal_ddc_service_query_ddc_data( + return ret; + } + +-enum ddc_result dal_ddc_service_read_dpcd_data( ++ssize_t 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 *read) ++ uint32_t len) + { + struct aux_payload read_payload = { + .i2c_over_aux = i2c, +@@ -653,8 +652,6 @@ enum ddc_result 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; +@@ -664,8 +661,7 @@ enum ddc_result dal_ddc_service_read_dpcd_data( + ddc->ctx->i2caux, + ddc->ddc_pin, + &command)) { +- *read = command.payloads->length; +- return DDC_RESULT_SUCESSFULL; ++ return (ssize_t)command.payloads->length; + } + + 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 30b3a08..090b7a8 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,14 +102,13 @@ bool dal_ddc_service_query_ddc_data( + uint8_t *read_buf, + uint32_t read_size); + +-enum ddc_result dal_ddc_service_read_dpcd_data( ++ssize_t 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 *read); ++ uint32_t len); + + enum ddc_result dal_ddc_service_write_dpcd_data( + struct ddc_service *ddc, +-- +2.7.4 + |