diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3620-drm-amd-display-make-dm_dp_aux_transfer-return-paylo.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3620-drm-amd-display-make-dm_dp_aux_transfer-return-paylo.patch | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3620-drm-amd-display-make-dm_dp_aux_transfer-return-paylo.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3620-drm-amd-display-make-dm_dp_aux_transfer-return-paylo.patch new file mode 100644 index 00000000..ffa463e7 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3620-drm-amd-display-make-dm_dp_aux_transfer-return-paylo.patch @@ -0,0 +1,154 @@ +From 4d2647cb2b8326ca91533870b63a9bbd3532ff8f Mon Sep 17 00:00:00 2001 +From: Shirish S <shirish.s@amd.com> +Date: Fri, 23 Feb 2018 16:10:13 +0530 +Subject: [PATCH 3620/4131] drm/amd/display: make dm_dp_aux_transfer return + payload bytes instead of size + +The drm layer expects aux->transfer() to return the payload bytes read. +Currently dm_dp_aux_transfer() returns the payload size which does not +gets updated during the read, hence not giving the right data for the +drm layer to pars edid. This leads to the drm layer to conclude as the +edid is BAD and hence some monitors/devices dont get detected properly. + +This patch changes the return type of dm_dp_aux_transfer() to actual +bytes read during DP_AUX_NATIVE_READ & DP_AUX_I2C_READ. + +Signed-off-by: Shirish S <shirish.s@amd.com> +Reviewed-by: Harry Wentland <harry.wentland@amd.com> +--- + .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | 9 +++++---- + drivers/gpu/drm/amd/display/dc/core/dc_link_ddc.c | 7 ++++--- + drivers/gpu/drm/amd/display/dc/i2caux/aux_engine.c | 15 ++------------- + drivers/gpu/drm/amd/display/dc/i2caux/i2caux.c | 1 + + drivers/gpu/drm/amd/display/dc/inc/dc_link_ddc.h | 2 +- + 5 files changed, 13 insertions(+), 21 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 5fbe539..c612329 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,17 +82,18 @@ 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; + + 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); +- break; ++ return read_bytes; + case DP_AUX_NATIVE_WRITE: + res = dal_ddc_service_write_dpcd_data( + TO_DM_AUX(aux)->ddc_service, +@@ -103,14 +104,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); +- break; ++ return read_bytes; + case DP_AUX_I2C_WRITE: + res = dal_ddc_service_write_dpcd_data( + TO_DM_AUX(aux)->ddc_service, +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 d5294798b..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,7 +629,7 @@ 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, +@@ -660,8 +660,9 @@ enum ddc_result dal_ddc_service_read_dpcd_data( + if (dal_i2caux_submit_aux_command( + ddc->ctx->i2caux, + ddc->ddc_pin, +- &command)) +- return DDC_RESULT_SUCESSFULL; ++ &command)) { ++ return (ssize_t)command.payloads->length; ++ } + + return DDC_RESULT_FAILED_OPERATION; + } +diff --git a/drivers/gpu/drm/amd/display/dc/i2caux/aux_engine.c b/drivers/gpu/drm/amd/display/dc/i2caux/aux_engine.c +index 0b1db48f..9c42fe5 100644 +--- a/drivers/gpu/drm/amd/display/dc/i2caux/aux_engine.c ++++ b/drivers/gpu/drm/amd/display/dc/i2caux/aux_engine.c +@@ -126,20 +126,8 @@ static void process_read_reply( + ctx->status = + I2CAUX_TRANSACTION_STATUS_FAILED_PROTOCOL_ERROR; + ctx->operation_succeeded = false; +- } else if (ctx->returned_byte < ctx->current_read_length) { +- ctx->current_read_length -= ctx->returned_byte; +- +- ctx->offset += ctx->returned_byte; +- +- ++ctx->invalid_reply_retry_aux_on_ack; +- +- if (ctx->invalid_reply_retry_aux_on_ack > +- AUX_INVALID_REPLY_RETRY_COUNTER) { +- ctx->status = +- I2CAUX_TRANSACTION_STATUS_FAILED_PROTOCOL_ERROR; +- ctx->operation_succeeded = false; +- } + } else { ++ ctx->current_read_length = ctx->returned_byte; + ctx->status = I2CAUX_TRANSACTION_STATUS_SUCCEEDED; + ctx->transaction_complete = true; + ctx->operation_succeeded = true; +@@ -292,6 +280,7 @@ static bool read_command( + ctx.operation_succeeded); + } + ++ request->payload.length = ctx.reply.length; + return ctx.operation_succeeded; + } + +diff --git a/drivers/gpu/drm/amd/display/dc/i2caux/i2caux.c b/drivers/gpu/drm/amd/display/dc/i2caux/i2caux.c +index e1593ff..5cbf662 100644 +--- a/drivers/gpu/drm/amd/display/dc/i2caux/i2caux.c ++++ b/drivers/gpu/drm/amd/display/dc/i2caux/i2caux.c +@@ -253,6 +253,7 @@ bool dal_i2caux_submit_aux_command( + break; + } + ++ cmd->payloads->length = request.payload.length; + ++index_of_payload; + } + +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 0bf73b7..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,7 +102,7 @@ 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, +-- +2.7.4 + |