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" 12*a27bd6c7SMarkus Armbruster #include "hw/qdev-properties.h" 139436b8c6SJuan Quintela #include "hw/virtio/virtio-input.h" 140b8fa32fSMarkus Armbruster #include "qemu/module.h" 159436b8c6SJuan Quintela 169436b8c6SJuan Quintela typedef struct VirtIOInputPCI VirtIOInputPCI; 179436b8c6SJuan Quintela typedef struct VirtIOInputHIDPCI VirtIOInputHIDPCI; 189436b8c6SJuan Quintela 199436b8c6SJuan Quintela /* 209436b8c6SJuan Quintela * virtio-input-pci: This extends VirtioPCIProxy. 219436b8c6SJuan Quintela */ 229436b8c6SJuan Quintela #define VIRTIO_INPUT_PCI(obj) \ 239436b8c6SJuan Quintela OBJECT_CHECK(VirtIOInputPCI, (obj), TYPE_VIRTIO_INPUT_PCI) 249436b8c6SJuan Quintela 259436b8c6SJuan Quintela struct VirtIOInputPCI { 269436b8c6SJuan Quintela VirtIOPCIProxy parent_obj; 279436b8c6SJuan Quintela VirtIOInput vdev; 289436b8c6SJuan Quintela }; 299436b8c6SJuan Quintela 309436b8c6SJuan Quintela #define TYPE_VIRTIO_INPUT_HID_PCI "virtio-input-hid-pci" 319436b8c6SJuan Quintela #define TYPE_VIRTIO_KEYBOARD_PCI "virtio-keyboard-pci" 329436b8c6SJuan Quintela #define TYPE_VIRTIO_MOUSE_PCI "virtio-mouse-pci" 339436b8c6SJuan Quintela #define TYPE_VIRTIO_TABLET_PCI "virtio-tablet-pci" 349436b8c6SJuan Quintela #define VIRTIO_INPUT_HID_PCI(obj) \ 359436b8c6SJuan Quintela OBJECT_CHECK(VirtIOInputHIDPCI, (obj), TYPE_VIRTIO_INPUT_HID_PCI) 369436b8c6SJuan Quintela 379436b8c6SJuan Quintela struct VirtIOInputHIDPCI { 389436b8c6SJuan Quintela VirtIOPCIProxy parent_obj; 399436b8c6SJuan Quintela VirtIOInputHID vdev; 409436b8c6SJuan Quintela }; 419436b8c6SJuan Quintela 429436b8c6SJuan Quintela static Property virtio_input_pci_properties[] = { 439436b8c6SJuan Quintela DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, 2), 449436b8c6SJuan Quintela DEFINE_PROP_END_OF_LIST(), 459436b8c6SJuan Quintela }; 469436b8c6SJuan Quintela 479436b8c6SJuan Quintela static void virtio_input_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp) 489436b8c6SJuan Quintela { 499436b8c6SJuan Quintela VirtIOInputPCI *vinput = VIRTIO_INPUT_PCI(vpci_dev); 509436b8c6SJuan Quintela DeviceState *vdev = DEVICE(&vinput->vdev); 519436b8c6SJuan Quintela 529436b8c6SJuan Quintela qdev_set_parent_bus(vdev, BUS(&vpci_dev->bus)); 53dd56040dSDr. David Alan Gilbert virtio_pci_force_virtio_1(vpci_dev); 549436b8c6SJuan Quintela object_property_set_bool(OBJECT(vdev), true, "realized", errp); 559436b8c6SJuan Quintela } 569436b8c6SJuan Quintela 579436b8c6SJuan Quintela static void virtio_input_pci_class_init(ObjectClass *klass, void *data) 589436b8c6SJuan Quintela { 599436b8c6SJuan Quintela DeviceClass *dc = DEVICE_CLASS(klass); 609436b8c6SJuan Quintela VirtioPCIClass *k = VIRTIO_PCI_CLASS(klass); 619436b8c6SJuan Quintela PCIDeviceClass *pcidev_k = PCI_DEVICE_CLASS(klass); 629436b8c6SJuan Quintela 639436b8c6SJuan Quintela dc->props = virtio_input_pci_properties; 649436b8c6SJuan Quintela k->realize = virtio_input_pci_realize; 659436b8c6SJuan Quintela set_bit(DEVICE_CATEGORY_INPUT, dc->categories); 669436b8c6SJuan Quintela 679436b8c6SJuan Quintela pcidev_k->class_id = PCI_CLASS_INPUT_OTHER; 689436b8c6SJuan Quintela } 699436b8c6SJuan Quintela 709436b8c6SJuan Quintela static void virtio_input_hid_kbd_pci_class_init(ObjectClass *klass, void *data) 719436b8c6SJuan Quintela { 729436b8c6SJuan Quintela PCIDeviceClass *pcidev_k = PCI_DEVICE_CLASS(klass); 739436b8c6SJuan Quintela 749436b8c6SJuan Quintela pcidev_k->class_id = PCI_CLASS_INPUT_KEYBOARD; 759436b8c6SJuan Quintela } 769436b8c6SJuan Quintela 779436b8c6SJuan Quintela static void virtio_input_hid_mouse_pci_class_init(ObjectClass *klass, 789436b8c6SJuan Quintela void *data) 799436b8c6SJuan Quintela { 809436b8c6SJuan Quintela PCIDeviceClass *pcidev_k = PCI_DEVICE_CLASS(klass); 819436b8c6SJuan Quintela 829436b8c6SJuan Quintela pcidev_k->class_id = PCI_CLASS_INPUT_MOUSE; 839436b8c6SJuan Quintela } 849436b8c6SJuan Quintela 859436b8c6SJuan Quintela static void virtio_keyboard_initfn(Object *obj) 869436b8c6SJuan Quintela { 879436b8c6SJuan Quintela VirtIOInputHIDPCI *dev = VIRTIO_INPUT_HID_PCI(obj); 889436b8c6SJuan Quintela 899436b8c6SJuan Quintela virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev), 909436b8c6SJuan Quintela TYPE_VIRTIO_KEYBOARD); 919436b8c6SJuan Quintela } 929436b8c6SJuan Quintela 939436b8c6SJuan Quintela static void virtio_mouse_initfn(Object *obj) 949436b8c6SJuan Quintela { 959436b8c6SJuan Quintela VirtIOInputHIDPCI *dev = VIRTIO_INPUT_HID_PCI(obj); 969436b8c6SJuan Quintela 979436b8c6SJuan Quintela virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev), 989436b8c6SJuan Quintela TYPE_VIRTIO_MOUSE); 999436b8c6SJuan Quintela } 1009436b8c6SJuan Quintela 1019436b8c6SJuan Quintela static void virtio_tablet_initfn(Object *obj) 1029436b8c6SJuan Quintela { 1039436b8c6SJuan Quintela VirtIOInputHIDPCI *dev = VIRTIO_INPUT_HID_PCI(obj); 1049436b8c6SJuan Quintela 1059436b8c6SJuan Quintela virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev), 1069436b8c6SJuan Quintela TYPE_VIRTIO_TABLET); 1079436b8c6SJuan Quintela } 1089436b8c6SJuan Quintela 1099436b8c6SJuan Quintela static const TypeInfo virtio_input_pci_info = { 1109436b8c6SJuan Quintela .name = TYPE_VIRTIO_INPUT_PCI, 1119436b8c6SJuan Quintela .parent = TYPE_VIRTIO_PCI, 1129436b8c6SJuan Quintela .instance_size = sizeof(VirtIOInputPCI), 1139436b8c6SJuan Quintela .class_init = virtio_input_pci_class_init, 1149436b8c6SJuan Quintela .abstract = true, 1159436b8c6SJuan Quintela }; 1169436b8c6SJuan Quintela 1179436b8c6SJuan Quintela static const TypeInfo virtio_input_hid_pci_info = { 1189436b8c6SJuan Quintela .name = TYPE_VIRTIO_INPUT_HID_PCI, 1199436b8c6SJuan Quintela .parent = TYPE_VIRTIO_INPUT_PCI, 1209436b8c6SJuan Quintela .instance_size = sizeof(VirtIOInputHIDPCI), 1219436b8c6SJuan Quintela .abstract = true, 1229436b8c6SJuan Quintela }; 1239436b8c6SJuan Quintela 1249436b8c6SJuan Quintela static const VirtioPCIDeviceTypeInfo virtio_keyboard_pci_info = { 1259436b8c6SJuan Quintela .generic_name = TYPE_VIRTIO_KEYBOARD_PCI, 1269436b8c6SJuan Quintela .parent = TYPE_VIRTIO_INPUT_HID_PCI, 1279436b8c6SJuan Quintela .class_init = virtio_input_hid_kbd_pci_class_init, 1289436b8c6SJuan Quintela .instance_size = sizeof(VirtIOInputHIDPCI), 1299436b8c6SJuan Quintela .instance_init = virtio_keyboard_initfn, 1309436b8c6SJuan Quintela }; 1319436b8c6SJuan Quintela 1329436b8c6SJuan Quintela static const VirtioPCIDeviceTypeInfo virtio_mouse_pci_info = { 1339436b8c6SJuan Quintela .generic_name = TYPE_VIRTIO_MOUSE_PCI, 1349436b8c6SJuan Quintela .parent = TYPE_VIRTIO_INPUT_HID_PCI, 1359436b8c6SJuan Quintela .class_init = virtio_input_hid_mouse_pci_class_init, 1369436b8c6SJuan Quintela .instance_size = sizeof(VirtIOInputHIDPCI), 1379436b8c6SJuan Quintela .instance_init = virtio_mouse_initfn, 1389436b8c6SJuan Quintela }; 1399436b8c6SJuan Quintela 1409436b8c6SJuan Quintela static const VirtioPCIDeviceTypeInfo virtio_tablet_pci_info = { 1419436b8c6SJuan Quintela .generic_name = TYPE_VIRTIO_TABLET_PCI, 1429436b8c6SJuan Quintela .parent = TYPE_VIRTIO_INPUT_HID_PCI, 1439436b8c6SJuan Quintela .instance_size = sizeof(VirtIOInputHIDPCI), 1449436b8c6SJuan Quintela .instance_init = virtio_tablet_initfn, 1459436b8c6SJuan Quintela }; 1469436b8c6SJuan Quintela 1479436b8c6SJuan Quintela static void virtio_pci_input_register(void) 1489436b8c6SJuan Quintela { 1499436b8c6SJuan Quintela /* Base types: */ 1509436b8c6SJuan Quintela type_register_static(&virtio_input_pci_info); 1519436b8c6SJuan Quintela type_register_static(&virtio_input_hid_pci_info); 1529436b8c6SJuan Quintela 1539436b8c6SJuan Quintela /* Implementations: */ 1549436b8c6SJuan Quintela virtio_pci_types_register(&virtio_keyboard_pci_info); 1559436b8c6SJuan Quintela virtio_pci_types_register(&virtio_mouse_pci_info); 1569436b8c6SJuan Quintela virtio_pci_types_register(&virtio_tablet_pci_info); 1579436b8c6SJuan Quintela } 1589436b8c6SJuan Quintela 1599436b8c6SJuan Quintela type_init(virtio_pci_input_register) 160