diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1076-drm-amd-display-Change-from-aux_engine-to-dce_aux.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.19.8/1076-drm-amd-display-Change-from-aux_engine-to-dce_aux.patch | 872 |
1 files changed, 872 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1076-drm-amd-display-Change-from-aux_engine-to-dce_aux.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1076-drm-amd-display-Change-from-aux_engine-to-dce_aux.patch new file mode 100644 index 00000000..b5201e72 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1076-drm-amd-display-Change-from-aux_engine-to-dce_aux.patch @@ -0,0 +1,872 @@ +From b0b4ed40be9879b2bd7db208db6837643ace7944 Mon Sep 17 00:00:00 2001 +From: David Francis <David.Francis@amd.com> +Date: Fri, 30 Nov 2018 10:32:01 -0500 +Subject: [PATCH 1076/2940] drm/amd/display: Change from aux_engine to dce_aux + +[Why] +The aux_engine struct is needlessly complex and +is defined multiple times. It contains function pointers +that each have only one version and are called only from +inside dce_aux. + +[How] +Replace aux_engine with a new struct called dce_aux. +Remove all function pointers and call functions directly. +Remove unused functions + +Signed-off-by: David Francis <David.Francis@amd.com> +Reviewed-by: Harry Wentland <Harry.Wentland@amd.com> +Acked-by: Leo Li <sunpeng.li@amd.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + drivers/gpu/drm/amd/display/dc/dce/dce_aux.c | 557 +----------------- + drivers/gpu/drm/amd/display/dc/dce/dce_aux.h | 20 +- + .../amd/display/dc/dce100/dce100_resource.c | 2 +- + .../amd/display/dc/dce110/dce110_resource.c | 2 +- + .../amd/display/dc/dce112/dce112_resource.c | 2 +- + .../amd/display/dc/dce120/dce120_resource.c | 2 +- + .../drm/amd/display/dc/dce80/dce80_resource.c | 2 +- + .../drm/amd/display/dc/dcn10/dcn10_resource.c | 4 +- + .../gpu/drm/amd/display/dc/inc/core_types.h | 2 +- + 9 files changed, 45 insertions(+), 548 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_aux.c b/drivers/gpu/drm/amd/display/dc/dce/dce_aux.c +index 566061529c58..adbb22224e1a 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce/dce_aux.c ++++ b/drivers/gpu/drm/amd/display/dc/dce/dce_aux.c +@@ -42,17 +42,17 @@ + container_of((ptr), struct aux_engine_dce110, base) + + #define FROM_ENGINE(ptr) \ +- FROM_AUX_ENGINE(container_of((ptr), struct aux_engine, base)) ++ FROM_AUX_ENGINE(container_of((ptr), struct dce_aux, base)) + + #define FROM_AUX_ENGINE_ENGINE(ptr) \ +- container_of((ptr), struct aux_engine, base) ++ container_of((ptr), struct dce_aux, base) + enum { + AUX_INVALID_REPLY_RETRY_COUNTER = 1, + AUX_TIMED_OUT_RETRY_COUNTER = 2, + AUX_DEFER_RETRY_COUNTER = 6 + }; + static void release_engine( +- struct aux_engine *engine) ++ struct dce_aux *engine) + { + struct aux_engine_dce110 *aux110 = FROM_AUX_ENGINE(engine); + +@@ -67,7 +67,7 @@ static void release_engine( + #define DMCU_CAN_ACCESS_AUX 2 + + static bool is_engine_available( +- struct aux_engine *engine) ++ struct dce_aux *engine) + { + struct aux_engine_dce110 *aux110 = FROM_AUX_ENGINE(engine); + +@@ -80,7 +80,7 @@ static bool is_engine_available( + return (field != DMCU_CAN_ACCESS_AUX); + } + static bool acquire_engine( +- struct aux_engine *engine) ++ struct dce_aux *engine) + { + struct aux_engine_dce110 *aux110 = FROM_AUX_ENGINE(engine); + +@@ -156,7 +156,7 @@ static bool acquire_engine( + (0xFF & (address)) + + static void submit_channel_request( +- struct aux_engine *engine, ++ struct dce_aux *engine, + struct aux_request_transaction_data *request) + { + struct aux_engine_dce110 *aux110 = FROM_AUX_ENGINE(engine); +@@ -248,7 +248,7 @@ static void submit_channel_request( + REG_UPDATE(AUX_SW_CONTROL, AUX_SW_GO, 1); + } + +-static int read_channel_reply(struct aux_engine *engine, uint32_t size, ++static int read_channel_reply(struct dce_aux *engine, uint32_t size, + uint8_t *buffer, uint8_t *reply_result, + uint32_t *sw_status) + { +@@ -301,61 +301,8 @@ static int read_channel_reply(struct aux_engine *engine, uint32_t size, + return 0; + } + +-static void process_channel_reply( +- struct aux_engine *engine, +- struct aux_reply_transaction_data *reply) +-{ +- int bytes_replied; +- uint8_t reply_result; +- uint32_t sw_status; +- +- bytes_replied = read_channel_reply(engine, reply->length, reply->data, +- &reply_result, &sw_status); +- +- /* in case HPD is LOW, exit AUX transaction */ +- if ((sw_status & AUX_SW_STATUS__AUX_SW_HPD_DISCON_MASK)) { +- reply->status = AUX_TRANSACTION_REPLY_HPD_DISCON; +- return; +- } +- +- if (bytes_replied < 0) { +- /* Need to handle an error case... +- * Hopefully, upper layer function won't call this function if +- * the number of bytes in the reply was 0, because there was +- * surely an error that was asserted that should have been +- * handled for hot plug case, this could happens +- */ +- if (!(sw_status & AUX_SW_STATUS__AUX_SW_HPD_DISCON_MASK)) { +- reply->status = AUX_TRANSACTION_REPLY_INVALID; +- ASSERT_CRITICAL(false); +- return; +- } +- } else { +- +- switch (reply_result) { +- case 0: /* ACK */ +- reply->status = AUX_TRANSACTION_REPLY_AUX_ACK; +- break; +- case 1: /* NACK */ +- reply->status = AUX_TRANSACTION_REPLY_AUX_NACK; +- break; +- case 2: /* DEFER */ +- reply->status = AUX_TRANSACTION_REPLY_AUX_DEFER; +- break; +- case 4: /* AUX ACK / I2C NACK */ +- reply->status = AUX_TRANSACTION_REPLY_I2C_NACK; +- break; +- case 8: /* AUX ACK / I2C DEFER */ +- reply->status = AUX_TRANSACTION_REPLY_I2C_DEFER; +- break; +- default: +- reply->status = AUX_TRANSACTION_REPLY_INVALID; +- } +- } +-} +- + static enum aux_channel_operation_result get_channel_status( +- struct aux_engine *engine, ++ struct dce_aux *engine, + uint8_t *returned_bytes) + { + struct aux_engine_dce110 *aux110 = FROM_AUX_ENGINE(engine); +@@ -416,469 +363,22 @@ static enum aux_channel_operation_result get_channel_status( + return AUX_CHANNEL_OPERATION_FAILED_TIMEOUT; + } + } +-static void process_read_reply( +- struct aux_engine *engine, +- struct read_command_context *ctx) +-{ +- engine->funcs->process_channel_reply(engine, &ctx->reply); +- +- switch (ctx->reply.status) { +- case AUX_TRANSACTION_REPLY_AUX_ACK: +- ctx->defer_retry_aux = 0; +- if (ctx->returned_byte > ctx->current_read_length) { +- 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->status = I2CAUX_TRANSACTION_STATUS_SUCCEEDED; +- ctx->transaction_complete = true; +- ctx->operation_succeeded = true; +- } +- break; +- case AUX_TRANSACTION_REPLY_AUX_NACK: +- ctx->status = I2CAUX_TRANSACTION_STATUS_FAILED_NACK; +- ctx->operation_succeeded = false; +- break; +- case AUX_TRANSACTION_REPLY_AUX_DEFER: +- ++ctx->defer_retry_aux; +- +- if (ctx->defer_retry_aux > AUX_DEFER_RETRY_COUNTER) { +- ctx->status = I2CAUX_TRANSACTION_STATUS_FAILED_TIMEOUT; +- ctx->operation_succeeded = false; +- } +- break; +- case AUX_TRANSACTION_REPLY_I2C_DEFER: +- ctx->defer_retry_aux = 0; +- +- ++ctx->defer_retry_i2c; +- +- if (ctx->defer_retry_i2c > AUX_DEFER_RETRY_COUNTER) { +- ctx->status = I2CAUX_TRANSACTION_STATUS_FAILED_TIMEOUT; +- ctx->operation_succeeded = false; +- } +- break; +- case AUX_TRANSACTION_REPLY_HPD_DISCON: +- ctx->status = I2CAUX_TRANSACTION_STATUS_FAILED_HPD_DISCON; +- ctx->operation_succeeded = false; +- break; +- default: +- ctx->status = I2CAUX_TRANSACTION_STATUS_UNKNOWN; +- ctx->operation_succeeded = false; +- } +-} +-static void process_read_request( +- struct aux_engine *engine, +- struct read_command_context *ctx) +-{ +- enum aux_channel_operation_result operation_result; +- +- engine->funcs->submit_channel_request(engine, &ctx->request); +- +- operation_result = engine->funcs->get_channel_status( +- engine, &ctx->returned_byte); +- +- switch (operation_result) { +- case AUX_CHANNEL_OPERATION_SUCCEEDED: +- if (ctx->returned_byte > ctx->current_read_length) { +- ctx->status = +- I2CAUX_TRANSACTION_STATUS_FAILED_PROTOCOL_ERROR; +- ctx->operation_succeeded = false; +- } else { +- ctx->timed_out_retry_aux = 0; +- ctx->invalid_reply_retry_aux = 0; +- +- ctx->reply.length = ctx->returned_byte; +- ctx->reply.data = ctx->buffer; +- +- process_read_reply(engine, ctx); +- } +- break; +- case AUX_CHANNEL_OPERATION_FAILED_INVALID_REPLY: +- ++ctx->invalid_reply_retry_aux; +- +- if (ctx->invalid_reply_retry_aux > +- AUX_INVALID_REPLY_RETRY_COUNTER) { +- ctx->status = +- I2CAUX_TRANSACTION_STATUS_FAILED_PROTOCOL_ERROR; +- ctx->operation_succeeded = false; +- } else +- udelay(400); +- break; +- case AUX_CHANNEL_OPERATION_FAILED_TIMEOUT: +- ++ctx->timed_out_retry_aux; +- +- if (ctx->timed_out_retry_aux > AUX_TIMED_OUT_RETRY_COUNTER) { +- ctx->status = I2CAUX_TRANSACTION_STATUS_FAILED_TIMEOUT; +- ctx->operation_succeeded = false; +- } else { +- /* DP 1.2a, table 2-58: +- * "S3: AUX Request CMD PENDING: +- * retry 3 times, with 400usec wait on each" +- * The HW timeout is set to 550usec, +- * so we should not wait here +- */ +- } +- break; +- case AUX_CHANNEL_OPERATION_FAILED_HPD_DISCON: +- ctx->status = I2CAUX_TRANSACTION_STATUS_FAILED_HPD_DISCON; +- ctx->operation_succeeded = false; +- break; +- default: +- ctx->status = I2CAUX_TRANSACTION_STATUS_UNKNOWN; +- ctx->operation_succeeded = false; +- } +-} +-static bool read_command( +- struct aux_engine *engine, +- struct i2caux_transaction_request *request, +- bool middle_of_transaction) +-{ +- struct read_command_context ctx; +- +- ctx.buffer = request->payload.data; +- ctx.current_read_length = request->payload.length; +- ctx.offset = 0; +- ctx.timed_out_retry_aux = 0; +- ctx.invalid_reply_retry_aux = 0; +- ctx.defer_retry_aux = 0; +- ctx.defer_retry_i2c = 0; +- ctx.invalid_reply_retry_aux_on_ack = 0; +- ctx.transaction_complete = false; +- ctx.operation_succeeded = true; +- +- if (request->payload.address_space == +- I2CAUX_TRANSACTION_ADDRESS_SPACE_DPCD) { +- ctx.request.type = AUX_TRANSACTION_TYPE_DP; +- ctx.request.action = I2CAUX_TRANSACTION_ACTION_DP_READ; +- ctx.request.address = request->payload.address; +- } else if (request->payload.address_space == +- I2CAUX_TRANSACTION_ADDRESS_SPACE_I2C) { +- ctx.request.type = AUX_TRANSACTION_TYPE_I2C; +- ctx.request.action = middle_of_transaction ? +- I2CAUX_TRANSACTION_ACTION_I2C_READ_MOT : +- I2CAUX_TRANSACTION_ACTION_I2C_READ; +- ctx.request.address = request->payload.address >> 1; +- } else { +- /* in DAL2, there was no return in such case */ +- BREAK_TO_DEBUGGER(); +- return false; +- } +- +- ctx.request.delay = 0; +- +- do { +- memset(ctx.buffer + ctx.offset, 0, ctx.current_read_length); +- +- ctx.request.data = ctx.buffer + ctx.offset; +- ctx.request.length = ctx.current_read_length; +- +- process_read_request(engine, &ctx); +- +- request->status = ctx.status; +- +- if (ctx.operation_succeeded && !ctx.transaction_complete) +- if (ctx.request.type == AUX_TRANSACTION_TYPE_I2C) +- msleep(engine->delay); +- } while (ctx.operation_succeeded && !ctx.transaction_complete); +- +- if (request->payload.address_space == +- I2CAUX_TRANSACTION_ADDRESS_SPACE_DPCD) { +- DC_LOG_I2C_AUX("READ: addr:0x%x value:0x%x Result:%d", +- request->payload.address, +- request->payload.data[0], +- ctx.operation_succeeded); +- } +- +- return ctx.operation_succeeded; +-} +- +-static void process_write_reply( +- struct aux_engine *engine, +- struct write_command_context *ctx) +-{ +- engine->funcs->process_channel_reply(engine, &ctx->reply); +- +- switch (ctx->reply.status) { +- case AUX_TRANSACTION_REPLY_AUX_ACK: +- ctx->operation_succeeded = true; +- +- if (ctx->returned_byte) { +- ctx->request.action = ctx->mot ? +- I2CAUX_TRANSACTION_ACTION_I2C_STATUS_REQUEST_MOT : +- I2CAUX_TRANSACTION_ACTION_I2C_STATUS_REQUEST; +- +- ctx->current_write_length = 0; +- +- ++ctx->ack_m_retry; +- +- if (ctx->ack_m_retry > AUX_DEFER_RETRY_COUNTER) { +- ctx->status = +- I2CAUX_TRANSACTION_STATUS_FAILED_TIMEOUT; +- ctx->operation_succeeded = false; +- } else +- udelay(300); +- } else { +- ctx->status = I2CAUX_TRANSACTION_STATUS_SUCCEEDED; +- ctx->defer_retry_aux = 0; +- ctx->ack_m_retry = 0; +- ctx->transaction_complete = true; +- } +- break; +- case AUX_TRANSACTION_REPLY_AUX_NACK: +- ctx->status = I2CAUX_TRANSACTION_STATUS_FAILED_NACK; +- ctx->operation_succeeded = false; +- break; +- case AUX_TRANSACTION_REPLY_AUX_DEFER: +- ++ctx->defer_retry_aux; +- +- if (ctx->defer_retry_aux > ctx->max_defer_retry) { +- ctx->status = I2CAUX_TRANSACTION_STATUS_FAILED_TIMEOUT; +- ctx->operation_succeeded = false; +- } +- break; +- case AUX_TRANSACTION_REPLY_I2C_DEFER: +- ctx->defer_retry_aux = 0; +- ctx->current_write_length = 0; +- +- ctx->request.action = ctx->mot ? +- I2CAUX_TRANSACTION_ACTION_I2C_STATUS_REQUEST_MOT : +- I2CAUX_TRANSACTION_ACTION_I2C_STATUS_REQUEST; +- +- ++ctx->defer_retry_i2c; +- +- if (ctx->defer_retry_i2c > ctx->max_defer_retry) { +- ctx->status = I2CAUX_TRANSACTION_STATUS_FAILED_TIMEOUT; +- ctx->operation_succeeded = false; +- } +- break; +- case AUX_TRANSACTION_REPLY_HPD_DISCON: +- ctx->status = I2CAUX_TRANSACTION_STATUS_FAILED_HPD_DISCON; +- ctx->operation_succeeded = false; +- break; +- default: +- ctx->status = I2CAUX_TRANSACTION_STATUS_UNKNOWN; +- ctx->operation_succeeded = false; +- } +-} +-static void process_write_request( +- struct aux_engine *engine, +- struct write_command_context *ctx) +-{ +- enum aux_channel_operation_result operation_result; +- +- engine->funcs->submit_channel_request(engine, &ctx->request); +- +- operation_result = engine->funcs->get_channel_status( +- engine, &ctx->returned_byte); +- +- switch (operation_result) { +- case AUX_CHANNEL_OPERATION_SUCCEEDED: +- ctx->timed_out_retry_aux = 0; +- ctx->invalid_reply_retry_aux = 0; +- +- ctx->reply.length = ctx->returned_byte; +- ctx->reply.data = ctx->reply_data; +- +- process_write_reply(engine, ctx); +- break; +- case AUX_CHANNEL_OPERATION_FAILED_INVALID_REPLY: +- ++ctx->invalid_reply_retry_aux; +- +- if (ctx->invalid_reply_retry_aux > +- AUX_INVALID_REPLY_RETRY_COUNTER) { +- ctx->status = +- I2CAUX_TRANSACTION_STATUS_FAILED_PROTOCOL_ERROR; +- ctx->operation_succeeded = false; +- } else +- udelay(400); +- break; +- case AUX_CHANNEL_OPERATION_FAILED_TIMEOUT: +- ++ctx->timed_out_retry_aux; +- +- if (ctx->timed_out_retry_aux > AUX_TIMED_OUT_RETRY_COUNTER) { +- ctx->status = I2CAUX_TRANSACTION_STATUS_FAILED_TIMEOUT; +- ctx->operation_succeeded = false; +- } else { +- /* DP 1.2a, table 2-58: +- * "S3: AUX Request CMD PENDING: +- * retry 3 times, with 400usec wait on each" +- * The HW timeout is set to 550usec, +- * so we should not wait here +- */ +- } +- break; +- case AUX_CHANNEL_OPERATION_FAILED_HPD_DISCON: +- ctx->status = I2CAUX_TRANSACTION_STATUS_FAILED_HPD_DISCON; +- ctx->operation_succeeded = false; +- break; +- default: +- ctx->status = I2CAUX_TRANSACTION_STATUS_UNKNOWN; +- ctx->operation_succeeded = false; +- } +-} +-static bool write_command( +- struct aux_engine *engine, +- struct i2caux_transaction_request *request, +- bool middle_of_transaction) +-{ +- struct write_command_context ctx; +- +- ctx.mot = middle_of_transaction; +- ctx.buffer = request->payload.data; +- ctx.current_write_length = request->payload.length; +- ctx.timed_out_retry_aux = 0; +- ctx.invalid_reply_retry_aux = 0; +- ctx.defer_retry_aux = 0; +- ctx.defer_retry_i2c = 0; +- ctx.ack_m_retry = 0; +- ctx.transaction_complete = false; +- ctx.operation_succeeded = true; +- +- if (request->payload.address_space == +- I2CAUX_TRANSACTION_ADDRESS_SPACE_DPCD) { +- ctx.request.type = AUX_TRANSACTION_TYPE_DP; +- ctx.request.action = I2CAUX_TRANSACTION_ACTION_DP_WRITE; +- ctx.request.address = request->payload.address; +- } else if (request->payload.address_space == +- I2CAUX_TRANSACTION_ADDRESS_SPACE_I2C) { +- ctx.request.type = AUX_TRANSACTION_TYPE_I2C; +- ctx.request.action = middle_of_transaction ? +- I2CAUX_TRANSACTION_ACTION_I2C_WRITE_MOT : +- I2CAUX_TRANSACTION_ACTION_I2C_WRITE; +- ctx.request.address = request->payload.address >> 1; +- } else { +- /* in DAL2, there was no return in such case */ +- BREAK_TO_DEBUGGER(); +- return false; +- } +- +- ctx.request.delay = 0; +- +- ctx.max_defer_retry = +- (engine->max_defer_write_retry > AUX_DEFER_RETRY_COUNTER) ? +- engine->max_defer_write_retry : AUX_DEFER_RETRY_COUNTER; +- +- do { +- ctx.request.data = ctx.buffer; +- ctx.request.length = ctx.current_write_length; +- +- process_write_request(engine, &ctx); +- +- request->status = ctx.status; +- +- if (ctx.operation_succeeded && !ctx.transaction_complete) +- if (ctx.request.type == AUX_TRANSACTION_TYPE_I2C) +- msleep(engine->delay); +- } while (ctx.operation_succeeded && !ctx.transaction_complete); +- +- if (request->payload.address_space == +- I2CAUX_TRANSACTION_ADDRESS_SPACE_DPCD) { +- DC_LOG_I2C_AUX("WRITE: addr:0x%x value:0x%x Result:%d", +- request->payload.address, +- request->payload.data[0], +- ctx.operation_succeeded); +- } +- +- return ctx.operation_succeeded; +-} +-static bool end_of_transaction_command( +- struct aux_engine *engine, +- struct i2caux_transaction_request *request) +-{ +- struct i2caux_transaction_request dummy_request; +- uint8_t dummy_data; +- +- /* [tcheng] We only need to send the stop (read with MOT = 0) +- * for I2C-over-Aux, not native AUX +- */ +- +- if (request->payload.address_space != +- I2CAUX_TRANSACTION_ADDRESS_SPACE_I2C) +- return false; +- +- dummy_request.operation = request->operation; +- dummy_request.payload.address_space = request->payload.address_space; +- dummy_request.payload.address = request->payload.address; +- +- /* +- * Add a dummy byte due to some receiver quirk +- * where one byte is sent along with MOT = 0. +- * Ideally this should be 0. +- */ +- +- dummy_request.payload.length = 0; +- dummy_request.payload.data = &dummy_data; +- +- if (request->operation == I2CAUX_TRANSACTION_READ) +- return read_command(engine, &dummy_request, false); +- else +- return write_command(engine, &dummy_request, false); +- +- /* according Syed, it does not need now DoDummyMOT */ +-} +-static bool submit_request( +- struct aux_engine *engine, +- struct i2caux_transaction_request *request, +- bool middle_of_transaction) +-{ +- +- bool result; +- bool mot_used = true; +- +- switch (request->operation) { +- case I2CAUX_TRANSACTION_READ: +- result = read_command(engine, request, mot_used); +- break; +- case I2CAUX_TRANSACTION_WRITE: +- result = write_command(engine, request, mot_used); +- break; +- default: +- result = false; +- } +- +- /* [tcheng] +- * need to send stop for the last transaction to free up the AUX +- * if the above command fails, this would be the last transaction +- */ + +- if (!middle_of_transaction || !result) +- end_of_transaction_command(engine, request); +- +- /* mask AUX interrupt */ +- +- return result; +-} + enum i2caux_engine_type get_engine_type( +- const struct aux_engine *engine) ++ const struct dce_aux *engine) + { + return I2CAUX_ENGINE_TYPE_AUX; + } + + static bool acquire( +- struct aux_engine *engine, ++ struct dce_aux *engine, + struct ddc *ddc) + { + + enum gpio_result result; + +- if (engine->funcs->is_engine_available) { +- /*check whether SW could use the engine*/ +- if (!engine->funcs->is_engine_available(engine)) +- return false; +- } ++ if (!is_engine_available(engine)) ++ return false; + + result = dal_ddc_open(ddc, GPIO_MODE_HARDWARE, + GPIO_DDC_CONFIG_TYPE_MODE_AUX); +@@ -886,7 +386,7 @@ static bool acquire( + if (result != GPIO_RESULT_OK) + return false; + +- if (!engine->funcs->acquire_engine(engine)) { ++ if (!acquire_engine(engine)) { + dal_ddc_close(ddc); + return false; + } +@@ -896,21 +396,7 @@ static bool acquire( + return true; + } + +-static const struct aux_engine_funcs aux_engine_funcs = { +- .acquire_engine = acquire_engine, +- .submit_channel_request = submit_channel_request, +- .process_channel_reply = process_channel_reply, +- .read_channel_reply = read_channel_reply, +- .get_channel_status = get_channel_status, +- .is_engine_available = is_engine_available, +- .release_engine = release_engine, +- .destroy_engine = dce110_engine_destroy, +- .submit_request = submit_request, +- .get_engine_type = get_engine_type, +- .acquire = acquire, +-}; +- +-void dce110_engine_destroy(struct aux_engine **engine) ++void dce110_engine_destroy(struct dce_aux **engine) + { + + struct aux_engine_dce110 *engine110 = FROM_AUX_ENGINE(*engine); +@@ -919,7 +405,7 @@ void dce110_engine_destroy(struct aux_engine **engine) + *engine = NULL; + + } +-struct aux_engine *dce110_aux_engine_construct(struct aux_engine_dce110 *aux_engine110, ++struct dce_aux *dce110_aux_engine_construct(struct aux_engine_dce110 *aux_engine110, + struct dc_context *ctx, + uint32_t inst, + uint32_t timeout_period, +@@ -929,7 +415,6 @@ struct aux_engine *dce110_aux_engine_construct(struct aux_engine_dce110 *aux_eng + aux_engine110->base.ctx = ctx; + aux_engine110->base.delay = 0; + aux_engine110->base.max_defer_write_retry = 0; +- aux_engine110->base.funcs = &aux_engine_funcs; + aux_engine110->base.inst = inst; + aux_engine110->timeout_period = timeout_period; + aux_engine110->regs = regs; +@@ -958,7 +443,7 @@ int dce_aux_transfer(struct ddc_service *ddc, + struct aux_payload *payload) + { + struct ddc *ddc_pin = ddc->ddc_pin; +- struct aux_engine *aux_engine; ++ struct dce_aux *aux_engine; + enum aux_channel_operation_result operation_result; + struct aux_request_transaction_data aux_req; + struct aux_reply_transaction_data aux_rep; +@@ -970,7 +455,7 @@ int dce_aux_transfer(struct ddc_service *ddc, + memset(&aux_rep, 0, sizeof(aux_rep)); + + aux_engine = ddc->ctx->dc->res_pool->engines[ddc_pin->pin_data->en]; +- aux_engine->funcs->acquire(aux_engine, ddc_pin); ++ acquire(aux_engine, ddc_pin); + + if (payload->i2c_over_aux) + aux_req.type = AUX_TRANSACTION_TYPE_I2C; +@@ -984,12 +469,12 @@ int dce_aux_transfer(struct ddc_service *ddc, + aux_req.length = payload->length; + aux_req.data = payload->data; + +- aux_engine->funcs->submit_channel_request(aux_engine, &aux_req); +- operation_result = aux_engine->funcs->get_channel_status(aux_engine, &returned_bytes); ++ submit_channel_request(aux_engine, &aux_req); ++ operation_result = get_channel_status(aux_engine, &returned_bytes); + + switch (operation_result) { + case AUX_CHANNEL_OPERATION_SUCCEEDED: +- res = aux_engine->funcs->read_channel_reply(aux_engine, payload->length, ++ res = read_channel_reply(aux_engine, payload->length, + payload->data, payload->reply, + &status); + break; +@@ -1002,7 +487,7 @@ int dce_aux_transfer(struct ddc_service *ddc, + res = -1; + break; + } +- aux_engine->funcs->release_engine(aux_engine); ++ release_engine(aux_engine); + return res; + } + +diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_aux.h b/drivers/gpu/drm/amd/display/dc/dce/dce_aux.h +index 990e7c7e191e..13e707e2e391 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce/dce_aux.h ++++ b/drivers/gpu/drm/amd/display/dc/dce/dce_aux.h +@@ -75,8 +75,20 @@ enum { /* This is the timeout as defined in DP 1.2a, + */ + SW_AUX_TIMEOUT_PERIOD_MULTIPLIER = 4 + }; ++ ++struct dce_aux { ++ uint32_t inst; ++ struct ddc *ddc; ++ struct dc_context *ctx; ++ /* following values are expressed in milliseconds */ ++ uint32_t delay; ++ uint32_t max_defer_write_retry; ++ ++ bool acquire_reset; ++}; ++ + struct aux_engine_dce110 { +- struct aux_engine base; ++ struct dce_aux base; + const struct dce110_aux_registers *regs; + struct { + uint32_t aux_control; +@@ -96,17 +108,17 @@ struct aux_engine_dce110_init_data { + const struct dce110_aux_registers *regs; + }; + +-struct aux_engine *dce110_aux_engine_construct( ++struct dce_aux *dce110_aux_engine_construct( + struct aux_engine_dce110 *aux_engine110, + struct dc_context *ctx, + uint32_t inst, + uint32_t timeout_period, + const struct dce110_aux_registers *regs); + +-void dce110_engine_destroy(struct aux_engine **engine); ++void dce110_engine_destroy(struct dce_aux **engine); + + bool dce110_aux_engine_acquire( +- struct aux_engine *aux_engine, ++ struct dce_aux *aux_engine, + struct ddc *ddc); + + int dce_aux_transfer(struct ddc_service *ddc, +diff --git a/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c b/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c +index 6ae51a5dfc04..c3f616a739d7 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c ++++ b/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c +@@ -587,7 +587,7 @@ struct output_pixel_processor *dce100_opp_create( + return &opp->base; + } + +-struct aux_engine *dce100_aux_engine_create( ++struct dce_aux *dce100_aux_engine_create( + struct dc_context *ctx, + uint32_t inst) + { +diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c +index 3c27c31eaf7c..7d46eb7a2ace 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c ++++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c +@@ -606,7 +606,7 @@ static struct output_pixel_processor *dce110_opp_create( + return &opp->base; + } + +-struct aux_engine *dce110_aux_engine_create( ++struct dce_aux *dce110_aux_engine_create( + struct dc_context *ctx, + uint32_t inst) + { +diff --git a/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c b/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c +index c2a713399726..d930e09ccfb4 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c ++++ b/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c +@@ -607,7 +607,7 @@ struct output_pixel_processor *dce112_opp_create( + return &opp->base; + } + +-struct aux_engine *dce112_aux_engine_create( ++struct dce_aux *dce112_aux_engine_create( + struct dc_context *ctx, + uint32_t inst) + { +diff --git a/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c b/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c +index 48a210ec975b..23d7d4d85207 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c ++++ b/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c +@@ -391,7 +391,7 @@ struct output_pixel_processor *dce120_opp_create( + ctx, inst, &opp_regs[inst], &opp_shift, &opp_mask); + return &opp->base; + } +-struct aux_engine *dce120_aux_engine_create( ++struct dce_aux *dce120_aux_engine_create( + struct dc_context *ctx, + uint32_t inst) + { +diff --git a/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c b/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c +index cdd1d6b7b9f2..e0bba0bc996b 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c ++++ b/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c +@@ -467,7 +467,7 @@ static struct output_pixel_processor *dce80_opp_create( + return &opp->base; + } + +-struct aux_engine *dce80_aux_engine_create( ++struct dce_aux *dce80_aux_engine_create( + struct dc_context *ctx, + uint32_t inst) + { +diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c +index add84f9df90c..3e6a6025419a 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c ++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c +@@ -609,7 +609,7 @@ static struct output_pixel_processor *dcn10_opp_create( + return &opp->base; + } + +-struct aux_engine *dcn10_aux_engine_create( ++struct dce_aux *dcn10_aux_engine_create( + struct dc_context *ctx, + uint32_t inst) + { +@@ -911,7 +911,7 @@ static void destruct(struct dcn10_resource_pool *pool) + + for (i = 0; i < pool->base.res_cap->num_ddc; i++) { + if (pool->base.engines[i] != NULL) +- pool->base.engines[i]->funcs->destroy_engine(&pool->base.engines[i]); ++ dce110_engine_destroy(&pool->base.engines[i]); + if (pool->base.hw_i2cs[i] != NULL) { + kfree(pool->base.hw_i2cs[i]); + pool->base.hw_i2cs[i] = NULL; +diff --git a/drivers/gpu/drm/amd/display/dc/inc/core_types.h b/drivers/gpu/drm/amd/display/dc/inc/core_types.h +index 1666adf01fb5..30834601f39f 100644 +--- a/drivers/gpu/drm/amd/display/dc/inc/core_types.h ++++ b/drivers/gpu/drm/amd/display/dc/inc/core_types.h +@@ -146,7 +146,7 @@ struct resource_pool { + struct mpc *mpc; + struct pp_smu_funcs_rv *pp_smu; + struct pp_smu_display_requirement_rv pp_smu_req; +- struct aux_engine *engines[MAX_PIPES]; ++ struct dce_aux *engines[MAX_PIPES]; + struct dce_i2c_hw *hw_i2cs[MAX_PIPES]; + struct dce_i2c_sw *sw_i2cs[MAX_PIPES]; + bool i2c_hw_buffer_in_use; +-- +2.17.1 + |