xref: /qemu/tests/qtest/libqos/arm-xilinx-zynq-a9-machine.c (revision b243c73cf4dc7017e28577c4056df0655427a76e)
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