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