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 31082587b7SPeter Crosthwaite static struct arm_boot_info xlnx_ep108_binfo; 32082587b7SPeter Crosthwaite 33859a0c5bSPeter Crosthwaite static void xlnx_ep108_init(MachineState *machine) 34859a0c5bSPeter Crosthwaite { 35859a0c5bSPeter Crosthwaite XlnxEP108 *s = g_new0(XlnxEP108, 1); 36859a0c5bSPeter Crosthwaite Error *err = NULL; 37859a0c5bSPeter Crosthwaite 38859a0c5bSPeter Crosthwaite object_initialize(&s->soc, sizeof(s->soc), TYPE_XLNX_ZYNQMP); 39859a0c5bSPeter Crosthwaite object_property_add_child(OBJECT(machine), "soc", OBJECT(&s->soc), 40859a0c5bSPeter Crosthwaite &error_abort); 41859a0c5bSPeter Crosthwaite 42859a0c5bSPeter Crosthwaite object_property_set_bool(OBJECT(&s->soc), true, "realized", &err); 43859a0c5bSPeter Crosthwaite if (err) { 44859a0c5bSPeter Crosthwaite error_report("%s", error_get_pretty(err)); 45859a0c5bSPeter Crosthwaite exit(1); 46859a0c5bSPeter Crosthwaite } 47b79b9d28SPeter Crosthwaite 48b79b9d28SPeter Crosthwaite if (machine->ram_size > EP108_MAX_RAM_SIZE) { 49b79b9d28SPeter Crosthwaite error_report("WARNING: RAM size " RAM_ADDR_FMT " above max supported, " 50b79b9d28SPeter Crosthwaite "reduced to %llx", machine->ram_size, EP108_MAX_RAM_SIZE); 51b79b9d28SPeter Crosthwaite machine->ram_size = EP108_MAX_RAM_SIZE; 52b79b9d28SPeter Crosthwaite } 53b79b9d28SPeter Crosthwaite 54b79b9d28SPeter Crosthwaite if (machine->ram_size <= 0x08000000) { 55b79b9d28SPeter Crosthwaite qemu_log("WARNING: RAM size " RAM_ADDR_FMT " is small for EP108", 56b79b9d28SPeter Crosthwaite machine->ram_size); 57b79b9d28SPeter Crosthwaite } 58b79b9d28SPeter Crosthwaite 59b79b9d28SPeter Crosthwaite memory_region_allocate_system_memory(&s->ddr_ram, NULL, "ddr-ram", 60b79b9d28SPeter Crosthwaite machine->ram_size); 61b79b9d28SPeter Crosthwaite memory_region_add_subregion(get_system_memory(), 0, &s->ddr_ram); 62082587b7SPeter Crosthwaite 63082587b7SPeter Crosthwaite xlnx_ep108_binfo.ram_size = machine->ram_size; 64082587b7SPeter Crosthwaite xlnx_ep108_binfo.kernel_filename = machine->kernel_filename; 65082587b7SPeter Crosthwaite xlnx_ep108_binfo.kernel_cmdline = machine->kernel_cmdline; 66082587b7SPeter Crosthwaite xlnx_ep108_binfo.initrd_filename = machine->initrd_filename; 67082587b7SPeter Crosthwaite xlnx_ep108_binfo.loader_start = 0; 686396a193SPeter Crosthwaite arm_load_kernel(s->soc.boot_cpu_ptr, &xlnx_ep108_binfo); 69859a0c5bSPeter Crosthwaite } 70859a0c5bSPeter Crosthwaite 71e264d29dSEduardo Habkost static void xlnx_ep108_machine_init(MachineClass *mc) 72859a0c5bSPeter Crosthwaite { 73e264d29dSEduardo Habkost mc->desc = "Xilinx ZynqMP EP108 board"; 74e264d29dSEduardo Habkost mc->init = xlnx_ep108_init; 75859a0c5bSPeter Crosthwaite } 76859a0c5bSPeter Crosthwaite 77e264d29dSEduardo Habkost DEFINE_MACHINE("xlnx-ep108", xlnx_ep108_machine_init) 78