129241067SEmanuele Giuseppe Esposito /* 229241067SEmanuele Giuseppe Esposito * libqos driver framework 329241067SEmanuele Giuseppe Esposito * 429241067SEmanuele Giuseppe Esposito * Copyright (c) 2018 Emanuele Giuseppe Esposito <e.emanuelegiuseppe@gmail.com> 529241067SEmanuele Giuseppe Esposito * 629241067SEmanuele Giuseppe Esposito * This library is free software; you can redistribute it and/or 729241067SEmanuele 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. 929241067SEmanuele Giuseppe Esposito * 1029241067SEmanuele Giuseppe Esposito * This library is distributed in the hope that it will be useful, 1129241067SEmanuele Giuseppe Esposito * but WITHOUT ANY WARRANTY; without even the implied warranty of 1229241067SEmanuele Giuseppe Esposito * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1329241067SEmanuele Giuseppe Esposito * Lesser General Public License for more details. 1429241067SEmanuele Giuseppe Esposito * 1529241067SEmanuele Giuseppe Esposito * You should have received a copy of the GNU Lesser General Public 1629241067SEmanuele Giuseppe Esposito * License along with this library; if not, see <http://www.gnu.org/licenses/> 1729241067SEmanuele Giuseppe Esposito */ 1829241067SEmanuele Giuseppe Esposito 1929241067SEmanuele Giuseppe Esposito #include "qemu/osdep.h" 2029241067SEmanuele Giuseppe Esposito #include "libqtest.h" 210b8fa32fSMarkus Armbruster #include "qemu/module.h" 22*a2ce7dbdSPaolo Bonzini #include "qgraph.h" 23*a2ce7dbdSPaolo Bonzini #include "virtio-balloon.h" 2429241067SEmanuele Giuseppe Esposito 2529241067SEmanuele Giuseppe Esposito /* virtio-balloon-device */ 2629241067SEmanuele Giuseppe Esposito static void *qvirtio_balloon_get_driver(QVirtioBalloon *v_balloon, 2729241067SEmanuele Giuseppe Esposito const char *interface) 2829241067SEmanuele Giuseppe Esposito { 2929241067SEmanuele Giuseppe Esposito if (!g_strcmp0(interface, "virtio-balloon")) { 3029241067SEmanuele Giuseppe Esposito return v_balloon; 3129241067SEmanuele Giuseppe Esposito } 3229241067SEmanuele Giuseppe Esposito if (!g_strcmp0(interface, "virtio")) { 3329241067SEmanuele Giuseppe Esposito return v_balloon->vdev; 3429241067SEmanuele Giuseppe Esposito } 3529241067SEmanuele Giuseppe Esposito 3629241067SEmanuele Giuseppe Esposito fprintf(stderr, "%s not present in virtio-balloon-device\n", interface); 3729241067SEmanuele Giuseppe Esposito g_assert_not_reached(); 3829241067SEmanuele Giuseppe Esposito } 3929241067SEmanuele Giuseppe Esposito 4029241067SEmanuele Giuseppe Esposito static void *qvirtio_balloon_device_get_driver(void *object, 4129241067SEmanuele Giuseppe Esposito const char *interface) 4229241067SEmanuele Giuseppe Esposito { 4329241067SEmanuele Giuseppe Esposito QVirtioBalloonDevice *v_balloon = object; 4429241067SEmanuele Giuseppe Esposito return qvirtio_balloon_get_driver(&v_balloon->balloon, interface); 4529241067SEmanuele Giuseppe Esposito } 4629241067SEmanuele Giuseppe Esposito 4729241067SEmanuele Giuseppe Esposito static void *virtio_balloon_device_create(void *virtio_dev, 4829241067SEmanuele Giuseppe Esposito QGuestAllocator *t_alloc, 4929241067SEmanuele Giuseppe Esposito void *addr) 5029241067SEmanuele Giuseppe Esposito { 5129241067SEmanuele Giuseppe Esposito QVirtioBalloonDevice *virtio_bdevice = g_new0(QVirtioBalloonDevice, 1); 5229241067SEmanuele Giuseppe Esposito QVirtioBalloon *interface = &virtio_bdevice->balloon; 5329241067SEmanuele Giuseppe Esposito 5429241067SEmanuele Giuseppe Esposito interface->vdev = virtio_dev; 5529241067SEmanuele Giuseppe Esposito 5629241067SEmanuele Giuseppe Esposito virtio_bdevice->obj.get_driver = qvirtio_balloon_device_get_driver; 5729241067SEmanuele Giuseppe Esposito 5829241067SEmanuele Giuseppe Esposito return &virtio_bdevice->obj; 5929241067SEmanuele Giuseppe Esposito } 6029241067SEmanuele Giuseppe Esposito 6129241067SEmanuele Giuseppe Esposito /* virtio-balloon-pci */ 6229241067SEmanuele Giuseppe Esposito static void *qvirtio_balloon_pci_get_driver(void *object, 6329241067SEmanuele Giuseppe Esposito const char *interface) 6429241067SEmanuele Giuseppe Esposito { 6529241067SEmanuele Giuseppe Esposito QVirtioBalloonPCI *v_balloon = object; 6629241067SEmanuele Giuseppe Esposito if (!g_strcmp0(interface, "pci-device")) { 6729241067SEmanuele Giuseppe Esposito return v_balloon->pci_vdev.pdev; 6829241067SEmanuele Giuseppe Esposito } 6929241067SEmanuele Giuseppe Esposito return qvirtio_balloon_get_driver(&v_balloon->balloon, interface); 7029241067SEmanuele Giuseppe Esposito } 7129241067SEmanuele Giuseppe Esposito 7229241067SEmanuele Giuseppe Esposito static void *virtio_balloon_pci_create(void *pci_bus, QGuestAllocator *t_alloc, 7329241067SEmanuele Giuseppe Esposito void *addr) 7429241067SEmanuele Giuseppe Esposito { 7529241067SEmanuele Giuseppe Esposito QVirtioBalloonPCI *virtio_bpci = g_new0(QVirtioBalloonPCI, 1); 7629241067SEmanuele Giuseppe Esposito QVirtioBalloon *interface = &virtio_bpci->balloon; 7729241067SEmanuele Giuseppe Esposito QOSGraphObject *obj = &virtio_bpci->pci_vdev.obj; 7829241067SEmanuele Giuseppe Esposito 7929241067SEmanuele Giuseppe Esposito 8029241067SEmanuele Giuseppe Esposito virtio_pci_init(&virtio_bpci->pci_vdev, pci_bus, addr); 8129241067SEmanuele Giuseppe Esposito interface->vdev = &virtio_bpci->pci_vdev.vdev; 8229241067SEmanuele Giuseppe Esposito 8329241067SEmanuele Giuseppe Esposito obj->get_driver = qvirtio_balloon_pci_get_driver; 8429241067SEmanuele Giuseppe Esposito 8529241067SEmanuele Giuseppe Esposito return obj; 8629241067SEmanuele Giuseppe Esposito } 8729241067SEmanuele Giuseppe Esposito 8829241067SEmanuele Giuseppe Esposito static void virtio_balloon_register_nodes(void) 8929241067SEmanuele Giuseppe Esposito { 9029241067SEmanuele Giuseppe Esposito QPCIAddress addr = { 9129241067SEmanuele Giuseppe Esposito .devfn = QPCI_DEVFN(4, 0), 9229241067SEmanuele Giuseppe Esposito }; 9329241067SEmanuele Giuseppe Esposito 9429241067SEmanuele Giuseppe Esposito QOSGraphEdgeOptions opts = { 9529241067SEmanuele Giuseppe Esposito .extra_device_opts = "addr=04.0", 9629241067SEmanuele Giuseppe Esposito }; 9729241067SEmanuele Giuseppe Esposito 9829241067SEmanuele Giuseppe Esposito /* virtio-balloon-device */ 9929241067SEmanuele Giuseppe Esposito qos_node_create_driver("virtio-balloon-device", 10029241067SEmanuele Giuseppe Esposito virtio_balloon_device_create); 10129241067SEmanuele Giuseppe Esposito qos_node_consumes("virtio-balloon-device", "virtio-bus", NULL); 10229241067SEmanuele Giuseppe Esposito qos_node_produces("virtio-balloon-device", "virtio"); 10329241067SEmanuele Giuseppe Esposito qos_node_produces("virtio-balloon-device", "virtio-balloon"); 10429241067SEmanuele Giuseppe Esposito 10529241067SEmanuele Giuseppe Esposito /* virtio-balloon-pci */ 10629241067SEmanuele Giuseppe Esposito add_qpci_address(&opts, &addr); 10729241067SEmanuele Giuseppe Esposito qos_node_create_driver("virtio-balloon-pci", virtio_balloon_pci_create); 10829241067SEmanuele Giuseppe Esposito qos_node_consumes("virtio-balloon-pci", "pci-bus", &opts); 10929241067SEmanuele Giuseppe Esposito qos_node_produces("virtio-balloon-pci", "pci-device"); 11029241067SEmanuele Giuseppe Esposito qos_node_produces("virtio-balloon-pci", "virtio"); 11129241067SEmanuele Giuseppe Esposito qos_node_produces("virtio-balloon-pci", "virtio-balloon"); 11229241067SEmanuele Giuseppe Esposito } 11329241067SEmanuele Giuseppe Esposito 11429241067SEmanuele Giuseppe Esposito libqos_init(virtio_balloon_register_nodes); 115