12013199dSEmanuele Giuseppe Esposito /* 22013199dSEmanuele Giuseppe Esposito * libqos driver framework 32013199dSEmanuele Giuseppe Esposito * 42013199dSEmanuele Giuseppe Esposito * Copyright (c) 2018 Emanuele Giuseppe Esposito <e.emanuelegiuseppe@gmail.com> 52013199dSEmanuele Giuseppe Esposito * 62013199dSEmanuele Giuseppe Esposito * This library is free software; you can redistribute it and/or 72013199dSEmanuele 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. 92013199dSEmanuele Giuseppe Esposito * 102013199dSEmanuele Giuseppe Esposito * This library is distributed in the hope that it will be useful, 112013199dSEmanuele Giuseppe Esposito * but WITHOUT ANY WARRANTY; without even the implied warranty of 122013199dSEmanuele Giuseppe Esposito * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 132013199dSEmanuele Giuseppe Esposito * Lesser General Public License for more details. 142013199dSEmanuele Giuseppe Esposito * 152013199dSEmanuele Giuseppe Esposito * You should have received a copy of the GNU Lesser General Public 162013199dSEmanuele Giuseppe Esposito * License along with this library; if not, see <http://www.gnu.org/licenses/> 172013199dSEmanuele Giuseppe Esposito */ 182013199dSEmanuele Giuseppe Esposito 192013199dSEmanuele Giuseppe Esposito #include "qemu/osdep.h" 202013199dSEmanuele Giuseppe Esposito #include "libqtest.h" 210b8fa32fSMarkus Armbruster #include "qemu/module.h" 22*a2ce7dbdSPaolo Bonzini #include "malloc.h" 23*a2ce7dbdSPaolo Bonzini #include "qgraph.h" 242013199dSEmanuele Giuseppe Esposito #include "sdhci.h" 252013199dSEmanuele Giuseppe Esposito 262013199dSEmanuele Giuseppe Esposito typedef struct QXilinxZynqA9Machine QXilinxZynqA9Machine; 272013199dSEmanuele Giuseppe Esposito 282013199dSEmanuele Giuseppe Esposito struct QXilinxZynqA9Machine { 292013199dSEmanuele Giuseppe Esposito QOSGraphObject obj; 302013199dSEmanuele Giuseppe Esposito QGuestAllocator alloc; 312013199dSEmanuele Giuseppe Esposito QSDHCI_MemoryMapped sdhci; 322013199dSEmanuele Giuseppe Esposito }; 332013199dSEmanuele Giuseppe Esposito 342013199dSEmanuele Giuseppe Esposito #define ARM_PAGE_SIZE 4096 352013199dSEmanuele Giuseppe Esposito #define XILINX_ZYNQ_A9_RAM_ADDR 0 362013199dSEmanuele Giuseppe Esposito #define XILINX_ZYNQ_A9_RAM_SIZE 0x20000000 372013199dSEmanuele Giuseppe Esposito 382013199dSEmanuele Giuseppe Esposito static void *xilinx_zynq_a9_get_driver(void *object, const char *interface) 392013199dSEmanuele Giuseppe Esposito { 402013199dSEmanuele Giuseppe Esposito QXilinxZynqA9Machine *machine = object; 412013199dSEmanuele Giuseppe Esposito if (!g_strcmp0(interface, "memory")) { 422013199dSEmanuele Giuseppe Esposito return &machine->alloc; 432013199dSEmanuele Giuseppe Esposito } 442013199dSEmanuele Giuseppe Esposito 452013199dSEmanuele Giuseppe Esposito fprintf(stderr, "%s not present in arm/xilinx-zynq-a9\n", interface); 462013199dSEmanuele Giuseppe Esposito g_assert_not_reached(); 472013199dSEmanuele Giuseppe Esposito } 482013199dSEmanuele Giuseppe Esposito 492013199dSEmanuele Giuseppe Esposito static QOSGraphObject *xilinx_zynq_a9_get_device(void *obj, const char *device) 502013199dSEmanuele Giuseppe Esposito { 512013199dSEmanuele Giuseppe Esposito QXilinxZynqA9Machine *machine = obj; 522013199dSEmanuele Giuseppe Esposito if (!g_strcmp0(device, "generic-sdhci")) { 532013199dSEmanuele Giuseppe Esposito return &machine->sdhci.obj; 542013199dSEmanuele Giuseppe Esposito } 552013199dSEmanuele Giuseppe Esposito 562013199dSEmanuele Giuseppe Esposito fprintf(stderr, "%s not present in arm/xilinx-zynq-a9\n", device); 572013199dSEmanuele Giuseppe Esposito g_assert_not_reached(); 582013199dSEmanuele Giuseppe Esposito } 592013199dSEmanuele Giuseppe Esposito 602013199dSEmanuele Giuseppe Esposito static void xilinx_zynq_a9_destructor(QOSGraphObject *obj) 612013199dSEmanuele Giuseppe Esposito { 622013199dSEmanuele Giuseppe Esposito QXilinxZynqA9Machine *machine = (QXilinxZynqA9Machine *) obj; 632013199dSEmanuele Giuseppe Esposito alloc_destroy(&machine->alloc); 642013199dSEmanuele Giuseppe Esposito } 652013199dSEmanuele Giuseppe Esposito 662013199dSEmanuele Giuseppe Esposito static void *qos_create_machine_arm_xilinx_zynq_a9(QTestState *qts) 672013199dSEmanuele Giuseppe Esposito { 682013199dSEmanuele Giuseppe Esposito QXilinxZynqA9Machine *machine = g_new0(QXilinxZynqA9Machine, 1); 692013199dSEmanuele Giuseppe Esposito 702013199dSEmanuele Giuseppe Esposito alloc_init(&machine->alloc, 0, 712013199dSEmanuele Giuseppe Esposito XILINX_ZYNQ_A9_RAM_ADDR + (1 << 20), 722013199dSEmanuele Giuseppe Esposito XILINX_ZYNQ_A9_RAM_ADDR + XILINX_ZYNQ_A9_RAM_SIZE, 732013199dSEmanuele Giuseppe Esposito ARM_PAGE_SIZE); 742013199dSEmanuele Giuseppe Esposito 752013199dSEmanuele Giuseppe Esposito machine->obj.get_device = xilinx_zynq_a9_get_device; 762013199dSEmanuele Giuseppe Esposito machine->obj.get_driver = xilinx_zynq_a9_get_driver; 772013199dSEmanuele Giuseppe Esposito machine->obj.destructor = xilinx_zynq_a9_destructor; 782013199dSEmanuele Giuseppe Esposito /* Datasheet: UG585 (v1.12.1) */ 792013199dSEmanuele Giuseppe Esposito qos_init_sdhci_mm(&machine->sdhci, qts, 0xe0100000, &(QSDHCIProperties) { 802013199dSEmanuele Giuseppe Esposito .version = 2, 812013199dSEmanuele Giuseppe Esposito .baseclock = 0, 822013199dSEmanuele Giuseppe Esposito .capab.sdma = true, 832013199dSEmanuele Giuseppe Esposito .capab.reg = 0x69ec0080, 842013199dSEmanuele Giuseppe Esposito }); 852013199dSEmanuele Giuseppe Esposito return &machine->obj; 862013199dSEmanuele Giuseppe Esposito } 872013199dSEmanuele Giuseppe Esposito 882013199dSEmanuele Giuseppe Esposito static void xilinx_zynq_a9_register_nodes(void) 892013199dSEmanuele Giuseppe Esposito { 902013199dSEmanuele Giuseppe Esposito qos_node_create_machine("arm/xilinx-zynq-a9", 912013199dSEmanuele Giuseppe Esposito qos_create_machine_arm_xilinx_zynq_a9); 922013199dSEmanuele Giuseppe Esposito qos_node_contains("arm/xilinx-zynq-a9", "generic-sdhci", NULL); 932013199dSEmanuele Giuseppe Esposito } 942013199dSEmanuele Giuseppe Esposito 952013199dSEmanuele Giuseppe Esposito libqos_init(xilinx_zynq_a9_register_nodes); 96