xref: /qemu/tests/qtest/libqos/ppc64_pseries-machine.c (revision 907b5105f1b9e1af1abbdbb4f2039c7ab105c001)
17985b582SEmanuele Giuseppe Esposito /*
27985b582SEmanuele Giuseppe Esposito  * libqos driver framework
37985b582SEmanuele Giuseppe Esposito  *
47985b582SEmanuele Giuseppe Esposito  * Copyright (c) 2018 Emanuele Giuseppe Esposito <e.emanuelegiuseppe@gmail.com>
57985b582SEmanuele Giuseppe Esposito  *
67985b582SEmanuele Giuseppe Esposito  * This library is free software; you can redistribute it and/or
77985b582SEmanuele 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.
97985b582SEmanuele Giuseppe Esposito  *
107985b582SEmanuele Giuseppe Esposito  * This library is distributed in the hope that it will be useful,
117985b582SEmanuele Giuseppe Esposito  * but WITHOUT ANY WARRANTY; without even the implied warranty of
127985b582SEmanuele Giuseppe Esposito  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
137985b582SEmanuele Giuseppe Esposito  * Lesser General Public License for more details.
147985b582SEmanuele Giuseppe Esposito  *
157985b582SEmanuele Giuseppe Esposito  * You should have received a copy of the GNU Lesser General Public
167985b582SEmanuele Giuseppe Esposito  * License along with this library; if not, see <http://www.gnu.org/licenses/>
177985b582SEmanuele Giuseppe Esposito  */
187985b582SEmanuele Giuseppe Esposito 
197985b582SEmanuele Giuseppe Esposito #include "qemu/osdep.h"
20*907b5105SMarc-André Lureau #include "../libqtest.h"
21a2ce7dbdSPaolo Bonzini #include "qgraph.h"
227985b582SEmanuele Giuseppe Esposito #include "pci-spapr.h"
230b8fa32fSMarkus Armbruster #include "qemu/module.h"
24a2ce7dbdSPaolo Bonzini #include "malloc-spapr.h"
257985b582SEmanuele Giuseppe Esposito 
267985b582SEmanuele Giuseppe Esposito typedef struct QSPAPR_pci_host QSPAPR_pci_host;
277985b582SEmanuele Giuseppe Esposito typedef struct Qppc64_pseriesMachine Qppc64_pseriesMachine;
287985b582SEmanuele Giuseppe Esposito 
297985b582SEmanuele Giuseppe Esposito struct QSPAPR_pci_host {
307985b582SEmanuele Giuseppe Esposito     QOSGraphObject obj;
317985b582SEmanuele Giuseppe Esposito     QPCIBusSPAPR pci;
327985b582SEmanuele Giuseppe Esposito };
337985b582SEmanuele Giuseppe Esposito 
347985b582SEmanuele Giuseppe Esposito struct Qppc64_pseriesMachine {
357985b582SEmanuele Giuseppe Esposito     QOSGraphObject obj;
367985b582SEmanuele Giuseppe Esposito     QGuestAllocator alloc;
377985b582SEmanuele Giuseppe Esposito     QSPAPR_pci_host bridge;
387985b582SEmanuele Giuseppe Esposito };
397985b582SEmanuele Giuseppe Esposito 
407985b582SEmanuele Giuseppe Esposito /* QSPAPR_pci_host */
417985b582SEmanuele Giuseppe Esposito 
QSPAPR_host_get_device(void * obj,const char * device)427985b582SEmanuele Giuseppe Esposito static QOSGraphObject *QSPAPR_host_get_device(void *obj, const char *device)
437985b582SEmanuele Giuseppe Esposito {
447985b582SEmanuele Giuseppe Esposito     QSPAPR_pci_host *host = obj;
457985b582SEmanuele Giuseppe Esposito     if (!g_strcmp0(device, "pci-bus-spapr")) {
467985b582SEmanuele Giuseppe Esposito         return &host->pci.obj;
477985b582SEmanuele Giuseppe Esposito     }
487985b582SEmanuele Giuseppe Esposito     fprintf(stderr, "%s not present in QSPAPR_pci_host\n", device);
497985b582SEmanuele Giuseppe Esposito     g_assert_not_reached();
507985b582SEmanuele Giuseppe Esposito }
517985b582SEmanuele Giuseppe Esposito 
qos_create_QSPAPR_host(QSPAPR_pci_host * host,QTestState * qts,QGuestAllocator * alloc)527985b582SEmanuele Giuseppe Esposito static void qos_create_QSPAPR_host(QSPAPR_pci_host *host,
537985b582SEmanuele Giuseppe Esposito                                    QTestState *qts,
547985b582SEmanuele Giuseppe Esposito                                    QGuestAllocator *alloc)
557985b582SEmanuele Giuseppe Esposito {
567985b582SEmanuele Giuseppe Esposito     host->obj.get_device = QSPAPR_host_get_device;
577985b582SEmanuele Giuseppe Esposito     qpci_init_spapr(&host->pci, qts, alloc);
587985b582SEmanuele Giuseppe Esposito }
597985b582SEmanuele Giuseppe Esposito 
607985b582SEmanuele Giuseppe Esposito /* ppc64/pseries machine */
617985b582SEmanuele Giuseppe Esposito 
spapr_destructor(QOSGraphObject * obj)627985b582SEmanuele Giuseppe Esposito static void spapr_destructor(QOSGraphObject *obj)
637985b582SEmanuele Giuseppe Esposito {
647985b582SEmanuele Giuseppe Esposito     Qppc64_pseriesMachine *machine = (Qppc64_pseriesMachine *) obj;
657985b582SEmanuele Giuseppe Esposito     alloc_destroy(&machine->alloc);
667985b582SEmanuele Giuseppe Esposito }
677985b582SEmanuele Giuseppe Esposito 
spapr_get_driver(void * object,const char * interface)687985b582SEmanuele Giuseppe Esposito static void *spapr_get_driver(void *object, const char *interface)
697985b582SEmanuele Giuseppe Esposito {
707985b582SEmanuele Giuseppe Esposito     Qppc64_pseriesMachine *machine = object;
717985b582SEmanuele Giuseppe Esposito     if (!g_strcmp0(interface, "memory")) {
727985b582SEmanuele Giuseppe Esposito         return &machine->alloc;
737985b582SEmanuele Giuseppe Esposito     }
747985b582SEmanuele Giuseppe Esposito 
757985b582SEmanuele Giuseppe Esposito     fprintf(stderr, "%s not present in ppc64/pseries\n", interface);
767985b582SEmanuele Giuseppe Esposito     g_assert_not_reached();
777985b582SEmanuele Giuseppe Esposito }
787985b582SEmanuele Giuseppe Esposito 
spapr_get_device(void * obj,const char * device)797985b582SEmanuele Giuseppe Esposito static QOSGraphObject *spapr_get_device(void *obj, const char *device)
807985b582SEmanuele Giuseppe Esposito {
817985b582SEmanuele Giuseppe Esposito     Qppc64_pseriesMachine *machine = obj;
827985b582SEmanuele Giuseppe Esposito     if (!g_strcmp0(device, "spapr-pci-host-bridge")) {
837985b582SEmanuele Giuseppe Esposito         return &machine->bridge.obj;
847985b582SEmanuele Giuseppe Esposito     }
857985b582SEmanuele Giuseppe Esposito 
867985b582SEmanuele Giuseppe Esposito     fprintf(stderr, "%s not present in ppc64/pseries\n", device);
877985b582SEmanuele Giuseppe Esposito     g_assert_not_reached();
887985b582SEmanuele Giuseppe Esposito }
897985b582SEmanuele Giuseppe Esposito 
qos_create_machine_spapr(QTestState * qts)907985b582SEmanuele Giuseppe Esposito static void *qos_create_machine_spapr(QTestState *qts)
917985b582SEmanuele Giuseppe Esposito {
927985b582SEmanuele Giuseppe Esposito     Qppc64_pseriesMachine *machine = g_new0(Qppc64_pseriesMachine, 1);
937985b582SEmanuele Giuseppe Esposito     machine->obj.get_device = spapr_get_device;
947985b582SEmanuele Giuseppe Esposito     machine->obj.get_driver = spapr_get_driver;
957985b582SEmanuele Giuseppe Esposito     machine->obj.destructor = spapr_destructor;
967985b582SEmanuele Giuseppe Esposito     spapr_alloc_init(&machine->alloc, qts, ALLOC_NO_FLAGS);
977985b582SEmanuele Giuseppe Esposito 
987985b582SEmanuele Giuseppe Esposito     qos_create_QSPAPR_host(&machine->bridge, qts, &machine->alloc);
997985b582SEmanuele Giuseppe Esposito 
1007985b582SEmanuele Giuseppe Esposito     return &machine->obj;
1017985b582SEmanuele Giuseppe Esposito }
1027985b582SEmanuele Giuseppe Esposito 
spapr_machine_register_nodes(void)1037985b582SEmanuele Giuseppe Esposito static void spapr_machine_register_nodes(void)
1047985b582SEmanuele Giuseppe Esposito {
1057985b582SEmanuele Giuseppe Esposito     qos_node_create_machine("ppc64/pseries", qos_create_machine_spapr);
1067985b582SEmanuele Giuseppe Esposito     qos_node_create_driver("spapr-pci-host-bridge", NULL);
1077985b582SEmanuele Giuseppe Esposito     qos_node_contains("ppc64/pseries", "spapr-pci-host-bridge", NULL);
1087985b582SEmanuele Giuseppe Esposito     qos_node_contains("spapr-pci-host-bridge", "pci-bus-spapr", NULL);
1097985b582SEmanuele Giuseppe Esposito }
1107985b582SEmanuele Giuseppe Esposito 
1117985b582SEmanuele Giuseppe Esposito libqos_init(spapr_machine_register_nodes);
1127985b582SEmanuele Giuseppe Esposito 
113