]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
Revert "drm/amd/display: make dm_dp_aux_transfer return payload bytes instead of...
authorHarry Wentland <harry.wentland@amd.com>
Fri, 6 Jul 2018 14:54:33 +0000 (10:54 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 13 Jul 2018 19:46:41 +0000 (14:46 -0500)
This reverts commit cc195141133ac3e767d930bedd8294ceebf1f10b.

This commit was problematic on other OSes. The real solution is to
leave all the error checking to DRM and don't do it in DC, which is
addressed by "Return aux replies directly to DRM" later in this patchset.

v2: Add reason for revert.

Signed-off-by: Harry Wentland <harry.wentland@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
drivers/gpu/drm/amd/display/dc/core/dc_link_ddc.c
drivers/gpu/drm/amd/display/dc/i2caux/aux_engine.c
drivers/gpu/drm/amd/display/dc/i2caux/i2caux.c
drivers/gpu/drm/amd/display/dc/inc/dc_link_ddc.h

index ace9ad578ca08f85aeccf49ac4d744b071444274..c74105758815d22928a514e215d3bcf71be87e7b 100644 (file)
@@ -83,21 +83,20 @@ 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;
 
        if (WARN_ON(msg->size > 16))
                return -E2BIG;
 
        switch (msg->request & ~DP_AUX_I2C_MOT) {
        case DP_AUX_NATIVE_READ:
-               read_bytes = dal_ddc_service_read_dpcd_data(
+               res = dal_ddc_service_read_dpcd_data(
                                TO_DM_AUX(aux)->ddc_service,
                                false,
                                I2C_MOT_UNDEF,
                                msg->address,
                                msg->buffer,
                                msg->size);
-               return read_bytes;
+               break;
        case DP_AUX_NATIVE_WRITE:
                res = dal_ddc_service_write_dpcd_data(
                                TO_DM_AUX(aux)->ddc_service,
@@ -108,14 +107,14 @@ static ssize_t dm_dp_aux_transfer(struct drm_dp_aux *aux,
                                msg->size);
                break;
        case DP_AUX_I2C_READ:
-               read_bytes = dal_ddc_service_read_dpcd_data(
+               res = dal_ddc_service_read_dpcd_data(
                                TO_DM_AUX(aux)->ddc_service,
                                true,
                                mot,
                                msg->address,
                                msg->buffer,
                                msg->size);
-               return read_bytes;
+               break;
        case DP_AUX_I2C_WRITE:
                res = dal_ddc_service_write_dpcd_data(
                                TO_DM_AUX(aux)->ddc_service,
index 49c2face1e7a869e07e94da881e7ed33acbe483e..d5294798b0a54f4fc66a3dca381a40e2dd28944c 100644 (file)
@@ -629,7 +629,7 @@ bool dal_ddc_service_query_ddc_data(
        return ret;
 }
 
-ssize_t dal_ddc_service_read_dpcd_data(
+enum ddc_result dal_ddc_service_read_dpcd_data(
        struct ddc_service *ddc,
        bool i2c,
        enum i2c_mot_mode mot,
@@ -660,9 +660,8 @@ ssize_t dal_ddc_service_read_dpcd_data(
        if (dal_i2caux_submit_aux_command(
                ddc->ctx->i2caux,
                ddc->ddc_pin,
-               &command)) {
-               return (ssize_t)command.payloads->length;
-       }
+               &command))
+               return DDC_RESULT_SUCESSFULL;
 
        return DDC_RESULT_FAILED_OPERATION;
 }
index 1d7309611978e9f07162e919879414618c45e4e0..0afd2fa57bbe5efbf9c988591862dab7b468f7e6 100644 (file)
@@ -128,8 +128,20 @@ 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;
@@ -290,7 +302,6 @@ static bool read_command(
                                ctx.operation_succeeded);
        }
 
-       request->payload.length = ctx.reply.length;
        return ctx.operation_succeeded;
 }
 
index 14dc8c94d862b049f7c5f7b760d91e201be8ac37..9b0bcc6b769b570c4a4ca4cf081072c2b260a4c4 100644 (file)
@@ -254,7 +254,6 @@ bool dal_i2caux_submit_aux_command(
                        break;
                }
 
-               cmd->payloads->length = request.payload.length;
                ++index_of_payload;
        }
 
index 090b7a8dd67bde2bdfdaf243c04d175abf82112c..0bf73b742f1f7262ba1a179965feec7e2572e3ec 100644 (file)
@@ -102,7 +102,7 @@ bool dal_ddc_service_query_ddc_data(
                uint8_t *read_buf,
                uint32_t read_size);
 
-ssize_t dal_ddc_service_read_dpcd_data(
+enum ddc_result dal_ddc_service_read_dpcd_data(
                struct ddc_service *ddc,
                bool i2c,
                enum i2c_mot_mode mot,