xref: /qemu/tests/qtest/libqos/arm-virt-machine.c (revision 0b8fa32f551e863bb548a11394239239270dd3dc)
1d18d2b57SEmanuele Giuseppe Esposito /*
2d18d2b57SEmanuele Giuseppe Esposito  * libqos driver framework
3d18d2b57SEmanuele Giuseppe Esposito  *
4d18d2b57SEmanuele Giuseppe Esposito  * Copyright (c) 2018 Emanuele Giuseppe Esposito <e.emanuelegiuseppe@gmail.com>
5d18d2b57SEmanuele Giuseppe Esposito  *
6d18d2b57SEmanuele Giuseppe Esposito  * This library is free software; you can redistribute it and/or
7d18d2b57SEmanuele Giuseppe Esposito  * modify it under the terms of the GNU Lesser General Public
8d18d2b57SEmanuele Giuseppe Esposito  * License version 2 as published by the Free Software Foundation.
9d18d2b57SEmanuele Giuseppe Esposito  *
10d18d2b57SEmanuele Giuseppe Esposito  * This library is distributed in the hope that it will be useful,
11d18d2b57SEmanuele Giuseppe Esposito  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12d18d2b57SEmanuele Giuseppe Esposito  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13d18d2b57SEmanuele Giuseppe Esposito  * Lesser General Public License for more details.
14d18d2b57SEmanuele Giuseppe Esposito  *
15d18d2b57SEmanuele Giuseppe Esposito  * You should have received a copy of the GNU Lesser General Public
16d18d2b57SEmanuele Giuseppe Esposito  * License along with this library; if not, see <http://www.gnu.org/licenses/>
17d18d2b57SEmanuele Giuseppe Esposito  */
18d18d2b57SEmanuele Giuseppe Esposito 
19d18d2b57SEmanuele Giuseppe Esposito #include "qemu/osdep.h"
20d18d2b57SEmanuele Giuseppe Esposito #include "libqtest.h"
21*0b8fa32fSMarkus Armbruster #include "qemu/module.h"
22d18d2b57SEmanuele Giuseppe Esposito #include "libqos/malloc.h"
23d18d2b57SEmanuele Giuseppe Esposito #include "libqos/qgraph.h"
24d18d2b57SEmanuele Giuseppe Esposito #include "libqos/virtio-mmio.h"
25d18d2b57SEmanuele Giuseppe Esposito 
26d18d2b57SEmanuele Giuseppe Esposito #define ARM_PAGE_SIZE               4096
27d18d2b57SEmanuele Giuseppe Esposito #define VIRTIO_MMIO_BASE_ADDR       0x0A003E00
28d18d2b57SEmanuele Giuseppe Esposito #define ARM_VIRT_RAM_ADDR           0x40000000
29d18d2b57SEmanuele Giuseppe Esposito #define ARM_VIRT_RAM_SIZE           0x20000000
30d18d2b57SEmanuele Giuseppe Esposito #define VIRTIO_MMIO_SIZE            0x00000200
31d18d2b57SEmanuele Giuseppe Esposito 
32d18d2b57SEmanuele Giuseppe Esposito typedef struct QVirtMachine QVirtMachine;
33d18d2b57SEmanuele Giuseppe Esposito 
34d18d2b57SEmanuele Giuseppe Esposito struct QVirtMachine {
35d18d2b57SEmanuele Giuseppe Esposito     QOSGraphObject obj;
36d18d2b57SEmanuele Giuseppe Esposito     QGuestAllocator alloc;
37d18d2b57SEmanuele Giuseppe Esposito     QVirtioMMIODevice virtio_mmio;
38d18d2b57SEmanuele Giuseppe Esposito };
39d18d2b57SEmanuele Giuseppe Esposito 
40d18d2b57SEmanuele Giuseppe Esposito static void virt_destructor(QOSGraphObject *obj)
41d18d2b57SEmanuele Giuseppe Esposito {
42d18d2b57SEmanuele Giuseppe Esposito     QVirtMachine *machine = (QVirtMachine *) obj;
43d18d2b57SEmanuele Giuseppe Esposito     alloc_destroy(&machine->alloc);
44d18d2b57SEmanuele Giuseppe Esposito }
45d18d2b57SEmanuele Giuseppe Esposito 
46d18d2b57SEmanuele Giuseppe Esposito static void *virt_get_driver(void *object, const char *interface)
47d18d2b57SEmanuele Giuseppe Esposito {
48d18d2b57SEmanuele Giuseppe Esposito     QVirtMachine *machine = object;
49d18d2b57SEmanuele Giuseppe Esposito     if (!g_strcmp0(interface, "memory")) {
50d18d2b57SEmanuele Giuseppe Esposito         return &machine->alloc;
51d18d2b57SEmanuele Giuseppe Esposito     }
52d18d2b57SEmanuele Giuseppe Esposito 
53d18d2b57SEmanuele Giuseppe Esposito     fprintf(stderr, "%s not present in arm/virtio\n", interface);
54d18d2b57SEmanuele Giuseppe Esposito     g_assert_not_reached();
55d18d2b57SEmanuele Giuseppe Esposito }
56d18d2b57SEmanuele Giuseppe Esposito 
57d18d2b57SEmanuele Giuseppe Esposito static QOSGraphObject *virt_get_device(void *obj, const char *device)
58d18d2b57SEmanuele Giuseppe Esposito {
59d18d2b57SEmanuele Giuseppe Esposito     QVirtMachine *machine = obj;
60d18d2b57SEmanuele Giuseppe Esposito     if (!g_strcmp0(device, "virtio-mmio")) {
61d18d2b57SEmanuele Giuseppe Esposito         return &machine->virtio_mmio.obj;
62d18d2b57SEmanuele Giuseppe Esposito     }
63d18d2b57SEmanuele Giuseppe Esposito 
64d18d2b57SEmanuele Giuseppe Esposito     fprintf(stderr, "%s not present in arm/virtio\n", device);
65d18d2b57SEmanuele Giuseppe Esposito     g_assert_not_reached();
66d18d2b57SEmanuele Giuseppe Esposito }
67d18d2b57SEmanuele Giuseppe Esposito 
68d18d2b57SEmanuele Giuseppe Esposito static void *qos_create_machine_arm_virt(QTestState *qts)
69d18d2b57SEmanuele Giuseppe Esposito {
70d18d2b57SEmanuele Giuseppe Esposito     QVirtMachine *machine = g_new0(QVirtMachine, 1);
71d18d2b57SEmanuele Giuseppe Esposito 
72d18d2b57SEmanuele Giuseppe Esposito     alloc_init(&machine->alloc, 0,
73d18d2b57SEmanuele Giuseppe Esposito                ARM_VIRT_RAM_ADDR,
74d18d2b57SEmanuele Giuseppe Esposito                ARM_VIRT_RAM_ADDR + ARM_VIRT_RAM_SIZE,
75d18d2b57SEmanuele Giuseppe Esposito                ARM_PAGE_SIZE);
76d18d2b57SEmanuele Giuseppe Esposito     qvirtio_mmio_init_device(&machine->virtio_mmio, qts, VIRTIO_MMIO_BASE_ADDR,
77d18d2b57SEmanuele Giuseppe Esposito                              VIRTIO_MMIO_SIZE);
78d18d2b57SEmanuele Giuseppe Esposito 
79d18d2b57SEmanuele Giuseppe Esposito     machine->obj.get_device = virt_get_device;
80d18d2b57SEmanuele Giuseppe Esposito     machine->obj.get_driver = virt_get_driver;
81d18d2b57SEmanuele Giuseppe Esposito     machine->obj.destructor = virt_destructor;
82d18d2b57SEmanuele Giuseppe Esposito     return machine;
83d18d2b57SEmanuele Giuseppe Esposito }
84d18d2b57SEmanuele Giuseppe Esposito 
85d18d2b57SEmanuele Giuseppe Esposito static void virtio_mmio_register_nodes(void)
86d18d2b57SEmanuele Giuseppe Esposito {
87d18d2b57SEmanuele Giuseppe Esposito     qos_node_create_machine("arm/virt", qos_create_machine_arm_virt);
88d18d2b57SEmanuele Giuseppe Esposito     qos_node_contains("arm/virt", "virtio-mmio", NULL);
89d18d2b57SEmanuele Giuseppe Esposito }
90d18d2b57SEmanuele Giuseppe Esposito 
91d18d2b57SEmanuele Giuseppe Esposito libqos_init(virtio_mmio_register_nodes);
92