Skip to content

Commit ad6756b

Browse files
fdavid-amdalexdeucher
authored andcommitted
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 <[email protected]> Reviewed-by: Harry Wentland <[email protected]> Acked-by: Leo Li <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
1 parent bbba983 commit ad6756b

File tree

5 files changed

+70
-95
lines changed

5 files changed

+70
-95
lines changed

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c

Lines changed: 15 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@
3535

3636
#include "dc_link_ddc.h"
3737

38+
#include "i2caux_interface.h"
39+
3840
/* #define TRACE_DPCD */
3941

4042
#ifdef TRACE_DPCD
@@ -81,80 +83,24 @@ static ssize_t dm_dp_aux_transfer(struct drm_dp_aux *aux,
8183
struct drm_dp_aux_msg *msg)
8284
{
8385
ssize_t result = 0;
84-
enum i2caux_transaction_action action;
85-
enum aux_transaction_type type;
86+
struct aux_payload payload;
8687

8788
if (WARN_ON(msg->size > 16))
8889
return -E2BIG;
8990

90-
switch (msg->request & ~DP_AUX_I2C_MOT) {
91-
case DP_AUX_NATIVE_READ:
92-
type = AUX_TRANSACTION_TYPE_DP;
93-
action = I2CAUX_TRANSACTION_ACTION_DP_READ;
94-
95-
result = dc_link_aux_transfer(TO_DM_AUX(aux)->ddc_service,
96-
msg->address,
97-
&msg->reply,
98-
msg->buffer,
99-
msg->size,
100-
type,
101-
action);
102-
break;
103-
case DP_AUX_NATIVE_WRITE:
104-
type = AUX_TRANSACTION_TYPE_DP;
105-
action = I2CAUX_TRANSACTION_ACTION_DP_WRITE;
106-
107-
dc_link_aux_transfer(TO_DM_AUX(aux)->ddc_service,
108-
msg->address,
109-
&msg->reply,
110-
msg->buffer,
111-
msg->size,
112-
type,
113-
action);
114-
result = msg->size;
115-
break;
116-
case DP_AUX_I2C_READ:
117-
type = AUX_TRANSACTION_TYPE_I2C;
118-
if (msg->request & DP_AUX_I2C_MOT)
119-
action = I2CAUX_TRANSACTION_ACTION_I2C_READ_MOT;
120-
else
121-
action = I2CAUX_TRANSACTION_ACTION_I2C_READ;
122-
123-
result = dc_link_aux_transfer(TO_DM_AUX(aux)->ddc_service,
124-
msg->address,
125-
&msg->reply,
126-
msg->buffer,
127-
msg->size,
128-
type,
129-
action);
130-
break;
131-
case DP_AUX_I2C_WRITE:
132-
type = AUX_TRANSACTION_TYPE_I2C;
133-
if (msg->request & DP_AUX_I2C_MOT)
134-
action = I2CAUX_TRANSACTION_ACTION_I2C_WRITE_MOT;
135-
else
136-
action = I2CAUX_TRANSACTION_ACTION_I2C_WRITE;
137-
138-
dc_link_aux_transfer(TO_DM_AUX(aux)->ddc_service,
139-
msg->address,
140-
&msg->reply,
141-
msg->buffer,
142-
msg->size,
143-
type,
144-
action);
145-
result = msg->size;
146-
break;
147-
default:
148-
return -EINVAL;
149-
}
91+
payload.address = msg->address;
92+
payload.data = msg->buffer;
93+
payload.length = msg->size;
94+
payload.reply = &msg->reply;
95+
payload.i2c_over_aux = (msg->request & DP_AUX_NATIVE_WRITE) == 0;
96+
payload.write = (msg->request & DP_AUX_I2C_READ) == 0;
97+
payload.mot = (msg->request & DP_AUX_I2C_MOT) != 0;
98+
payload.defer_delay = 0;
15099

151-
#ifdef TRACE_DPCD
152-
log_dpcd(msg->request,
153-
msg->address,
154-
msg->buffer,
155-
msg->size,
156-
r == DDC_RESULT_SUCESSFULL);
157-
#endif
100+
result = dc_link_aux_transfer(TO_DM_AUX(aux)->ddc_service, &payload);
101+
102+
if (payload.write)
103+
result = msg->size;
158104

159105
if (result < 0) /* DC doesn't know about kernel error codes */
160106
result = -EIO;

drivers/gpu/drm/amd/display/dc/core/dc_link_ddc.c

Lines changed: 39 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,9 @@ void dal_ddc_aux_payloads_add(
229229
uint32_t address,
230230
uint32_t len,
231231
uint8_t *data,
232-
bool write)
232+
bool write,
233+
bool mot,
234+
uint32_t defer_delay)
233235
{
234236
uint32_t payload_size = DEFAULT_AUX_MAX_DATA_SIZE;
235237
uint32_t pos;
@@ -240,7 +242,10 @@ void dal_ddc_aux_payloads_add(
240242
.write = write,
241243
.address = address,
242244
.length = DDC_MIN(payload_size, len - pos),
243-
.data = data + pos };
245+
.data = data + pos,
246+
.reply = NULL,
247+
.mot = mot,
248+
.defer_delay = defer_delay};
244249
dal_vector_append(&payloads->payloads, &payload);
245250
}
246251
}
@@ -584,10 +589,10 @@ bool dal_ddc_service_query_ddc_data(
584589
.max_defer_write_retry = 0 };
585590

586591
dal_ddc_aux_payloads_add(
587-
payloads, address, write_size, write_buf, true);
592+
payloads, address, write_size, write_buf, true, true, get_defer_delay(ddc));
588593

589594
dal_ddc_aux_payloads_add(
590-
payloads, address, read_size, read_buf, false);
595+
payloads, address, read_size, read_buf, false, false, get_defer_delay(ddc));
591596

592597
command.number_of_payloads =
593598
dal_ddc_aux_payloads_get_count(payloads);
@@ -629,13 +634,25 @@ bool dal_ddc_service_query_ddc_data(
629634
return ret;
630635
}
631636

637+
static enum i2caux_transaction_action i2caux_action_from_payload(struct aux_payload *payload)
638+
{
639+
if (payload->i2c_over_aux) {
640+
if (payload->write) {
641+
if (payload->mot)
642+
return I2CAUX_TRANSACTION_ACTION_I2C_WRITE_MOT;
643+
return I2CAUX_TRANSACTION_ACTION_I2C_WRITE;
644+
}
645+
if (payload->mot)
646+
return I2CAUX_TRANSACTION_ACTION_I2C_READ_MOT;
647+
return I2CAUX_TRANSACTION_ACTION_I2C_READ;
648+
}
649+
if (payload->write)
650+
return I2CAUX_TRANSACTION_ACTION_DP_WRITE;
651+
return I2CAUX_TRANSACTION_ACTION_DP_READ;
652+
}
653+
632654
int dc_link_aux_transfer(struct ddc_service *ddc,
633-
unsigned int address,
634-
uint8_t *reply,
635-
void *buffer,
636-
unsigned int size,
637-
enum aux_transaction_type type,
638-
enum i2caux_transaction_action action)
655+
struct aux_payload *payload)
639656
{
640657
struct ddc *ddc_pin = ddc->ddc_pin;
641658
struct aux_engine *aux_engine;
@@ -652,21 +669,25 @@ int dc_link_aux_transfer(struct ddc_service *ddc,
652669
aux_engine = ddc->ctx->dc->res_pool->engines[ddc_pin->pin_data->en];
653670
aux_engine->funcs->acquire(aux_engine, ddc_pin);
654671

655-
aux_req.type = type;
656-
aux_req.action = action;
672+
if (payload->i2c_over_aux)
673+
aux_req.type = AUX_TRANSACTION_TYPE_I2C;
674+
else
675+
aux_req.type = AUX_TRANSACTION_TYPE_DP;
676+
677+
aux_req.action = i2caux_action_from_payload(payload);
657678

658-
aux_req.address = address;
659-
aux_req.delay = 0;
660-
aux_req.length = size;
661-
aux_req.data = buffer;
679+
aux_req.address = payload->address;
680+
aux_req.delay = payload->defer_delay * 10;
681+
aux_req.length = payload->length;
682+
aux_req.data = payload->data;
662683

663684
aux_engine->funcs->submit_channel_request(aux_engine, &aux_req);
664685
operation_result = aux_engine->funcs->get_channel_status(aux_engine, &returned_bytes);
665686

666687
switch (operation_result) {
667688
case AUX_CHANNEL_OPERATION_SUCCEEDED:
668-
res = aux_engine->funcs->read_channel_reply(aux_engine, size,
669-
buffer, reply,
689+
res = aux_engine->funcs->read_channel_reply(aux_engine, payload->length,
690+
payload->data, payload->reply,
670691
&status);
671692
break;
672693
case AUX_CHANNEL_OPERATION_FAILED_HPD_DISCON:

drivers/gpu/drm/amd/display/dc/dce/dce_aux.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,8 @@ static int read_channel_reply(struct aux_engine *engine, uint32_t size,
273273

274274
REG_GET(AUX_SW_DATA, AUX_SW_DATA, &reply_result_32);
275275
reply_result_32 = reply_result_32 >> 4;
276-
*reply_result = (uint8_t)reply_result_32;
276+
if (reply_result != NULL)
277+
*reply_result = (uint8_t)reply_result_32;
277278

278279
if (reply_result_32 == 0) { /* ACK */
279280
uint32_t i = 0;

drivers/gpu/drm/amd/display/dc/inc/dc_link_ddc.h

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,9 @@ void dal_ddc_aux_payloads_add(
6969
uint32_t address,
7070
uint32_t len,
7171
uint8_t *data,
72-
bool write);
72+
bool write,
73+
bool mot,
74+
uint32_t defer_delay);
7375

7476
struct ddc_service_init_data {
7577
struct graphics_object_id id;
@@ -103,12 +105,7 @@ bool dal_ddc_service_query_ddc_data(
103105
uint32_t read_size);
104106

105107
int dc_link_aux_transfer(struct ddc_service *ddc,
106-
unsigned int address,
107-
uint8_t *reply,
108-
void *buffer,
109-
unsigned int size,
110-
enum aux_transaction_type type,
111-
enum i2caux_transaction_action action);
108+
struct aux_payload *payload);
112109

113110
void dal_ddc_service_write_scdc_data(
114111
struct ddc_service *ddc_service,

drivers/gpu/drm/amd/display/include/i2caux_interface.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,19 @@ struct aux_payload {
4040
/* set following flag to write data,
4141
* reset it to read data */
4242
bool write;
43+
bool mot;
4344
uint32_t address;
4445
uint8_t length;
4546
uint8_t *data;
47+
/*
48+
* used to return the reply type of the transaction
49+
* ignored if NULL
50+
*/
51+
uint8_t *reply;
52+
/* expressed in milliseconds
53+
* zero means "use default value"
54+
*/
55+
uint32_t defer_delay;
4656
};
4757

4858
struct aux_command {

0 commit comments

Comments
 (0)