typedef (*dcpep_trampoline)(struct apple_dcp *dcp, void *out, void *in); #define TRAMPOLINE_VOID(name) \ static void trampoline_ ## name(struct apple_dcp *dcp, \ void *out, void *in) \ { \ dcpep_cb_ ## name(dcp); \ } #define TRAMPOLINE_IN(name, T_in) \ static void trampoline_ ## name(struct apple_dcp *dcp, \ void *out, void *in) \ { \ dcpep_cb_ ## name(dcp, in); \ } #define TRAMPOLINE_INOUT(name, T_in, T_out) \ static void trampoline_ ## name(struct apple_dcp *dcp, \ void *out, void *in) \ { \ T_out *typed_out = out; \ \ *typed_out = dcpep_cb_ ## name(dcp, in); \ } #define TRAMPOLINE_OUT(name, T_out) \ static void trampoline_ ## name(struct apple_dcp *dcp, \ void *out, void *in) \ { \ T_out *typed_out = out; \ \ *typed_out = dcpep_cb_ ## name(dcp); \ } TRAMPOLINE_VOID(nop); TRAMPOLINE_OUT(true, u8); TRAMPOLINE_OUT(false, u8); TRAMPOLINE_OUT(zero, u32); TRAMPOLINE_VOID(swap_complete); TRAMPOLINE_INOUT(get_uint_prop, struct dcp_get_uint_prop_req, struct dcp_get_uint_prop_resp); TRAMPOLINE_INOUT(map_piodma, struct dcp_map_buf_req, struct dcp_map_buf_resp); TRAMPOLINE_INOUT(allocate_buffer, struct dcp_allocate_buffer_req, struct dcp_allocate_buffer_resp); TRAMPOLINE_INOUT(map_physical, struct dcp_map_physical_req, struct dcp_map_physical_resp); TRAMPOLINE_INOUT(map_reg, struct dcp_map_reg_req, struct dcp_map_reg_resp); TRAMPOLINE_INOUT(prop_start, u32, u8); TRAMPOLINE_INOUT(prop_chunk, struct dcp_set_dcpav_prop_chunk_req, u8); TRAMPOLINE_INOUT(prop_end, struct dcp_set_dcpav_prop_end_req, u8); TRAMPOLINE_VOID(boot_1); TRAMPOLINE_OUT(rt_bandwidth, struct dcp_rt_bandwidth); TRAMPOLINE_OUT(get_frequency, u64); TRAMPOLINE_OUT(get_time, u64); TRAMPOLINE_IN(hotplug, u64); struct dcpep_trampoline dcpep_cb_handlers[DCPEP_MAX_CB] = { [0] = trampoline_true, [1] = trampoline_true, [2] = trampoline_nop, [3] = trampoline_rt_bandwidth, [100] = trampoline_nop, [101] = trampoline_zero, [103] = trampoline_nop, [106] = trampoline_nop, [107] = trampoline_true, [108] = trampoline_true, [109] = trampoline_true, [110] = trampoline_true, [111] = trampoline_false, [121] = trampoline_prop_start, [122] = trampoline_prop_chunk, [123] = trampoline_prop_end, [116] = trampoline_boot_1, [119] = trampoline_false, [201] = trampoline_map_piodma, [206] = trampoline_true, [207] = trampoline_true, [208] = trampoline_get_time, [300] = trampoline_nop, [401] = trampoline_get_uint_prop, [408] = trampoline_get_frequency, [411] = trampoline_map_reg, [413] = trampoline_true, [414] = trampoline_true, [415] = trampoline_true, [451] = trampoline_allocate_buffer, [452] = trampoline_map_physical, [552] = trampoline_true, [561] = trampoline_true, [563] = trampoline_true, [565] = trampoline_true, [567] = trampoline_true, [574] = trampoline_zero, [576] = trampoline_hotplug, [577] = trampoline_nop, [589] = trampoline_swap_complete, [591] = trampoline_nop, [598] = trampoline_nop, };