2 * Xen para-virtual input device
4 * Copyright (C) 2005 Anthony Liguori <aliguori@us.ibm.com>
5 * Copyright (C) 2006-2008 Red Hat, Inc., Markus Armbruster <armbru@redhat.com>
7 * Based on linux/drivers/input/mouse/sermouse.c
9 * This file is subject to the terms and conditions of the GNU General Public
10 * License. See the file COPYING in the main directory of this archive for
14 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
16 #include <linux/kernel.h>
17 #include <linux/errno.h>
18 #include <linux/module.h>
19 #include <linux/input.h>
20 #include <linux/input/mt.h>
21 #include <linux/slab.h>
23 #include <asm/xen/hypervisor.h>
26 #include <xen/events.h>
28 #include <xen/grant_table.h>
29 #include <xen/interface/grant_table.h>
30 #include <xen/interface/io/fbif.h>
31 #include <xen/interface/io/kbdif.h>
32 #include <xen/xenbus.h>
33 #include <xen/platform_pci.h>
36 struct input_dev
*kbd
;
37 struct input_dev
*ptr
;
38 struct input_dev
*mtouch
;
39 struct xenkbd_page
*page
;
42 struct xenbus_device
*xbdev
;
44 /* current MT slot/contact ID we are injecting events in */
45 int mtouch_cur_contact_id
;
48 enum { KPARAM_X
, KPARAM_Y
, KPARAM_CNT
};
49 static int ptr_size
[KPARAM_CNT
] = { XENFB_WIDTH
, XENFB_HEIGHT
};
50 module_param_array(ptr_size
, int, NULL
, 0444);
51 MODULE_PARM_DESC(ptr_size
,
52 "Pointing device width, height in pixels (default 800,600)");
54 static int xenkbd_remove(struct xenbus_device
*);
55 static int xenkbd_connect_backend(struct xenbus_device
*, struct xenkbd_info
*);
56 static void xenkbd_disconnect_backend(struct xenkbd_info
*);
59 * Note: if you need to send out events, see xenfb_do_update() for how
63 static void xenkbd_handle_motion_event(struct xenkbd_info
*info
,
64 struct xenkbd_motion
*motion
)
66 input_report_rel(info
->ptr
, REL_X
, motion
->rel_x
);
67 input_report_rel(info
->ptr
, REL_Y
, motion
->rel_y
);
69 input_report_rel(info
->ptr
, REL_WHEEL
, -motion
->rel_z
);
70 input_sync(info
->ptr
);
73 static void xenkbd_handle_position_event(struct xenkbd_info
*info
,
74 struct xenkbd_position
*pos
)
76 input_report_abs(info
->ptr
, ABS_X
, pos
->abs_x
);
77 input_report_abs(info
->ptr
, ABS_Y
, pos
->abs_y
);
79 input_report_rel(info
->ptr
, REL_WHEEL
, -pos
->rel_z
);
80 input_sync(info
->ptr
);
83 static void xenkbd_handle_key_event(struct xenkbd_info
*info
,
84 struct xenkbd_key
*key
)
86 struct input_dev
*dev
;
87 int value
= key
->pressed
;
89 if (test_bit(key
->keycode
, info
->ptr
->keybit
)) {
91 } else if (test_bit(key
->keycode
, info
->kbd
->keybit
)) {
93 if (key
->pressed
&& test_bit(key
->keycode
, info
->kbd
->key
))
94 value
= 2; /* Mark as autorepeat */
96 pr_warn("unhandled keycode 0x%x\n", key
->keycode
);
100 input_event(dev
, EV_KEY
, key
->keycode
, value
);
104 static void xenkbd_handle_mt_event(struct xenkbd_info
*info
,
105 struct xenkbd_mtouch
*mtouch
)
107 if (unlikely(!info
->mtouch
))
110 if (mtouch
->contact_id
!= info
->mtouch_cur_contact_id
) {
111 info
->mtouch_cur_contact_id
= mtouch
->contact_id
;
112 input_mt_slot(info
->mtouch
, mtouch
->contact_id
);
115 switch (mtouch
->event_type
) {
116 case XENKBD_MT_EV_DOWN
:
117 input_mt_report_slot_state(info
->mtouch
, MT_TOOL_FINGER
, true);
120 case XENKBD_MT_EV_MOTION
:
121 input_report_abs(info
->mtouch
, ABS_MT_POSITION_X
,
122 mtouch
->u
.pos
.abs_x
);
123 input_report_abs(info
->mtouch
, ABS_MT_POSITION_Y
,
124 mtouch
->u
.pos
.abs_y
);
127 case XENKBD_MT_EV_SHAPE
:
128 input_report_abs(info
->mtouch
, ABS_MT_TOUCH_MAJOR
,
129 mtouch
->u
.shape
.major
);
130 input_report_abs(info
->mtouch
, ABS_MT_TOUCH_MINOR
,
131 mtouch
->u
.shape
.minor
);
134 case XENKBD_MT_EV_ORIENT
:
135 input_report_abs(info
->mtouch
, ABS_MT_ORIENTATION
,
136 mtouch
->u
.orientation
);
139 case XENKBD_MT_EV_UP
:
140 input_mt_report_slot_state(info
->mtouch
, MT_TOOL_FINGER
, false);
143 case XENKBD_MT_EV_SYN
:
144 input_mt_sync_frame(info
->mtouch
);
145 input_sync(info
->mtouch
);
150 static void xenkbd_handle_event(struct xenkbd_info
*info
,
151 union xenkbd_in_event
*event
)
153 switch (event
->type
) {
154 case XENKBD_TYPE_MOTION
:
155 xenkbd_handle_motion_event(info
, &event
->motion
);
158 case XENKBD_TYPE_KEY
:
159 xenkbd_handle_key_event(info
, &event
->key
);
162 case XENKBD_TYPE_POS
:
163 xenkbd_handle_position_event(info
, &event
->pos
);
166 case XENKBD_TYPE_MTOUCH
:
167 xenkbd_handle_mt_event(info
, &event
->mtouch
);
172 static irqreturn_t
input_handler(int rq
, void *dev_id
)
174 struct xenkbd_info
*info
= dev_id
;
175 struct xenkbd_page
*page
= info
->page
;
178 prod
= page
->in_prod
;
179 if (prod
== page
->in_cons
)
181 rmb(); /* ensure we see ring contents up to prod */
182 for (cons
= page
->in_cons
; cons
!= prod
; cons
++)
183 xenkbd_handle_event(info
, &XENKBD_IN_RING_REF(page
, cons
));
184 mb(); /* ensure we got ring contents */
185 page
->in_cons
= cons
;
186 notify_remote_via_irq(info
->irq
);
191 static int xenkbd_probe(struct xenbus_device
*dev
,
192 const struct xenbus_device_id
*id
)
195 unsigned int abs
, touch
;
196 struct xenkbd_info
*info
;
197 struct input_dev
*kbd
, *ptr
, *mtouch
;
199 info
= kzalloc(sizeof(*info
), GFP_KERNEL
);
201 xenbus_dev_fatal(dev
, -ENOMEM
, "allocating info structure");
204 dev_set_drvdata(&dev
->dev
, info
);
208 snprintf(info
->phys
, sizeof(info
->phys
), "xenbus/%s", dev
->nodename
);
210 info
->page
= (void *)__get_free_page(GFP_KERNEL
| __GFP_ZERO
);
214 /* Set input abs params to match backend screen res */
215 abs
= xenbus_read_unsigned(dev
->otherend
,
216 XENKBD_FIELD_FEAT_ABS_POINTER
, 0);
217 ptr_size
[KPARAM_X
] = xenbus_read_unsigned(dev
->otherend
,
220 ptr_size
[KPARAM_Y
] = xenbus_read_unsigned(dev
->otherend
,
224 ret
= xenbus_write(XBT_NIL
, dev
->nodename
,
225 XENKBD_FIELD_REQ_ABS_POINTER
, "1");
227 pr_warn("xenkbd: can't request abs-pointer\n");
232 touch
= xenbus_read_unsigned(dev
->nodename
,
233 XENKBD_FIELD_FEAT_MTOUCH
, 0);
235 ret
= xenbus_write(XBT_NIL
, dev
->nodename
,
236 XENKBD_FIELD_REQ_MTOUCH
, "1");
238 pr_warn("xenkbd: can't request multi-touch");
244 kbd
= input_allocate_device();
247 kbd
->name
= "Xen Virtual Keyboard";
248 kbd
->phys
= info
->phys
;
249 kbd
->id
.bustype
= BUS_PCI
;
250 kbd
->id
.vendor
= 0x5853;
251 kbd
->id
.product
= 0xffff;
253 __set_bit(EV_KEY
, kbd
->evbit
);
254 for (i
= KEY_ESC
; i
< KEY_UNKNOWN
; i
++)
255 __set_bit(i
, kbd
->keybit
);
256 for (i
= KEY_OK
; i
< KEY_MAX
; i
++)
257 __set_bit(i
, kbd
->keybit
);
259 ret
= input_register_device(kbd
);
261 input_free_device(kbd
);
262 xenbus_dev_fatal(dev
, ret
, "input_register_device(kbd)");
267 /* pointing device */
268 ptr
= input_allocate_device();
271 ptr
->name
= "Xen Virtual Pointer";
272 ptr
->phys
= info
->phys
;
273 ptr
->id
.bustype
= BUS_PCI
;
274 ptr
->id
.vendor
= 0x5853;
275 ptr
->id
.product
= 0xfffe;
278 __set_bit(EV_ABS
, ptr
->evbit
);
279 input_set_abs_params(ptr
, ABS_X
, 0, ptr_size
[KPARAM_X
], 0, 0);
280 input_set_abs_params(ptr
, ABS_Y
, 0, ptr_size
[KPARAM_Y
], 0, 0);
282 input_set_capability(ptr
, EV_REL
, REL_X
);
283 input_set_capability(ptr
, EV_REL
, REL_Y
);
285 input_set_capability(ptr
, EV_REL
, REL_WHEEL
);
287 __set_bit(EV_KEY
, ptr
->evbit
);
288 for (i
= BTN_LEFT
; i
<= BTN_TASK
; i
++)
289 __set_bit(i
, ptr
->keybit
);
291 ret
= input_register_device(ptr
);
293 input_free_device(ptr
);
294 xenbus_dev_fatal(dev
, ret
, "input_register_device(ptr)");
299 /* multi-touch device */
301 int num_cont
, width
, height
;
303 mtouch
= input_allocate_device();
307 num_cont
= xenbus_read_unsigned(info
->xbdev
->nodename
,
308 XENKBD_FIELD_MT_NUM_CONTACTS
,
310 width
= xenbus_read_unsigned(info
->xbdev
->nodename
,
311 XENKBD_FIELD_MT_WIDTH
,
313 height
= xenbus_read_unsigned(info
->xbdev
->nodename
,
314 XENKBD_FIELD_MT_HEIGHT
,
317 mtouch
->name
= "Xen Virtual Multi-touch";
318 mtouch
->phys
= info
->phys
;
319 mtouch
->id
.bustype
= BUS_PCI
;
320 mtouch
->id
.vendor
= 0x5853;
321 mtouch
->id
.product
= 0xfffd;
323 input_set_abs_params(mtouch
, ABS_MT_TOUCH_MAJOR
,
325 input_set_abs_params(mtouch
, ABS_MT_POSITION_X
,
327 input_set_abs_params(mtouch
, ABS_MT_POSITION_Y
,
330 ret
= input_mt_init_slots(mtouch
, num_cont
, INPUT_MT_DIRECT
);
332 input_free_device(mtouch
);
333 xenbus_dev_fatal(info
->xbdev
, ret
,
334 "input_mt_init_slots");
338 ret
= input_register_device(mtouch
);
340 input_free_device(mtouch
);
341 xenbus_dev_fatal(info
->xbdev
, ret
,
342 "input_register_device(mtouch)");
345 info
->mtouch_cur_contact_id
= -1;
346 info
->mtouch
= mtouch
;
349 ret
= xenkbd_connect_backend(dev
, info
);
357 xenbus_dev_fatal(dev
, ret
, "allocating device memory");
363 static int xenkbd_resume(struct xenbus_device
*dev
)
365 struct xenkbd_info
*info
= dev_get_drvdata(&dev
->dev
);
367 xenkbd_disconnect_backend(info
);
368 memset(info
->page
, 0, PAGE_SIZE
);
369 return xenkbd_connect_backend(dev
, info
);
372 static int xenkbd_remove(struct xenbus_device
*dev
)
374 struct xenkbd_info
*info
= dev_get_drvdata(&dev
->dev
);
376 xenkbd_disconnect_backend(info
);
378 input_unregister_device(info
->kbd
);
380 input_unregister_device(info
->ptr
);
382 input_unregister_device(info
->mtouch
);
383 free_page((unsigned long)info
->page
);
388 static int xenkbd_connect_backend(struct xenbus_device
*dev
,
389 struct xenkbd_info
*info
)
392 struct xenbus_transaction xbt
;
394 ret
= gnttab_grant_foreign_access(dev
->otherend_id
,
395 virt_to_gfn(info
->page
), 0);
400 ret
= xenbus_alloc_evtchn(dev
, &evtchn
);
403 ret
= bind_evtchn_to_irqhandler(evtchn
, input_handler
,
404 0, dev
->devicetype
, info
);
406 xenbus_dev_fatal(dev
, ret
, "bind_evtchn_to_irqhandler");
412 ret
= xenbus_transaction_start(&xbt
);
414 xenbus_dev_fatal(dev
, ret
, "starting transaction");
417 ret
= xenbus_printf(xbt
, dev
->nodename
, XENKBD_FIELD_RING_REF
, "%lu",
418 virt_to_gfn(info
->page
));
421 ret
= xenbus_printf(xbt
, dev
->nodename
, XENKBD_FIELD_RING_GREF
,
425 ret
= xenbus_printf(xbt
, dev
->nodename
, XENKBD_FIELD_EVT_CHANNEL
, "%u",
429 ret
= xenbus_transaction_end(xbt
, 0);
433 xenbus_dev_fatal(dev
, ret
, "completing transaction");
437 xenbus_switch_state(dev
, XenbusStateInitialised
);
441 xenbus_transaction_end(xbt
, 1);
442 xenbus_dev_fatal(dev
, ret
, "writing xenstore");
444 unbind_from_irqhandler(info
->irq
, info
);
447 xenbus_free_evtchn(dev
, evtchn
);
449 gnttab_end_foreign_access(info
->gref
, 0, 0UL);
454 static void xenkbd_disconnect_backend(struct xenkbd_info
*info
)
457 unbind_from_irqhandler(info
->irq
, info
);
460 gnttab_end_foreign_access(info
->gref
, 0, 0UL);
464 static void xenkbd_backend_changed(struct xenbus_device
*dev
,
465 enum xenbus_state backend_state
)
467 switch (backend_state
) {
468 case XenbusStateInitialising
:
469 case XenbusStateInitialised
:
470 case XenbusStateReconfiguring
:
471 case XenbusStateReconfigured
:
472 case XenbusStateUnknown
:
475 case XenbusStateInitWait
:
476 xenbus_switch_state(dev
, XenbusStateConnected
);
479 case XenbusStateConnected
:
481 * Work around xenbus race condition: If backend goes
482 * through InitWait to Connected fast enough, we can
483 * get Connected twice here.
485 if (dev
->state
!= XenbusStateConnected
)
486 xenbus_switch_state(dev
, XenbusStateConnected
);
489 case XenbusStateClosed
:
490 if (dev
->state
== XenbusStateClosed
)
492 /* Missed the backend's CLOSING state -- fallthrough */
493 case XenbusStateClosing
:
494 xenbus_frontend_closed(dev
);
499 static const struct xenbus_device_id xenkbd_ids
[] = {
500 { XENKBD_DRIVER_NAME
},
504 static struct xenbus_driver xenkbd_driver
= {
506 .probe
= xenkbd_probe
,
507 .remove
= xenkbd_remove
,
508 .resume
= xenkbd_resume
,
509 .otherend_changed
= xenkbd_backend_changed
,
512 static int __init
xenkbd_init(void)
517 /* Nothing to do if running in dom0. */
518 if (xen_initial_domain())
521 if (!xen_has_pv_devices())
524 return xenbus_register_frontend(&xenkbd_driver
);
527 static void __exit
xenkbd_cleanup(void)
529 xenbus_unregister_driver(&xenkbd_driver
);
532 module_init(xenkbd_init
);
533 module_exit(xenkbd_cleanup
);
535 MODULE_DESCRIPTION("Xen virtual keyboard/pointer device frontend");
536 MODULE_LICENSE("GPL");
537 MODULE_ALIAS("xen:" XENKBD_DRIVER_NAME
);