19436b8c6SJuan Quintela /* 29436b8c6SJuan Quintela * Virtio input PCI Bindings 39436b8c6SJuan Quintela * 49436b8c6SJuan Quintela * This work is licensed under the terms of the GNU GPL, version 2 or 59436b8c6SJuan Quintela * (at your option) any later version. See the COPYING file in the 69436b8c6SJuan Quintela * top-level directory. 79436b8c6SJuan Quintela */ 89436b8c6SJuan Quintela 99436b8c6SJuan Quintela #include "qemu/osdep.h" 109436b8c6SJuan Quintela 11e1b1f534SAlex Bennée #include "hw/virtio/virtio-pci.h" 12a27bd6c7SMarkus Armbruster #include "hw/qdev-properties.h" 139436b8c6SJuan Quintela #include "hw/virtio/virtio-input.h" 140b8fa32fSMarkus Armbruster #include "qemu/module.h" 15db1015e9SEduardo Habkost #include "qom/object.h" 169436b8c6SJuan Quintela 179436b8c6SJuan Quintela 189436b8c6SJuan Quintela /* 199436b8c6SJuan Quintela * virtio-input-pci: This extends VirtioPCIProxy. 209436b8c6SJuan Quintela */ 218063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(VirtIOInputPCI, VIRTIO_INPUT_PCI) 229436b8c6SJuan Quintela 239436b8c6SJuan Quintela struct VirtIOInputPCI { 249436b8c6SJuan Quintela VirtIOPCIProxy parent_obj; 259436b8c6SJuan Quintela VirtIOInput vdev; 269436b8c6SJuan Quintela }; 279436b8c6SJuan Quintela 289436b8c6SJuan Quintela #define TYPE_VIRTIO_INPUT_HID_PCI "virtio-input-hid-pci" 299436b8c6SJuan Quintela #define TYPE_VIRTIO_KEYBOARD_PCI "virtio-keyboard-pci" 309436b8c6SJuan Quintela #define TYPE_VIRTIO_MOUSE_PCI "virtio-mouse-pci" 319436b8c6SJuan Quintela #define TYPE_VIRTIO_TABLET_PCI "virtio-tablet-pci" 32*4b2321c9SSergio Lopez #define TYPE_VIRTIO_MULTITOUCH_PCI "virtio-multitouch-pci" 338063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(VirtIOInputHIDPCI, VIRTIO_INPUT_HID_PCI) 349436b8c6SJuan Quintela 359436b8c6SJuan Quintela struct VirtIOInputHIDPCI { 369436b8c6SJuan Quintela VirtIOPCIProxy parent_obj; 379436b8c6SJuan Quintela VirtIOInputHID vdev; 389436b8c6SJuan Quintela }; 399436b8c6SJuan Quintela 409436b8c6SJuan Quintela static Property virtio_input_pci_properties[] = { 419436b8c6SJuan Quintela DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, 2), 429436b8c6SJuan Quintela DEFINE_PROP_END_OF_LIST(), 439436b8c6SJuan Quintela }; 449436b8c6SJuan Quintela 459436b8c6SJuan Quintela static void virtio_input_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp) 469436b8c6SJuan Quintela { 479436b8c6SJuan Quintela VirtIOInputPCI *vinput = VIRTIO_INPUT_PCI(vpci_dev); 489436b8c6SJuan Quintela DeviceState *vdev = DEVICE(&vinput->vdev); 499436b8c6SJuan Quintela 50dd56040dSDr. David Alan Gilbert virtio_pci_force_virtio_1(vpci_dev); 5199ba777eSMarkus Armbruster qdev_realize(vdev, BUS(&vpci_dev->bus), errp); 529436b8c6SJuan Quintela } 539436b8c6SJuan Quintela 549436b8c6SJuan Quintela static void virtio_input_pci_class_init(ObjectClass *klass, void *data) 559436b8c6SJuan Quintela { 569436b8c6SJuan Quintela DeviceClass *dc = DEVICE_CLASS(klass); 579436b8c6SJuan Quintela VirtioPCIClass *k = VIRTIO_PCI_CLASS(klass); 589436b8c6SJuan Quintela PCIDeviceClass *pcidev_k = PCI_DEVICE_CLASS(klass); 599436b8c6SJuan Quintela 604f67d30bSMarc-André Lureau device_class_set_props(dc, virtio_input_pci_properties); 619436b8c6SJuan Quintela k->realize = virtio_input_pci_realize; 629436b8c6SJuan Quintela set_bit(DEVICE_CATEGORY_INPUT, dc->categories); 639436b8c6SJuan Quintela 649436b8c6SJuan Quintela pcidev_k->class_id = PCI_CLASS_INPUT_OTHER; 659436b8c6SJuan Quintela } 669436b8c6SJuan Quintela 679436b8c6SJuan Quintela static void virtio_input_hid_kbd_pci_class_init(ObjectClass *klass, void *data) 689436b8c6SJuan Quintela { 699436b8c6SJuan Quintela PCIDeviceClass *pcidev_k = PCI_DEVICE_CLASS(klass); 709436b8c6SJuan Quintela 719436b8c6SJuan Quintela pcidev_k->class_id = PCI_CLASS_INPUT_KEYBOARD; 729436b8c6SJuan Quintela } 739436b8c6SJuan Quintela 749436b8c6SJuan Quintela static void virtio_input_hid_mouse_pci_class_init(ObjectClass *klass, 759436b8c6SJuan Quintela void *data) 769436b8c6SJuan Quintela { 779436b8c6SJuan Quintela PCIDeviceClass *pcidev_k = PCI_DEVICE_CLASS(klass); 789436b8c6SJuan Quintela 799436b8c6SJuan Quintela pcidev_k->class_id = PCI_CLASS_INPUT_MOUSE; 809436b8c6SJuan Quintela } 819436b8c6SJuan Quintela 829436b8c6SJuan Quintela static void virtio_keyboard_initfn(Object *obj) 839436b8c6SJuan Quintela { 849436b8c6SJuan Quintela VirtIOInputHIDPCI *dev = VIRTIO_INPUT_HID_PCI(obj); 859436b8c6SJuan Quintela 869436b8c6SJuan Quintela virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev), 879436b8c6SJuan Quintela TYPE_VIRTIO_KEYBOARD); 889436b8c6SJuan Quintela } 899436b8c6SJuan Quintela 909436b8c6SJuan Quintela static void virtio_mouse_initfn(Object *obj) 919436b8c6SJuan Quintela { 929436b8c6SJuan Quintela VirtIOInputHIDPCI *dev = VIRTIO_INPUT_HID_PCI(obj); 939436b8c6SJuan Quintela 949436b8c6SJuan Quintela virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev), 959436b8c6SJuan Quintela TYPE_VIRTIO_MOUSE); 969436b8c6SJuan Quintela } 979436b8c6SJuan Quintela 989436b8c6SJuan Quintela static void virtio_tablet_initfn(Object *obj) 999436b8c6SJuan Quintela { 1009436b8c6SJuan Quintela VirtIOInputHIDPCI *dev = VIRTIO_INPUT_HID_PCI(obj); 1019436b8c6SJuan Quintela 1029436b8c6SJuan Quintela virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev), 1039436b8c6SJuan Quintela TYPE_VIRTIO_TABLET); 1049436b8c6SJuan Quintela } 1059436b8c6SJuan Quintela 106*4b2321c9SSergio Lopez static void virtio_multitouch_initfn(Object *obj) 107*4b2321c9SSergio Lopez { 108*4b2321c9SSergio Lopez VirtIOInputHIDPCI *dev = VIRTIO_INPUT_HID_PCI(obj); 109*4b2321c9SSergio Lopez 110*4b2321c9SSergio Lopez virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev), 111*4b2321c9SSergio Lopez TYPE_VIRTIO_MULTITOUCH); 112*4b2321c9SSergio Lopez } 113*4b2321c9SSergio Lopez 1149436b8c6SJuan Quintela static const TypeInfo virtio_input_pci_info = { 1159436b8c6SJuan Quintela .name = TYPE_VIRTIO_INPUT_PCI, 1169436b8c6SJuan Quintela .parent = TYPE_VIRTIO_PCI, 1179436b8c6SJuan Quintela .instance_size = sizeof(VirtIOInputPCI), 1189436b8c6SJuan Quintela .class_init = virtio_input_pci_class_init, 1199436b8c6SJuan Quintela .abstract = true, 1209436b8c6SJuan Quintela }; 1219436b8c6SJuan Quintela 1229436b8c6SJuan Quintela static const TypeInfo virtio_input_hid_pci_info = { 1239436b8c6SJuan Quintela .name = TYPE_VIRTIO_INPUT_HID_PCI, 1249436b8c6SJuan Quintela .parent = TYPE_VIRTIO_INPUT_PCI, 1259436b8c6SJuan Quintela .instance_size = sizeof(VirtIOInputHIDPCI), 1269436b8c6SJuan Quintela .abstract = true, 1279436b8c6SJuan Quintela }; 1289436b8c6SJuan Quintela 1299436b8c6SJuan Quintela static const VirtioPCIDeviceTypeInfo virtio_keyboard_pci_info = { 1309436b8c6SJuan Quintela .generic_name = TYPE_VIRTIO_KEYBOARD_PCI, 1319436b8c6SJuan Quintela .parent = TYPE_VIRTIO_INPUT_HID_PCI, 1329436b8c6SJuan Quintela .class_init = virtio_input_hid_kbd_pci_class_init, 1339436b8c6SJuan Quintela .instance_size = sizeof(VirtIOInputHIDPCI), 1349436b8c6SJuan Quintela .instance_init = virtio_keyboard_initfn, 1359436b8c6SJuan Quintela }; 1369436b8c6SJuan Quintela 1379436b8c6SJuan Quintela static const VirtioPCIDeviceTypeInfo virtio_mouse_pci_info = { 1389436b8c6SJuan Quintela .generic_name = TYPE_VIRTIO_MOUSE_PCI, 1399436b8c6SJuan Quintela .parent = TYPE_VIRTIO_INPUT_HID_PCI, 1409436b8c6SJuan Quintela .class_init = virtio_input_hid_mouse_pci_class_init, 1419436b8c6SJuan Quintela .instance_size = sizeof(VirtIOInputHIDPCI), 1429436b8c6SJuan Quintela .instance_init = virtio_mouse_initfn, 1439436b8c6SJuan Quintela }; 1449436b8c6SJuan Quintela 1459436b8c6SJuan Quintela static const VirtioPCIDeviceTypeInfo virtio_tablet_pci_info = { 1469436b8c6SJuan Quintela .generic_name = TYPE_VIRTIO_TABLET_PCI, 1479436b8c6SJuan Quintela .parent = TYPE_VIRTIO_INPUT_HID_PCI, 1489436b8c6SJuan Quintela .instance_size = sizeof(VirtIOInputHIDPCI), 1499436b8c6SJuan Quintela .instance_init = virtio_tablet_initfn, 1509436b8c6SJuan Quintela }; 1519436b8c6SJuan Quintela 152*4b2321c9SSergio Lopez static const VirtioPCIDeviceTypeInfo virtio_multitouch_pci_info = { 153*4b2321c9SSergio Lopez .generic_name = TYPE_VIRTIO_MULTITOUCH_PCI, 154*4b2321c9SSergio Lopez .parent = TYPE_VIRTIO_INPUT_HID_PCI, 155*4b2321c9SSergio Lopez .instance_size = sizeof(VirtIOInputHIDPCI), 156*4b2321c9SSergio Lopez .instance_init = virtio_multitouch_initfn, 157*4b2321c9SSergio Lopez }; 158*4b2321c9SSergio Lopez 1599436b8c6SJuan Quintela static void virtio_pci_input_register(void) 1609436b8c6SJuan Quintela { 1619436b8c6SJuan Quintela /* Base types: */ 1629436b8c6SJuan Quintela type_register_static(&virtio_input_pci_info); 1639436b8c6SJuan Quintela type_register_static(&virtio_input_hid_pci_info); 1649436b8c6SJuan Quintela 1659436b8c6SJuan Quintela /* Implementations: */ 1669436b8c6SJuan Quintela virtio_pci_types_register(&virtio_keyboard_pci_info); 1679436b8c6SJuan Quintela virtio_pci_types_register(&virtio_mouse_pci_info); 1689436b8c6SJuan Quintela virtio_pci_types_register(&virtio_tablet_pci_info); 169*4b2321c9SSergio Lopez virtio_pci_types_register(&virtio_multitouch_pci_info); 1709436b8c6SJuan Quintela } 1719436b8c6SJuan Quintela 1729436b8c6SJuan Quintela type_init(virtio_pci_input_register) 173