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