1*a4eefc69SBernhard Beschow /* 2*a4eefc69SBernhard Beschow * NXP i.MX 8M Plus Evaluation Kit System Emulation 3*a4eefc69SBernhard Beschow * 4*a4eefc69SBernhard Beschow * Copyright (c) 2024, Bernhard Beschow <shentey@gmail.com> 5*a4eefc69SBernhard Beschow * 6*a4eefc69SBernhard Beschow * SPDX-License-Identifier: GPL-2.0-or-later 7*a4eefc69SBernhard Beschow */ 8*a4eefc69SBernhard Beschow 9*a4eefc69SBernhard Beschow #include "qemu/osdep.h" 10*a4eefc69SBernhard Beschow #include "exec/address-spaces.h" 11*a4eefc69SBernhard Beschow #include "hw/arm/boot.h" 12*a4eefc69SBernhard Beschow #include "hw/arm/fsl-imx8mp.h" 13*a4eefc69SBernhard Beschow #include "hw/boards.h" 14*a4eefc69SBernhard Beschow #include "system/qtest.h" 15*a4eefc69SBernhard Beschow #include "qemu/error-report.h" 16*a4eefc69SBernhard Beschow #include "qapi/error.h" 17*a4eefc69SBernhard Beschow 18*a4eefc69SBernhard Beschow static void imx8mp_evk_init(MachineState *machine) 19*a4eefc69SBernhard Beschow { 20*a4eefc69SBernhard Beschow static struct arm_boot_info boot_info; 21*a4eefc69SBernhard Beschow FslImx8mpState *s; 22*a4eefc69SBernhard Beschow 23*a4eefc69SBernhard Beschow if (machine->ram_size > FSL_IMX8MP_RAM_SIZE_MAX) { 24*a4eefc69SBernhard Beschow error_report("RAM size " RAM_ADDR_FMT " above max supported (%08" PRIx64 ")", 25*a4eefc69SBernhard Beschow machine->ram_size, FSL_IMX8MP_RAM_SIZE_MAX); 26*a4eefc69SBernhard Beschow exit(1); 27*a4eefc69SBernhard Beschow } 28*a4eefc69SBernhard Beschow 29*a4eefc69SBernhard Beschow boot_info = (struct arm_boot_info) { 30*a4eefc69SBernhard Beschow .loader_start = FSL_IMX8MP_RAM_START, 31*a4eefc69SBernhard Beschow .board_id = -1, 32*a4eefc69SBernhard Beschow .ram_size = machine->ram_size, 33*a4eefc69SBernhard Beschow .psci_conduit = QEMU_PSCI_CONDUIT_SMC, 34*a4eefc69SBernhard Beschow }; 35*a4eefc69SBernhard Beschow 36*a4eefc69SBernhard Beschow s = FSL_IMX8MP(object_new(TYPE_FSL_IMX8MP)); 37*a4eefc69SBernhard Beschow object_property_add_child(OBJECT(machine), "soc", OBJECT(s)); 38*a4eefc69SBernhard Beschow qdev_realize(DEVICE(s), NULL, &error_fatal); 39*a4eefc69SBernhard Beschow 40*a4eefc69SBernhard Beschow memory_region_add_subregion(get_system_memory(), FSL_IMX8MP_RAM_START, 41*a4eefc69SBernhard Beschow machine->ram); 42*a4eefc69SBernhard Beschow 43*a4eefc69SBernhard Beschow if (!qtest_enabled()) { 44*a4eefc69SBernhard Beschow arm_load_kernel(&s->cpu[0], machine, &boot_info); 45*a4eefc69SBernhard Beschow } 46*a4eefc69SBernhard Beschow } 47*a4eefc69SBernhard Beschow 48*a4eefc69SBernhard Beschow static void imx8mp_evk_machine_init(MachineClass *mc) 49*a4eefc69SBernhard Beschow { 50*a4eefc69SBernhard Beschow mc->desc = "NXP i.MX 8M Plus EVK Board"; 51*a4eefc69SBernhard Beschow mc->init = imx8mp_evk_init; 52*a4eefc69SBernhard Beschow mc->max_cpus = FSL_IMX8MP_NUM_CPUS; 53*a4eefc69SBernhard Beschow mc->default_ram_id = "imx8mp-evk.ram"; 54*a4eefc69SBernhard Beschow } 55*a4eefc69SBernhard Beschow DEFINE_MACHINE("imx8mp-evk", imx8mp_evk_machine_init) 56