Skip to content

Commit 462a4ba

Browse files
jannaumarcan
authored andcommitted
drm: apple: iomfb: implement abort_swaps_dcp
To match macOS behavior and in the hope to fix dcpext crashes on t8112. Crashes still occur but let's keep this. Shouldn;t make a difference since we're on the swaps to finish. Signed-off-by: Janne Grunau <j@jannau.net>
1 parent 4779419 commit 462a4ba

4 files changed

Lines changed: 49 additions & 5 deletions

File tree

drivers/gpu/drm/apple/iomfb.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ enum dcpep_method {
189189
iomfbep_a358_vi_set_temperature_hint,
190190
iomfbep_get_color_remap_mode,
191191
iomfbep_last_client_close,
192+
iomfbep_abort_swaps_dcp,
192193
iomfbep_set_matrix,
193194
dcpep_num_methods
194195
};
@@ -380,6 +381,25 @@ struct iomfb_last_client_close_resp {
380381
u32 unkint;
381382
} __packed;
382383

384+
struct io_user_client {
385+
u64 addr;
386+
u32 unk;
387+
u8 flag1;
388+
u8 flag2;
389+
u8 pad[2];
390+
} __packed;
391+
392+
struct iomfb_abort_swaps_dcp_req {
393+
struct io_user_client client;
394+
u8 client_null;
395+
u8 pad[3];
396+
} __packed;
397+
398+
struct iomfb_abort_swaps_dcp_resp {
399+
struct io_user_client client;
400+
u32 ret;
401+
} __packed;
402+
383403
struct iomfb_set_matrix_req {
384404
u32 unk_u32; // maybe length?
385405
u64 r[3];

drivers/gpu/drm/apple/iomfb_template.c

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ DCP_THUNK_OUT(iomfb_a358_vi_set_temperature_hint, iomfbep_a358_vi_set_temperatur
5959
IOMFB_THUNK_INOUT(set_matrix);
6060
IOMFB_THUNK_INOUT(get_color_remap_mode);
6161
IOMFB_THUNK_INOUT(last_client_close);
62+
IOMFB_THUNK_INOUT(abort_swaps_dcp);
6263

6364
DCP_THUNK_INOUT(dcp_swap_submit, dcpep_swap_submit,
6465
struct DCP_FW_NAME(dcp_swap_submit_req),
@@ -859,10 +860,21 @@ static void last_client_closed_poff(struct apple_dcp *dcp, void *out, void *cook
859860
cookie);
860861
}
861862

863+
static void aborted_swaps_dcp_poff(struct apple_dcp *dcp, void *out, void *cookie)
864+
{
865+
struct iomfb_last_client_close_req last_client_req = {};
866+
iomfb_last_client_close(dcp, false, &last_client_req,
867+
last_client_closed_poff, cookie);
868+
}
869+
862870
void DCP_FW_NAME(iomfb_poweroff)(struct apple_dcp *dcp)
863871
{
864872
int ret, swap_id;
865-
struct iomfb_last_client_close_req last_client_req = {};
873+
struct iomfb_abort_swaps_dcp_req abort_req = {
874+
.client = {
875+
.flag2 = 1,
876+
},
877+
};
866878
struct dcp_swap_cookie *cookie;
867879
struct dcp_wait_cookie *poff_cookie;
868880
struct dcp_swap_start_req swap_req = { 0 };
@@ -927,8 +939,8 @@ void DCP_FW_NAME(iomfb_poweroff)(struct apple_dcp *dcp)
927939
/* increase refcount to ensure the receiver has a reference */
928940
kref_get(&poff_cookie->refcount);
929941

930-
iomfb_last_client_close(dcp, false, &last_client_req,
931-
last_client_closed_poff, poff_cookie);
942+
iomfb_abort_swaps_dcp(dcp, false, &abort_req,
943+
aborted_swaps_dcp_poff, poff_cookie);
932944
ret = wait_for_completion_timeout(&poff_cookie->done,
933945
msecs_to_jiffies(1000));
934946

@@ -953,10 +965,20 @@ static void last_client_closed_sleep(struct apple_dcp *dcp, void *out, void *coo
953965
dcp_set_power_state(dcp, false, &power_req, complete_set_powerstate, cookie);
954966
}
955967

968+
static void aborted_swaps_dcp_sleep(struct apple_dcp *dcp, void *out, void *cookie)
969+
{
970+
struct iomfb_last_client_close_req req = { 0 };
971+
iomfb_last_client_close(dcp, false, &req, last_client_closed_sleep, cookie);
972+
}
973+
956974
void DCP_FW_NAME(iomfb_sleep)(struct apple_dcp *dcp)
957975
{
958976
int ret;
959-
struct iomfb_last_client_close_req req = {};
977+
struct iomfb_abort_swaps_dcp_req req = {
978+
.client = {
979+
.flag2 = 1,
980+
},
981+
};
960982

961983
struct dcp_wait_cookie *cookie;
962984

@@ -968,7 +990,7 @@ void DCP_FW_NAME(iomfb_sleep)(struct apple_dcp *dcp)
968990
/* increase refcount to ensure the receiver has a reference */
969991
kref_get(&cookie->refcount);
970992

971-
iomfb_last_client_close(dcp, false, &req, last_client_closed_sleep,
993+
iomfb_abort_swaps_dcp(dcp, false, &req, aborted_swaps_dcp_sleep,
972994
cookie);
973995
ret = wait_for_completion_timeout(&cookie->done,
974996
msecs_to_jiffies(1000));

drivers/gpu/drm/apple/iomfb_v12_3.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ static const struct dcp_method_entry dcp_methods[dcpep_num_methods] = {
2727
IOMFB_METHOD("A455", iomfbep_last_client_close),
2828
IOMFB_METHOD("A460", dcpep_set_display_refresh_properties),
2929
IOMFB_METHOD("A463", dcpep_flush_supports_power),
30+
IOMFB_METHOD("A464", iomfbep_abort_swaps_dcp),
3031
IOMFB_METHOD("A468", dcpep_set_power_state),
3132
};
3233

drivers/gpu/drm/apple/iomfb_v13_3.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ static const struct dcp_method_entry dcp_methods[dcpep_num_methods] = {
2727
IOMFB_METHOD("A457", iomfbep_last_client_close),
2828
IOMFB_METHOD("A463", dcpep_set_display_refresh_properties),
2929
IOMFB_METHOD("A466", dcpep_flush_supports_power),
30+
IOMFB_METHOD("A467", iomfbep_abort_swaps_dcp),
3031
IOMFB_METHOD("A472", dcpep_set_power_state),
3132
};
3233

0 commit comments

Comments
 (0)