xref: /openbmc/qemu/include/hw/virtio/virtio-input.h (revision 5767815218efd3cbfd409505ed824d5f356044ae)
12a6a4076SMarkus Armbruster #ifndef QEMU_VIRTIO_INPUT_H
22a6a4076SMarkus Armbruster #define QEMU_VIRTIO_INPUT_H
3f73ddbadSGerd Hoffmann 
4*bad38726SLeo Yan #include "hw/virtio/vhost-user.h"
5*bad38726SLeo Yan #include "hw/virtio/vhost-user-base.h"
6f73ddbadSGerd Hoffmann #include "ui/input.h"
79c4d05b7SMarc-André Lureau #include "sysemu/vhost-user-backend.h"
8f73ddbadSGerd Hoffmann 
9f73ddbadSGerd Hoffmann /* ----------------------------------------------------------------- */
10f73ddbadSGerd Hoffmann /* virtio input protocol                                             */
11f73ddbadSGerd Hoffmann 
12f73ddbadSGerd Hoffmann #include "standard-headers/linux/virtio_ids.h"
13f73ddbadSGerd Hoffmann #include "standard-headers/linux/virtio_input.h"
14db1015e9SEduardo Habkost #include "qom/object.h"
15f73ddbadSGerd Hoffmann 
16f73ddbadSGerd Hoffmann typedef struct virtio_input_absinfo virtio_input_absinfo;
17f73ddbadSGerd Hoffmann typedef struct virtio_input_config virtio_input_config;
18f73ddbadSGerd Hoffmann typedef struct virtio_input_event virtio_input_event;
19f73ddbadSGerd Hoffmann 
20f73ddbadSGerd Hoffmann /* ----------------------------------------------------------------- */
21f73ddbadSGerd Hoffmann /* qemu internals                                                    */
22f73ddbadSGerd Hoffmann 
23f73ddbadSGerd Hoffmann #define TYPE_VIRTIO_INPUT "virtio-input-device"
24c821774aSEduardo Habkost OBJECT_DECLARE_TYPE(VirtIOInput, VirtIOInputClass,
2530b5707cSEduardo Habkost                     VIRTIO_INPUT)
26f73ddbadSGerd Hoffmann #define VIRTIO_INPUT_GET_PARENT_CLASS(obj) \
27f73ddbadSGerd Hoffmann         OBJECT_GET_PARENT_CLASS(obj, TYPE_VIRTIO_INPUT)
28f73ddbadSGerd Hoffmann 
29e63d114bSGerd Hoffmann #define TYPE_VIRTIO_INPUT_HID  "virtio-input-hid-device"
30e63d114bSGerd Hoffmann #define TYPE_VIRTIO_KEYBOARD   "virtio-keyboard-device"
31e63d114bSGerd Hoffmann #define TYPE_VIRTIO_MOUSE      "virtio-mouse-device"
32e63d114bSGerd Hoffmann #define TYPE_VIRTIO_TABLET     "virtio-tablet-device"
338e9ebd75SSergio Lopez #define TYPE_VIRTIO_MULTITOUCH "virtio-multitouch-device"
3455a1d80aSGerd Hoffmann 
358063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(VirtIOInputHID, VIRTIO_INPUT_HID)
3655a1d80aSGerd Hoffmann #define VIRTIO_INPUT_HID_GET_PARENT_CLASS(obj) \
3755a1d80aSGerd Hoffmann         OBJECT_GET_PARENT_CLASS(obj, TYPE_VIRTIO_INPUT_HID)
3855a1d80aSGerd Hoffmann 
39006a5edeSGerd Hoffmann #define TYPE_VIRTIO_INPUT_HOST   "virtio-input-host-device"
408063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(VirtIOInputHost, VIRTIO_INPUT_HOST)
41006a5edeSGerd Hoffmann #define VIRTIO_INPUT_HOST_GET_PARENT_CLASS(obj) \
42006a5edeSGerd Hoffmann         OBJECT_GET_PARENT_CLASS(obj, TYPE_VIRTIO_INPUT_HOST)
43006a5edeSGerd Hoffmann 
449c4d05b7SMarc-André Lureau #define TYPE_VHOST_USER_INPUT   "vhost-user-input"
458063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(VHostUserInput, VHOST_USER_INPUT)
469c4d05b7SMarc-André Lureau #define VHOST_USER_INPUT_GET_PARENT_CLASS(obj)             \
479c4d05b7SMarc-André Lureau     OBJECT_GET_PARENT_CLASS(obj, TYPE_VHOST_USER_INPUT)
489c4d05b7SMarc-André Lureau 
49f73ddbadSGerd Hoffmann typedef struct VirtIOInputConfig VirtIOInputConfig;
50f73ddbadSGerd Hoffmann 
51f73ddbadSGerd Hoffmann struct VirtIOInputConfig {
52f73ddbadSGerd Hoffmann     virtio_input_config               config;
53f73ddbadSGerd Hoffmann     QTAILQ_ENTRY(VirtIOInputConfig)   node;
54f73ddbadSGerd Hoffmann };
55f73ddbadSGerd Hoffmann 
56f73ddbadSGerd Hoffmann struct VirtIOInput {
57f73ddbadSGerd Hoffmann     VirtIODevice                      parent_obj;
58f73ddbadSGerd Hoffmann     uint8_t                           cfg_select;
59f73ddbadSGerd Hoffmann     uint8_t                           cfg_subsel;
60f73ddbadSGerd Hoffmann     uint32_t                          cfg_size;
61f73ddbadSGerd Hoffmann     QTAILQ_HEAD(, VirtIOInputConfig)  cfg_list;
62f73ddbadSGerd Hoffmann     VirtQueue                         *evt, *sts;
636f2b9a5bSGerd Hoffmann     char                              *serial;
64f73ddbadSGerd Hoffmann 
6557094547SLadi Prosek     struct {
6657094547SLadi Prosek         virtio_input_event event;
6757094547SLadi Prosek         VirtQueueElement *elem;
6857094547SLadi Prosek     }                                 *queue;
69f73ddbadSGerd Hoffmann     uint32_t                          qindex, qsize;
70f73ddbadSGerd Hoffmann 
71f73ddbadSGerd Hoffmann     bool                              active;
72f73ddbadSGerd Hoffmann };
73f73ddbadSGerd Hoffmann 
74f73ddbadSGerd Hoffmann struct VirtIOInputClass {
75f73ddbadSGerd Hoffmann     /*< private >*/
76f73ddbadSGerd Hoffmann     VirtioDeviceClass parent;
77f73ddbadSGerd Hoffmann     /*< public >*/
78f73ddbadSGerd Hoffmann 
79f73ddbadSGerd Hoffmann     DeviceRealize realize;
80f73ddbadSGerd Hoffmann     DeviceUnrealize unrealize;
81f73ddbadSGerd Hoffmann     void (*change_active)(VirtIOInput *vinput);
82f73ddbadSGerd Hoffmann     void (*handle_status)(VirtIOInput *vinput, virtio_input_event *event);
83f73ddbadSGerd Hoffmann };
84f73ddbadSGerd Hoffmann 
8555a1d80aSGerd Hoffmann struct VirtIOInputHID {
8655a1d80aSGerd Hoffmann     VirtIOInput                       parent_obj;
875cce1733SGerd Hoffmann     char                              *display;
885cce1733SGerd Hoffmann     uint32_t                          head;
89b1be65f6SPhilippe Mathieu-Daudé     const QemuInputHandler            *handler;
9055a1d80aSGerd Hoffmann     QemuInputHandlerState             *hs;
9155a1d80aSGerd Hoffmann     int                               ledstate;
92f4924974SGerd Hoffmann     bool                              wheel_axis;
9355a1d80aSGerd Hoffmann };
9455a1d80aSGerd Hoffmann 
95006a5edeSGerd Hoffmann struct VirtIOInputHost {
96006a5edeSGerd Hoffmann     VirtIOInput                       parent_obj;
97006a5edeSGerd Hoffmann     char                              *evdev;
98006a5edeSGerd Hoffmann     int                               fd;
99006a5edeSGerd Hoffmann };
100006a5edeSGerd Hoffmann 
1019c4d05b7SMarc-André Lureau struct VHostUserInput {
102*bad38726SLeo Yan     VHostUserBase parent_obj;
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