xref: /qemu/hw/arm/mcimx6ul-evk.c (revision 4d7dd4ed4f42e659a214e4f81c1a15ee991352df)
1  /*
2   * Copyright (c) 2018 Jean-Christophe Dubois <jcd@tribudubois.net>
3   *
4   * MCIMX6UL_EVK Board System emulation.
5   *
6   * This code is licensed under the GPL, version 2 or later.
7   * See the file `COPYING' in the top level directory.
8   *
9   * It (partially) emulates a mcimx6ul_evk board, with a Freescale
10   * i.MX6ul SoC
11   */
12  
13  #include "qemu/osdep.h"
14  #include "qapi/error.h"
15  #include "hw/arm/fsl-imx6ul.h"
16  #include "hw/arm/boot.h"
17  #include "hw/boards.h"
18  #include "hw/qdev-properties.h"
19  #include "qemu/error-report.h"
20  #include "sysemu/qtest.h"
21  
22  static void mcimx6ul_evk_init(MachineState *machine)
23  {
24      static struct arm_boot_info boot_info;
25      FslIMX6ULState *s;
26      int i;
27  
28      if (machine->ram_size > FSL_IMX6UL_MMDC_SIZE) {
29          error_report("RAM size " RAM_ADDR_FMT " above max supported (%08x)",
30                       machine->ram_size, FSL_IMX6UL_MMDC_SIZE);
31          exit(1);
32      }
33  
34      boot_info = (struct arm_boot_info) {
35          .loader_start = FSL_IMX6UL_MMDC_ADDR,
36          .board_id = -1,
37          .ram_size = machine->ram_size,
38          .psci_conduit = QEMU_PSCI_CONDUIT_SMC,
39      };
40  
41      s = FSL_IMX6UL(object_new(TYPE_FSL_IMX6UL));
42      object_property_add_child(OBJECT(machine), "soc", OBJECT(s));
43      object_property_set_uint(OBJECT(s), "fec1-phy-num", 2, &error_fatal);
44      object_property_set_uint(OBJECT(s), "fec2-phy-num", 1, &error_fatal);
45      object_property_set_bool(OBJECT(s), "fec1-phy-connected", false,
46                               &error_fatal);
47      qdev_realize(DEVICE(s), NULL, &error_fatal);
48  
49      memory_region_add_subregion(get_system_memory(), FSL_IMX6UL_MMDC_ADDR,
50                                  machine->ram);
51  
52      for (i = 0; i < FSL_IMX6UL_NUM_USDHCS; i++) {
53          BusState *bus;
54          DeviceState *carddev;
55          DriveInfo *di;
56          BlockBackend *blk;
57  
58          di = drive_get(IF_SD, 0, i);
59          blk = di ? blk_by_legacy_dinfo(di) : NULL;
60          bus = qdev_get_child_bus(DEVICE(&s->usdhc[i]), "sd-bus");
61          carddev = qdev_new(TYPE_SD_CARD);
62          qdev_prop_set_drive_err(carddev, "drive", blk, &error_fatal);
63          qdev_realize_and_unref(carddev, bus, &error_fatal);
64      }
65  
66      if (!qtest_enabled()) {
67          arm_load_kernel(&s->cpu, machine, &boot_info);
68      }
69  }
70  
71  static void mcimx6ul_evk_machine_init(MachineClass *mc)
72  {
73      mc->desc = "Freescale i.MX6UL Evaluation Kit (Cortex-A7)";
74      mc->init = mcimx6ul_evk_init;
75      mc->max_cpus = FSL_IMX6UL_NUM_CPUS;
76      mc->default_ram_id = "mcimx6ul-evk.ram";
77  }
78  DEFINE_MACHINE("mcimx6ul-evk", mcimx6ul_evk_machine_init)
79