xref: /qemu/tests/qtest/libqos/x86_64_pc-machine.c (revision 907b5105f1b9e1af1abbdbb4f2039c7ab105c001)
146113f88SEmanuele Giuseppe Esposito /*
246113f88SEmanuele Giuseppe Esposito  * libqos driver framework
346113f88SEmanuele Giuseppe Esposito  *
446113f88SEmanuele Giuseppe Esposito  * Copyright (c) 2018 Emanuele Giuseppe Esposito <e.emanuelegiuseppe@gmail.com>
546113f88SEmanuele Giuseppe Esposito  *
646113f88SEmanuele Giuseppe Esposito  * This library is free software; you can redistribute it and/or
746113f88SEmanuele 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.
946113f88SEmanuele Giuseppe Esposito  *
1046113f88SEmanuele Giuseppe Esposito  * This library is distributed in the hope that it will be useful,
1146113f88SEmanuele Giuseppe Esposito  * but WITHOUT ANY WARRANTY; without even the implied warranty of
1246113f88SEmanuele Giuseppe Esposito  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1346113f88SEmanuele Giuseppe Esposito  * Lesser General Public License for more details.
1446113f88SEmanuele Giuseppe Esposito  *
1546113f88SEmanuele Giuseppe Esposito  * You should have received a copy of the GNU Lesser General Public
1646113f88SEmanuele Giuseppe Esposito  * License along with this library; if not, see <http://www.gnu.org/licenses/>
1746113f88SEmanuele Giuseppe Esposito  */
1846113f88SEmanuele Giuseppe Esposito 
1946113f88SEmanuele Giuseppe Esposito #include "qemu/osdep.h"
20*907b5105SMarc-André Lureau #include "../libqtest.h"
21a2ce7dbdSPaolo Bonzini #include "qgraph.h"
2246113f88SEmanuele Giuseppe Esposito #include "pci-pc.h"
230b8fa32fSMarkus Armbruster #include "qemu/module.h"
2446113f88SEmanuele Giuseppe Esposito #include "malloc-pc.h"
2546113f88SEmanuele Giuseppe Esposito 
2646113f88SEmanuele Giuseppe Esposito typedef struct QX86PCMachine QX86PCMachine;
2746113f88SEmanuele Giuseppe Esposito typedef struct i440FX_pcihost i440FX_pcihost;
2846113f88SEmanuele Giuseppe Esposito typedef struct QSDHCI_PCI  QSDHCI_PCI;
2946113f88SEmanuele Giuseppe Esposito 
3046113f88SEmanuele Giuseppe Esposito struct i440FX_pcihost {
3146113f88SEmanuele Giuseppe Esposito     QOSGraphObject obj;
3246113f88SEmanuele Giuseppe Esposito     QPCIBusPC pci;
3346113f88SEmanuele Giuseppe Esposito };
3446113f88SEmanuele Giuseppe Esposito 
3546113f88SEmanuele Giuseppe Esposito struct QX86PCMachine {
3646113f88SEmanuele Giuseppe Esposito     QOSGraphObject obj;
3746113f88SEmanuele Giuseppe Esposito     QGuestAllocator alloc;
3846113f88SEmanuele Giuseppe Esposito     i440FX_pcihost bridge;
3946113f88SEmanuele Giuseppe Esposito };
4046113f88SEmanuele Giuseppe Esposito 
4146113f88SEmanuele Giuseppe Esposito /* i440FX_pcihost */
4246113f88SEmanuele Giuseppe Esposito 
i440FX_host_get_device(void * obj,const char * device)4346113f88SEmanuele Giuseppe Esposito static QOSGraphObject *i440FX_host_get_device(void *obj, const char *device)
4446113f88SEmanuele Giuseppe Esposito {
4546113f88SEmanuele Giuseppe Esposito     i440FX_pcihost *host = obj;
4646113f88SEmanuele Giuseppe Esposito     if (!g_strcmp0(device, "pci-bus-pc")) {
4746113f88SEmanuele Giuseppe Esposito         return &host->pci.obj;
4846113f88SEmanuele Giuseppe Esposito     }
4946113f88SEmanuele Giuseppe Esposito     fprintf(stderr, "%s not present in i440FX-pcihost\n", device);
5046113f88SEmanuele Giuseppe Esposito     g_assert_not_reached();
5146113f88SEmanuele Giuseppe Esposito }
5246113f88SEmanuele Giuseppe Esposito 
qos_create_i440FX_host(i440FX_pcihost * host,QTestState * qts,QGuestAllocator * alloc)5346113f88SEmanuele Giuseppe Esposito static void qos_create_i440FX_host(i440FX_pcihost *host,
5446113f88SEmanuele Giuseppe Esposito                                    QTestState *qts,
5546113f88SEmanuele Giuseppe Esposito                                    QGuestAllocator *alloc)
5646113f88SEmanuele Giuseppe Esposito {
5746113f88SEmanuele Giuseppe Esposito     host->obj.get_device = i440FX_host_get_device;
5846113f88SEmanuele Giuseppe Esposito     qpci_init_pc(&host->pci, qts, alloc);
5946113f88SEmanuele Giuseppe Esposito }
6046113f88SEmanuele Giuseppe Esposito 
6146113f88SEmanuele Giuseppe Esposito /* x86_64/pc machine */
6246113f88SEmanuele Giuseppe Esposito 
pc_destructor(QOSGraphObject * obj)6346113f88SEmanuele Giuseppe Esposito static void pc_destructor(QOSGraphObject *obj)
6446113f88SEmanuele Giuseppe Esposito {
6546113f88SEmanuele Giuseppe Esposito     QX86PCMachine *machine = (QX86PCMachine *) obj;
6646113f88SEmanuele Giuseppe Esposito     alloc_destroy(&machine->alloc);
6746113f88SEmanuele Giuseppe Esposito }
6846113f88SEmanuele Giuseppe Esposito 
pc_get_driver(void * object,const char * interface)6946113f88SEmanuele Giuseppe Esposito static void *pc_get_driver(void *object, const char *interface)
7046113f88SEmanuele Giuseppe Esposito {
7146113f88SEmanuele Giuseppe Esposito     QX86PCMachine *machine = object;
7246113f88SEmanuele Giuseppe Esposito     if (!g_strcmp0(interface, "memory")) {
7346113f88SEmanuele Giuseppe Esposito         return &machine->alloc;
7446113f88SEmanuele Giuseppe Esposito     }
7546113f88SEmanuele Giuseppe Esposito 
7646113f88SEmanuele Giuseppe Esposito     fprintf(stderr, "%s not present in x86_64/pc\n", interface);
7746113f88SEmanuele Giuseppe Esposito     g_assert_not_reached();
7846113f88SEmanuele Giuseppe Esposito }
7946113f88SEmanuele Giuseppe Esposito 
pc_get_device(void * obj,const char * device)8046113f88SEmanuele Giuseppe Esposito static QOSGraphObject *pc_get_device(void *obj, const char *device)
8146113f88SEmanuele Giuseppe Esposito {
8246113f88SEmanuele Giuseppe Esposito     QX86PCMachine *machine = obj;
8346113f88SEmanuele Giuseppe Esposito     if (!g_strcmp0(device, "i440FX-pcihost")) {
8446113f88SEmanuele Giuseppe Esposito         return &machine->bridge.obj;
8546113f88SEmanuele Giuseppe Esposito     }
8646113f88SEmanuele Giuseppe Esposito 
8746113f88SEmanuele Giuseppe Esposito     fprintf(stderr, "%s not present in x86_64/pc\n", device);
8846113f88SEmanuele Giuseppe Esposito     g_assert_not_reached();
8946113f88SEmanuele Giuseppe Esposito }
9046113f88SEmanuele Giuseppe Esposito 
qos_create_machine_pc(QTestState * qts)9146113f88SEmanuele Giuseppe Esposito static void *qos_create_machine_pc(QTestState *qts)
9246113f88SEmanuele Giuseppe Esposito {
9346113f88SEmanuele Giuseppe Esposito     QX86PCMachine *machine = g_new0(QX86PCMachine, 1);
9446113f88SEmanuele Giuseppe Esposito     machine->obj.get_device = pc_get_device;
9546113f88SEmanuele Giuseppe Esposito     machine->obj.get_driver = pc_get_driver;
9646113f88SEmanuele Giuseppe Esposito     machine->obj.destructor = pc_destructor;
9746113f88SEmanuele Giuseppe Esposito     pc_alloc_init(&machine->alloc, qts, ALLOC_NO_FLAGS);
9846113f88SEmanuele Giuseppe Esposito     qos_create_i440FX_host(&machine->bridge, qts, &machine->alloc);
9946113f88SEmanuele Giuseppe Esposito 
10046113f88SEmanuele Giuseppe Esposito     return &machine->obj;
10146113f88SEmanuele Giuseppe Esposito }
10246113f88SEmanuele Giuseppe Esposito 
pc_machine_register_nodes(void)10346113f88SEmanuele Giuseppe Esposito static void pc_machine_register_nodes(void)
10446113f88SEmanuele Giuseppe Esposito {
10546113f88SEmanuele Giuseppe Esposito     qos_node_create_machine("i386/pc", qos_create_machine_pc);
10646113f88SEmanuele Giuseppe Esposito     qos_node_contains("i386/pc", "i440FX-pcihost", NULL);
10746113f88SEmanuele Giuseppe Esposito 
10846113f88SEmanuele Giuseppe Esposito     qos_node_create_machine("x86_64/pc", qos_create_machine_pc);
10946113f88SEmanuele Giuseppe Esposito     qos_node_contains("x86_64/pc", "i440FX-pcihost", NULL);
11046113f88SEmanuele Giuseppe Esposito 
11146113f88SEmanuele Giuseppe Esposito     qos_node_create_driver("i440FX-pcihost", NULL);
11246113f88SEmanuele Giuseppe Esposito     qos_node_contains("i440FX-pcihost", "pci-bus-pc", NULL);
11346113f88SEmanuele Giuseppe Esposito }
11446113f88SEmanuele Giuseppe Esposito 
11546113f88SEmanuele Giuseppe Esposito libqos_init(pc_machine_register_nodes);
116