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 87985b582SEmanuele Giuseppe Esposito * License version 2 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" 207985b582SEmanuele Giuseppe Esposito #include "libqtest.h" 217985b582SEmanuele Giuseppe Esposito #include "libqos/qgraph.h" 227985b582SEmanuele Giuseppe Esposito #include "pci-spapr.h" 23*0b8fa32fSMarkus Armbruster #include "qemu/module.h" 247985b582SEmanuele Giuseppe Esposito #include "libqos/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 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 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 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 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 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 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 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