1859a0c5bSPeter Crosthwaite /* 2859a0c5bSPeter Crosthwaite * Xilinx ZynqMP EP108 board 3859a0c5bSPeter Crosthwaite * 4859a0c5bSPeter Crosthwaite * Copyright (C) 2015 Xilinx Inc 5859a0c5bSPeter Crosthwaite * Written by Peter Crosthwaite <peter.crosthwaite@xilinx.com> 6859a0c5bSPeter Crosthwaite * 7859a0c5bSPeter Crosthwaite * This program is free software; you can redistribute it and/or modify it 8859a0c5bSPeter Crosthwaite * under the terms of the GNU General Public License as published by the 9859a0c5bSPeter Crosthwaite * Free Software Foundation; either version 2 of the License, or 10859a0c5bSPeter Crosthwaite * (at your option) any later version. 11859a0c5bSPeter Crosthwaite * 12859a0c5bSPeter Crosthwaite * This program is distributed in the hope that it will be useful, but WITHOUT 13859a0c5bSPeter Crosthwaite * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 14859a0c5bSPeter Crosthwaite * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15859a0c5bSPeter Crosthwaite * for more details. 16859a0c5bSPeter Crosthwaite */ 17859a0c5bSPeter Crosthwaite 18859a0c5bSPeter Crosthwaite #include "hw/arm/xlnx-zynqmp.h" 19859a0c5bSPeter Crosthwaite #include "hw/boards.h" 20859a0c5bSPeter Crosthwaite #include "qemu/error-report.h" 21b79b9d28SPeter Crosthwaite #include "exec/address-spaces.h" 22859a0c5bSPeter Crosthwaite 23859a0c5bSPeter Crosthwaite typedef struct XlnxEP108 { 24859a0c5bSPeter Crosthwaite XlnxZynqMPState soc; 25b79b9d28SPeter Crosthwaite MemoryRegion ddr_ram; 26859a0c5bSPeter Crosthwaite } XlnxEP108; 27859a0c5bSPeter Crosthwaite 28b79b9d28SPeter Crosthwaite /* Max 2GB RAM */ 29b79b9d28SPeter Crosthwaite #define EP108_MAX_RAM_SIZE 0x80000000ull 30b79b9d28SPeter Crosthwaite 31859a0c5bSPeter Crosthwaite static void xlnx_ep108_init(MachineState *machine) 32859a0c5bSPeter Crosthwaite { 33859a0c5bSPeter Crosthwaite XlnxEP108 *s = g_new0(XlnxEP108, 1); 34859a0c5bSPeter Crosthwaite Error *err = NULL; 35859a0c5bSPeter Crosthwaite 36859a0c5bSPeter Crosthwaite object_initialize(&s->soc, sizeof(s->soc), TYPE_XLNX_ZYNQMP); 37859a0c5bSPeter Crosthwaite object_property_add_child(OBJECT(machine), "soc", OBJECT(&s->soc), 38859a0c5bSPeter Crosthwaite &error_abort); 39859a0c5bSPeter Crosthwaite 40859a0c5bSPeter Crosthwaite object_property_set_bool(OBJECT(&s->soc), true, "realized", &err); 41859a0c5bSPeter Crosthwaite if (err) { 42859a0c5bSPeter Crosthwaite error_report("%s", error_get_pretty(err)); 43859a0c5bSPeter Crosthwaite exit(1); 44859a0c5bSPeter Crosthwaite } 45b79b9d28SPeter Crosthwaite 46b79b9d28SPeter Crosthwaite if (machine->ram_size > EP108_MAX_RAM_SIZE) { 47b79b9d28SPeter Crosthwaite error_report("WARNING: RAM size " RAM_ADDR_FMT " above max supported, " 48b79b9d28SPeter Crosthwaite "reduced to %llx", machine->ram_size, EP108_MAX_RAM_SIZE); 49b79b9d28SPeter Crosthwaite machine->ram_size = EP108_MAX_RAM_SIZE; 50b79b9d28SPeter Crosthwaite } 51b79b9d28SPeter Crosthwaite 52b79b9d28SPeter Crosthwaite if (machine->ram_size <= 0x08000000) { 53b79b9d28SPeter Crosthwaite qemu_log("WARNING: RAM size " RAM_ADDR_FMT " is small for EP108", 54b79b9d28SPeter Crosthwaite machine->ram_size); 55b79b9d28SPeter Crosthwaite } 56b79b9d28SPeter Crosthwaite 57b79b9d28SPeter Crosthwaite memory_region_allocate_system_memory(&s->ddr_ram, NULL, "ddr-ram", 58b79b9d28SPeter Crosthwaite machine->ram_size); 59b79b9d28SPeter Crosthwaite memory_region_add_subregion(get_system_memory(), 0, &s->ddr_ram); 60859a0c5bSPeter Crosthwaite } 61859a0c5bSPeter Crosthwaite 62859a0c5bSPeter Crosthwaite static QEMUMachine xlnx_ep108_machine = { 63859a0c5bSPeter Crosthwaite .name = "xlnx-ep108", 64859a0c5bSPeter Crosthwaite .desc = "Xilinx ZynqMP EP108 board", 65859a0c5bSPeter Crosthwaite .init = xlnx_ep108_init, 66859a0c5bSPeter Crosthwaite }; 67859a0c5bSPeter Crosthwaite 68859a0c5bSPeter Crosthwaite static void xlnx_ep108_machine_init(void) 69859a0c5bSPeter Crosthwaite { 70859a0c5bSPeter Crosthwaite qemu_register_machine(&xlnx_ep108_machine); 71859a0c5bSPeter Crosthwaite } 72859a0c5bSPeter Crosthwaite 73859a0c5bSPeter Crosthwaite machine_init(xlnx_ep108_machine_init); 74