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