xref: /qemu/tests/qtest/libqos/ppc64_pseries-machine.c (revision 7985b582d68a990d0285afd3ad6f9eff5ff5c3c5)
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