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 119436b8c6SJuan Quintela #include "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 */ 21*8063396bSEduardo 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*8063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(VirtIOInputHIDPCI, VIRTIO_INPUT_HID_PCI) 339436b8c6SJuan Quintela 349436b8c6SJuan Quintela struct VirtIOInputHIDPCI { 359436b8c6SJuan Quintela VirtIOPCIProxy parent_obj; 369436b8c6SJuan Quintela VirtIOInputHID vdev; 379436b8c6SJuan Quintela }; 389436b8c6SJuan Quintela 399436b8c6SJuan Quintela static Property virtio_input_pci_properties[] = { 409436b8c6SJuan Quintela DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, 2), 419436b8c6SJuan Quintela DEFINE_PROP_END_OF_LIST(), 429436b8c6SJuan Quintela }; 439436b8c6SJuan Quintela 449436b8c6SJuan Quintela static void virtio_input_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp) 459436b8c6SJuan Quintela { 469436b8c6SJuan Quintela VirtIOInputPCI *vinput = VIRTIO_INPUT_PCI(vpci_dev); 479436b8c6SJuan Quintela DeviceState *vdev = DEVICE(&vinput->vdev); 489436b8c6SJuan Quintela 49dd56040dSDr. David Alan Gilbert virtio_pci_force_virtio_1(vpci_dev); 5099ba777eSMarkus Armbruster qdev_realize(vdev, BUS(&vpci_dev->bus), errp); 519436b8c6SJuan Quintela } 529436b8c6SJuan Quintela 539436b8c6SJuan Quintela static void virtio_input_pci_class_init(ObjectClass *klass, void *data) 549436b8c6SJuan Quintela { 559436b8c6SJuan Quintela DeviceClass *dc = DEVICE_CLASS(klass); 569436b8c6SJuan Quintela VirtioPCIClass *k = VIRTIO_PCI_CLASS(klass); 579436b8c6SJuan Quintela PCIDeviceClass *pcidev_k = PCI_DEVICE_CLASS(klass); 589436b8c6SJuan Quintela 594f67d30bSMarc-André Lureau device_class_set_props(dc, virtio_input_pci_properties); 609436b8c6SJuan Quintela k->realize = virtio_input_pci_realize; 619436b8c6SJuan Quintela set_bit(DEVICE_CATEGORY_INPUT, dc->categories); 629436b8c6SJuan Quintela 639436b8c6SJuan Quintela pcidev_k->class_id = PCI_CLASS_INPUT_OTHER; 649436b8c6SJuan Quintela } 659436b8c6SJuan Quintela 669436b8c6SJuan Quintela static void virtio_input_hid_kbd_pci_class_init(ObjectClass *klass, void *data) 679436b8c6SJuan Quintela { 689436b8c6SJuan Quintela PCIDeviceClass *pcidev_k = PCI_DEVICE_CLASS(klass); 699436b8c6SJuan Quintela 709436b8c6SJuan Quintela pcidev_k->class_id = PCI_CLASS_INPUT_KEYBOARD; 719436b8c6SJuan Quintela } 729436b8c6SJuan Quintela 739436b8c6SJuan Quintela static void virtio_input_hid_mouse_pci_class_init(ObjectClass *klass, 749436b8c6SJuan Quintela void *data) 759436b8c6SJuan Quintela { 769436b8c6SJuan Quintela PCIDeviceClass *pcidev_k = PCI_DEVICE_CLASS(klass); 779436b8c6SJuan Quintela 789436b8c6SJuan Quintela pcidev_k->class_id = PCI_CLASS_INPUT_MOUSE; 799436b8c6SJuan Quintela } 809436b8c6SJuan Quintela 819436b8c6SJuan Quintela static void virtio_keyboard_initfn(Object *obj) 829436b8c6SJuan Quintela { 839436b8c6SJuan Quintela VirtIOInputHIDPCI *dev = VIRTIO_INPUT_HID_PCI(obj); 849436b8c6SJuan Quintela 859436b8c6SJuan Quintela virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev), 869436b8c6SJuan Quintela TYPE_VIRTIO_KEYBOARD); 879436b8c6SJuan Quintela } 889436b8c6SJuan Quintela 899436b8c6SJuan Quintela static void virtio_mouse_initfn(Object *obj) 909436b8c6SJuan Quintela { 919436b8c6SJuan Quintela VirtIOInputHIDPCI *dev = VIRTIO_INPUT_HID_PCI(obj); 929436b8c6SJuan Quintela 939436b8c6SJuan Quintela virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev), 949436b8c6SJuan Quintela TYPE_VIRTIO_MOUSE); 959436b8c6SJuan Quintela } 969436b8c6SJuan Quintela 979436b8c6SJuan Quintela static void virtio_tablet_initfn(Object *obj) 989436b8c6SJuan Quintela { 999436b8c6SJuan Quintela VirtIOInputHIDPCI *dev = VIRTIO_INPUT_HID_PCI(obj); 1009436b8c6SJuan Quintela 1019436b8c6SJuan Quintela virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev), 1029436b8c6SJuan Quintela TYPE_VIRTIO_TABLET); 1039436b8c6SJuan Quintela } 1049436b8c6SJuan Quintela 1059436b8c6SJuan Quintela static const TypeInfo virtio_input_pci_info = { 1069436b8c6SJuan Quintela .name = TYPE_VIRTIO_INPUT_PCI, 1079436b8c6SJuan Quintela .parent = TYPE_VIRTIO_PCI, 1089436b8c6SJuan Quintela .instance_size = sizeof(VirtIOInputPCI), 1099436b8c6SJuan Quintela .class_init = virtio_input_pci_class_init, 1109436b8c6SJuan Quintela .abstract = true, 1119436b8c6SJuan Quintela }; 1129436b8c6SJuan Quintela 1139436b8c6SJuan Quintela static const TypeInfo virtio_input_hid_pci_info = { 1149436b8c6SJuan Quintela .name = TYPE_VIRTIO_INPUT_HID_PCI, 1159436b8c6SJuan Quintela .parent = TYPE_VIRTIO_INPUT_PCI, 1169436b8c6SJuan Quintela .instance_size = sizeof(VirtIOInputHIDPCI), 1179436b8c6SJuan Quintela .abstract = true, 1189436b8c6SJuan Quintela }; 1199436b8c6SJuan Quintela 1209436b8c6SJuan Quintela static const VirtioPCIDeviceTypeInfo virtio_keyboard_pci_info = { 1219436b8c6SJuan Quintela .generic_name = TYPE_VIRTIO_KEYBOARD_PCI, 1229436b8c6SJuan Quintela .parent = TYPE_VIRTIO_INPUT_HID_PCI, 1239436b8c6SJuan Quintela .class_init = virtio_input_hid_kbd_pci_class_init, 1249436b8c6SJuan Quintela .instance_size = sizeof(VirtIOInputHIDPCI), 1259436b8c6SJuan Quintela .instance_init = virtio_keyboard_initfn, 1269436b8c6SJuan Quintela }; 1279436b8c6SJuan Quintela 1289436b8c6SJuan Quintela static const VirtioPCIDeviceTypeInfo virtio_mouse_pci_info = { 1299436b8c6SJuan Quintela .generic_name = TYPE_VIRTIO_MOUSE_PCI, 1309436b8c6SJuan Quintela .parent = TYPE_VIRTIO_INPUT_HID_PCI, 1319436b8c6SJuan Quintela .class_init = virtio_input_hid_mouse_pci_class_init, 1329436b8c6SJuan Quintela .instance_size = sizeof(VirtIOInputHIDPCI), 1339436b8c6SJuan Quintela .instance_init = virtio_mouse_initfn, 1349436b8c6SJuan Quintela }; 1359436b8c6SJuan Quintela 1369436b8c6SJuan Quintela static const VirtioPCIDeviceTypeInfo virtio_tablet_pci_info = { 1379436b8c6SJuan Quintela .generic_name = TYPE_VIRTIO_TABLET_PCI, 1389436b8c6SJuan Quintela .parent = TYPE_VIRTIO_INPUT_HID_PCI, 1399436b8c6SJuan Quintela .instance_size = sizeof(VirtIOInputHIDPCI), 1409436b8c6SJuan Quintela .instance_init = virtio_tablet_initfn, 1419436b8c6SJuan Quintela }; 1429436b8c6SJuan Quintela 1439436b8c6SJuan Quintela static void virtio_pci_input_register(void) 1449436b8c6SJuan Quintela { 1459436b8c6SJuan Quintela /* Base types: */ 1469436b8c6SJuan Quintela type_register_static(&virtio_input_pci_info); 1479436b8c6SJuan Quintela type_register_static(&virtio_input_hid_pci_info); 1489436b8c6SJuan Quintela 1499436b8c6SJuan Quintela /* Implementations: */ 1509436b8c6SJuan Quintela virtio_pci_types_register(&virtio_keyboard_pci_info); 1519436b8c6SJuan Quintela virtio_pci_types_register(&virtio_mouse_pci_info); 1529436b8c6SJuan Quintela virtio_pci_types_register(&virtio_tablet_pci_info); 1539436b8c6SJuan Quintela } 1549436b8c6SJuan Quintela 1559436b8c6SJuan Quintela type_init(virtio_pci_input_register) 156