Skip to content

Commit f87f374

Browse files
committed
drm: apple: dptxep: Implement drive settings stuff
Just in case, for consistency with macOS. Signed-off-by: Hector Martin <[email protected]>
1 parent 2ed6a8e commit f87f374

2 files changed

Lines changed: 74 additions & 2 deletions

File tree

drivers/gpu/drm/apple/dptxep.c

Lines changed: 73 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,18 @@ struct dptxport_apcall_max_drive_settings {
5656
u8 _unk1[8];
5757
};
5858

59+
struct dptxport_apcall_drive_settings {
60+
__le32 retcode;
61+
u8 _unk0[12];
62+
__le32 unk1;
63+
__le32 unk2;
64+
__le32 unk3;
65+
__le32 unk4;
66+
__le32 unk5;
67+
__le32 unk6;
68+
__le32 unk7;
69+
};
70+
5971
int dptxport_validate_connection(struct apple_epic_service *service, u8 core,
6072
u8 atc, u8 die)
6173
{
@@ -159,6 +171,61 @@ dptxport_call_get_max_drive_settings(struct apple_epic_service *service,
159171
return 0;
160172
}
161173

174+
static int
175+
dptxport_call_get_drive_settings(struct apple_epic_service *service,
176+
const void *request_, size_t request_size,
177+
void *reply_, size_t reply_size)
178+
{
179+
struct dptx_port *dptx = service->cookie;
180+
const struct dptxport_apcall_drive_settings *request = request_;
181+
struct dptxport_apcall_drive_settings *reply = reply_;
182+
183+
if (reply_size < sizeof(*reply) || request_size < sizeof(*request))
184+
return -EINVAL;
185+
186+
*reply = *request;
187+
188+
/* Clear the rest of the buffer */
189+
memset(reply_ + sizeof(*reply), 0, reply_size - sizeof(*reply));
190+
191+
if (reply->retcode != 4)
192+
dev_err(service->ep->dcp->dev,
193+
"get_drive_settings: unexpected retcode %d\n",
194+
reply->retcode);
195+
196+
reply->retcode = 4; /* Should already be 4? */
197+
reply->unk5 = dptx->drive_settings[0];
198+
reply->unk6 = 0;
199+
reply->unk7 = dptx->drive_settings[1];
200+
201+
return 0;
202+
}
203+
204+
static int
205+
dptxport_call_set_drive_settings(struct apple_epic_service *service,
206+
const void *request_, size_t request_size,
207+
void *reply_, size_t reply_size)
208+
{
209+
struct dptx_port *dptx = service->cookie;
210+
const struct dptxport_apcall_drive_settings *request = request_;
211+
struct dptxport_apcall_drive_settings *reply = reply_;
212+
213+
if (reply_size < sizeof(*reply) || request_size < sizeof(*request))
214+
return -EINVAL;
215+
216+
*reply = *request;
217+
reply->retcode = cpu_to_le32(0);
218+
219+
dev_info(service->ep->dcp->dev, "set_drive_settings: %d:%d:%d:%d:%d:%d:%d\n",
220+
request->unk1, request->unk2, request->unk3, request->unk4,
221+
request->unk5, request->unk6, request->unk7);
222+
223+
dptx->drive_settings[0] = reply->unk5;
224+
dptx->drive_settings[1] = reply->unk7;
225+
226+
return 0;
227+
}
228+
162229
static int dptxport_call_get_max_link_rate(struct apple_epic_service *service,
163230
void *reply_, size_t reply_size)
164231
{
@@ -417,6 +484,12 @@ static int dptxport_call(struct apple_epic_service *service, u32 idx,
417484
case DPTX_APCALL_GET_MAX_DRIVE_SETTINGS:
418485
return dptxport_call_get_max_drive_settings(service, reply,
419486
reply_size);
487+
case DPTX_APCALL_GET_DRIVE_SETTINGS:
488+
return dptxport_call_get_drive_settings(service, data, data_size,
489+
reply, reply_size);
490+
case DPTX_APCALL_SET_DRIVE_SETTINGS:
491+
return dptxport_call_set_drive_settings(service, data, data_size,
492+
reply, reply_size);
420493
case DPTX_APCALL_ACTIVATE:
421494
return dptxport_call_activate(service, data, data_size,
422495
reply, reply_size);
@@ -427,8 +500,6 @@ static int dptxport_call(struct apple_epic_service *service, u32 idx,
427500
fallthrough;
428501
/* we can silently ignore and just ACK these calls */
429502
case DPTX_APCALL_DEACTIVATE:
430-
case DPTX_APCALL_SET_DRIVE_SETTINGS:
431-
case DPTX_APCALL_GET_DRIVE_SETTINGS:
432503
memcpy(reply, data, min(reply_size, data_size));
433504
if (reply_size >= 4)
434505
memset(reply, 0, 4);

drivers/gpu/drm/apple/dptxep.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ struct dptx_port {
5555
struct phy *atcphy;
5656
struct mux_control *mux;
5757
u32 link_rate, pending_link_rate;
58+
u32 drive_settings[2];
5859
};
5960

6061
int dptxport_validate_connection(struct apple_epic_service *service, u8 core,

0 commit comments

Comments
 (0)