Re: [PATCH] Revert "drm/amd/display: Don't return ddc result and read_bytes in same return value"

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxx>
> Cc: stable@xxxxxxxxxxxxxxx

Acked-by: Harry Wentland <harry.wentland@xxxxxxx>

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,
> 



[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux