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