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 846113f88SEmanuele Giuseppe Esposito * License version 2 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" 2046113f88SEmanuele Giuseppe Esposito #include "libqtest.h" 2146113f88SEmanuele Giuseppe Esposito #include "libqos/qgraph.h" 2246113f88SEmanuele Giuseppe Esposito #include "pci-pc.h" 23*0b8fa32fSMarkus 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 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 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 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 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 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 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 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