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"
20907b5105SMarc-André Lureau #include "../libqtest.h"
210b8fa32fSMarkus Armbruster #include "qemu/module.h"
22*b243c73cSXuzhou Cheng #include "libqos-malloc.h"
23a2ce7dbdSPaolo 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
xilinx_zynq_a9_get_driver(void * object,const char * interface)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
xilinx_zynq_a9_get_device(void * obj,const char * device)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
xilinx_zynq_a9_destructor(QOSGraphObject * obj)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
qos_create_machine_arm_xilinx_zynq_a9(QTestState * qts)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
xilinx_zynq_a9_register_nodes(void)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