aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/display/dc/core/dc_link_ddc.c
diff options
context:
space:
mode:
authorDavid Francis <David.Francis@amd.com>2018-11-29 13:40:03 -0500
committerAlex Deucher <alexander.deucher@amd.com>2019-01-14 15:40:33 -0500
commitad6756b4d773aae68430a7d8b3c35c6717de5a15 (patch)
tree237b2f3271758140b80042d5b07add2eefe09680 /drivers/gpu/drm/amd/display/dc/core/dc_link_ddc.c
parentdrm/amd/display: 3.2.13 (diff)
downloadlinux-dev-ad6756b4d773aae68430a7d8b3c35c6717de5a15.tar.xz
linux-dev-ad6756b4d773aae68430a7d8b3c35c6717de5a15.zip
drm/amd/display: Shift dc link aux to aux_payload
[Why] aux_payload should be the struct used inside dc to start aux transactions. This will allow the old aux interface to be seamlessly replaced. [How] Add three fields to aux_payload: reply, mot, defer_delay This will mean that aux_payload has all data required to submit a request. Shift dc_link to use this struct 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>
Diffstat (limited to 'drivers/gpu/drm/amd/display/dc/core/dc_link_ddc.c')
-rw-r--r--drivers/gpu/drm/amd/display/dc/core/dc_link_ddc.c57
1 files changed, 39 insertions, 18 deletions
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 99a314b79850..5ac65737a1e8 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
@@ -229,7 +229,9 @@ void dal_ddc_aux_payloads_add(
uint32_t address,
uint32_t len,
uint8_t *data,
- bool write)
+ bool write,
+ bool mot,
+ uint32_t defer_delay)
{
uint32_t payload_size = DEFAULT_AUX_MAX_DATA_SIZE;
uint32_t pos;
@@ -240,7 +242,10 @@ void dal_ddc_aux_payloads_add(
.write = write,
.address = address,
.length = DDC_MIN(payload_size, len - pos),
- .data = data + pos };
+ .data = data + pos,
+ .reply = NULL,
+ .mot = mot,
+ .defer_delay = defer_delay};
dal_vector_append(&payloads->payloads, &payload);
}
}
@@ -584,10 +589,10 @@ bool dal_ddc_service_query_ddc_data(
.max_defer_write_retry = 0 };
dal_ddc_aux_payloads_add(
- payloads, address, write_size, write_buf, true);
+ payloads, address, write_size, write_buf, true, true, get_defer_delay(ddc));
dal_ddc_aux_payloads_add(
- payloads, address, read_size, read_buf, false);
+ payloads, address, read_size, read_buf, false, false, get_defer_delay(ddc));
command.number_of_payloads =
dal_ddc_aux_payloads_get_count(payloads);
@@ -629,13 +634,25 @@ bool dal_ddc_service_query_ddc_data(
return ret;
}
+static enum i2caux_transaction_action i2caux_action_from_payload(struct aux_payload *payload)
+{
+ if (payload->i2c_over_aux) {
+ if (payload->write) {
+ if (payload->mot)
+ return I2CAUX_TRANSACTION_ACTION_I2C_WRITE_MOT;
+ return I2CAUX_TRANSACTION_ACTION_I2C_WRITE;
+ }
+ if (payload->mot)
+ return I2CAUX_TRANSACTION_ACTION_I2C_READ_MOT;
+ return I2CAUX_TRANSACTION_ACTION_I2C_READ;
+ }
+ if (payload->write)
+ return I2CAUX_TRANSACTION_ACTION_DP_WRITE;
+ return I2CAUX_TRANSACTION_ACTION_DP_READ;
+}
+
int dc_link_aux_transfer(struct ddc_service *ddc,
- unsigned int address,
- uint8_t *reply,
- void *buffer,
- unsigned int size,
- enum aux_transaction_type type,
- enum i2caux_transaction_action action)
+ struct aux_payload *payload)
{
struct ddc *ddc_pin = ddc->ddc_pin;
struct aux_engine *aux_engine;
@@ -652,21 +669,25 @@ int dc_link_aux_transfer(struct ddc_service *ddc,
aux_engine = ddc->ctx->dc->res_pool->engines[ddc_pin->pin_data->en];
aux_engine->funcs->acquire(aux_engine, ddc_pin);
- aux_req.type = type;
- aux_req.action = action;
+ if (payload->i2c_over_aux)
+ aux_req.type = AUX_TRANSACTION_TYPE_I2C;
+ else
+ aux_req.type = AUX_TRANSACTION_TYPE_DP;
+
+ aux_req.action = i2caux_action_from_payload(payload);
- aux_req.address = address;
- aux_req.delay = 0;
- aux_req.length = size;
- aux_req.data = buffer;
+ aux_req.address = payload->address;
+ aux_req.delay = payload->defer_delay * 10;
+ 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);
switch (operation_result) {
case AUX_CHANNEL_OPERATION_SUCCEEDED:
- res = aux_engine->funcs->read_channel_reply(aux_engine, size,
- buffer, reply,
+ res = aux_engine->funcs->read_channel_reply(aux_engine, payload->length,
+ payload->data, payload->reply,
&status);
break;
case AUX_CHANNEL_OPERATION_FAILED_HPD_DISCON: