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