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