xref: /qemu/hw/virtio/virtio-input-pci.c (revision 9436b8c62cbae61781f34c5c4be3ec5bc3fa1f49)
1*9436b8c6SJuan Quintela /*
2*9436b8c6SJuan Quintela  * Virtio input PCI Bindings
3*9436b8c6SJuan Quintela  *
4*9436b8c6SJuan Quintela  * This work is licensed under the terms of the GNU GPL, version 2 or
5*9436b8c6SJuan Quintela  * (at your option) any later version.  See the COPYING file in the
6*9436b8c6SJuan Quintela  * top-level directory.
7*9436b8c6SJuan Quintela  */
8*9436b8c6SJuan Quintela 
9*9436b8c6SJuan Quintela #include "qemu/osdep.h"
10*9436b8c6SJuan Quintela 
11*9436b8c6SJuan Quintela #include "virtio-pci.h"
12*9436b8c6SJuan Quintela #include "hw/virtio/virtio-input.h"
13*9436b8c6SJuan Quintela 
14*9436b8c6SJuan Quintela typedef struct VirtIOInputPCI VirtIOInputPCI;
15*9436b8c6SJuan Quintela typedef struct VirtIOInputHIDPCI VirtIOInputHIDPCI;
16*9436b8c6SJuan Quintela 
17*9436b8c6SJuan Quintela /*
18*9436b8c6SJuan Quintela  * virtio-input-pci: This extends VirtioPCIProxy.
19*9436b8c6SJuan Quintela  */
20*9436b8c6SJuan Quintela #define VIRTIO_INPUT_PCI(obj) \
21*9436b8c6SJuan Quintela         OBJECT_CHECK(VirtIOInputPCI, (obj), TYPE_VIRTIO_INPUT_PCI)
22*9436b8c6SJuan Quintela 
23*9436b8c6SJuan Quintela struct VirtIOInputPCI {
24*9436b8c6SJuan Quintela     VirtIOPCIProxy parent_obj;
25*9436b8c6SJuan Quintela     VirtIOInput vdev;
26*9436b8c6SJuan Quintela };
27*9436b8c6SJuan Quintela 
28*9436b8c6SJuan Quintela #define TYPE_VIRTIO_INPUT_HID_PCI "virtio-input-hid-pci"
29*9436b8c6SJuan Quintela #define TYPE_VIRTIO_KEYBOARD_PCI  "virtio-keyboard-pci"
30*9436b8c6SJuan Quintela #define TYPE_VIRTIO_MOUSE_PCI     "virtio-mouse-pci"
31*9436b8c6SJuan Quintela #define TYPE_VIRTIO_TABLET_PCI    "virtio-tablet-pci"
32*9436b8c6SJuan Quintela #define VIRTIO_INPUT_HID_PCI(obj) \
33*9436b8c6SJuan Quintela         OBJECT_CHECK(VirtIOInputHIDPCI, (obj), TYPE_VIRTIO_INPUT_HID_PCI)
34*9436b8c6SJuan Quintela 
35*9436b8c6SJuan Quintela struct VirtIOInputHIDPCI {
36*9436b8c6SJuan Quintela     VirtIOPCIProxy parent_obj;
37*9436b8c6SJuan Quintela     VirtIOInputHID vdev;
38*9436b8c6SJuan Quintela };
39*9436b8c6SJuan Quintela 
40*9436b8c6SJuan Quintela static Property virtio_input_pci_properties[] = {
41*9436b8c6SJuan Quintela     DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, 2),
42*9436b8c6SJuan Quintela     DEFINE_PROP_END_OF_LIST(),
43*9436b8c6SJuan Quintela };
44*9436b8c6SJuan Quintela 
45*9436b8c6SJuan Quintela static void virtio_input_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
46*9436b8c6SJuan Quintela {
47*9436b8c6SJuan Quintela     VirtIOInputPCI *vinput = VIRTIO_INPUT_PCI(vpci_dev);
48*9436b8c6SJuan Quintela     DeviceState *vdev = DEVICE(&vinput->vdev);
49*9436b8c6SJuan Quintela 
50*9436b8c6SJuan Quintela     qdev_set_parent_bus(vdev, BUS(&vpci_dev->bus));
51*9436b8c6SJuan Quintela     virtio_pci_force_virtio_1(vpci_dev);
52*9436b8c6SJuan Quintela     object_property_set_bool(OBJECT(vdev), true, "realized", errp);
53*9436b8c6SJuan Quintela }
54*9436b8c6SJuan Quintela 
55*9436b8c6SJuan Quintela static void virtio_input_pci_class_init(ObjectClass *klass, void *data)
56*9436b8c6SJuan Quintela {
57*9436b8c6SJuan Quintela     DeviceClass *dc = DEVICE_CLASS(klass);
58*9436b8c6SJuan Quintela     VirtioPCIClass *k = VIRTIO_PCI_CLASS(klass);
59*9436b8c6SJuan Quintela     PCIDeviceClass *pcidev_k = PCI_DEVICE_CLASS(klass);
60*9436b8c6SJuan Quintela 
61*9436b8c6SJuan Quintela     dc->props = virtio_input_pci_properties;
62*9436b8c6SJuan Quintela     k->realize = virtio_input_pci_realize;
63*9436b8c6SJuan Quintela     set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
64*9436b8c6SJuan Quintela 
65*9436b8c6SJuan Quintela     pcidev_k->class_id = PCI_CLASS_INPUT_OTHER;
66*9436b8c6SJuan Quintela }
67*9436b8c6SJuan Quintela 
68*9436b8c6SJuan Quintela static void virtio_input_hid_kbd_pci_class_init(ObjectClass *klass, void *data)
69*9436b8c6SJuan Quintela {
70*9436b8c6SJuan Quintela     PCIDeviceClass *pcidev_k = PCI_DEVICE_CLASS(klass);
71*9436b8c6SJuan Quintela 
72*9436b8c6SJuan Quintela     pcidev_k->class_id = PCI_CLASS_INPUT_KEYBOARD;
73*9436b8c6SJuan Quintela }
74*9436b8c6SJuan Quintela 
75*9436b8c6SJuan Quintela static void virtio_input_hid_mouse_pci_class_init(ObjectClass *klass,
76*9436b8c6SJuan Quintela                                                   void *data)
77*9436b8c6SJuan Quintela {
78*9436b8c6SJuan Quintela     PCIDeviceClass *pcidev_k = PCI_DEVICE_CLASS(klass);
79*9436b8c6SJuan Quintela 
80*9436b8c6SJuan Quintela     pcidev_k->class_id = PCI_CLASS_INPUT_MOUSE;
81*9436b8c6SJuan Quintela }
82*9436b8c6SJuan Quintela 
83*9436b8c6SJuan Quintela static void virtio_keyboard_initfn(Object *obj)
84*9436b8c6SJuan Quintela {
85*9436b8c6SJuan Quintela     VirtIOInputHIDPCI *dev = VIRTIO_INPUT_HID_PCI(obj);
86*9436b8c6SJuan Quintela 
87*9436b8c6SJuan Quintela     virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev),
88*9436b8c6SJuan Quintela                                 TYPE_VIRTIO_KEYBOARD);
89*9436b8c6SJuan Quintela }
90*9436b8c6SJuan Quintela 
91*9436b8c6SJuan Quintela static void virtio_mouse_initfn(Object *obj)
92*9436b8c6SJuan Quintela {
93*9436b8c6SJuan Quintela     VirtIOInputHIDPCI *dev = VIRTIO_INPUT_HID_PCI(obj);
94*9436b8c6SJuan Quintela 
95*9436b8c6SJuan Quintela     virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev),
96*9436b8c6SJuan Quintela                                 TYPE_VIRTIO_MOUSE);
97*9436b8c6SJuan Quintela }
98*9436b8c6SJuan Quintela 
99*9436b8c6SJuan Quintela static void virtio_tablet_initfn(Object *obj)
100*9436b8c6SJuan Quintela {
101*9436b8c6SJuan Quintela     VirtIOInputHIDPCI *dev = VIRTIO_INPUT_HID_PCI(obj);
102*9436b8c6SJuan Quintela 
103*9436b8c6SJuan Quintela     virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev),
104*9436b8c6SJuan Quintela                                 TYPE_VIRTIO_TABLET);
105*9436b8c6SJuan Quintela }
106*9436b8c6SJuan Quintela 
107*9436b8c6SJuan Quintela static const TypeInfo virtio_input_pci_info = {
108*9436b8c6SJuan Quintela     .name          = TYPE_VIRTIO_INPUT_PCI,
109*9436b8c6SJuan Quintela     .parent        = TYPE_VIRTIO_PCI,
110*9436b8c6SJuan Quintela     .instance_size = sizeof(VirtIOInputPCI),
111*9436b8c6SJuan Quintela     .class_init    = virtio_input_pci_class_init,
112*9436b8c6SJuan Quintela     .abstract      = true,
113*9436b8c6SJuan Quintela };
114*9436b8c6SJuan Quintela 
115*9436b8c6SJuan Quintela static const TypeInfo virtio_input_hid_pci_info = {
116*9436b8c6SJuan Quintela     .name          = TYPE_VIRTIO_INPUT_HID_PCI,
117*9436b8c6SJuan Quintela     .parent        = TYPE_VIRTIO_INPUT_PCI,
118*9436b8c6SJuan Quintela     .instance_size = sizeof(VirtIOInputHIDPCI),
119*9436b8c6SJuan Quintela     .abstract      = true,
120*9436b8c6SJuan Quintela };
121*9436b8c6SJuan Quintela 
122*9436b8c6SJuan Quintela static const VirtioPCIDeviceTypeInfo virtio_keyboard_pci_info = {
123*9436b8c6SJuan Quintela     .generic_name  = TYPE_VIRTIO_KEYBOARD_PCI,
124*9436b8c6SJuan Quintela     .parent        = TYPE_VIRTIO_INPUT_HID_PCI,
125*9436b8c6SJuan Quintela     .class_init    = virtio_input_hid_kbd_pci_class_init,
126*9436b8c6SJuan Quintela     .instance_size = sizeof(VirtIOInputHIDPCI),
127*9436b8c6SJuan Quintela     .instance_init = virtio_keyboard_initfn,
128*9436b8c6SJuan Quintela };
129*9436b8c6SJuan Quintela 
130*9436b8c6SJuan Quintela static const VirtioPCIDeviceTypeInfo virtio_mouse_pci_info = {
131*9436b8c6SJuan Quintela     .generic_name  = TYPE_VIRTIO_MOUSE_PCI,
132*9436b8c6SJuan Quintela     .parent        = TYPE_VIRTIO_INPUT_HID_PCI,
133*9436b8c6SJuan Quintela     .class_init    = virtio_input_hid_mouse_pci_class_init,
134*9436b8c6SJuan Quintela     .instance_size = sizeof(VirtIOInputHIDPCI),
135*9436b8c6SJuan Quintela     .instance_init = virtio_mouse_initfn,
136*9436b8c6SJuan Quintela };
137*9436b8c6SJuan Quintela 
138*9436b8c6SJuan Quintela static const VirtioPCIDeviceTypeInfo virtio_tablet_pci_info = {
139*9436b8c6SJuan Quintela     .generic_name  = TYPE_VIRTIO_TABLET_PCI,
140*9436b8c6SJuan Quintela     .parent        = TYPE_VIRTIO_INPUT_HID_PCI,
141*9436b8c6SJuan Quintela     .instance_size = sizeof(VirtIOInputHIDPCI),
142*9436b8c6SJuan Quintela     .instance_init = virtio_tablet_initfn,
143*9436b8c6SJuan Quintela };
144*9436b8c6SJuan Quintela 
145*9436b8c6SJuan Quintela static void virtio_pci_input_register(void)
146*9436b8c6SJuan Quintela {
147*9436b8c6SJuan Quintela     /* Base types: */
148*9436b8c6SJuan Quintela     type_register_static(&virtio_input_pci_info);
149*9436b8c6SJuan Quintela     type_register_static(&virtio_input_hid_pci_info);
150*9436b8c6SJuan Quintela 
151*9436b8c6SJuan Quintela     /* Implementations: */
152*9436b8c6SJuan Quintela     virtio_pci_types_register(&virtio_keyboard_pci_info);
153*9436b8c6SJuan Quintela     virtio_pci_types_register(&virtio_mouse_pci_info);
154*9436b8c6SJuan Quintela     virtio_pci_types_register(&virtio_tablet_pci_info);
155*9436b8c6SJuan Quintela }
156*9436b8c6SJuan Quintela 
157*9436b8c6SJuan Quintela type_init(virtio_pci_input_register)
158