xref: /freebsd/sys/dev/evdev/evdev.c (revision 0fbdc3726a50a2e5f8530f08da858d3ff175d960)
1 /*-
2  * Copyright (c) 2014 Jakub Wojciech Klama <jceel@FreeBSD.org>
3  * Copyright (c) 2015-2016 Vladimir Kondratyev <wulf@FreeBSD.org>
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25  * SUCH DAMAGE.
26  *
27  * $FreeBSD$
28  */
29 
30 #include "opt_evdev.h"
31 
32 #include <sys/param.h>
33 #include <sys/bitstring.h>
34 #include <sys/conf.h>
35 #include <sys/kdb.h>
36 #include <sys/kernel.h>
37 #include <sys/malloc.h>
38 #include <sys/module.h>
39 #include <sys/proc.h>
40 #include <sys/sysctl.h>
41 #include <sys/systm.h>
42 
43 #include <dev/evdev/evdev.h>
44 #include <dev/evdev/evdev_private.h>
45 #include <dev/evdev/input.h>
46 
47 #ifdef EVDEV_DEBUG
48 #define	debugf(evdev, fmt, args...)	printf("evdev: " fmt "\n", ##args)
49 #else
50 #define	debugf(evdev, fmt, args...)
51 #endif
52 
53 #ifdef FEATURE
54 FEATURE(evdev, "Input event devices support");
55 #ifdef EVDEV_SUPPORT
56 FEATURE(evdev_support, "Evdev support in hybrid drivers");
57 #endif
58 #endif
59 
60 enum evdev_sparse_result
61 {
62 	EV_SKIP_EVENT,		/* Event value not changed */
63 	EV_REPORT_EVENT,	/* Event value changed */
64 	EV_REPORT_MT_SLOT,	/* Event value and MT slot number changed */
65 };
66 
67 MALLOC_DEFINE(M_EVDEV, "evdev", "evdev memory");
68 
69 int evdev_rcpt_mask = EVDEV_RCPT_SYSMOUSE | EVDEV_RCPT_KBDMUX;
70 int evdev_sysmouse_t_axis = 0;
71 
72 SYSCTL_NODE(_kern, OID_AUTO, evdev, CTLFLAG_RW | CTLFLAG_MPSAFE, 0,
73     "Evdev args");
74 #ifdef EVDEV_SUPPORT
75 SYSCTL_INT(_kern_evdev, OID_AUTO, rcpt_mask, CTLFLAG_RW, &evdev_rcpt_mask, 0,
76     "Who is receiving events: bit0 - sysmouse, bit1 - kbdmux, "
77     "bit2 - mouse hardware, bit3 - keyboard hardware");
78 SYSCTL_INT(_kern_evdev, OID_AUTO, sysmouse_t_axis, CTLFLAG_RW,
79     &evdev_sysmouse_t_axis, 0, "Extract T-axis from 0-none, 1-ums, 2-psm");
80 #endif
81 SYSCTL_NODE(_kern_evdev, OID_AUTO, input, CTLFLAG_RD | CTLFLAG_MPSAFE, 0,
82     "Evdev input devices");
83 
84 static void evdev_start_repeat(struct evdev_dev *, uint16_t);
85 static void evdev_stop_repeat(struct evdev_dev *);
86 static int evdev_check_event(struct evdev_dev *, uint16_t, uint16_t, int32_t);
87 
88 static inline void
89 bit_change(bitstr_t *bitstr, int bit, int value)
90 {
91 	if (value)
92 		bit_set(bitstr, bit);
93 	else
94 		bit_clear(bitstr, bit);
95 }
96 
97 struct evdev_dev *
98 evdev_alloc(void)
99 {
100 
101 	return malloc(sizeof(struct evdev_dev), M_EVDEV, M_WAITOK | M_ZERO);
102 }
103 
104 void
105 evdev_free(struct evdev_dev *evdev)
106 {
107 
108 	if (evdev != NULL && evdev->ev_cdev != NULL &&
109 	    evdev->ev_cdev->si_drv1 != NULL)
110 		evdev_unregister(evdev);
111 
112 	free(evdev, M_EVDEV);
113 }
114 
115 static struct input_absinfo *
116 evdev_alloc_absinfo(void)
117 {
118 
119 	return (malloc(sizeof(struct input_absinfo) * ABS_CNT, M_EVDEV,
120 	    M_WAITOK | M_ZERO));
121 }
122 
123 static void
124 evdev_free_absinfo(struct input_absinfo *absinfo)
125 {
126 
127 	free(absinfo, M_EVDEV);
128 }
129 
130 int
131 evdev_set_report_size(struct evdev_dev *evdev, size_t report_size)
132 {
133 	if (report_size > KEY_CNT + REL_CNT + ABS_CNT + MAX_MT_SLOTS * MT_CNT +
134 	    MSC_CNT + LED_CNT + SND_CNT + SW_CNT + FF_CNT)
135 		return (EINVAL);
136 
137 	evdev->ev_report_size = report_size;
138 	return (0);
139 }
140 
141 static size_t
142 evdev_estimate_report_size(struct evdev_dev *evdev)
143 {
144 	size_t size = 0;
145 	int res;
146 
147 	/*
148 	 * Keyboards generate one event per report but other devices with
149 	 * buttons like mouses can report events simultaneously
150 	 */
151 	bit_ffs_at(evdev->ev_key_flags, KEY_OK, KEY_CNT - KEY_OK, &res);
152 	if (res == -1)
153 		bit_ffs(evdev->ev_key_flags, BTN_MISC, &res);
154 	size += (res != -1);
155 	bit_count(evdev->ev_key_flags, BTN_MISC, KEY_OK - BTN_MISC, &res);
156 	size += res;
157 
158 	/* All relative axes can be reported simultaneously */
159 	bit_count(evdev->ev_rel_flags, 0, REL_CNT, &res);
160 	size += res;
161 
162 	/*
163 	 * All absolute axes can be reported simultaneously.
164 	 * Multitouch axes can be reported ABS_MT_SLOT times
165 	 */
166 	if (evdev->ev_absinfo != NULL) {
167 		bit_count(evdev->ev_abs_flags, 0, ABS_CNT, &res);
168 		size += res;
169 		bit_count(evdev->ev_abs_flags, ABS_MT_FIRST, MT_CNT, &res);
170 		if (res > 0) {
171 			res++;	/* ABS_MT_SLOT or SYN_MT_REPORT */
172 			if (bit_test(evdev->ev_abs_flags, ABS_MT_SLOT))
173 				/* MT type B */
174 				size += res * MAXIMAL_MT_SLOT(evdev);
175 			else
176 				/* MT type A */
177 				size += res * (MAX_MT_REPORTS - 1);
178 		}
179 	}
180 
181 	/* All misc events can be reported simultaneously */
182 	bit_count(evdev->ev_msc_flags, 0, MSC_CNT, &res);
183 	size += res;
184 
185 	/* All leds can be reported simultaneously */
186 	bit_count(evdev->ev_led_flags, 0, LED_CNT, &res);
187 	size += res;
188 
189 	/* Assume other events are generated once per report */
190 	bit_ffs(evdev->ev_snd_flags, SND_CNT, &res);
191 	size += (res != -1);
192 
193 	bit_ffs(evdev->ev_sw_flags, SW_CNT, &res);
194 	size += (res != -1);
195 
196 	/* XXX: FF part is not implemented yet */
197 
198 	size++;		/* SYN_REPORT */
199 	return (size);
200 }
201 
202 static void
203 evdev_sysctl_create(struct evdev_dev *evdev)
204 {
205 	struct sysctl_oid *ev_sysctl_tree;
206 	char ev_unit_str[8];
207 
208 	snprintf(ev_unit_str, sizeof(ev_unit_str), "%d", evdev->ev_unit);
209 	sysctl_ctx_init(&evdev->ev_sysctl_ctx);
210 
211 	ev_sysctl_tree = SYSCTL_ADD_NODE_WITH_LABEL(&evdev->ev_sysctl_ctx,
212 	    SYSCTL_STATIC_CHILDREN(_kern_evdev_input), OID_AUTO,
213 	    ev_unit_str, CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, "",
214 	    "device index");
215 
216 	SYSCTL_ADD_STRING(&evdev->ev_sysctl_ctx,
217 	    SYSCTL_CHILDREN(ev_sysctl_tree), OID_AUTO, "name", CTLFLAG_RD,
218 	    evdev->ev_name, 0,
219 	    "Input device name");
220 
221 	SYSCTL_ADD_STRUCT(&evdev->ev_sysctl_ctx,
222 	    SYSCTL_CHILDREN(ev_sysctl_tree), OID_AUTO, "id", CTLFLAG_RD,
223 	    &evdev->ev_id, input_id,
224 	    "Input device identification");
225 
226 	/* ioctl returns ENOENT if phys is not set. sysctl returns "" here */
227 	SYSCTL_ADD_STRING(&evdev->ev_sysctl_ctx,
228 	    SYSCTL_CHILDREN(ev_sysctl_tree), OID_AUTO, "phys", CTLFLAG_RD,
229 	    evdev->ev_shortname, 0,
230 	    "Input device short name");
231 
232 	/* ioctl returns ENOENT if uniq is not set. sysctl returns "" here */
233 	SYSCTL_ADD_STRING(&evdev->ev_sysctl_ctx,
234 	    SYSCTL_CHILDREN(ev_sysctl_tree), OID_AUTO, "uniq", CTLFLAG_RD,
235 	    evdev->ev_serial, 0,
236 	    "Input device unique number");
237 
238 	SYSCTL_ADD_OPAQUE(&evdev->ev_sysctl_ctx,
239 	    SYSCTL_CHILDREN(ev_sysctl_tree), OID_AUTO, "props", CTLFLAG_RD,
240 	    evdev->ev_prop_flags, sizeof(evdev->ev_prop_flags), "",
241 	    "Input device properties");
242 
243 	SYSCTL_ADD_OPAQUE(&evdev->ev_sysctl_ctx,
244 	    SYSCTL_CHILDREN(ev_sysctl_tree), OID_AUTO, "type_bits", CTLFLAG_RD,
245 	    evdev->ev_type_flags, sizeof(evdev->ev_type_flags), "",
246 	    "Input device supported events types");
247 
248 	SYSCTL_ADD_OPAQUE(&evdev->ev_sysctl_ctx,
249 	    SYSCTL_CHILDREN(ev_sysctl_tree), OID_AUTO, "key_bits", CTLFLAG_RD,
250 	    evdev->ev_key_flags, sizeof(evdev->ev_key_flags),
251 	    "", "Input device supported keys");
252 
253 	SYSCTL_ADD_OPAQUE(&evdev->ev_sysctl_ctx,
254 	    SYSCTL_CHILDREN(ev_sysctl_tree), OID_AUTO, "rel_bits", CTLFLAG_RD,
255 	    evdev->ev_rel_flags, sizeof(evdev->ev_rel_flags), "",
256 	    "Input device supported relative events");
257 
258 	SYSCTL_ADD_OPAQUE(&evdev->ev_sysctl_ctx,
259 	    SYSCTL_CHILDREN(ev_sysctl_tree), OID_AUTO, "abs_bits", CTLFLAG_RD,
260 	    evdev->ev_abs_flags, sizeof(evdev->ev_abs_flags), "",
261 	    "Input device supported absolute events");
262 
263 	SYSCTL_ADD_OPAQUE(&evdev->ev_sysctl_ctx,
264 	    SYSCTL_CHILDREN(ev_sysctl_tree), OID_AUTO, "msc_bits", CTLFLAG_RD,
265 	    evdev->ev_msc_flags, sizeof(evdev->ev_msc_flags), "",
266 	    "Input device supported miscellaneous events");
267 
268 	SYSCTL_ADD_OPAQUE(&evdev->ev_sysctl_ctx,
269 	    SYSCTL_CHILDREN(ev_sysctl_tree), OID_AUTO, "led_bits", CTLFLAG_RD,
270 	    evdev->ev_led_flags, sizeof(evdev->ev_led_flags), "",
271 	    "Input device supported LED events");
272 
273 	SYSCTL_ADD_OPAQUE(&evdev->ev_sysctl_ctx,
274 	    SYSCTL_CHILDREN(ev_sysctl_tree), OID_AUTO, "snd_bits", CTLFLAG_RD,
275 	    evdev->ev_snd_flags, sizeof(evdev->ev_snd_flags), "",
276 	    "Input device supported sound events");
277 
278 	SYSCTL_ADD_OPAQUE(&evdev->ev_sysctl_ctx,
279 	    SYSCTL_CHILDREN(ev_sysctl_tree), OID_AUTO, "sw_bits", CTLFLAG_RD,
280 	    evdev->ev_sw_flags, sizeof(evdev->ev_sw_flags), "",
281 	    "Input device supported switch events");
282 }
283 
284 static int
285 evdev_register_common(struct evdev_dev *evdev)
286 {
287 	int ret;
288 
289 	debugf(evdev, "%s: registered evdev provider: %s <%s>\n",
290 	    evdev->ev_shortname, evdev->ev_name, evdev->ev_serial);
291 
292 	/* Initialize internal structures */
293 	LIST_INIT(&evdev->ev_clients);
294 
295 	if (evdev_event_supported(evdev, EV_REP) &&
296 	    bit_test(evdev->ev_flags, EVDEV_FLAG_SOFTREPEAT)) {
297 		/* Initialize callout */
298 		callout_init_mtx(&evdev->ev_rep_callout, evdev->ev_lock, 0);
299 
300 		if (evdev->ev_rep[REP_DELAY] == 0 &&
301 		    evdev->ev_rep[REP_PERIOD] == 0) {
302 			/* Supply default values */
303 			evdev->ev_rep[REP_DELAY] = 250;
304 			evdev->ev_rep[REP_PERIOD] = 33;
305 		}
306 	}
307 
308 	/* Initialize multitouch protocol type B states */
309 	if (bit_test(evdev->ev_abs_flags, ABS_MT_SLOT) &&
310 	    evdev->ev_absinfo != NULL && MAXIMAL_MT_SLOT(evdev) > 0)
311 		evdev_mt_init(evdev);
312 
313 	/* Estimate maximum report size */
314 	if (evdev->ev_report_size == 0) {
315 		ret = evdev_set_report_size(evdev,
316 		    evdev_estimate_report_size(evdev));
317 		if (ret != 0)
318 			goto bail_out;
319 	}
320 
321 	/* Create char device node */
322 	ret = evdev_cdev_create(evdev);
323 	if (ret != 0)
324 		goto bail_out;
325 
326 	/* Create sysctls (for device enumeration without /dev/input access rights) */
327 	evdev_sysctl_create(evdev);
328 
329 bail_out:
330 	return (ret);
331 }
332 
333 int
334 evdev_register(struct evdev_dev *evdev)
335 {
336 	int ret;
337 
338 	evdev->ev_lock_type = EV_LOCK_INTERNAL;
339 	evdev->ev_lock = &evdev->ev_mtx;
340 	mtx_init(&evdev->ev_mtx, "evmtx", NULL, MTX_DEF);
341 
342 	ret = evdev_register_common(evdev);
343 	if (ret != 0)
344 		mtx_destroy(&evdev->ev_mtx);
345 
346 	return (ret);
347 }
348 
349 int
350 evdev_register_mtx(struct evdev_dev *evdev, struct mtx *mtx)
351 {
352 
353 	evdev->ev_lock_type = EV_LOCK_MTX;
354 	evdev->ev_lock = mtx;
355 	return (evdev_register_common(evdev));
356 }
357 
358 int
359 evdev_unregister(struct evdev_dev *evdev)
360 {
361 	struct evdev_client *client, *tmp;
362 	int ret;
363 	debugf(evdev, "%s: unregistered evdev provider: %s\n",
364 	    evdev->ev_shortname, evdev->ev_name);
365 
366 	sysctl_ctx_free(&evdev->ev_sysctl_ctx);
367 
368 	EVDEV_LOCK(evdev);
369 	evdev->ev_cdev->si_drv1 = NULL;
370 	/* Wake up sleepers */
371 	LIST_FOREACH_SAFE(client, &evdev->ev_clients, ec_link, tmp) {
372 		evdev_revoke_client(client);
373 		evdev_dispose_client(evdev, client);
374 		EVDEV_CLIENT_LOCKQ(client);
375 		evdev_notify_event(client);
376 		EVDEV_CLIENT_UNLOCKQ(client);
377 	}
378 	EVDEV_UNLOCK(evdev);
379 
380 	/* destroy_dev can sleep so release lock */
381 	ret = evdev_cdev_destroy(evdev);
382 	evdev->ev_cdev = NULL;
383 	if (ret == 0 && evdev->ev_lock_type == EV_LOCK_INTERNAL)
384 		mtx_destroy(&evdev->ev_mtx);
385 
386 	evdev_free_absinfo(evdev->ev_absinfo);
387 	evdev_mt_free(evdev);
388 
389 	return (ret);
390 }
391 
392 inline void
393 evdev_set_name(struct evdev_dev *evdev, const char *name)
394 {
395 
396 	snprintf(evdev->ev_name, NAMELEN, "%s", name);
397 }
398 
399 inline void
400 evdev_set_id(struct evdev_dev *evdev, uint16_t bustype, uint16_t vendor,
401     uint16_t product, uint16_t version)
402 {
403 
404 	evdev->ev_id = (struct input_id) {
405 		.bustype = bustype,
406 		.vendor = vendor,
407 		.product = product,
408 		.version = version
409 	};
410 }
411 
412 inline void
413 evdev_set_phys(struct evdev_dev *evdev, const char *name)
414 {
415 
416 	snprintf(evdev->ev_shortname, NAMELEN, "%s", name);
417 }
418 
419 inline void
420 evdev_set_serial(struct evdev_dev *evdev, const char *serial)
421 {
422 
423 	snprintf(evdev->ev_serial, NAMELEN, "%s", serial);
424 }
425 
426 inline void
427 evdev_set_methods(struct evdev_dev *evdev, void *softc,
428     const struct evdev_methods *methods)
429 {
430 
431 	evdev->ev_methods = methods;
432 	evdev->ev_softc = softc;
433 }
434 
435 inline void *
436 evdev_get_softc(struct evdev_dev *evdev)
437 {
438 
439 	return (evdev->ev_softc);
440 }
441 
442 inline void
443 evdev_support_prop(struct evdev_dev *evdev, uint16_t prop)
444 {
445 
446 	KASSERT(prop < INPUT_PROP_CNT, ("invalid evdev input property"));
447 	bit_set(evdev->ev_prop_flags, prop);
448 }
449 
450 inline void
451 evdev_support_event(struct evdev_dev *evdev, uint16_t type)
452 {
453 
454 	KASSERT(type < EV_CNT, ("invalid evdev event property"));
455 	bit_set(evdev->ev_type_flags, type);
456 }
457 
458 inline void
459 evdev_support_key(struct evdev_dev *evdev, uint16_t code)
460 {
461 
462 	KASSERT(code < KEY_CNT, ("invalid evdev key property"));
463 	bit_set(evdev->ev_key_flags, code);
464 }
465 
466 inline void
467 evdev_support_rel(struct evdev_dev *evdev, uint16_t code)
468 {
469 
470 	KASSERT(code < REL_CNT, ("invalid evdev rel property"));
471 	bit_set(evdev->ev_rel_flags, code);
472 }
473 
474 inline void
475 evdev_support_abs(struct evdev_dev *evdev, uint16_t code, int32_t value,
476     int32_t minimum, int32_t maximum, int32_t fuzz, int32_t flat,
477     int32_t resolution)
478 {
479 	struct input_absinfo absinfo;
480 
481 	KASSERT(code < ABS_CNT, ("invalid evdev abs property"));
482 
483 	absinfo = (struct input_absinfo) {
484 		.value = value,
485 		.minimum = minimum,
486 		.maximum = maximum,
487 		.fuzz = fuzz,
488 		.flat = flat,
489 		.resolution = resolution,
490 	};
491 	evdev_set_abs_bit(evdev, code);
492 	evdev_set_absinfo(evdev, code, &absinfo);
493 }
494 
495 inline void
496 evdev_set_abs_bit(struct evdev_dev *evdev, uint16_t code)
497 {
498 
499 	KASSERT(code < ABS_CNT, ("invalid evdev abs property"));
500 	if (evdev->ev_absinfo == NULL)
501 		evdev->ev_absinfo = evdev_alloc_absinfo();
502 	bit_set(evdev->ev_abs_flags, code);
503 }
504 
505 inline void
506 evdev_support_msc(struct evdev_dev *evdev, uint16_t code)
507 {
508 
509 	KASSERT(code < MSC_CNT, ("invalid evdev msc property"));
510 	bit_set(evdev->ev_msc_flags, code);
511 }
512 
513 
514 inline void
515 evdev_support_led(struct evdev_dev *evdev, uint16_t code)
516 {
517 
518 	KASSERT(code < LED_CNT, ("invalid evdev led property"));
519 	bit_set(evdev->ev_led_flags, code);
520 }
521 
522 inline void
523 evdev_support_snd(struct evdev_dev *evdev, uint16_t code)
524 {
525 
526 	KASSERT(code < SND_CNT, ("invalid evdev snd property"));
527 	bit_set(evdev->ev_snd_flags, code);
528 }
529 
530 inline void
531 evdev_support_sw(struct evdev_dev *evdev, uint16_t code)
532 {
533 
534 	KASSERT(code < SW_CNT, ("invalid evdev sw property"));
535 	bit_set(evdev->ev_sw_flags, code);
536 }
537 
538 bool
539 evdev_event_supported(struct evdev_dev *evdev, uint16_t type)
540 {
541 
542 	KASSERT(type < EV_CNT, ("invalid evdev event property"));
543 	return (bit_test(evdev->ev_type_flags, type));
544 }
545 
546 inline void
547 evdev_set_absinfo(struct evdev_dev *evdev, uint16_t axis,
548     struct input_absinfo *absinfo)
549 {
550 
551 	KASSERT(axis < ABS_CNT, ("invalid evdev abs property"));
552 
553 	if (axis == ABS_MT_SLOT &&
554 	    (absinfo->maximum < 1 || absinfo->maximum >= MAX_MT_SLOTS))
555 		return;
556 
557 	if (evdev->ev_absinfo == NULL)
558 		evdev->ev_absinfo = evdev_alloc_absinfo();
559 
560 	if (axis == ABS_MT_SLOT)
561 		evdev->ev_absinfo[ABS_MT_SLOT].maximum = absinfo->maximum;
562 	else
563 		memcpy(&evdev->ev_absinfo[axis], absinfo,
564 		    sizeof(struct input_absinfo));
565 }
566 
567 inline void
568 evdev_set_repeat_params(struct evdev_dev *evdev, uint16_t property, int value)
569 {
570 
571 	KASSERT(property < REP_CNT, ("invalid evdev repeat property"));
572 	evdev->ev_rep[property] = value;
573 }
574 
575 inline void
576 evdev_set_flag(struct evdev_dev *evdev, uint16_t flag)
577 {
578 
579 	KASSERT(flag < EVDEV_FLAG_CNT, ("invalid evdev flag property"));
580 	bit_set(evdev->ev_flags, flag);
581 }
582 
583 static int
584 evdev_check_event(struct evdev_dev *evdev, uint16_t type, uint16_t code,
585     int32_t value)
586 {
587 
588 	if (type >= EV_CNT)
589 		return (EINVAL);
590 
591 	/* Allow SYN events implicitly */
592 	if (type != EV_SYN && !evdev_event_supported(evdev, type))
593 		return (EINVAL);
594 
595 	switch (type) {
596 	case EV_SYN:
597 		if (code >= SYN_CNT)
598 			return (EINVAL);
599 		break;
600 
601 	case EV_KEY:
602 		if (code >= KEY_CNT)
603 			return (EINVAL);
604 		if (!bit_test(evdev->ev_key_flags, code))
605 			return (EINVAL);
606 		break;
607 
608 	case EV_REL:
609 		if (code >= REL_CNT)
610 			return (EINVAL);
611 		if (!bit_test(evdev->ev_rel_flags, code))
612 			return (EINVAL);
613 		break;
614 
615 	case EV_ABS:
616 		if (code >= ABS_CNT)
617 			return (EINVAL);
618 		if (!bit_test(evdev->ev_abs_flags, code))
619 			return (EINVAL);
620 		if (code == ABS_MT_SLOT &&
621 		    (value < 0 || value > MAXIMAL_MT_SLOT(evdev)))
622 			return (EINVAL);
623 		if (ABS_IS_MT(code) && evdev->ev_mt == NULL &&
624 		    bit_test(evdev->ev_abs_flags, ABS_MT_SLOT))
625 			return (EINVAL);
626 		break;
627 
628 	case EV_MSC:
629 		if (code >= MSC_CNT)
630 			return (EINVAL);
631 		if (!bit_test(evdev->ev_msc_flags, code))
632 			return (EINVAL);
633 		break;
634 
635 	case EV_LED:
636 		if (code >= LED_CNT)
637 			return (EINVAL);
638 		if (!bit_test(evdev->ev_led_flags, code))
639 			return (EINVAL);
640 		break;
641 
642 	case EV_SND:
643 		if (code >= SND_CNT)
644 			return (EINVAL);
645 		if (!bit_test(evdev->ev_snd_flags, code))
646 			return (EINVAL);
647 		break;
648 
649 	case EV_SW:
650 		if (code >= SW_CNT)
651 			return (EINVAL);
652 		if (!bit_test(evdev->ev_sw_flags, code))
653 			return (EINVAL);
654 		break;
655 
656 	case EV_REP:
657 		if (code >= REP_CNT)
658 			return (EINVAL);
659 		break;
660 
661 	default:
662 		return (EINVAL);
663 	}
664 
665 	return (0);
666 }
667 
668 static void
669 evdev_modify_event(struct evdev_dev *evdev, uint16_t type, uint16_t code,
670     int32_t *value)
671 {
672 
673 	EVDEV_LOCK_ASSERT(evdev);
674 
675 	switch (type) {
676 	case EV_KEY:
677 		if (!evdev_event_supported(evdev, EV_REP))
678 			break;
679 
680 		if (!bit_test(evdev->ev_flags, EVDEV_FLAG_SOFTREPEAT)) {
681 			/* Detect driver key repeats. */
682 			if (bit_test(evdev->ev_key_states, code) &&
683 			    *value == KEY_EVENT_DOWN)
684 				*value = KEY_EVENT_REPEAT;
685 		} else {
686 			/* Start/stop callout for evdev repeats */
687 			if (bit_test(evdev->ev_key_states, code) == !*value &&
688 			    !LIST_EMPTY(&evdev->ev_clients)) {
689 				if (*value == KEY_EVENT_DOWN)
690 					evdev_start_repeat(evdev, code);
691 				else
692 					evdev_stop_repeat(evdev);
693 			}
694 		}
695 		break;
696 
697 	case EV_ABS:
698 		/* TBD: implement fuzz */
699 		break;
700 	}
701 }
702 
703 static enum evdev_sparse_result
704 evdev_sparse_event(struct evdev_dev *evdev, uint16_t type, uint16_t code,
705     int32_t value)
706 {
707 	int32_t last_mt_slot;
708 
709 	EVDEV_LOCK_ASSERT(evdev);
710 
711 	/*
712 	 * For certain event types, update device state bits
713 	 * and convert level reporting to edge reporting
714 	 */
715 	switch (type) {
716 	case EV_KEY:
717 		switch (value) {
718 		case KEY_EVENT_UP:
719 		case KEY_EVENT_DOWN:
720 			if (bit_test(evdev->ev_key_states, code) == value)
721 				return (EV_SKIP_EVENT);
722 			bit_change(evdev->ev_key_states, code, value);
723 			break;
724 
725 		case KEY_EVENT_REPEAT:
726 			if (bit_test(evdev->ev_key_states, code) == 0 ||
727 			    !evdev_event_supported(evdev, EV_REP))
728 				return (EV_SKIP_EVENT);
729 			break;
730 
731 		default:
732 			 return (EV_SKIP_EVENT);
733 		}
734 		break;
735 
736 	case EV_LED:
737 		if (bit_test(evdev->ev_led_states, code) == value)
738 			return (EV_SKIP_EVENT);
739 		bit_change(evdev->ev_led_states, code, value);
740 		break;
741 
742 	case EV_SND:
743 		bit_change(evdev->ev_snd_states, code, value);
744 		break;
745 
746 	case EV_SW:
747 		if (bit_test(evdev->ev_sw_states, code) == value)
748 			return (EV_SKIP_EVENT);
749 		bit_change(evdev->ev_sw_states, code, value);
750 		break;
751 
752 	case EV_REP:
753 		if (evdev->ev_rep[code] == value)
754 			return (EV_SKIP_EVENT);
755 		evdev_set_repeat_params(evdev, code, value);
756 		break;
757 
758 	case EV_REL:
759 		if (value == 0)
760 			return (EV_SKIP_EVENT);
761 		break;
762 
763 	/* For EV_ABS, save last value in absinfo and ev_mt_states */
764 	case EV_ABS:
765 		switch (code) {
766 		case ABS_MT_SLOT:
767 			/* Postpone ABS_MT_SLOT till next event */
768 			evdev_set_last_mt_slot(evdev, value);
769 			return (EV_SKIP_EVENT);
770 
771 		case ABS_MT_FIRST ... ABS_MT_LAST:
772 			/* Pass MT protocol type A events as is */
773 			if (!bit_test(evdev->ev_abs_flags, ABS_MT_SLOT))
774 				break;
775 			/* Don`t repeat MT protocol type B events */
776 			last_mt_slot = evdev_get_last_mt_slot(evdev);
777 			if (evdev_get_mt_value(evdev, last_mt_slot, code)
778 			     == value)
779 				return (EV_SKIP_EVENT);
780 			evdev_set_mt_value(evdev, last_mt_slot, code, value);
781 			if (last_mt_slot != CURRENT_MT_SLOT(evdev)) {
782 				CURRENT_MT_SLOT(evdev) = last_mt_slot;
783 				evdev->ev_report_opened = true;
784 				return (EV_REPORT_MT_SLOT);
785 			}
786 			break;
787 
788 		default:
789 			if (evdev->ev_absinfo[code].value == value)
790 				return (EV_SKIP_EVENT);
791 			evdev->ev_absinfo[code].value = value;
792 		}
793 		break;
794 
795 	case EV_SYN:
796 		if (code == SYN_REPORT) {
797 			/* Count empty reports as well as non empty */
798 			evdev->ev_report_count++;
799 			/* Skip empty reports */
800 			if (!evdev->ev_report_opened)
801 				return (EV_SKIP_EVENT);
802 			evdev->ev_report_opened = false;
803 			return (EV_REPORT_EVENT);
804 		}
805 		break;
806 	}
807 
808 	evdev->ev_report_opened = true;
809 	return (EV_REPORT_EVENT);
810 }
811 
812 static void
813 evdev_propagate_event(struct evdev_dev *evdev, uint16_t type, uint16_t code,
814     int32_t value)
815 {
816 	struct evdev_client *client;
817 
818 	debugf(evdev, "%s pushed event %d/%d/%d",
819 	    evdev->ev_shortname, type, code, value);
820 
821 	EVDEV_LOCK_ASSERT(evdev);
822 
823 	/* Propagate event through all clients */
824 	LIST_FOREACH(client, &evdev->ev_clients, ec_link) {
825 		if (evdev->ev_grabber != NULL && evdev->ev_grabber != client)
826 			continue;
827 
828 		EVDEV_CLIENT_LOCKQ(client);
829 		evdev_client_push(client, type, code, value);
830 		if (type == EV_SYN && code == SYN_REPORT)
831 			evdev_notify_event(client);
832 		EVDEV_CLIENT_UNLOCKQ(client);
833 	}
834 
835 	evdev->ev_event_count++;
836 }
837 
838 void
839 evdev_send_event(struct evdev_dev *evdev, uint16_t type, uint16_t code,
840     int32_t value)
841 {
842 	enum evdev_sparse_result sparse;
843 
844 	EVDEV_LOCK_ASSERT(evdev);
845 
846 	sparse =  evdev_sparse_event(evdev, type, code, value);
847 	switch (sparse) {
848 	case EV_REPORT_MT_SLOT:
849 		/* report postponed ABS_MT_SLOT */
850 		evdev_propagate_event(evdev, EV_ABS, ABS_MT_SLOT,
851 		    CURRENT_MT_SLOT(evdev));
852 		/* FALLTHROUGH */
853 	case EV_REPORT_EVENT:
854 		evdev_propagate_event(evdev, type, code, value);
855 		/* FALLTHROUGH */
856 	case EV_SKIP_EVENT:
857 		break;
858 	}
859 }
860 
861 void
862 evdev_restore_after_kdb(struct evdev_dev *evdev)
863 {
864 	int code;
865 
866 	EVDEV_LOCK_ASSERT(evdev);
867 
868 	/* Report postponed leds */
869 	for (code = 0; code < LED_CNT; code++)
870 		if (bit_test(evdev->ev_kdb_led_states, code))
871 			evdev_send_event(evdev, EV_LED, code,
872 			    !bit_test(evdev->ev_led_states, code));
873 	bit_nclear(evdev->ev_kdb_led_states, 0, LED_MAX);
874 
875 	/* Release stuck keys (CTRL + ALT + ESC) */
876 	evdev_stop_repeat(evdev);
877 	for (code = 0; code < KEY_CNT; code++) {
878 		if (bit_test(evdev->ev_key_states, code)) {
879 			evdev_send_event(evdev, EV_KEY, code, KEY_EVENT_UP);
880 			evdev_send_event(evdev, EV_SYN, SYN_REPORT, 1);
881 		}
882 	}
883 }
884 
885 int
886 evdev_push_event(struct evdev_dev *evdev, uint16_t type, uint16_t code,
887     int32_t value)
888 {
889 
890 	if (evdev_check_event(evdev, type, code, value) != 0)
891 		return (EINVAL);
892 
893 	/*
894 	 * Discard all but LEDs kdb events as unrelated to userspace.
895 	 * Aggregate LED updates and postpone reporting until kdb deactivation.
896 	 */
897 	if (kdb_active || SCHEDULER_STOPPED()) {
898 		evdev->ev_kdb_active = true;
899 		if (type == EV_LED)
900 			bit_set(evdev->ev_kdb_led_states,
901 			    bit_test(evdev->ev_led_states, code) != value);
902 		return (0);
903 	}
904 
905 	EVDEV_ENTER(evdev);
906 
907 	/* Fix evdev state corrupted with discarding of kdb events */
908 	if (evdev->ev_kdb_active) {
909 		evdev->ev_kdb_active = false;
910 		evdev_restore_after_kdb(evdev);
911 	}
912 
913 	evdev_modify_event(evdev, type, code, &value);
914 	if (type == EV_SYN && code == SYN_REPORT &&
915 	     bit_test(evdev->ev_flags, EVDEV_FLAG_MT_AUTOREL))
916 		evdev_send_mt_autorel(evdev);
917 	if (type == EV_SYN && code == SYN_REPORT && evdev->ev_report_opened &&
918 	    bit_test(evdev->ev_flags, EVDEV_FLAG_MT_STCOMPAT))
919 		evdev_send_mt_compat(evdev);
920 	evdev_send_event(evdev, type, code, value);
921 
922 	EVDEV_EXIT(evdev);
923 
924 	return (0);
925 }
926 
927 int
928 evdev_inject_event(struct evdev_dev *evdev, uint16_t type, uint16_t code,
929     int32_t value)
930 {
931 	int ret = 0;
932 
933 	switch (type) {
934 	case EV_REP:
935 		/* evdev repeats should not be processed by hardware driver */
936 		if (bit_test(evdev->ev_flags, EVDEV_FLAG_SOFTREPEAT))
937 			goto push;
938 		/* FALLTHROUGH */
939 	case EV_LED:
940 	case EV_MSC:
941 	case EV_SND:
942 	case EV_FF:
943 		if (evdev->ev_methods != NULL &&
944 		    evdev->ev_methods->ev_event != NULL)
945 			evdev->ev_methods->ev_event(evdev, type, code, value);
946 		/*
947 		 * Leds and driver repeats should be reported in ev_event
948 		 * method body to interoperate with kbdmux states and rates
949 		 * propagation so both ways (ioctl and evdev) of changing it
950 		 * will produce only one evdev event report to client.
951 		 */
952 		if (type == EV_LED || type == EV_REP)
953 			break;
954 		/* FALLTHROUGH */
955 	case EV_SYN:
956 	case EV_KEY:
957 	case EV_REL:
958 	case EV_ABS:
959 	case EV_SW:
960 push:
961 		if (evdev->ev_lock_type != EV_LOCK_INTERNAL)
962 			EVDEV_LOCK(evdev);
963 		ret = evdev_push_event(evdev, type,  code, value);
964 		if (evdev->ev_lock_type != EV_LOCK_INTERNAL)
965 			EVDEV_UNLOCK(evdev);
966 		break;
967 
968 	default:
969 		ret = EINVAL;
970 	}
971 
972 	return (ret);
973 }
974 
975 int
976 evdev_register_client(struct evdev_dev *evdev, struct evdev_client *client)
977 {
978 	int ret = 0;
979 
980 	debugf(evdev, "adding new client for device %s", evdev->ev_shortname);
981 
982 	EVDEV_LOCK_ASSERT(evdev);
983 
984 	if (LIST_EMPTY(&evdev->ev_clients) && evdev->ev_methods != NULL &&
985 	    evdev->ev_methods->ev_open != NULL) {
986 		debugf(evdev, "calling ev_open() on device %s",
987 		    evdev->ev_shortname);
988 		ret = evdev->ev_methods->ev_open(evdev);
989 	}
990 	if (ret == 0)
991 		LIST_INSERT_HEAD(&evdev->ev_clients, client, ec_link);
992 	return (ret);
993 }
994 
995 void
996 evdev_dispose_client(struct evdev_dev *evdev, struct evdev_client *client)
997 {
998 	debugf(evdev, "removing client for device %s", evdev->ev_shortname);
999 
1000 	EVDEV_LOCK_ASSERT(evdev);
1001 
1002 	LIST_REMOVE(client, ec_link);
1003 	if (LIST_EMPTY(&evdev->ev_clients)) {
1004 		if (evdev->ev_methods != NULL &&
1005 		    evdev->ev_methods->ev_close != NULL)
1006 			(void)evdev->ev_methods->ev_close(evdev);
1007 		if (evdev_event_supported(evdev, EV_REP) &&
1008 		    bit_test(evdev->ev_flags, EVDEV_FLAG_SOFTREPEAT))
1009 			evdev_stop_repeat(evdev);
1010 	}
1011 	evdev_release_client(evdev, client);
1012 }
1013 
1014 int
1015 evdev_grab_client(struct evdev_dev *evdev, struct evdev_client *client)
1016 {
1017 
1018 	EVDEV_LOCK_ASSERT(evdev);
1019 
1020 	if (evdev->ev_grabber != NULL)
1021 		return (EBUSY);
1022 
1023 	evdev->ev_grabber = client;
1024 
1025 	return (0);
1026 }
1027 
1028 int
1029 evdev_release_client(struct evdev_dev *evdev, struct evdev_client *client)
1030 {
1031 
1032 	EVDEV_LOCK_ASSERT(evdev);
1033 
1034 	if (evdev->ev_grabber != client)
1035 		return (EINVAL);
1036 
1037 	evdev->ev_grabber = NULL;
1038 
1039 	return (0);
1040 }
1041 
1042 static void
1043 evdev_repeat_callout(void *arg)
1044 {
1045 	struct evdev_dev *evdev = (struct evdev_dev *)arg;
1046 
1047 	evdev_send_event(evdev, EV_KEY, evdev->ev_rep_key, KEY_EVENT_REPEAT);
1048 	evdev_send_event(evdev, EV_SYN, SYN_REPORT, 1);
1049 
1050 	if (evdev->ev_rep[REP_PERIOD])
1051 		callout_reset(&evdev->ev_rep_callout,
1052 		    evdev->ev_rep[REP_PERIOD] * hz / 1000,
1053 		    evdev_repeat_callout, evdev);
1054 	else
1055 		evdev->ev_rep_key = KEY_RESERVED;
1056 }
1057 
1058 static void
1059 evdev_start_repeat(struct evdev_dev *evdev, uint16_t key)
1060 {
1061 
1062 	EVDEV_LOCK_ASSERT(evdev);
1063 
1064 	if (evdev->ev_rep[REP_DELAY]) {
1065 		evdev->ev_rep_key = key;
1066 		callout_reset(&evdev->ev_rep_callout,
1067 		    evdev->ev_rep[REP_DELAY] * hz / 1000,
1068 		    evdev_repeat_callout, evdev);
1069 	}
1070 }
1071 
1072 static void
1073 evdev_stop_repeat(struct evdev_dev *evdev)
1074 {
1075 
1076 	EVDEV_LOCK_ASSERT(evdev);
1077 
1078 	if (evdev->ev_rep_key != KEY_RESERVED) {
1079 		callout_stop(&evdev->ev_rep_callout);
1080 		evdev->ev_rep_key = KEY_RESERVED;
1081 	}
1082 }
1083 
1084 MODULE_VERSION(evdev, 1);
1085