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