1b3e7dc87SEmanuele Giuseppe Esposito /* 2b3e7dc87SEmanuele Giuseppe Esposito * libqos driver framework 3b3e7dc87SEmanuele Giuseppe Esposito * 4b3e7dc87SEmanuele Giuseppe Esposito * Copyright (c) 2018 Emanuele Giuseppe Esposito <e.emanuelegiuseppe@gmail.com> 5b3e7dc87SEmanuele Giuseppe Esposito * 6b3e7dc87SEmanuele Giuseppe Esposito * This library is free software; you can redistribute it and/or 7b3e7dc87SEmanuele Giuseppe Esposito * modify it under the terms of the GNU Lesser General Public 8dc0ad02dSThomas Huth * License version 2.1 as published by the Free Software Foundation. 9b3e7dc87SEmanuele Giuseppe Esposito * 10b3e7dc87SEmanuele Giuseppe Esposito * This library is distributed in the hope that it will be useful, 11b3e7dc87SEmanuele Giuseppe Esposito * but WITHOUT ANY WARRANTY; without even the implied warranty of 12b3e7dc87SEmanuele Giuseppe Esposito * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13b3e7dc87SEmanuele Giuseppe Esposito * Lesser General Public License for more details. 14b3e7dc87SEmanuele Giuseppe Esposito * 15b3e7dc87SEmanuele Giuseppe Esposito * You should have received a copy of the GNU Lesser General Public 16b3e7dc87SEmanuele Giuseppe Esposito * License along with this library; if not, see <http://www.gnu.org/licenses/> 17b3e7dc87SEmanuele Giuseppe Esposito */ 18b3e7dc87SEmanuele Giuseppe Esposito 19b3e7dc87SEmanuele Giuseppe Esposito #include "qemu/osdep.h" 20b3e7dc87SEmanuele Giuseppe Esposito #include "libqtest.h" 210b8fa32fSMarkus Armbruster #include "qemu/module.h" 22*a2ce7dbdSPaolo Bonzini #include "qgraph.h" 23*a2ce7dbdSPaolo Bonzini #include "virtio-serial.h" 24b3e7dc87SEmanuele Giuseppe Esposito 25b3e7dc87SEmanuele Giuseppe Esposito static void *qvirtio_serial_get_driver(QVirtioSerial *v_serial, 26b3e7dc87SEmanuele Giuseppe Esposito const char *interface) 27b3e7dc87SEmanuele Giuseppe Esposito { 28b3e7dc87SEmanuele Giuseppe Esposito if (!g_strcmp0(interface, "virtio-serial")) { 29b3e7dc87SEmanuele Giuseppe Esposito return v_serial; 30b3e7dc87SEmanuele Giuseppe Esposito } 31b3e7dc87SEmanuele Giuseppe Esposito if (!g_strcmp0(interface, "virtio")) { 32b3e7dc87SEmanuele Giuseppe Esposito return v_serial->vdev; 33b3e7dc87SEmanuele Giuseppe Esposito } 34b3e7dc87SEmanuele Giuseppe Esposito 35b3e7dc87SEmanuele Giuseppe Esposito fprintf(stderr, "%s not present in virtio-serial-device\n", interface); 36b3e7dc87SEmanuele Giuseppe Esposito g_assert_not_reached(); 37b3e7dc87SEmanuele Giuseppe Esposito } 38b3e7dc87SEmanuele Giuseppe Esposito 39b3e7dc87SEmanuele Giuseppe Esposito static void *qvirtio_serial_device_get_driver(void *object, 40b3e7dc87SEmanuele Giuseppe Esposito const char *interface) 41b3e7dc87SEmanuele Giuseppe Esposito { 42b3e7dc87SEmanuele Giuseppe Esposito QVirtioSerialDevice *v_serial = object; 43b3e7dc87SEmanuele Giuseppe Esposito return qvirtio_serial_get_driver(&v_serial->serial, interface); 44b3e7dc87SEmanuele Giuseppe Esposito } 45b3e7dc87SEmanuele Giuseppe Esposito 46b3e7dc87SEmanuele Giuseppe Esposito static void *virtio_serial_device_create(void *virtio_dev, 47b3e7dc87SEmanuele Giuseppe Esposito QGuestAllocator *t_alloc, 48b3e7dc87SEmanuele Giuseppe Esposito void *addr) 49b3e7dc87SEmanuele Giuseppe Esposito { 50b3e7dc87SEmanuele Giuseppe Esposito QVirtioSerialDevice *virtio_device = g_new0(QVirtioSerialDevice, 1); 51b3e7dc87SEmanuele Giuseppe Esposito QVirtioSerial *interface = &virtio_device->serial; 52b3e7dc87SEmanuele Giuseppe Esposito 53b3e7dc87SEmanuele Giuseppe Esposito interface->vdev = virtio_dev; 54b3e7dc87SEmanuele Giuseppe Esposito 55b3e7dc87SEmanuele Giuseppe Esposito virtio_device->obj.get_driver = qvirtio_serial_device_get_driver; 56b3e7dc87SEmanuele Giuseppe Esposito 57b3e7dc87SEmanuele Giuseppe Esposito return &virtio_device->obj; 58b3e7dc87SEmanuele Giuseppe Esposito } 59b3e7dc87SEmanuele Giuseppe Esposito 60b3e7dc87SEmanuele Giuseppe Esposito /* virtio-serial-pci */ 61b3e7dc87SEmanuele Giuseppe Esposito static void *qvirtio_serial_pci_get_driver(void *object, const char *interface) 62b3e7dc87SEmanuele Giuseppe Esposito { 63b3e7dc87SEmanuele Giuseppe Esposito QVirtioSerialPCI *v_serial = object; 64b3e7dc87SEmanuele Giuseppe Esposito if (!g_strcmp0(interface, "pci-device")) { 65b3e7dc87SEmanuele Giuseppe Esposito return v_serial->pci_vdev.pdev; 66b3e7dc87SEmanuele Giuseppe Esposito } 67b3e7dc87SEmanuele Giuseppe Esposito return qvirtio_serial_get_driver(&v_serial->serial, interface); 68b3e7dc87SEmanuele Giuseppe Esposito } 69b3e7dc87SEmanuele Giuseppe Esposito 70b3e7dc87SEmanuele Giuseppe Esposito static void *virtio_serial_pci_create(void *pci_bus, QGuestAllocator *t_alloc, 71b3e7dc87SEmanuele Giuseppe Esposito void *addr) 72b3e7dc87SEmanuele Giuseppe Esposito { 73b3e7dc87SEmanuele Giuseppe Esposito QVirtioSerialPCI *virtio_spci = g_new0(QVirtioSerialPCI, 1); 74b3e7dc87SEmanuele Giuseppe Esposito QVirtioSerial *interface = &virtio_spci->serial; 75b3e7dc87SEmanuele Giuseppe Esposito QOSGraphObject *obj = &virtio_spci->pci_vdev.obj; 76b3e7dc87SEmanuele Giuseppe Esposito 77b3e7dc87SEmanuele Giuseppe Esposito virtio_pci_init(&virtio_spci->pci_vdev, pci_bus, addr); 78b3e7dc87SEmanuele Giuseppe Esposito interface->vdev = &virtio_spci->pci_vdev.vdev; 79b3e7dc87SEmanuele Giuseppe Esposito 80b3e7dc87SEmanuele Giuseppe Esposito obj->get_driver = qvirtio_serial_pci_get_driver; 81b3e7dc87SEmanuele Giuseppe Esposito 82b3e7dc87SEmanuele Giuseppe Esposito return obj; 83b3e7dc87SEmanuele Giuseppe Esposito } 84b3e7dc87SEmanuele Giuseppe Esposito 85b3e7dc87SEmanuele Giuseppe Esposito static void virtio_serial_register_nodes(void) 86b3e7dc87SEmanuele Giuseppe Esposito { 87b3e7dc87SEmanuele Giuseppe Esposito QPCIAddress addr = { 88b3e7dc87SEmanuele Giuseppe Esposito .devfn = QPCI_DEVFN(4, 0), 89b3e7dc87SEmanuele Giuseppe Esposito }; 90b3e7dc87SEmanuele Giuseppe Esposito 91b3e7dc87SEmanuele Giuseppe Esposito QOSGraphEdgeOptions edge_opts = { }; 92b3e7dc87SEmanuele Giuseppe Esposito 93b3e7dc87SEmanuele Giuseppe Esposito /* virtio-serial-device */ 94b3e7dc87SEmanuele Giuseppe Esposito edge_opts.extra_device_opts = "id=vser0"; 95b3e7dc87SEmanuele Giuseppe Esposito qos_node_create_driver("virtio-serial-device", 96b3e7dc87SEmanuele Giuseppe Esposito virtio_serial_device_create); 97b3e7dc87SEmanuele Giuseppe Esposito qos_node_consumes("virtio-serial-device", "virtio-bus", &edge_opts); 98b3e7dc87SEmanuele Giuseppe Esposito qos_node_produces("virtio-serial-device", "virtio"); 99b3e7dc87SEmanuele Giuseppe Esposito qos_node_produces("virtio-serial-device", "virtio-serial"); 100b3e7dc87SEmanuele Giuseppe Esposito 101b3e7dc87SEmanuele Giuseppe Esposito /* virtio-serial-pci */ 102b3e7dc87SEmanuele Giuseppe Esposito edge_opts.extra_device_opts = "id=vser0,addr=04.0"; 103b3e7dc87SEmanuele Giuseppe Esposito add_qpci_address(&edge_opts, &addr); 104b3e7dc87SEmanuele Giuseppe Esposito qos_node_create_driver("virtio-serial-pci", virtio_serial_pci_create); 105b3e7dc87SEmanuele Giuseppe Esposito qos_node_consumes("virtio-serial-pci", "pci-bus", &edge_opts); 106b3e7dc87SEmanuele Giuseppe Esposito qos_node_produces("virtio-serial-pci", "pci-device"); 107b3e7dc87SEmanuele Giuseppe Esposito qos_node_produces("virtio-serial-pci", "virtio"); 108b3e7dc87SEmanuele Giuseppe Esposito qos_node_produces("virtio-serial-pci", "virtio-serial"); 109b3e7dc87SEmanuele Giuseppe Esposito } 110b3e7dc87SEmanuele Giuseppe Esposito 111b3e7dc87SEmanuele Giuseppe Esposito libqos_init(virtio_serial_register_nodes); 112