xref: /qemu/tests/qtest/libqos/virtio-balloon.c (revision 907b5105f1b9e1af1abbdbb4f2039c7ab105c001)
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"
20*907b5105SMarc-André Lureau #include "../libqtest.h"
210b8fa32fSMarkus Armbruster #include "qemu/module.h"
22a2ce7dbdSPaolo Bonzini #include "qgraph.h"
23a2ce7dbdSPaolo Bonzini #include "virtio-balloon.h"
2429241067SEmanuele Giuseppe Esposito 
2529241067SEmanuele Giuseppe Esposito /* virtio-balloon-device */
qvirtio_balloon_get_driver(QVirtioBalloon * v_balloon,const char * interface)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 
qvirtio_balloon_device_get_driver(void * object,const char * interface)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 
virtio_balloon_device_create(void * virtio_dev,QGuestAllocator * t_alloc,void * addr)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 */
qvirtio_balloon_pci_get_driver(void * object,const char * interface)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 
virtio_balloon_pci_create(void * pci_bus,QGuestAllocator * t_alloc,void * addr)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 
virtio_balloon_register_nodes(void)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