2 * Copyright (c) 2014 Jakub Wojciech Klama <jceel@FreeBSD.org>
3 * Copyright (c) 2015-2016 Vladimir Kondratyev <wulf@FreeBSD.org>
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
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.
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
30 #include "opt_evdev.h"
32 #include <sys/types.h>
33 #include <sys/module.h>
34 #include <sys/devfs.h>
36 #include <sys/param.h>
38 #include <sys/filio.h>
39 #include <sys/fcntl.h>
40 #include <sys/kernel.h>
41 #include <sys/malloc.h>
44 #include <sys/systm.h>
46 #include <sys/vnode.h> /* IO_NDELAY in read() */
49 #include <sys/errno.h>
51 #include <sys/device.h>
54 #include "device_if.h"
56 /* Use FreeBSD bitstring locally. */
57 #include "freebsd-bitstring.h"
59 #include <dev/misc/evdev/evdev.h>
60 #include <dev/misc/evdev/evdev_private.h>
61 #include <dev/misc/evdev/input.h>
64 #define debugf(client, fmt, args...) kprintf("evdev cdev: "fmt"\n", ##args)
66 #define debugf(client, fmt, args...)
69 #define DEF_RING_REPORTS 8
70 #define GID_INPUT 107 /* input group */
72 static d_open_t evdev_open;
73 static d_read_t evdev_read;
74 static d_write_t evdev_write;
75 static d_ioctl_t evdev_ioctl;
76 static d_kqfilter_t evdev_kqfilter;
78 static int evdev_kqread(struct knote *kn, long hint);
79 static void evdev_kqdetach(struct knote *kn);
80 static void evdev_dtor(void *);
81 static int evdev_ioctl_eviocgbit(struct evdev_dev *, int, int, caddr_t);
82 static void evdev_client_filter_queue(struct evdev_client *, uint16_t);
84 static struct dev_ops evdev_cdevsw = {
88 .d_write = evdev_write,
89 .d_ioctl = evdev_ioctl,
90 .d_kqfilter = evdev_kqfilter,
93 static struct filterops evdev_cdev_filterops = {
94 .f_flags = FILTEROP_ISFD,
96 .f_detach = evdev_kqdetach,
97 .f_event = evdev_kqread,
101 evdev_open(struct dev_open_args *ap)
103 cdev_t dev = ap->a_head.a_dev;
104 struct evdev_dev *evdev = dev->si_drv1;
105 struct evdev_client *client;
112 /* Initialize client structure */
113 buffer_size = evdev->ev_report_size * DEF_RING_REPORTS;
114 client = kmalloc(offsetof(struct evdev_client, ec_buffer) +
115 sizeof(struct input_event) * buffer_size,
116 M_EVDEV, M_WAITOK | M_ZERO);
118 /* Initialize ring buffer */
119 client->ec_buffer_size = buffer_size;
120 client->ec_buffer_head = 0;
121 client->ec_buffer_tail = 0;
122 client->ec_buffer_ready = 0;
124 client->ec_evdev = evdev;
125 lockinit(&client->ec_buffer_mtx, "evclient", 0, LK_CANRECURSE);
127 /* Avoid race with evdev_unregister */
129 if (dev->si_drv1 == NULL)
132 ret = evdev_register_client(evdev, client);
135 evdev_revoke_client(client);
137 * Unlock evdev here because non-sleepable lock held
138 * while calling devfs_set_cdevpriv upsets WITNESS
143 ret = devfs_set_cdevpriv(ap->a_fp, client, &evdev_dtor);
146 debugf(client, "cannot register evdev client");
153 evdev_dtor(void *data)
155 struct evdev_client *client = (struct evdev_client *)data;
157 EVDEV_LOCK(client->ec_evdev);
158 if (!client->ec_revoked)
159 evdev_dispose_client(client->ec_evdev, client);
160 EVDEV_UNLOCK(client->ec_evdev);
162 funsetown(&client->ec_sigio);
163 lockuninit(&client->ec_buffer_mtx);
164 kfree(client, M_EVDEV);
168 evdev_read(struct dev_read_args *ap)
170 struct uio *uio = ap->a_uio;
171 int ioflag = ap->a_ioflag;
172 struct evdev_client *client;
173 struct input_event event;
177 ret = devfs_get_cdevpriv(ap->a_fp, (void **)&client);
181 debugf(client, "read %zd bytes by thread %d", uio->uio_resid, 0);
183 if (client->ec_revoked)
186 /* Zero-sized reads are allowed for error checking */
187 if (uio->uio_resid != 0 && uio->uio_resid < sizeof(struct input_event))
190 remaining = uio->uio_resid / sizeof(struct input_event);
192 EVDEV_CLIENT_LOCKQ(client);
194 if (EVDEV_CLIENT_EMPTYQ(client)) {
195 if (ioflag & IO_NDELAY) {
198 if (remaining != 0) {
199 client->ec_blocked = true;
200 ret = lksleep(client, &client->ec_buffer_mtx,
201 PCATCH, "evread", 0);
206 while (ret == 0 && !EVDEV_CLIENT_EMPTYQ(client) && remaining > 0) {
207 memcpy(&event, &client->ec_buffer[client->ec_buffer_head],
208 sizeof(struct input_event));
209 client->ec_buffer_head =
210 (client->ec_buffer_head + 1) % client->ec_buffer_size;
213 EVDEV_CLIENT_UNLOCKQ(client);
214 ret = uiomove((void *)&event, sizeof(struct input_event), uio);
215 EVDEV_CLIENT_LOCKQ(client);
218 EVDEV_CLIENT_UNLOCKQ(client);
224 evdev_write(struct dev_write_args *ap)
226 cdev_t dev = ap->a_head.a_dev;
227 struct uio *uio = ap->a_uio;
228 struct evdev_dev *evdev = dev->si_drv1;
229 struct evdev_client *client;
230 struct input_event event;
233 ret = devfs_get_cdevpriv(ap->a_fp, (void **)&client);
237 debugf(client, "write %zd bytes by thread %d", uio->uio_resid, 0);
239 if (client->ec_revoked || evdev == NULL)
242 if (uio->uio_resid % sizeof(struct input_event) != 0) {
243 debugf(client, "write size not multiple of input_event size");
247 while (uio->uio_resid > 0 && ret == 0) {
248 ret = uiomove((void *)&event, sizeof(struct input_event), uio);
250 ret = evdev_inject_event(evdev, event.type, event.code,
258 evdev_kqfilter(struct dev_kqfilter_args *ap)
260 struct knote *kn = ap->a_kn;
262 struct evdev_client *client;
265 ret = devfs_get_cdevpriv(ap->a_fp, (void **)&client);
269 if (client->ec_revoked)
272 switch(kn->kn_filter) {
274 kn->kn_fop = &evdev_cdev_filterops;
279 kn->kn_hook = (caddr_t)client;
281 klist = &client->kqinfo.ki_note;
282 knote_insert(klist, kn);
287 evdev_kqread(struct knote *kn, long hint)
289 struct evdev_client *client;
293 client = (struct evdev_client *)kn->kn_hook;
295 /* NOTE on DragonFly v FreeBSD.
296 * FreeBSD locks the klist when calling f_event, i.e. evdev_kqread().
297 * That's why the plain assertion EVDEV_CLIENT_LOCKQ_ASSERT(client)
298 * fails on DragonFly: DragonFly does not ensure the lock associated
299 * with the klist is locked.
300 * To mimic FreeBSD's behavior, we will lock ec_buffer_mtx if
301 * it was not locked, and unlock when leaving.
303 locked = lockowned(&(client)->ec_buffer_mtx);
305 EVDEV_CLIENT_LOCKQ(client);
307 EVDEV_CLIENT_LOCKQ_ASSERT(client);
309 if (client->ec_revoked) {
310 kn->kn_flags |= EV_EOF;
313 kn->kn_data = EVDEV_CLIENT_SIZEQ(client) *
314 sizeof(struct input_event);
315 ret = !EVDEV_CLIENT_EMPTYQ(client);
318 /* Unlock if ec_buffer_mtx was not locked. */
320 EVDEV_CLIENT_UNLOCKQ(client);
327 evdev_kqdetach(struct knote *kn)
329 struct evdev_client *client;
331 client = (struct evdev_client *)kn->kn_hook;
332 knote_remove(&client->kqinfo.ki_note, kn);
336 evdev_ioctl(struct dev_ioctl_args *ap)
338 cdev_t dev = ap->a_head.a_dev;
339 u_long cmd = ap->a_cmd;
340 caddr_t data = ap->a_data;
341 struct evdev_dev *evdev = dev->si_drv1;
342 struct evdev_client *client;
343 struct input_keymap_entry *ke;
344 int ret, len, limit, type_num;
348 ret = devfs_get_cdevpriv(ap->a_fp, (void **)&client);
352 if (client->ec_revoked || evdev == NULL)
355 /* file I/O ioctl handling */
358 return (fsetown(*(int *)data, &client->ec_sigio));
361 *(int *)data = fgetown(&client->ec_sigio);
369 client->ec_async = true;
371 client->ec_async = false;
376 EVDEV_CLIENT_LOCKQ(client);
378 EVDEV_CLIENT_SIZEQ(client) * sizeof(struct input_event);
379 EVDEV_CLIENT_UNLOCKQ(client);
383 len = IOCPARM_LEN(cmd);
384 debugf(client, "ioctl called: cmd=0x%08lx, data=%p", cmd, data);
386 /* evdev fixed-length ioctls handling */
389 *(int *)data = EV_VERSION;
393 debugf(client, "EVIOCGID: bus=%d vendor=0x%04x product=0x%04x",
394 evdev->ev_id.bustype, evdev->ev_id.vendor,
395 evdev->ev_id.product);
396 memcpy(data, &evdev->ev_id, sizeof(struct input_id));
400 if (!evdev_event_supported(evdev, EV_REP))
403 memcpy(data, evdev->ev_rep, sizeof(evdev->ev_rep));
407 if (!evdev_event_supported(evdev, EV_REP))
410 evdev_inject_event(evdev, EV_REP, REP_DELAY, ((int *)data)[0]);
411 evdev_inject_event(evdev, EV_REP, REP_PERIOD,
416 /* Fake unsupported ioctl */
419 case EVIOCGKEYCODE_V2:
420 if (evdev->ev_methods == NULL ||
421 evdev->ev_methods->ev_get_keycode == NULL)
424 ke = (struct input_keymap_entry *)data;
425 evdev->ev_methods->ev_get_keycode(evdev, evdev->ev_softc, ke);
429 /* Fake unsupported ioctl */
432 case EVIOCSKEYCODE_V2:
433 if (evdev->ev_methods == NULL ||
434 evdev->ev_methods->ev_set_keycode == NULL)
437 ke = (struct input_keymap_entry *)data;
438 evdev->ev_methods->ev_set_keycode(evdev, evdev->ev_softc, ke);
441 case EVIOCGABS(0) ... EVIOCGABS(ABS_MAX):
442 if (evdev->ev_absinfo == NULL)
445 memcpy(data, &evdev->ev_absinfo[cmd - EVIOCGABS(0)],
446 sizeof(struct input_absinfo));
449 case EVIOCSABS(0) ... EVIOCSABS(ABS_MAX):
450 if (evdev->ev_absinfo == NULL)
453 code = cmd - EVIOCSABS(0);
454 /* mt-slot number can not be changed */
455 if (code == ABS_MT_SLOT)
459 evdev_set_absinfo(evdev, code, (struct input_absinfo *)data);
466 /* Fake unsupported ioctls */
472 ret = evdev_grab_client(evdev, client);
474 ret = evdev_release_client(evdev, client);
479 if (*(int *)data != 0)
483 if (dev->si_drv1 != NULL && !client->ec_revoked) {
484 evdev_dispose_client(evdev, client);
485 evdev_revoke_client(client);
491 switch (*(int *)data) {
493 client->ec_clock_id = EV_CLOCK_REALTIME;
495 case CLOCK_MONOTONIC:
496 client->ec_clock_id = EV_CLOCK_MONOTONIC;
503 /* evdev variable-length ioctls handling */
504 switch (IOCBASECMD(cmd)) {
506 strlcpy(data, evdev->ev_name, len);
510 if (evdev->ev_shortname[0] == 0)
513 strlcpy(data, evdev->ev_shortname, len);
517 if (evdev->ev_serial[0] == 0)
520 strlcpy(data, evdev->ev_serial, len);
524 limit = MIN(len, bitstr_size(INPUT_PROP_CNT));
525 memcpy(data, evdev->ev_prop_flags, limit);
528 case EVIOCGMTSLOTS(0):
529 if (evdev->ev_mt == NULL)
531 if (len < sizeof(uint32_t))
533 code = *(uint32_t *)data;
534 if (!ABS_IS_MT(code))
538 MIN(len / sizeof(int32_t) - 1, MAXIMAL_MT_SLOT(evdev) + 1);
539 for (int i = 0; i < nvalues; i++)
540 ((int32_t *)data)[i + 1] =
541 evdev_get_mt_value(evdev, i, code);
545 limit = MIN(len, bitstr_size(KEY_CNT));
547 evdev_client_filter_queue(client, EV_KEY);
548 memcpy(data, evdev->ev_key_states, limit);
553 limit = MIN(len, bitstr_size(LED_CNT));
555 evdev_client_filter_queue(client, EV_LED);
556 memcpy(data, evdev->ev_led_states, limit);
561 limit = MIN(len, bitstr_size(SND_CNT));
563 evdev_client_filter_queue(client, EV_SND);
564 memcpy(data, evdev->ev_snd_states, limit);
569 limit = MIN(len, bitstr_size(SW_CNT));
571 evdev_client_filter_queue(client, EV_SW);
572 memcpy(data, evdev->ev_sw_states, limit);
576 case EVIOCGBIT(0, 0) ... EVIOCGBIT(EV_MAX, 0):
577 type_num = IOCBASECMD(cmd) - EVIOCGBIT(0, 0);
578 debugf(client, "EVIOCGBIT(%d): data=%p, len=%d", type_num,
580 return (evdev_ioctl_eviocgbit(evdev, type_num, len, data));
587 evdev_ioctl_eviocgbit(struct evdev_dev *evdev, int type, int len, caddr_t data)
590 * We will use freebsd-bitstring.h locally. This ensures bitmap
591 * is of type (unsigned long *). DragonFly's original bitmap
592 * is (unsigned char *).
594 unsigned long *bitmap;
599 bitmap = evdev->ev_type_flags;
603 bitmap = evdev->ev_key_flags;
607 bitmap = evdev->ev_rel_flags;
611 bitmap = evdev->ev_abs_flags;
615 bitmap = evdev->ev_msc_flags;
619 bitmap = evdev->ev_led_flags;
623 bitmap = evdev->ev_snd_flags;
627 bitmap = evdev->ev_sw_flags;
632 * We don't support EV_FF now, so let's
633 * just fake it returning only zeros.
642 * Clear ioctl data buffer in case it's bigger than
647 limit = bitstr_size(limit);
648 len = MIN(limit, len);
649 memcpy(data, bitmap, len);
654 evdev_revoke_client(struct evdev_client *client)
657 EVDEV_LOCK_ASSERT(client->ec_evdev);
659 client->ec_revoked = true;
663 evdev_notify_event(struct evdev_client *client)
666 EVDEV_CLIENT_LOCKQ_ASSERT(client);
668 if (client->ec_blocked) {
669 client->ec_blocked = false;
672 if (client->ec_selected) {
673 client->ec_selected = false;
674 wakeup(&client->kqinfo);
677 KNOTE(&client->kqinfo.ki_note, 0);
679 if (client->ec_async && client->ec_sigio != NULL)
680 pgsigio(client->ec_sigio, SIGIO, 0);
684 evdev_cdev_create(struct evdev_dev *evdev)
690 * Iterate over devices input/eventX until we find a non-existing
691 * one and record its number in unit.
694 while (devfs_find_device_by_name("input/event%d", unit) != NULL) {
699 * Put unit as minor. Minor and major will determine st_rdev of
700 * eventX. Ensuring that all eventX have different major and minor
701 * will make st_rdev unique. This is needed by libinput, which
702 * determines eventX from st_rdev.
704 dev = make_dev(&evdev_cdevsw, unit, UID_ROOT, GID_INPUT,
705 0660, "input/event%d", unit);
708 dev->si_drv1 = evdev;
709 evdev->ev_cdev = dev;
710 evdev->ev_unit = unit;
717 reference_dev(evdev->ev_cdev);
724 evdev_cdev_destroy(struct evdev_dev *evdev)
727 if (evdev->ev_cdev) {
728 dev_ops_remove_minor(&evdev_cdevsw, evdev->ev_unit);
735 evdev_client_gettime(struct evdev_client *client, struct timeval *tv)
738 switch (client->ec_clock_id) {
739 case EV_CLOCK_BOOTTIME:
741 * XXX: FreeBSD does not support true POSIX monotonic clock.
742 * So aliase EV_CLOCK_BOOTTIME to EV_CLOCK_MONOTONIC.
744 case EV_CLOCK_MONOTONIC:
748 case EV_CLOCK_REALTIME:
756 evdev_client_push(struct evdev_client *client, uint16_t type, uint16_t code,
760 size_t count, head, tail, ready;
762 EVDEV_CLIENT_LOCKQ_ASSERT(client);
763 head = client->ec_buffer_head;
764 tail = client->ec_buffer_tail;
765 ready = client->ec_buffer_ready;
766 count = client->ec_buffer_size;
768 /* If queue is full drop its content and place SYN_DROPPED event */
769 if ((tail + 1) % count == head) {
770 debugf(client, "client %p: buffer overflow", client);
772 head = (tail + count - 1) % count;
773 client->ec_buffer[head] = (struct input_event) {
779 * XXX: Here is a small race window from now till the end of
780 * report. The queue is empty but client has been already
781 * notified of data readyness. Can be fixed in two ways:
782 * 1. Implement bulk insert so queue lock would not be dropped
783 * till the SYN_REPORT event.
784 * 2. Insert SYN_REPORT just now and skip remaining events
786 client->ec_buffer_head = head;
787 client->ec_buffer_ready = head;
790 client->ec_buffer[tail].type = type;
791 client->ec_buffer[tail].code = code;
792 client->ec_buffer[tail].value = value;
793 client->ec_buffer_tail = (tail + 1) % count;
795 /* Allow users to read events only after report has been completed */
796 if (type == EV_SYN && code == SYN_REPORT) {
797 evdev_client_gettime(client, &time);
798 for (; ready != client->ec_buffer_tail;
799 ready = (ready + 1) % count)
800 client->ec_buffer[ready].time = time;
801 client->ec_buffer_ready = client->ec_buffer_tail;
806 evdev_client_dumpqueue(struct evdev_client *client)
808 struct input_event *event;
809 size_t i, head, tail, ready, size;
811 head = client->ec_buffer_head;
812 tail = client->ec_buffer_tail;
813 ready = client->ec_buffer_ready;
814 size = client->ec_buffer_size;
816 kprintf("evdev client: %p\n", client);
817 kprintf("event queue: head=%zu ready=%zu tail=%zu size=%zu\n",
818 head, ready, tail, size);
820 kprintf("queue contents:\n");
822 for (i = 0; i < size; i++) {
823 event = &client->ec_buffer[i];
826 if (i < head || i > tail)
829 kprintf("type=%d code=%d value=%d ", event->type,
830 event->code, event->value);
833 kprintf("<- head\n");
835 kprintf("<- tail\n");
837 kprintf("<- ready\n");
844 evdev_client_filter_queue(struct evdev_client *client, uint16_t type)
846 struct input_event *event;
847 size_t head, tail, count, i;
848 bool last_was_syn = false;
850 EVDEV_CLIENT_LOCKQ(client);
852 i = head = client->ec_buffer_head;
853 tail = client->ec_buffer_tail;
854 count = client->ec_buffer_size;
855 client->ec_buffer_ready = client->ec_buffer_tail;
857 while (i != client->ec_buffer_tail) {
858 event = &client->ec_buffer[i];
861 /* Skip event of given type */
862 if (event->type == type)
865 /* Remove empty SYN_REPORT events */
866 if (event->type == EV_SYN && event->code == SYN_REPORT) {
870 client->ec_buffer_ready = (tail + 1) % count;
874 memcpy(&client->ec_buffer[tail], event,
875 sizeof(struct input_event));
877 last_was_syn = (event->type == EV_SYN &&
878 event->code == SYN_REPORT);
880 tail = (tail + 1) % count;
883 client->ec_buffer_head = i;
884 client->ec_buffer_tail = tail;
886 EVDEV_CLIENT_UNLOCKQ(client);