1*7985b582SEmanuele Giuseppe Esposito /* 2*7985b582SEmanuele Giuseppe Esposito * libqos driver framework 3*7985b582SEmanuele Giuseppe Esposito * 4*7985b582SEmanuele Giuseppe Esposito * Copyright (c) 2018 Emanuele Giuseppe Esposito <e.emanuelegiuseppe@gmail.com> 5*7985b582SEmanuele Giuseppe Esposito * 6*7985b582SEmanuele Giuseppe Esposito * This library is free software; you can redistribute it and/or 7*7985b582SEmanuele Giuseppe Esposito * modify it under the terms of the GNU Lesser General Public 8*7985b582SEmanuele Giuseppe Esposito * License version 2 as published by the Free Software Foundation. 9*7985b582SEmanuele Giuseppe Esposito * 10*7985b582SEmanuele Giuseppe Esposito * This library is distributed in the hope that it will be useful, 11*7985b582SEmanuele Giuseppe Esposito * but WITHOUT ANY WARRANTY; without even the implied warranty of 12*7985b582SEmanuele Giuseppe Esposito * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13*7985b582SEmanuele Giuseppe Esposito * Lesser General Public License for more details. 14*7985b582SEmanuele Giuseppe Esposito * 15*7985b582SEmanuele Giuseppe Esposito * You should have received a copy of the GNU Lesser General Public 16*7985b582SEmanuele Giuseppe Esposito * License along with this library; if not, see <http://www.gnu.org/licenses/> 17*7985b582SEmanuele Giuseppe Esposito */ 18*7985b582SEmanuele Giuseppe Esposito 19*7985b582SEmanuele Giuseppe Esposito #include "qemu/osdep.h" 20*7985b582SEmanuele Giuseppe Esposito #include "libqtest.h" 21*7985b582SEmanuele Giuseppe Esposito #include "libqos/qgraph.h" 22*7985b582SEmanuele Giuseppe Esposito #include "pci-spapr.h" 23*7985b582SEmanuele Giuseppe Esposito #include "libqos/malloc-spapr.h" 24*7985b582SEmanuele Giuseppe Esposito 25*7985b582SEmanuele Giuseppe Esposito typedef struct QSPAPR_pci_host QSPAPR_pci_host; 26*7985b582SEmanuele Giuseppe Esposito typedef struct Qppc64_pseriesMachine Qppc64_pseriesMachine; 27*7985b582SEmanuele Giuseppe Esposito 28*7985b582SEmanuele Giuseppe Esposito struct QSPAPR_pci_host { 29*7985b582SEmanuele Giuseppe Esposito QOSGraphObject obj; 30*7985b582SEmanuele Giuseppe Esposito QPCIBusSPAPR pci; 31*7985b582SEmanuele Giuseppe Esposito }; 32*7985b582SEmanuele Giuseppe Esposito 33*7985b582SEmanuele Giuseppe Esposito struct Qppc64_pseriesMachine { 34*7985b582SEmanuele Giuseppe Esposito QOSGraphObject obj; 35*7985b582SEmanuele Giuseppe Esposito QGuestAllocator alloc; 36*7985b582SEmanuele Giuseppe Esposito QSPAPR_pci_host bridge; 37*7985b582SEmanuele Giuseppe Esposito }; 38*7985b582SEmanuele Giuseppe Esposito 39*7985b582SEmanuele Giuseppe Esposito /* QSPAPR_pci_host */ 40*7985b582SEmanuele Giuseppe Esposito 41*7985b582SEmanuele Giuseppe Esposito static QOSGraphObject *QSPAPR_host_get_device(void *obj, const char *device) 42*7985b582SEmanuele Giuseppe Esposito { 43*7985b582SEmanuele Giuseppe Esposito QSPAPR_pci_host *host = obj; 44*7985b582SEmanuele Giuseppe Esposito if (!g_strcmp0(device, "pci-bus-spapr")) { 45*7985b582SEmanuele Giuseppe Esposito return &host->pci.obj; 46*7985b582SEmanuele Giuseppe Esposito } 47*7985b582SEmanuele Giuseppe Esposito fprintf(stderr, "%s not present in QSPAPR_pci_host\n", device); 48*7985b582SEmanuele Giuseppe Esposito g_assert_not_reached(); 49*7985b582SEmanuele Giuseppe Esposito } 50*7985b582SEmanuele Giuseppe Esposito 51*7985b582SEmanuele Giuseppe Esposito static void qos_create_QSPAPR_host(QSPAPR_pci_host *host, 52*7985b582SEmanuele Giuseppe Esposito QTestState *qts, 53*7985b582SEmanuele Giuseppe Esposito QGuestAllocator *alloc) 54*7985b582SEmanuele Giuseppe Esposito { 55*7985b582SEmanuele Giuseppe Esposito host->obj.get_device = QSPAPR_host_get_device; 56*7985b582SEmanuele Giuseppe Esposito qpci_init_spapr(&host->pci, qts, alloc); 57*7985b582SEmanuele Giuseppe Esposito } 58*7985b582SEmanuele Giuseppe Esposito 59*7985b582SEmanuele Giuseppe Esposito /* ppc64/pseries machine */ 60*7985b582SEmanuele Giuseppe Esposito 61*7985b582SEmanuele Giuseppe Esposito static void spapr_destructor(QOSGraphObject *obj) 62*7985b582SEmanuele Giuseppe Esposito { 63*7985b582SEmanuele Giuseppe Esposito Qppc64_pseriesMachine *machine = (Qppc64_pseriesMachine *) obj; 64*7985b582SEmanuele Giuseppe Esposito alloc_destroy(&machine->alloc); 65*7985b582SEmanuele Giuseppe Esposito } 66*7985b582SEmanuele Giuseppe Esposito 67*7985b582SEmanuele Giuseppe Esposito static void *spapr_get_driver(void *object, const char *interface) 68*7985b582SEmanuele Giuseppe Esposito { 69*7985b582SEmanuele Giuseppe Esposito Qppc64_pseriesMachine *machine = object; 70*7985b582SEmanuele Giuseppe Esposito if (!g_strcmp0(interface, "memory")) { 71*7985b582SEmanuele Giuseppe Esposito return &machine->alloc; 72*7985b582SEmanuele Giuseppe Esposito } 73*7985b582SEmanuele Giuseppe Esposito 74*7985b582SEmanuele Giuseppe Esposito fprintf(stderr, "%s not present in ppc64/pseries\n", interface); 75*7985b582SEmanuele Giuseppe Esposito g_assert_not_reached(); 76*7985b582SEmanuele Giuseppe Esposito } 77*7985b582SEmanuele Giuseppe Esposito 78*7985b582SEmanuele Giuseppe Esposito static QOSGraphObject *spapr_get_device(void *obj, const char *device) 79*7985b582SEmanuele Giuseppe Esposito { 80*7985b582SEmanuele Giuseppe Esposito Qppc64_pseriesMachine *machine = obj; 81*7985b582SEmanuele Giuseppe Esposito if (!g_strcmp0(device, "spapr-pci-host-bridge")) { 82*7985b582SEmanuele Giuseppe Esposito return &machine->bridge.obj; 83*7985b582SEmanuele Giuseppe Esposito } 84*7985b582SEmanuele Giuseppe Esposito 85*7985b582SEmanuele Giuseppe Esposito fprintf(stderr, "%s not present in ppc64/pseries\n", device); 86*7985b582SEmanuele Giuseppe Esposito g_assert_not_reached(); 87*7985b582SEmanuele Giuseppe Esposito } 88*7985b582SEmanuele Giuseppe Esposito 89*7985b582SEmanuele Giuseppe Esposito static void *qos_create_machine_spapr(QTestState *qts) 90*7985b582SEmanuele Giuseppe Esposito { 91*7985b582SEmanuele Giuseppe Esposito Qppc64_pseriesMachine *machine = g_new0(Qppc64_pseriesMachine, 1); 92*7985b582SEmanuele Giuseppe Esposito machine->obj.get_device = spapr_get_device; 93*7985b582SEmanuele Giuseppe Esposito machine->obj.get_driver = spapr_get_driver; 94*7985b582SEmanuele Giuseppe Esposito machine->obj.destructor = spapr_destructor; 95*7985b582SEmanuele Giuseppe Esposito spapr_alloc_init(&machine->alloc, qts, ALLOC_NO_FLAGS); 96*7985b582SEmanuele Giuseppe Esposito 97*7985b582SEmanuele Giuseppe Esposito qos_create_QSPAPR_host(&machine->bridge, qts, &machine->alloc); 98*7985b582SEmanuele Giuseppe Esposito 99*7985b582SEmanuele Giuseppe Esposito return &machine->obj; 100*7985b582SEmanuele Giuseppe Esposito } 101*7985b582SEmanuele Giuseppe Esposito 102*7985b582SEmanuele Giuseppe Esposito static void spapr_machine_register_nodes(void) 103*7985b582SEmanuele Giuseppe Esposito { 104*7985b582SEmanuele Giuseppe Esposito qos_node_create_machine("ppc64/pseries", qos_create_machine_spapr); 105*7985b582SEmanuele Giuseppe Esposito qos_node_create_driver("spapr-pci-host-bridge", NULL); 106*7985b582SEmanuele Giuseppe Esposito qos_node_contains("ppc64/pseries", "spapr-pci-host-bridge", NULL); 107*7985b582SEmanuele Giuseppe Esposito qos_node_contains("spapr-pci-host-bridge", "pci-bus-spapr", NULL); 108*7985b582SEmanuele Giuseppe Esposito } 109*7985b582SEmanuele Giuseppe Esposito 110*7985b582SEmanuele Giuseppe Esposito libqos_init(spapr_machine_register_nodes); 111*7985b582SEmanuele Giuseppe Esposito 112