[PATCH] Revert "drm/amd/display: Don't return ddc result and read_bytes in same return value"
Harry Wentland
harry.wentland at amd.com
Tue Jul 10 19:26:56 UTC 2018
On 2018-07-10 02:06 PM, Alex Deucher wrote:
> 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
> Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
> Cc: stable at vger.kernel.org
Acked-by: Harry Wentland <harry.wentland at amd.com>
Harry
> ---
> .../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 4304d9e408b8..ace9ad578ca0 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
> @@ -83,22 +83,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,
> @@ -109,15 +108,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,
> @@ -139,9 +137,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 ae48d603ebd6..49c2face1e7a 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 30b3a08b91be..090b7a8dd67b 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,
>
More information about the amd-gfx
mailing list