xref: /qemu/include/hw/virtio/virtio-input.h (revision b1be65f6436f53618408d9c6fc6959054f5afed6)
12a6a4076SMarkus Armbruster #ifndef QEMU_VIRTIO_INPUT_H
22a6a4076SMarkus Armbruster #define QEMU_VIRTIO_INPUT_H
3f73ddbadSGerd Hoffmann 
4f73ddbadSGerd Hoffmann #include "ui/input.h"
59c4d05b7SMarc-André Lureau #include "sysemu/vhost-user-backend.h"
6f73ddbadSGerd Hoffmann 
7f73ddbadSGerd Hoffmann /* ----------------------------------------------------------------- */
8f73ddbadSGerd Hoffmann /* virtio input protocol                                             */
9f73ddbadSGerd Hoffmann 
10f73ddbadSGerd Hoffmann #include "standard-headers/linux/virtio_ids.h"
11f73ddbadSGerd Hoffmann #include "standard-headers/linux/virtio_input.h"
12db1015e9SEduardo Habkost #include "qom/object.h"
13f73ddbadSGerd Hoffmann 
14f73ddbadSGerd Hoffmann typedef struct virtio_input_absinfo virtio_input_absinfo;
15f73ddbadSGerd Hoffmann typedef struct virtio_input_config virtio_input_config;
16f73ddbadSGerd Hoffmann typedef struct virtio_input_event virtio_input_event;
17f73ddbadSGerd Hoffmann 
18f73ddbadSGerd Hoffmann /* ----------------------------------------------------------------- */
19f73ddbadSGerd Hoffmann /* qemu internals                                                    */
20f73ddbadSGerd Hoffmann 
21f73ddbadSGerd Hoffmann #define TYPE_VIRTIO_INPUT "virtio-input-device"
22c821774aSEduardo Habkost OBJECT_DECLARE_TYPE(VirtIOInput, VirtIOInputClass,
2330b5707cSEduardo Habkost                     VIRTIO_INPUT)
24f73ddbadSGerd Hoffmann #define VIRTIO_INPUT_GET_PARENT_CLASS(obj) \
25f73ddbadSGerd Hoffmann         OBJECT_GET_PARENT_CLASS(obj, TYPE_VIRTIO_INPUT)
26f73ddbadSGerd Hoffmann 
27e63d114bSGerd Hoffmann #define TYPE_VIRTIO_INPUT_HID  "virtio-input-hid-device"
28e63d114bSGerd Hoffmann #define TYPE_VIRTIO_KEYBOARD   "virtio-keyboard-device"
29e63d114bSGerd Hoffmann #define TYPE_VIRTIO_MOUSE      "virtio-mouse-device"
30e63d114bSGerd Hoffmann #define TYPE_VIRTIO_TABLET     "virtio-tablet-device"
318e9ebd75SSergio Lopez #define TYPE_VIRTIO_MULTITOUCH "virtio-multitouch-device"
3255a1d80aSGerd Hoffmann 
338063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(VirtIOInputHID, VIRTIO_INPUT_HID)
3455a1d80aSGerd Hoffmann #define VIRTIO_INPUT_HID_GET_PARENT_CLASS(obj) \
3555a1d80aSGerd Hoffmann         OBJECT_GET_PARENT_CLASS(obj, TYPE_VIRTIO_INPUT_HID)
3655a1d80aSGerd Hoffmann 
37006a5edeSGerd Hoffmann #define TYPE_VIRTIO_INPUT_HOST   "virtio-input-host-device"
388063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(VirtIOInputHost, VIRTIO_INPUT_HOST)
39006a5edeSGerd Hoffmann #define VIRTIO_INPUT_HOST_GET_PARENT_CLASS(obj) \
40006a5edeSGerd Hoffmann         OBJECT_GET_PARENT_CLASS(obj, TYPE_VIRTIO_INPUT_HOST)
41006a5edeSGerd Hoffmann 
429c4d05b7SMarc-André Lureau #define TYPE_VHOST_USER_INPUT   "vhost-user-input"
438063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(VHostUserInput, VHOST_USER_INPUT)
449c4d05b7SMarc-André Lureau #define VHOST_USER_INPUT_GET_PARENT_CLASS(obj)             \
459c4d05b7SMarc-André Lureau     OBJECT_GET_PARENT_CLASS(obj, TYPE_VHOST_USER_INPUT)
469c4d05b7SMarc-André Lureau 
47f73ddbadSGerd Hoffmann typedef struct VirtIOInputConfig VirtIOInputConfig;
48f73ddbadSGerd Hoffmann 
49f73ddbadSGerd Hoffmann struct VirtIOInputConfig {
50f73ddbadSGerd Hoffmann     virtio_input_config               config;
51f73ddbadSGerd Hoffmann     QTAILQ_ENTRY(VirtIOInputConfig)   node;
52f73ddbadSGerd Hoffmann };
53f73ddbadSGerd Hoffmann 
54f73ddbadSGerd Hoffmann struct VirtIOInput {
55f73ddbadSGerd Hoffmann     VirtIODevice                      parent_obj;
56f73ddbadSGerd Hoffmann     uint8_t                           cfg_select;
57f73ddbadSGerd Hoffmann     uint8_t                           cfg_subsel;
58f73ddbadSGerd Hoffmann     uint32_t                          cfg_size;
59f73ddbadSGerd Hoffmann     QTAILQ_HEAD(, VirtIOInputConfig)  cfg_list;
60f73ddbadSGerd Hoffmann     VirtQueue                         *evt, *sts;
616f2b9a5bSGerd Hoffmann     char                              *serial;
62f73ddbadSGerd Hoffmann 
6357094547SLadi Prosek     struct {
6457094547SLadi Prosek         virtio_input_event event;
6557094547SLadi Prosek         VirtQueueElement *elem;
6657094547SLadi Prosek     }                                 *queue;
67f73ddbadSGerd Hoffmann     uint32_t                          qindex, qsize;
68f73ddbadSGerd Hoffmann 
69f73ddbadSGerd Hoffmann     bool                              active;
70f73ddbadSGerd Hoffmann };
71f73ddbadSGerd Hoffmann 
72f73ddbadSGerd Hoffmann struct VirtIOInputClass {
73f73ddbadSGerd Hoffmann     /*< private >*/
74f73ddbadSGerd Hoffmann     VirtioDeviceClass parent;
75f73ddbadSGerd Hoffmann     /*< public >*/
76f73ddbadSGerd Hoffmann 
77f73ddbadSGerd Hoffmann     DeviceRealize realize;
78f73ddbadSGerd Hoffmann     DeviceUnrealize unrealize;
79f73ddbadSGerd Hoffmann     void (*change_active)(VirtIOInput *vinput);
80f73ddbadSGerd Hoffmann     void (*handle_status)(VirtIOInput *vinput, virtio_input_event *event);
81f73ddbadSGerd Hoffmann };
82f73ddbadSGerd Hoffmann 
8355a1d80aSGerd Hoffmann struct VirtIOInputHID {
8455a1d80aSGerd Hoffmann     VirtIOInput                       parent_obj;
855cce1733SGerd Hoffmann     char                              *display;
865cce1733SGerd Hoffmann     uint32_t                          head;
87*b1be65f6SPhilippe Mathieu-Daudé     const QemuInputHandler            *handler;
8855a1d80aSGerd Hoffmann     QemuInputHandlerState             *hs;
8955a1d80aSGerd Hoffmann     int                               ledstate;
90f4924974SGerd Hoffmann     bool                              wheel_axis;
9155a1d80aSGerd Hoffmann };
9255a1d80aSGerd Hoffmann 
93006a5edeSGerd Hoffmann struct VirtIOInputHost {
94006a5edeSGerd Hoffmann     VirtIOInput                       parent_obj;
95006a5edeSGerd Hoffmann     char                              *evdev;
96006a5edeSGerd Hoffmann     int                               fd;
97006a5edeSGerd Hoffmann };
98006a5edeSGerd Hoffmann 
999c4d05b7SMarc-André Lureau struct VHostUserInput {
1009c4d05b7SMarc-André Lureau     VirtIOInput                       parent_obj;
1019c4d05b7SMarc-André Lureau 
1029c4d05b7SMarc-André Lureau     VhostUserBackend                  *vhost;
1039c4d05b7SMarc-André Lureau };
1049c4d05b7SMarc-André Lureau 
105f73ddbadSGerd Hoffmann void virtio_input_send(VirtIOInput *vinput, virtio_input_event *event);
106f73ddbadSGerd Hoffmann void virtio_input_init_config(VirtIOInput *vinput,
107f73ddbadSGerd Hoffmann                               virtio_input_config *config);
108b065e275SLadi Prosek virtio_input_config *virtio_input_find_config(VirtIOInput *vinput,
109b065e275SLadi Prosek                                               uint8_t select,
110b065e275SLadi Prosek                                               uint8_t subsel);
111f73ddbadSGerd Hoffmann void virtio_input_add_config(VirtIOInput *vinput,
112f73ddbadSGerd Hoffmann                              virtio_input_config *config);
113f73ddbadSGerd Hoffmann void virtio_input_idstr_config(VirtIOInput *vinput,
114f73ddbadSGerd Hoffmann                                uint8_t select, const char *string);
115f73ddbadSGerd Hoffmann 
1162a6a4076SMarkus Armbruster #endif /* QEMU_VIRTIO_INPUT_H */
117