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