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