1
+/*
2
+ * ASPEED AST1040 EVB
3
+ *
4
+ * Copyright (C) 2026 ASPEED Technology Inc.
5
+ *
6
+ * SPDX-License-Identifier: GPL-2.0-or-later
7
+ */
8
+
9
+#include "qemu/osdep.h"
10
+#include "qapi/error.h"
11
+#include "hw/arm/boot.h"
12
+#include "hw/arm/machines-qom.h"
13
+#include "hw/arm/aspeed.h"
14
+#include "hw/arm/aspeed_soc.h"
15
+#include "hw/core/qdev-clock.h"
16
+#include "system/system.h"
17
+
18
+#define AST1040_INTERNAL_FLASH_SIZE (4 * MiB)
19
+/* Main SYSCLK frequency in Hz (400MHz) */
20
+#define SYSCLK_FRQ 400000000ULL
21
+
22
+static void aspeed_bic_machine_init(MachineState *machine)
23
+{
24
+ AspeedMachineState *bmc = ASPEED_MACHINE(machine);
25
+ AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
26
+ Clock *sysclk;
27
+
28
+ sysclk = clock_new(OBJECT(machine), "SYSCLK");
29
+ clock_set_hz(sysclk, SYSCLK_FRQ);
30
+
31
+ bmc->soc = ASPEED_SOC(object_new(amc->soc_name));
32
+ object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc));
33
+ object_unref(OBJECT(bmc->soc));
34
+ qdev_connect_clock_in(DEVICE(bmc->soc), "sysclk", sysclk);
35
+
36
+ object_property_set_link(OBJECT(bmc->soc), "memory",
37
+ OBJECT(get_system_memory()), &error_abort);
38
+ aspeed_connect_serial_hds_to_uarts(bmc);
39
+ qdev_realize(DEVICE(bmc->soc), NULL, &error_abort);
40
+
41
+ armv7m_load_kernel(ARM_CPU(first_cpu),
42
+ machine->kernel_filename,
43
+ 0,
44
+ AST1040_INTERNAL_FLASH_SIZE);
45
+}
46
+
47
+static void aspeed_machine_ast1040_evb_class_init(ObjectClass *oc,
48
+ const void *data)
49
+{
50
+ MachineClass *mc = MACHINE_CLASS(oc);
51
+ AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
52
+
53
+ mc->desc = "Aspeed AST1040 BIC EVB (Cortex-M4F)";
54
+ amc->soc_name = "ast1040-a0";
55
+ amc->hw_strap1 = 0;
56
+ amc->hw_strap2 = 0;
57
+ mc->init = aspeed_bic_machine_init;
58
+ mc->default_ram_size = 0;
59
+ amc->macs_mask = 0;
60
+ amc->uart_default = ASPEED_DEV_UART12;
61
+ aspeed_machine_class_init_cpus_defaults(mc);
62
+}
63
+
64
+static const TypeInfo aspeed_ast1040_evb_types[] = {
65
+ {
66
+ .name = MACHINE_TYPE_NAME("ast1040-evb"),
67
+ .parent = TYPE_ASPEED_MACHINE,
68
+ .class_init = aspeed_machine_ast1040_evb_class_init,
69
+ .interfaces = arm_machine_interfaces,
70
+ }
71
+};
72
+
73
+DEFINE_TYPES(aspeed_ast1040_evb_types)