xref: /netbsd-src/sys/arch/arm/apple/apple_rtkit.c (revision 09966de28c106fef44191dd94de4614a6a5d0a86)
1*09966de2Sskrll /*	$NetBSD: apple_rtkit.c,v 1.1 2022/04/27 08:06:20 skrll Exp $ */
2*09966de2Sskrll /*	$OpenBSD: rtkit.c,v 1.3 2022/01/10 09:07:28 kettenis Exp $	*/
3*09966de2Sskrll 
4*09966de2Sskrll /*
5*09966de2Sskrll  * Copyright (c) 2021 Mark Kettenis <kettenis@openbsd.org>
6*09966de2Sskrll  *
7*09966de2Sskrll  * Permission to use, copy, modify, and distribute this software for any
8*09966de2Sskrll  * purpose with or without fee is hereby granted, provided that the above
9*09966de2Sskrll  * copyright notice and this permission notice appear in all copies.
10*09966de2Sskrll  *
11*09966de2Sskrll  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12*09966de2Sskrll  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13*09966de2Sskrll  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14*09966de2Sskrll  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15*09966de2Sskrll  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16*09966de2Sskrll  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17*09966de2Sskrll  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18*09966de2Sskrll  */
19*09966de2Sskrll 
20*09966de2Sskrll #include <sys/param.h>
21*09966de2Sskrll #include <sys/systm.h>
22*09966de2Sskrll 
23*09966de2Sskrll #include <sys/kmem.h>
24*09966de2Sskrll 
25*09966de2Sskrll #include <dev/fdt/fdtvar.h>
26*09966de2Sskrll 
27*09966de2Sskrll #include <arm/apple/apple_rtkit.h>
28*09966de2Sskrll #include <arm/apple/apple_mbox.h>
29*09966de2Sskrll 
30*09966de2Sskrll 
31*09966de2Sskrll #define RTKIT_EP_MGMT			0
32*09966de2Sskrll #define RTKIT_EP_CRASHLOG		1
33*09966de2Sskrll #define RTKIT_EP_SYSLOG			2
34*09966de2Sskrll #define RTKIT_EP_DEBUG			3
35*09966de2Sskrll #define RTKIT_EP_IOREPORT		4
36*09966de2Sskrll 
37*09966de2Sskrll #define RTKIT_MGMT_TYPE_MASK		__BITS(59, 52)
38*09966de2Sskrll #define RTKIT_MGMT_TYPE(x)		__SHIFTOUT((x), RTKIT_MGMT_TYPE_MASK)
39*09966de2Sskrll 
40*09966de2Sskrll #define RTKIT_MGMT_PWR_STATE_MASK	__BITS(7, 0)
41*09966de2Sskrll #define RTKIT_MGMT_PWR_STATE(x)		__SHIFTOUT((x), RTKIT_MGMT_PWR_STATE_MASK)
42*09966de2Sskrll #define RTKIT_MGMT_PWR_STATE_ON		0x20
43*09966de2Sskrll 
44*09966de2Sskrll #define RTKIT_MGMT_HELLO		1
45*09966de2Sskrll #define RTKIT_MGMT_HELLO_ACK		2
46*09966de2Sskrll #define RTKIT_MGMT_STARTEP		5
47*09966de2Sskrll #define RTKIT_MGMT_IOP_PWR_STATE	6
48*09966de2Sskrll #define RTKIT_MGMT_IOP_PWR_STATE_ACK	7
49*09966de2Sskrll #define RTKIT_MGMT_EPMAP		8
50*09966de2Sskrll 
51*09966de2Sskrll #define RTKIT_MGMT_HELLO_MINVER_MASK	__BITS(15, 0)
52*09966de2Sskrll #define RTKIT_MGMT_HELLO_MINVER(x)	__SHIFTOUT((x), RTKIT_MGMT_HELLO_MINVER_MASK)
53*09966de2Sskrll #define RTKIT_MGMT_HELLO_MAXVER_MASK	__BITS(31, 16)
54*09966de2Sskrll #define RTKIT_MGMT_HELLO_MAXVER(x)	__SHIFTOUT((x), RTKIT_MGMT_HELLO_MAXVER_MASK)
55*09966de2Sskrll 
56*09966de2Sskrll #define RTKIT_MGMT_STARTEP_EP_SHIFT	32
57*09966de2Sskrll #define RTKIT_MGMT_STARTEP_EP_MASK	__BITS(39, 32)
58*09966de2Sskrll #define RTKIT_MGMT_STARTEP_START	__BIT(1)
59*09966de2Sskrll 
60*09966de2Sskrll #define RTKIT_MGMT_EPMAP_LAST		__BIT(51)
61*09966de2Sskrll #define RTKIT_MGMT_EPMAP_BASE_MASK	__BITS(34, 32)
62*09966de2Sskrll #define RTKIT_MGMT_EPMAP_BASE(x)	__SHIFTOUT((x), RTKIT_MGMT_EPMAP_BASE_MASK)
63*09966de2Sskrll #define RTKIT_MGMT_EPMAP_BITMAP_MASK	__BITS(31, 0)
64*09966de2Sskrll #define RTKIT_MGMT_EPMAP_BITMAP(x)	__SHIFTOUT((x), RTKIT_MGMT_EPMAP_BITMAP_MASK)
65*09966de2Sskrll #define RTKIT_MGMT_EPMAP_MORE		__BIT(0)
66*09966de2Sskrll 
67*09966de2Sskrll #define RTKIT_BUFFER_REQUEST		1
68*09966de2Sskrll #define RTKIT_BUFFER_ADDR_MASK		__BITS(41, 0)
69*09966de2Sskrll #define RTKIT_BUFFER_ADDR(x)		__SHIFTOUT((x), RTKIT_BUFFER_ADDR_MASK)
70*09966de2Sskrll #define RTKIT_BUFFER_SIZE_MASK		__BITS(51, 44)
71*09966de2Sskrll #define RTKIT_BUFFER_SIZE(x)		__SHIFTOUT((x), RTKIT_BUFFER_SIZE_MASK)
72*09966de2Sskrll 
73*09966de2Sskrll /* Versions we support. */
74*09966de2Sskrll #define RTKIT_MINVER			11
75*09966de2Sskrll #define RTKIT_MAXVER			12
76*09966de2Sskrll 
77*09966de2Sskrll struct rtkit_state {
78*09966de2Sskrll 	struct fdtbus_mbox_channel	*mc;
79*09966de2Sskrll 	int			pwrstate;
80*09966de2Sskrll 	uint64_t		epmap;
81*09966de2Sskrll 	void			(*callback[32])(void *, uint64_t);
82*09966de2Sskrll 	void			*arg[32];
83*09966de2Sskrll };
84*09966de2Sskrll 
85*09966de2Sskrll static int
rtkit_recv(struct fdtbus_mbox_channel * mc,struct apple_mbox_msg * msg)86*09966de2Sskrll rtkit_recv(struct fdtbus_mbox_channel *mc, struct apple_mbox_msg *msg)
87*09966de2Sskrll {
88*09966de2Sskrll 	int error, timo;
89*09966de2Sskrll 
90*09966de2Sskrll 	for (timo = 0; timo < 10000; timo++) {
91*09966de2Sskrll 		error = fdtbus_mbox_recv(mc, msg, sizeof(*msg));
92*09966de2Sskrll 		if (error == 0)
93*09966de2Sskrll 			break;
94*09966de2Sskrll 		delay(10);
95*09966de2Sskrll 	}
96*09966de2Sskrll 
97*09966de2Sskrll 	return error;
98*09966de2Sskrll }
99*09966de2Sskrll 
100*09966de2Sskrll static int
rtkit_send(struct fdtbus_mbox_channel * mc,uint32_t endpoint,uint64_t type,uint64_t data)101*09966de2Sskrll rtkit_send(struct fdtbus_mbox_channel *mc, uint32_t endpoint,
102*09966de2Sskrll     uint64_t type, uint64_t data)
103*09966de2Sskrll {
104*09966de2Sskrll 	struct apple_mbox_msg msg;
105*09966de2Sskrll 
106*09966de2Sskrll 	msg.data0 = __SHIFTIN(type, RTKIT_MGMT_TYPE_MASK) | data;
107*09966de2Sskrll 	msg.data1 = endpoint;
108*09966de2Sskrll 	return fdtbus_mbox_send(mc, &msg, sizeof(msg));
109*09966de2Sskrll }
110*09966de2Sskrll 
111*09966de2Sskrll static int
rtkit_start(struct rtkit_state * state,uint32_t endpoint)112*09966de2Sskrll rtkit_start(struct rtkit_state *state, uint32_t endpoint)
113*09966de2Sskrll {
114*09966de2Sskrll 	struct fdtbus_mbox_channel *mc = state->mc;
115*09966de2Sskrll 	uint64_t reply;
116*09966de2Sskrll 
117*09966de2Sskrll 	reply = __SHIFTIN(endpoint, RTKIT_MGMT_STARTEP_EP_MASK);
118*09966de2Sskrll 	reply |= RTKIT_MGMT_STARTEP_START;
119*09966de2Sskrll 	return rtkit_send(mc, RTKIT_EP_MGMT, RTKIT_MGMT_STARTEP, reply);
120*09966de2Sskrll }
121*09966de2Sskrll 
122*09966de2Sskrll static int
rtkit_handle_mgmt(struct rtkit_state * state,struct apple_mbox_msg * msg)123*09966de2Sskrll rtkit_handle_mgmt(struct rtkit_state *state, struct apple_mbox_msg *msg)
124*09966de2Sskrll {
125*09966de2Sskrll 	struct fdtbus_mbox_channel *mc = state->mc;
126*09966de2Sskrll 	uint64_t minver, maxver, ver;
127*09966de2Sskrll 	uint64_t base, bitmap, reply;
128*09966de2Sskrll 	uint32_t endpoint;
129*09966de2Sskrll 	int error;
130*09966de2Sskrll 
131*09966de2Sskrll 	switch (RTKIT_MGMT_TYPE(msg->data0)) {
132*09966de2Sskrll 	case RTKIT_MGMT_HELLO:
133*09966de2Sskrll 		minver = RTKIT_MGMT_HELLO_MINVER(msg->data0);
134*09966de2Sskrll 		maxver = RTKIT_MGMT_HELLO_MAXVER(msg->data0);
135*09966de2Sskrll 		if (minver > RTKIT_MAXVER) {
136*09966de2Sskrll 			printf("unsupported minimum firmware version "
137*09966de2Sskrll 			    "%"PRId64"\n", minver);
138*09966de2Sskrll 			return EINVAL;
139*09966de2Sskrll 		}
140*09966de2Sskrll 		if (maxver < RTKIT_MINVER) {
141*09966de2Sskrll 			printf("unsupported maximum firmware version "
142*09966de2Sskrll 			"%"PRId64"\n", maxver);
143*09966de2Sskrll 			return EINVAL;
144*09966de2Sskrll 		}
145*09966de2Sskrll 		ver = MIN(RTKIT_MAXVER, maxver);
146*09966de2Sskrll 		error = rtkit_send(mc, RTKIT_EP_MGMT, RTKIT_MGMT_HELLO_ACK,
147*09966de2Sskrll 		    __SHIFTIN(ver, RTKIT_MGMT_HELLO_MINVER_MASK) |
148*09966de2Sskrll 		    __SHIFTIN(ver, RTKIT_MGMT_HELLO_MAXVER_MASK));
149*09966de2Sskrll 		if (error)
150*09966de2Sskrll 			return error;
151*09966de2Sskrll 		break;
152*09966de2Sskrll 
153*09966de2Sskrll 	case RTKIT_MGMT_IOP_PWR_STATE_ACK:
154*09966de2Sskrll 		state->pwrstate = RTKIT_MGMT_PWR_STATE(msg->data0);
155*09966de2Sskrll 		break;
156*09966de2Sskrll 
157*09966de2Sskrll 	case RTKIT_MGMT_EPMAP:
158*09966de2Sskrll 		base = RTKIT_MGMT_EPMAP_BASE(msg->data0);
159*09966de2Sskrll 		bitmap = RTKIT_MGMT_EPMAP_BITMAP(msg->data0);
160*09966de2Sskrll 		state->epmap |= (bitmap << (base * 32));
161*09966de2Sskrll 		reply = __SHIFTIN(base, RTKIT_MGMT_EPMAP_BASE_MASK);
162*09966de2Sskrll 		if (msg->data0 & RTKIT_MGMT_EPMAP_LAST)
163*09966de2Sskrll 			reply |= RTKIT_MGMT_EPMAP_LAST;
164*09966de2Sskrll 		else
165*09966de2Sskrll 			reply |= RTKIT_MGMT_EPMAP_MORE;
166*09966de2Sskrll 		error = rtkit_send(state->mc, RTKIT_EP_MGMT,
167*09966de2Sskrll 		    RTKIT_MGMT_EPMAP, reply);
168*09966de2Sskrll 		if (error)
169*09966de2Sskrll 			return error;
170*09966de2Sskrll 		if (msg->data0 & RTKIT_MGMT_EPMAP_LAST) {
171*09966de2Sskrll 			for (endpoint = 1; endpoint < 32; endpoint++) {
172*09966de2Sskrll 				if ((state->epmap & __BIT(endpoint)) == 0)
173*09966de2Sskrll 					continue;
174*09966de2Sskrll 
175*09966de2Sskrll 				switch (endpoint) {
176*09966de2Sskrll 				case RTKIT_EP_CRASHLOG:
177*09966de2Sskrll 				case RTKIT_EP_DEBUG:
178*09966de2Sskrll 				case RTKIT_EP_IOREPORT:
179*09966de2Sskrll 					error = rtkit_start(state, endpoint);
180*09966de2Sskrll 					if (error)
181*09966de2Sskrll 						return error;
182*09966de2Sskrll 					break;
183*09966de2Sskrll 				}
184*09966de2Sskrll 			}
185*09966de2Sskrll 		}
186*09966de2Sskrll 		break;
187*09966de2Sskrll 	default:
188*09966de2Sskrll 		printf("unhandled management event "
189*09966de2Sskrll 		    "0x%016"PRIx64"\n", msg->data0);
190*09966de2Sskrll 		return EIO;
191*09966de2Sskrll 	}
192*09966de2Sskrll 
193*09966de2Sskrll 	return 0;
194*09966de2Sskrll }
195*09966de2Sskrll 
196*09966de2Sskrll static int
rtkit_handle_crashlog(struct rtkit_state * state,struct apple_mbox_msg * msg)197*09966de2Sskrll rtkit_handle_crashlog(struct rtkit_state *state, struct apple_mbox_msg *msg)
198*09966de2Sskrll {
199*09966de2Sskrll 	struct fdtbus_mbox_channel *mc = state->mc;
200*09966de2Sskrll 	bus_addr_t addr;
201*09966de2Sskrll 	bus_size_t size;
202*09966de2Sskrll 	int error;
203*09966de2Sskrll 
204*09966de2Sskrll 	switch (RTKIT_MGMT_TYPE(msg->data0)) {
205*09966de2Sskrll 	case RTKIT_BUFFER_REQUEST:
206*09966de2Sskrll 		addr = RTKIT_BUFFER_ADDR(msg->data0);
207*09966de2Sskrll 		size = RTKIT_BUFFER_SIZE(msg->data0);
208*09966de2Sskrll 		// XXXNH WTF is this conditional
209*09966de2Sskrll 		if (addr)
210*09966de2Sskrll 			break;
211*09966de2Sskrll 
212*09966de2Sskrll 		error = rtkit_send(mc, RTKIT_EP_CRASHLOG, RTKIT_BUFFER_REQUEST,
213*09966de2Sskrll 		    __SHIFTIN(size, RTKIT_BUFFER_SIZE_MASK) | addr);
214*09966de2Sskrll 		if (error)
215*09966de2Sskrll 			return error;
216*09966de2Sskrll 		break;
217*09966de2Sskrll 	default:
218*09966de2Sskrll 		printf("unhandled crashlog event "
219*09966de2Sskrll 		    "0x%016"PRIx64"\n", msg->data0);
220*09966de2Sskrll 		return EIO;
221*09966de2Sskrll 	}
222*09966de2Sskrll 
223*09966de2Sskrll 	return 0;
224*09966de2Sskrll }
225*09966de2Sskrll 
226*09966de2Sskrll static int
rtkit_handle_ioreport(struct rtkit_state * state,struct apple_mbox_msg * msg)227*09966de2Sskrll rtkit_handle_ioreport(struct rtkit_state *state, struct apple_mbox_msg *msg)
228*09966de2Sskrll {
229*09966de2Sskrll 	struct fdtbus_mbox_channel *mc = state->mc;
230*09966de2Sskrll 	bus_addr_t addr;
231*09966de2Sskrll 	bus_size_t size;
232*09966de2Sskrll 	int error;
233*09966de2Sskrll 
234*09966de2Sskrll 	switch (RTKIT_MGMT_TYPE(msg->data0)) {
235*09966de2Sskrll 	case RTKIT_BUFFER_REQUEST:
236*09966de2Sskrll 		addr = RTKIT_BUFFER_ADDR(msg->data0);
237*09966de2Sskrll 		size = RTKIT_BUFFER_SIZE(msg->data0);
238*09966de2Sskrll 		// XXXNH WTF is this conditional
239*09966de2Sskrll 		if (addr)
240*09966de2Sskrll 			break;
241*09966de2Sskrll 		error = rtkit_send(mc, RTKIT_EP_IOREPORT, RTKIT_BUFFER_REQUEST,
242*09966de2Sskrll 		    __SHIFTIN(size, RTKIT_BUFFER_SIZE_MASK) | addr);
243*09966de2Sskrll 		if (error)
244*09966de2Sskrll 			return error;
245*09966de2Sskrll 		break;
246*09966de2Sskrll 	default:
247*09966de2Sskrll 		printf("unhandled ioreport event"
248*09966de2Sskrll 		    "0x%016"PRIx64"\n", msg->data0);
249*09966de2Sskrll 		return EIO;
250*09966de2Sskrll 	}
251*09966de2Sskrll 
252*09966de2Sskrll 	return 0;
253*09966de2Sskrll }
254*09966de2Sskrll 
255*09966de2Sskrll int
rtkit_poll(struct rtkit_state * state)256*09966de2Sskrll rtkit_poll(struct rtkit_state *state)
257*09966de2Sskrll {
258*09966de2Sskrll 	struct fdtbus_mbox_channel *mc = state->mc;
259*09966de2Sskrll 	struct apple_mbox_msg msg;
260*09966de2Sskrll 	void (*callback)(void *, uint64_t);
261*09966de2Sskrll 	void *arg;
262*09966de2Sskrll 	uint32_t endpoint;
263*09966de2Sskrll 	int error;
264*09966de2Sskrll 
265*09966de2Sskrll 	error = rtkit_recv(mc, &msg);
266*09966de2Sskrll 	if (error)
267*09966de2Sskrll 		return error;
268*09966de2Sskrll 
269*09966de2Sskrll 	endpoint = msg.data1;
270*09966de2Sskrll 	switch (endpoint) {
271*09966de2Sskrll 	case RTKIT_EP_MGMT:
272*09966de2Sskrll 		error = rtkit_handle_mgmt(state, &msg);
273*09966de2Sskrll 		if (error)
274*09966de2Sskrll 			return error;
275*09966de2Sskrll 		break;
276*09966de2Sskrll 	case RTKIT_EP_CRASHLOG:
277*09966de2Sskrll 		error = rtkit_handle_crashlog(state, &msg);
278*09966de2Sskrll 		if (error)
279*09966de2Sskrll 			return error;
280*09966de2Sskrll 		break;
281*09966de2Sskrll 	case RTKIT_EP_IOREPORT:
282*09966de2Sskrll 		error = rtkit_handle_ioreport(state, &msg);
283*09966de2Sskrll 		if (error)
284*09966de2Sskrll 			return error;
285*09966de2Sskrll 		break;
286*09966de2Sskrll 	default:
287*09966de2Sskrll 		if (endpoint >= 32 && endpoint < 64 &&
288*09966de2Sskrll 		    state->callback[endpoint - 32]) {
289*09966de2Sskrll 			callback = state->callback[endpoint - 32];
290*09966de2Sskrll 			arg = state->arg[endpoint - 32];
291*09966de2Sskrll 			callback(arg, msg.data0);
292*09966de2Sskrll 			break;
293*09966de2Sskrll 		}
294*09966de2Sskrll 
295*09966de2Sskrll 		printf("unhandled endpoint %d\n", msg.data1);
296*09966de2Sskrll 		return EIO;
297*09966de2Sskrll 	}
298*09966de2Sskrll 
299*09966de2Sskrll 	return 0;
300*09966de2Sskrll }
301*09966de2Sskrll 
302*09966de2Sskrll static void
rtkit_rx_callback(void * cookie)303*09966de2Sskrll rtkit_rx_callback(void *cookie)
304*09966de2Sskrll {
305*09966de2Sskrll 	rtkit_poll(cookie);
306*09966de2Sskrll }
307*09966de2Sskrll 
308*09966de2Sskrll struct rtkit_state *
rtkit_init(int node,const char * name)309*09966de2Sskrll rtkit_init(int node, const char *name)
310*09966de2Sskrll {
311*09966de2Sskrll 	struct rtkit_state *state;
312*09966de2Sskrll 
313*09966de2Sskrll 	state = kmem_zalloc(sizeof(*state), KM_SLEEP);
314*09966de2Sskrll 	if (name) {
315*09966de2Sskrll 		state->mc = fdtbus_mbox_get(node, name, rtkit_rx_callback, state);
316*09966de2Sskrll 	} else {
317*09966de2Sskrll 		state->mc = fdtbus_mbox_get_index(node, 0, rtkit_rx_callback, state);
318*09966de2Sskrll 	}
319*09966de2Sskrll 	if (state->mc == NULL) {
320*09966de2Sskrll 		kmem_free(state, sizeof(*state));
321*09966de2Sskrll 
322*09966de2Sskrll 		return NULL;
323*09966de2Sskrll 	}
324*09966de2Sskrll 
325*09966de2Sskrll 	return state;
326*09966de2Sskrll }
327*09966de2Sskrll 
328*09966de2Sskrll int
rtkit_boot(struct rtkit_state * state)329*09966de2Sskrll rtkit_boot(struct rtkit_state *state)
330*09966de2Sskrll {
331*09966de2Sskrll 	struct fdtbus_mbox_channel *mc = state->mc;
332*09966de2Sskrll 	int error;
333*09966de2Sskrll 
334*09966de2Sskrll 	/* Wake up! */
335*09966de2Sskrll 	error = rtkit_send(mc, RTKIT_EP_MGMT, RTKIT_MGMT_IOP_PWR_STATE,
336*09966de2Sskrll 	    RTKIT_MGMT_PWR_STATE_ON);
337*09966de2Sskrll 	if (error) {
338*09966de2Sskrll 		return error;
339*09966de2Sskrll 	}
340*09966de2Sskrll 
341*09966de2Sskrll 	while (state->pwrstate != RTKIT_MGMT_PWR_STATE_ON)
342*09966de2Sskrll 		rtkit_poll(state);
343*09966de2Sskrll 
344*09966de2Sskrll 	return 0;
345*09966de2Sskrll }
346*09966de2Sskrll 
347*09966de2Sskrll int
rtkit_start_endpoint(struct rtkit_state * state,uint32_t endpoint,void (* callback)(void *,uint64_t),void * arg)348*09966de2Sskrll rtkit_start_endpoint(struct rtkit_state *state, uint32_t endpoint,
349*09966de2Sskrll     void (*callback)(void *, uint64_t), void *arg)
350*09966de2Sskrll {
351*09966de2Sskrll 	if (endpoint < 32 || endpoint >= 64)
352*09966de2Sskrll 		return EINVAL;
353*09966de2Sskrll 
354*09966de2Sskrll 	if ((state->epmap & __BIT(endpoint)) == 0)
355*09966de2Sskrll 		return EINVAL;
356*09966de2Sskrll 
357*09966de2Sskrll 	state->callback[endpoint - 32] = callback;
358*09966de2Sskrll 	state->arg[endpoint - 32] = arg;
359*09966de2Sskrll 	return rtkit_start(state, endpoint);
360*09966de2Sskrll }
361*09966de2Sskrll 
362*09966de2Sskrll int
rtkit_send_endpoint(struct rtkit_state * state,uint32_t endpoint,uint64_t data)363*09966de2Sskrll rtkit_send_endpoint(struct rtkit_state *state, uint32_t endpoint,
364*09966de2Sskrll     uint64_t data)
365*09966de2Sskrll {
366*09966de2Sskrll 
367*09966de2Sskrll 	return rtkit_send(state->mc, endpoint, 0, data);
368*09966de2Sskrll }
369