]> git.proxmox.com Git - mirror_qemu.git/blame - hw/arm/aspeed.c
Merge tag 'pull-maintainer-may24-160524-2' of https://gitlab.com/stsquad/qemu into...
[mirror_qemu.git] / hw / arm / aspeed.c
CommitLineData
327d8e4e
AJ
1/*
2 * OpenPOWER Palmetto BMC
3 *
4 * Andrew Jeffery <andrew@aj.id.au>
5 *
6 * Copyright 2016 IBM Corp.
7 *
8 * This code is licensed under the GPL version 2 or later. See
9 * the COPYING file in the top-level directory.
10 */
11
12#include "qemu/osdep.h"
da34e65c 13#include "qapi/error.h"
12ec8bd5 14#include "hw/arm/boot.h"
fca9ca1b 15#include "hw/arm/aspeed.h"
00442402 16#include "hw/arm/aspeed_soc.h"
c0216b94 17#include "hw/arm/aspeed_eeprom.h"
8285490b 18#include "hw/block/flash.h"
3ec75e39 19#include "hw/i2c/i2c_mux_pca954x.h"
93198b6c 20#include "hw/i2c/smbus_eeprom.h"
6328d8ff 21#include "hw/gpio/pca9552.h"
9618ebae 22#include "hw/nvram/eeprom_at24c.h"
5e9ae4b1 23#include "hw/sensor/tmp105.h"
7cfbde5e 24#include "hw/misc/led.h"
a27bd6c7 25#include "hw/qdev-properties.h"
e1ad9bc4 26#include "sysemu/block-backend.h"
fa699e80 27#include "sysemu/reset.h"
d769a1da
CLG
28#include "hw/loader.h"
29#include "qemu/error-report.h"
a9df9622 30#include "qemu/units.h"
66c895b8 31#include "hw/qdev-clock.h"
d2b3eaef 32#include "sysemu/sysemu.h"
327d8e4e 33
74fb1f38 34static struct arm_boot_info aspeed_board_binfo = {
b033271f 35 .board_id = -1, /* device-tree-only board */
327d8e4e
AJ
36};
37
612b219a 38struct AspeedMachineState {
888b2b03
PMD
39 /* Private */
40 MachineState parent_obj;
41 /* Public */
42
3c392e87 43 AspeedSoCState *soc;
262259ea 44 MemoryRegion boot_rom;
888b2b03 45 bool mmio_exec;
f65f6ad5 46 uint32_t uart_chosen;
9820e52f
CLG
47 char *fmc_model;
48 char *spi_model;
ea066d39 49};
327d8e4e 50
1e2c22c9
CLG
51/* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */
52#if HOST_LONG_BITS == 32
53#define ASPEED_RAM_SIZE(sz) MIN((sz), 1 * GiB)
54#else
55#define ASPEED_RAM_SIZE(sz) (sz)
56#endif
57
ef17f836 58/* Palmetto hardware value: 0x120CE416 */
8da33ef7
CLG
59#define PALMETTO_BMC_HW_STRAP1 ( \
60 SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_256MB) | \
61 SCU_AST2400_HW_STRAP_DRAM_CONFIG(2 /* DDR3 with CL=6, CWL=5 */) | \
62 SCU_AST2400_HW_STRAP_ACPI_DIS | \
63 SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) | \
64 SCU_HW_STRAP_VGA_CLASS_CODE | \
65 SCU_HW_STRAP_LPC_RESET_PIN | \
66 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) | \
67 SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
68 SCU_HW_STRAP_SPI_WIDTH | \
69 SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \
70 SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
71
40a38df5
ES
72/* TODO: Find the actual hardware value */
73#define SUPERMICROX11_BMC_HW_STRAP1 ( \
74 SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) | \
75 SCU_AST2400_HW_STRAP_DRAM_CONFIG(2) | \
76 SCU_AST2400_HW_STRAP_ACPI_DIS | \
77 SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) | \
78 SCU_HW_STRAP_VGA_CLASS_CODE | \
79 SCU_HW_STRAP_LPC_RESET_PIN | \
80 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) | \
81 SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
82 SCU_HW_STRAP_SPI_WIDTH | \
83 SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \
84 SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
85
47936597
GR
86/* TODO: Find the actual hardware value */
87#define SUPERMICRO_X11SPI_BMC_HW_STRAP1 ( \
88 AST2500_HW_STRAP1_DEFAULTS | \
89 SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \
90 SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \
91 SCU_AST2500_HW_STRAP_UART_DEBUG | \
92 SCU_AST2500_HW_STRAP_DDR4_ENABLE | \
93 SCU_HW_STRAP_SPI_WIDTH | \
94 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN))
95
ef17f836 96/* AST2500 evb hardware value: 0xF100C2E6 */
9a7c1750
CLG
97#define AST2500_EVB_HW_STRAP1 (( \
98 AST2500_HW_STRAP1_DEFAULTS | \
99 SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \
100 SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \
101 SCU_AST2500_HW_STRAP_UART_DEBUG | \
102 SCU_AST2500_HW_STRAP_DDR4_ENABLE | \
103 SCU_HW_STRAP_MAC1_RGMII | \
104 SCU_HW_STRAP_MAC0_RGMII) & \
105 ~SCU_HW_STRAP_2ND_BOOT_WDT)
106
ef17f836
CLG
107/* Romulus hardware value: 0xF10AD206 */
108#define ROMULUS_BMC_HW_STRAP1 ( \
109 AST2500_HW_STRAP1_DEFAULTS | \
110 SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \
111 SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \
112 SCU_AST2500_HW_STRAP_UART_DEBUG | \
113 SCU_AST2500_HW_STRAP_DDR4_ENABLE | \
114 SCU_AST2500_HW_STRAP_ACPI_ENABLE | \
115 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER))
116
143b040f
PW
117/* Sonorapass hardware value: 0xF100D216 */
118#define SONORAPASS_BMC_HW_STRAP1 ( \
119 SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \
120 SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \
121 SCU_AST2500_HW_STRAP_UART_DEBUG | \
122 SCU_AST2500_HW_STRAP_RESERVED28 | \
123 SCU_AST2500_HW_STRAP_DDR4_ENABLE | \
124 SCU_HW_STRAP_VGA_CLASS_CODE | \
125 SCU_HW_STRAP_LPC_RESET_PIN | \
126 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \
127 SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \
128 SCU_HW_STRAP_VGA_BIOS_ROM | \
129 SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \
130 SCU_AST2500_HW_STRAP_RESERVED1)
131
95f068c8
JW
132#define G220A_BMC_HW_STRAP1 ( \
133 SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \
134 SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \
135 SCU_AST2500_HW_STRAP_UART_DEBUG | \
136 SCU_AST2500_HW_STRAP_RESERVED28 | \
137 SCU_AST2500_HW_STRAP_DDR4_ENABLE | \
138 SCU_HW_STRAP_2ND_BOOT_WDT | \
139 SCU_HW_STRAP_VGA_CLASS_CODE | \
140 SCU_HW_STRAP_LPC_RESET_PIN | \
141 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \
142 SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \
143 SCU_HW_STRAP_VGA_SIZE_SET(VGA_64M_DRAM) | \
144 SCU_AST2500_HW_STRAP_RESERVED1)
145
82b6a3f6
JW
146/* FP5280G2 hardware value: 0XF100D286 */
147#define FP5280G2_BMC_HW_STRAP1 ( \
148 SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \
149 SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \
150 SCU_AST2500_HW_STRAP_UART_DEBUG | \
151 SCU_AST2500_HW_STRAP_RESERVED28 | \
152 SCU_AST2500_HW_STRAP_DDR4_ENABLE | \
153 SCU_HW_STRAP_VGA_CLASS_CODE | \
154 SCU_HW_STRAP_LPC_RESET_PIN | \
155 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \
156 SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \
157 SCU_HW_STRAP_MAC1_RGMII | \
158 SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \
159 SCU_AST2500_HW_STRAP_RESERVED1)
160
62c2c2eb
CLG
161/* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */
162#define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1
163
9cccb912
PV
164/* Quanta-Q71l hardware value */
165#define QUANTA_Q71L_BMC_HW_STRAP1 ( \
166 SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) | \
167 SCU_AST2400_HW_STRAP_DRAM_CONFIG(2/* DDR3 with CL=6, CWL=5 */) | \
168 SCU_AST2400_HW_STRAP_ACPI_DIS | \
169 SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_24M_IN) | \
170 SCU_HW_STRAP_VGA_CLASS_CODE | \
171 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_PASS_THROUGH) | \
172 SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
173 SCU_HW_STRAP_SPI_WIDTH | \
174 SCU_HW_STRAP_VGA_SIZE_SET(VGA_8M_DRAM) | \
175 SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
176
ccc2c418
CLG
177/* AST2600 evb hardware value */
178#define AST2600_EVB_HW_STRAP1 0x000000C0
179#define AST2600_EVB_HW_STRAP2 0x00000003
180
63ceb818
CLG
181/* Tacoma hardware value */
182#define TACOMA_BMC_HW_STRAP1 0x00000000
7582591a 183#define TACOMA_BMC_HW_STRAP2 0x00000040
63ceb818 184
58e52bdb 185/* Rainier hardware value: (QEMU prototype) */
b6d1df64
JS
186#define RAINIER_BMC_HW_STRAP1 0x00422016
187#define RAINIER_BMC_HW_STRAP2 0x80000848
58e52bdb 188
febbe308
PD
189/* Fuji hardware value */
190#define FUJI_BMC_HW_STRAP1 0x00000000
191#define FUJI_BMC_HW_STRAP2 0x00000000
192
a20c54b1
PW
193/* Bletchley hardware value */
194/* TODO: Leave same as EVB for now. */
195#define BLETCHLEY_BMC_HW_STRAP1 AST2600_EVB_HW_STRAP1
196#define BLETCHLEY_BMC_HW_STRAP2 AST2600_EVB_HW_STRAP2
197
fb6b3c8d
JHY
198/* Qualcomm DC-SCM hardware value */
199#define QCOM_DC_SCM_V1_BMC_HW_STRAP1 0x00000000
200#define QCOM_DC_SCM_V1_BMC_HW_STRAP2 0x00000041
201
9bb6d140
JS
202#define AST_SMP_MAILBOX_BASE 0x1e6e2180
203#define AST_SMP_MBOX_FIELD_ENTRY (AST_SMP_MAILBOX_BASE + 0x0)
204#define AST_SMP_MBOX_FIELD_GOSIGN (AST_SMP_MAILBOX_BASE + 0x4)
205#define AST_SMP_MBOX_FIELD_READY (AST_SMP_MAILBOX_BASE + 0x8)
206#define AST_SMP_MBOX_FIELD_POLLINSN (AST_SMP_MAILBOX_BASE + 0xc)
207#define AST_SMP_MBOX_CODE (AST_SMP_MAILBOX_BASE + 0x10)
208#define AST_SMP_MBOX_GOSIGN 0xabbaab00
209
210static void aspeed_write_smpboot(ARMCPU *cpu,
211 const struct arm_boot_info *info)
212{
902bba54
CLG
213 AddressSpace *as = arm_boot_address_space(cpu, info);
214 static const ARMInsnFixup poll_mailbox_ready[] = {
9bb6d140
JS
215 /*
216 * r2 = per-cpu go sign value
217 * r1 = AST_SMP_MBOX_FIELD_ENTRY
218 * r0 = AST_SMP_MBOX_FIELD_GOSIGN
219 */
902bba54
CLG
220 { 0xee100fb0 }, /* mrc p15, 0, r0, c0, c0, 5 */
221 { 0xe21000ff }, /* ands r0, r0, #255 */
222 { 0xe59f201c }, /* ldr r2, [pc, #28] */
223 { 0xe1822000 }, /* orr r2, r2, r0 */
224
225 { 0xe59f1018 }, /* ldr r1, [pc, #24] */
226 { 0xe59f0018 }, /* ldr r0, [pc, #24] */
227
228 { 0xe320f002 }, /* wfe */
229 { 0xe5904000 }, /* ldr r4, [r0] */
230 { 0xe1520004 }, /* cmp r2, r4 */
231 { 0x1afffffb }, /* bne <wfe> */
232 { 0xe591f000 }, /* ldr pc, [r1] */
233 { AST_SMP_MBOX_GOSIGN },
234 { AST_SMP_MBOX_FIELD_ENTRY },
235 { AST_SMP_MBOX_FIELD_GOSIGN },
236 { 0, FIXUP_TERMINATOR }
9bb6d140 237 };
902bba54 238 static const uint32_t fixupcontext[FIXUP_MAX] = { 0 };
9bb6d140 239
902bba54
CLG
240 arm_write_bootloader("aspeed.smpboot", as, info->smp_loader_start,
241 poll_mailbox_ready, fixupcontext);
9bb6d140
JS
242}
243
244static void aspeed_reset_secondary(ARMCPU *cpu,
245 const struct arm_boot_info *info)
246{
247 AddressSpace *as = arm_boot_address_space(cpu, info);
248 CPUState *cs = CPU(cpu);
249
250 /* info->smp_bootreg_addr */
251 address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0,
252 MEMTXATTRS_UNSPECIFIED, NULL);
253 cpu_set_pc(cs, info->smp_loader_start);
254}
255
8b744a6a 256static void write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size,
d769a1da
CLG
257 Error **errp)
258{
05e6e40a 259 g_autofree void *storage = NULL;
0c7209be
CLG
260 int64_t size;
261
262 /* The block backend size should have already been 'validated' by
263 * the creation of the m25p80 object.
264 */
265 size = blk_getlength(blk);
266 if (size <= 0) {
267 error_setg(errp, "failed to get flash size");
268 return;
269 }
d769a1da 270
0c7209be
CLG
271 if (rom_size > size) {
272 rom_size = size;
d769a1da
CLG
273 }
274
05e6e40a 275 storage = g_malloc0(rom_size);
a9262f55 276 if (blk_pread(blk, 0, rom_size, storage, 0) < 0) {
d769a1da
CLG
277 error_setg(errp, "failed to read the initial flash content");
278 return;
279 }
280
281 rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr);
d769a1da
CLG
282}
283
8b744a6a
CLG
284/*
285 * Create a ROM and copy the flash contents at the expected address
286 * (0x0). Boots faster than execute-in-place.
287 */
262259ea 288static void aspeed_install_boot_rom(AspeedMachineState *bmc, BlockBackend *blk,
8b744a6a
CLG
289 uint64_t rom_size)
290{
3c392e87 291 AspeedSoCState *soc = bmc->soc;
db052d0e 292 AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(soc);
8b744a6a 293
262259ea 294 memory_region_init_rom(&bmc->boot_rom, NULL, "aspeed.boot_rom", rom_size,
8b744a6a
CLG
295 &error_abort);
296 memory_region_add_subregion_overlap(&soc->spi_boot_container, 0,
262259ea 297 &bmc->boot_rom, 1);
db052d0e
JL
298 write_boot_rom(blk, sc->memmap[ASPEED_DEV_SPI_BOOT],
299 rom_size, &error_abort);
8b744a6a
CLG
300}
301
1099ad10 302void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
9bd4ac61 303 unsigned int count, int unit0)
e1ad9bc4 304{
179b2058
PW
305 int i;
306
307 if (!flashtype) {
308 return;
309 }
e1ad9bc4 310
9bd4ac61 311 for (i = 0; i < count; ++i) {
8ec239f2 312 DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i);
a7d78bef 313 DeviceState *dev;
e1ad9bc4 314
a7d78bef 315 dev = qdev_new(flashtype);
e1ad9bc4 316 if (dinfo) {
a7d78bef 317 qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo));
e1ad9bc4 318 }
27a2c66c 319 qdev_prop_set_uint8(dev, "cs", i);
a7d78bef 320 qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal);
e1ad9bc4
CLG
321 }
322}
323
a29e3e12
AJ
324static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo)
325{
326 DeviceState *card;
327
756f739b
PMD
328 if (!dinfo) {
329 return;
a29e3e12 330 }
756f739b
PMD
331 card = qdev_new(TYPE_SD_CARD);
332 qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
333 &error_fatal);
3e80f690
MA
334 qdev_realize_and_unref(card,
335 qdev_get_child_bus(DEVICE(sdhci), "sd-bus"),
336 &error_fatal);
a29e3e12
AJ
337}
338
d2b3eaef
PD
339static void connect_serial_hds_to_uarts(AspeedMachineState *bmc)
340{
341 AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
3c392e87 342 AspeedSoCState *s = bmc->soc;
d2b3eaef 343 AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
f65f6ad5 344 int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default;
d2b3eaef 345
f65f6ad5 346 aspeed_soc_uart_set_chr(s, uart_chosen, serial_hd(0));
944128ee 347 for (int i = 1, uart = sc->uarts_base; i < sc->uarts_num; i++, uart++) {
f65f6ad5 348 if (uart == uart_chosen) {
d2b3eaef
PD
349 continue;
350 }
351 aspeed_soc_uart_set_chr(s, uart, serial_hd(i));
352 }
353}
354
baa4732b 355static void aspeed_machine_init(MachineState *machine)
327d8e4e 356{
888b2b03 357 AspeedMachineState *bmc = ASPEED_MACHINE(machine);
baa4732b 358 AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
b033271f 359 AspeedSoCClass *sc;
2bea128c 360 int i;
327d8e4e 361
3c392e87
PMD
362 bmc->soc = ASPEED_SOC(object_new(amc->soc_name));
363 object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc));
364 object_unref(OBJECT(bmc->soc));
365 sc = ASPEED_SOC_GET_CLASS(bmc->soc);
b033271f 366
533eb415 367 /*
346160cb
CLG
368 * This will error out if the RAM size is not supported by the
369 * memory controller of the SoC.
533eb415 370 */
3c392e87 371 object_property_set_uint(OBJECT(bmc->soc), "ram-size", machine->ram_size,
533eb415
IM
372 &error_fatal);
373
d3bad7e7 374 for (i = 0; i < sc->macs_num; i++) {
b3cfec5b
DW
375 if ((amc->macs_mask & (1 << i)) &&
376 !qemu_configure_nic_device(DEVICE(&bmc->soc->ftgmac100[i]),
377 true, NULL)) {
378 break; /* No configs left; stop asking */
d3bad7e7
CLG
379 }
380 }
381
3c392e87 382 object_property_set_int(OBJECT(bmc->soc), "hw-strap1", amc->hw_strap1,
87e79af0 383 &error_abort);
3c392e87 384 object_property_set_int(OBJECT(bmc->soc), "hw-strap2", amc->hw_strap2,
ccc2c418 385 &error_abort);
3c392e87 386 object_property_set_link(OBJECT(bmc->soc), "memory",
4dd9d554 387 OBJECT(get_system_memory()), &error_abort);
3c392e87 388 object_property_set_link(OBJECT(bmc->soc), "dram",
0df2d9a6 389 OBJECT(machine->ram), &error_abort);
b6e70d1d
JS
390 if (machine->kernel_filename) {
391 /*
392 * When booting with a -kernel command line there is no u-boot
393 * that runs to unlock the SCU. In this case set the default to
394 * be unlocked as the kernel expects
395 */
3c392e87 396 object_property_set_int(OBJECT(bmc->soc), "hw-prot-key",
5325cc34 397 ASPEED_SCU_PROT_KEY, &error_abort);
b6e70d1d 398 }
d2b3eaef 399 connect_serial_hds_to_uarts(bmc);
3c392e87 400 qdev_realize(DEVICE(bmc->soc), NULL, &error_abort);
327d8e4e 401
c7e313ae 402 if (defaults_enabled()) {
3c392e87 403 aspeed_board_init_flashes(&bmc->soc->fmc,
8ec239f2 404 bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
9bd4ac61 405 amc->num_cs, 0);
3c392e87 406 aspeed_board_init_flashes(&bmc->soc->spi[0],
8ec239f2 407 bmc->spi_model ? bmc->spi_model : amc->spi_model,
9bd4ac61 408 1, amc->num_cs);
c7e313ae 409 }
74fb1f38 410
b7f1a0cb 411 if (machine->kernel_filename && sc->num_cpus > 1) {
9bb6d140
JS
412 /* With no u-boot we must set up a boot stub for the secondary CPU */
413 MemoryRegion *smpboot = g_new(MemoryRegion, 1);
f489960d 414 memory_region_init_ram(smpboot, NULL, "aspeed.smpboot",
9bb6d140
JS
415 0x80, &error_abort);
416 memory_region_add_subregion(get_system_memory(),
417 AST_SMP_MAILBOX_BASE, smpboot);
418
419 aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot;
420 aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary;
421 aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE;
422 }
423
6e504a98 424 aspeed_board_binfo.ram_size = machine->ram_size;
347df6f8 425 aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM];
e1ad9bc4 426
baa4732b
CLG
427 if (amc->i2c_init) {
428 amc->i2c_init(bmc);
2cf6cb50
CLG
429 }
430
3c392e87
PMD
431 for (i = 0; i < bmc->soc->sdhci.num_slots; i++) {
432 sdhci_attach_drive(&bmc->soc->sdhci.slots[i],
8ec239f2 433 drive_get(IF_SD, 0, i));
a29e3e12 434 }
2bea128c 435
3c392e87
PMD
436 if (bmc->soc->emmc.num_slots) {
437 sdhci_attach_drive(&bmc->soc->emmc.slots[0],
438 drive_get(IF_SD, 0, bmc->soc->sdhci.num_slots));
2bea128c
EJ
439 }
440
8b744a6a 441 if (!bmc->mmio_exec) {
3c392e87 442 DeviceState *dev = ssi_get_cs(bmc->soc->fmc.spi, 0);
8285490b 443 BlockBackend *fmc0 = dev ? m25p80_get_blk(dev) : NULL;
8b744a6a 444
8285490b 445 if (fmc0) {
3c392e87 446 uint64_t rom_size = memory_region_size(&bmc->soc->spi_boot);
8285490b 447 aspeed_install_boot_rom(bmc, fmc0, rom_size);
8b744a6a
CLG
448 }
449 }
450
2744ece8 451 arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo);
74fb1f38 452}
b033271f 453
612b219a 454static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
2cf6cb50 455{
3c392e87 456 AspeedSoCState *soc = bmc->soc;
a87e81b9 457 DeviceState *dev;
3d165f12 458 uint8_t *eeprom_buf = g_malloc0(32 * 1024);
2cf6cb50
CLG
459
460 /* The palmetto platform expects a ds3231 RTC but a ds1338 is
461 * enough to provide basic RTC features. Alarms will be missing */
1373b15b 462 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
a87e81b9 463
7a204cbd 464 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
3d165f12
CLG
465 eeprom_buf);
466
a87e81b9 467 /* add a TMP423 temperature sensor */
1373b15b
PMD
468 dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
469 "tmp423", 0x4c));
5325cc34
MA
470 object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
471 object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
472 object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
473 object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort);
2cf6cb50
CLG
474}
475
9cccb912
PV
476static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc)
477{
3c392e87 478 AspeedSoCState *soc = bmc->soc;
9cccb912
PV
479
480 /*
481 * The quanta-q71l platform expects tmp75s which are compatible with
482 * tmp105s.
483 */
484 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c);
485 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e);
486 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f);
487
488 /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */
489 /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */
490 /* TODO: Add Memory Riser i2c mux and eeproms. */
491
3ec75e39
PV
492 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74);
493 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77);
494
9cccb912 495 /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */
3ec75e39
PV
496
497 /* i2c-7 */
498 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70);
9cccb912
PV
499 /* - i2c@0: pmbus@59 */
500 /* - i2c@1: pmbus@58 */
501 /* - i2c@2: pmbus@58 */
502 /* - i2c@3: pmbus@59 */
3ec75e39 503
9cccb912
PV
504 /* TODO: i2c-7: Add PDB FRU eeprom@52 */
505 /* TODO: i2c-8: Add BMC FRU eeprom@50 */
506}
507
612b219a 508static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
2cf6cb50 509{
3c392e87 510 AspeedSoCState *soc = bmc->soc;
3d165f12
CLG
511 uint8_t *eeprom_buf = g_malloc0(8 * 1024);
512
7a204cbd 513 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50,
3d165f12 514 eeprom_buf);
2cf6cb50
CLG
515
516 /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
1373b15b 517 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
044475f3 518 TYPE_TMP105, 0x4d);
2cf6cb50
CLG
519}
520
612b219a 521static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
ccc2c418 522{
3c392e87 523 AspeedSoCState *soc = bmc->soc;
52bcd997
HC
524 uint8_t *eeprom_buf = g_malloc0(8 * 1024);
525
526 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50,
527 eeprom_buf);
528
529 /* LM75 is compatible with TMP105 driver */
530 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
531 TYPE_TMP105, 0x4d);
ccc2c418
CLG
532}
533
34f73a81
KP
534static void yosemitev2_bmc_i2c_init(AspeedMachineState *bmc)
535{
3c392e87 536 AspeedSoCState *soc = bmc->soc;
34f73a81
KP
537
538 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x51, 128 * KiB);
539 at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 128 * KiB,
540 yosemitev2_bmc_fruid, yosemitev2_bmc_fruid_len);
0a1f86ba
KP
541 /* TMP421 */
542 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "tmp421", 0x1f);
543 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4e);
544 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4f);
545
34f73a81
KP
546}
547
612b219a 548static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
6c4567c7 549{
3c392e87 550 AspeedSoCState *soc = bmc->soc;
6c4567c7
CLG
551
552 /* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
553 * good enough */
1373b15b 554 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
6c4567c7
CLG
555}
556
6c323aba
KP
557static void tiogapass_bmc_i2c_init(AspeedMachineState *bmc)
558{
3c392e87 559 AspeedSoCState *soc = bmc->soc;
6c323aba
KP
560
561 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 128 * KiB);
562 at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 6), 0x54, 128 * KiB,
563 tiogapass_bmc_fruid, tiogapass_bmc_fruid_len);
a09d357d
KP
564 /* TMP421 */
565 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "tmp421", 0x1f);
566 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4f);
567 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4e);
6c323aba
KP
568}
569
f4aec252
CLG
570static void create_pca9552(AspeedSoCState *soc, int bus_id, int addr)
571{
572 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, bus_id),
573 TYPE_PCA9552, addr);
574}
575
612b219a 576static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc)
143b040f 577{
3c392e87 578 AspeedSoCState *soc = bmc->soc;
143b040f
PW
579
580 /* bus 2 : */
1373b15b
PMD
581 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48);
582 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49);
143b040f
PW
583 /* bus 2 : pca9546 @ 0x73 */
584
585 /* bus 3 : pca9548 @ 0x70 */
586
587 /* bus 4 : */
588 uint8_t *eeprom4_54 = g_malloc0(8 * 1024);
7a204cbd 589 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54,
143b040f
PW
590 eeprom4_54);
591 /* PCA9539 @ 0x76, but PCA9552 is compatible */
f4aec252 592 create_pca9552(soc, 4, 0x76);
143b040f 593 /* PCA9539 @ 0x77, but PCA9552 is compatible */
f4aec252 594 create_pca9552(soc, 4, 0x77);
143b040f
PW
595
596 /* bus 6 : */
1373b15b
PMD
597 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48);
598 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49);
143b040f
PW
599 /* bus 6 : pca9546 @ 0x73 */
600
601 /* bus 8 : */
602 uint8_t *eeprom8_56 = g_malloc0(8 * 1024);
7a204cbd 603 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56,
143b040f 604 eeprom8_56);
f4aec252
CLG
605 create_pca9552(soc, 8, 0x60);
606 create_pca9552(soc, 8, 0x61);
143b040f
PW
607 /* bus 8 : adc128d818 @ 0x1d */
608 /* bus 8 : adc128d818 @ 0x1f */
609
610 /*
611 * bus 13 : pca9548 @ 0x71
612 * - channel 3:
613 * - tmm421 @ 0x4c
614 * - tmp421 @ 0x4e
615 * - tmp421 @ 0x4f
616 */
617
618}
619
612b219a 620static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
62c2c2eb 621{
7cfbde5e
PMD
622 static const struct {
623 unsigned gpio_id;
624 LEDColor color;
625 const char *description;
626 bool gpio_polarity;
627 } pca1_leds[] = {
628 {13, LED_COLOR_GREEN, "front-fault-4", GPIO_POLARITY_ACTIVE_LOW},
629 {14, LED_COLOR_GREEN, "front-power-3", GPIO_POLARITY_ACTIVE_LOW},
630 {15, LED_COLOR_GREEN, "front-id-5", GPIO_POLARITY_ACTIVE_LOW},
631 };
3c392e87 632 AspeedSoCState *soc = bmc->soc;
3d165f12 633 uint8_t *eeprom_buf = g_malloc0(8 * 1024);
15ce12cf 634 DeviceState *dev;
7cfbde5e 635 LEDState *led;
62c2c2eb 636
63ceb818 637 /* Bus 3: TODO bmp280@77 */
db437ca6 638 dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
15ce12cf 639 qdev_prop_set_string(dev, "description", "pca1");
2616f572
PMD
640 i2c_slave_realize_and_unref(I2C_SLAVE(dev),
641 aspeed_i2c_get_bus(&soc->i2c, 3),
642 &error_fatal);
8c9a61d7 643
7cfbde5e
PMD
644 for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) {
645 led = led_create_simple(OBJECT(bmc),
646 pca1_leds[i].gpio_polarity,
647 pca1_leds[i].color,
648 pca1_leds[i].description);
649 qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id,
650 qdev_get_gpio_in(DEVICE(led), 0));
651 }
b61ea6e7 652 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76);
2a75e8c3 653 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "max31785", 0x52);
1373b15b
PMD
654 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c);
655 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c);
62c2c2eb
CLG
656
657 /* The Witherspoon expects a TMP275 but a TMP105 is compatible */
1373b15b 658 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105,
044475f3 659 0x4a);
6c4567c7
CLG
660
661 /* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
662 * good enough */
1373b15b 663 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
3d165f12 664
7a204cbd 665 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51,
3d165f12 666 eeprom_buf);
db437ca6 667 dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
15ce12cf 668 qdev_prop_set_string(dev, "description", "pca0");
2616f572
PMD
669 i2c_slave_realize_and_unref(I2C_SLAVE(dev),
670 aspeed_i2c_get_bus(&soc->i2c, 11),
671 &error_fatal);
63ceb818 672 /* Bus 11: TODO ucd90160@64 */
62c2c2eb
CLG
673}
674
95f068c8
JW
675static void g220a_bmc_i2c_init(AspeedMachineState *bmc)
676{
3c392e87 677 AspeedSoCState *soc = bmc->soc;
95f068c8
JW
678 DeviceState *dev;
679
680 dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3),
681 "emc1413", 0x4c));
682 object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
683 object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
684 object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
685
686 dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12),
687 "emc1413", 0x4c));
688 object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
689 object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
690 object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
691
692 dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13),
693 "emc1413", 0x4c));
694 object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
695 object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
696 object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
6f5f6507
JW
697
698 static uint8_t eeprom_buf[2 * 1024] = {
699 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe,
700 0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65,
701 0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32,
702 0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42,
703 0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45,
704 0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1,
705 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7,
706 };
707 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57,
708 eeprom_buf);
95f068c8
JW
709}
710
82b6a3f6
JW
711static void fp5280g2_bmc_i2c_init(AspeedMachineState *bmc)
712{
3c392e87 713 AspeedSoCState *soc = bmc->soc;
82b6a3f6
JW
714 I2CSlave *i2c_mux;
715
716 /* The at24c256 */
717 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 1), 0x50, 32768);
718
719 /* The fp5280g2 expects a TMP112 but a TMP105 is compatible */
720 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
721 0x48);
722 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
723 0x49);
724
725 i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
726 "pca9546", 0x70);
727 /* It expects a TMP112 but a TMP105 is compatible */
728 i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0), TYPE_TMP105,
729 0x4a);
730
731 /* It expects a ds3232 but a ds1338 is good enough */
732 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "ds1338", 0x68);
733
734 /* It expects a pca9555 but a pca9552 is compatible */
f4aec252 735 create_pca9552(soc, 8, 0x30);
82b6a3f6
JW
736}
737
58e52bdb
CLG
738static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
739{
3c392e87 740 AspeedSoCState *soc = bmc->soc;
fa6d98c0
JS
741 I2CSlave *i2c_mux;
742
9077e09a 743 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB);
58e52bdb 744
f4aec252 745 create_pca9552(soc, 3, 0x61);
bcb122f8 746
58e52bdb
CLG
747 /* The rainier expects a TMP275 but a TMP105 is compatible */
748 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
749 0x48);
750 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
751 0x49);
752 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
753 0x4a);
fa6d98c0
JS
754 i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4),
755 "pca9546", 0x70);
9077e09a
PD
756 at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
757 at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
758 at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB);
f4aec252 759 create_pca9552(soc, 4, 0x60);
58e52bdb
CLG
760
761 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
762 0x48);
763 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
764 0x49);
f4aec252
CLG
765 create_pca9552(soc, 5, 0x60);
766 create_pca9552(soc, 5, 0x61);
fa6d98c0
JS
767 i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5),
768 "pca9546", 0x70);
9077e09a
PD
769 at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
770 at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
58e52bdb
CLG
771
772 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
773 0x48);
774 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
775 0x4a);
776 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
777 0x4b);
fa6d98c0
JS
778 i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6),
779 "pca9546", 0x70);
9077e09a
PD
780 at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
781 at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
782 at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB);
783 at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB);
58e52bdb 784
f4aec252
CLG
785 create_pca9552(soc, 7, 0x30);
786 create_pca9552(soc, 7, 0x31);
787 create_pca9552(soc, 7, 0x32);
788 create_pca9552(soc, 7, 0x33);
f4aec252
CLG
789 create_pca9552(soc, 7, 0x60);
790 create_pca9552(soc, 7, 0x61);
b61ea6e7 791 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76);
58e52bdb
CLG
792 /* Bus 7: TODO si7021-a20@20 */
793 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105,
794 0x48);
2a75e8c3 795 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "max31785", 0x52);
9077e09a
PD
796 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB);
797 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB);
58e52bdb
CLG
798
799 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
800 0x48);
801 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
802 0x4a);
be85508f
NP
803 at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50,
804 64 * KiB, rainier_bb_fruid, rainier_bb_fruid_len);
805 at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51,
806 64 * KiB, rainier_bmc_fruid, rainier_bmc_fruid_len);
f4aec252
CLG
807 create_pca9552(soc, 8, 0x60);
808 create_pca9552(soc, 8, 0x61);
58e52bdb
CLG
809 /* Bus 8: ucd90320@11 */
810 /* Bus 8: ucd90320@b */
811 /* Bus 8: ucd90320@c */
812
813 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c);
814 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d);
9077e09a 815 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB);
58e52bdb
CLG
816
817 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c);
818 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d);
9077e09a 819 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB);
58e52bdb
CLG
820
821 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
822 0x48);
823 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
824 0x49);
fa6d98c0
JS
825 i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11),
826 "pca9546", 0x70);
9077e09a
PD
827 at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
828 at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
f4aec252 829 create_pca9552(soc, 11, 0x60);
fa6d98c0
JS
830
831
9077e09a 832 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB);
f4aec252 833 create_pca9552(soc, 13, 0x60);
fa6d98c0 834
9077e09a 835 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB);
f4aec252 836 create_pca9552(soc, 14, 0x60);
fa6d98c0 837
9077e09a 838 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB);
f4aec252 839 create_pca9552(soc, 15, 0x60);
58e52bdb
CLG
840}
841
febbe308
PD
842static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr,
843 I2CBus **channels)
844{
845 I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr);
846 for (int i = 0; i < 8; i++) {
847 channels[i] = pca954x_i2c_get_bus(mux, i);
848 }
849}
850
851#define TYPE_LM75 TYPE_TMP105
852#define TYPE_TMP75 TYPE_TMP105
853#define TYPE_TMP422 "tmp422"
854
855static void fuji_bmc_i2c_init(AspeedMachineState *bmc)
856{
3c392e87 857 AspeedSoCState *soc = bmc->soc;
febbe308
PD
858 I2CBus *i2c[144] = {};
859
860 for (int i = 0; i < 16; i++) {
861 i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
862 }
863 I2CBus *i2c180 = i2c[2];
864 I2CBus *i2c480 = i2c[8];
865 I2CBus *i2c600 = i2c[11];
866
867 get_pca9548_channels(i2c180, 0x70, &i2c[16]);
868 get_pca9548_channels(i2c480, 0x70, &i2c[24]);
869 /* NOTE: The device tree skips [32, 40) in the alias numbering */
870 get_pca9548_channels(i2c600, 0x77, &i2c[40]);
871 get_pca9548_channels(i2c[24], 0x71, &i2c[48]);
872 get_pca9548_channels(i2c[25], 0x72, &i2c[56]);
873 get_pca9548_channels(i2c[26], 0x76, &i2c[64]);
874 get_pca9548_channels(i2c[27], 0x76, &i2c[72]);
875 for (int i = 0; i < 8; i++) {
876 get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]);
877 }
878
879 i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c);
880 i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d);
881
ef0eb67e
SS
882 /*
883 * EEPROM 24c64 size is 64Kbits or 8 Kbytes
884 * 24c02 size is 2Kbits or 256 bytes
885 */
886 at24c_eeprom_init(i2c[19], 0x52, 8 * KiB);
887 at24c_eeprom_init(i2c[20], 0x50, 256);
888 at24c_eeprom_init(i2c[22], 0x52, 256);
febbe308
PD
889
890 i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x48);
891 i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x49);
892 i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x4a);
893 i2c_slave_create_simple(i2c[3], TYPE_TMP422, 0x4c);
894
ef0eb67e 895 at24c_eeprom_init(i2c[8], 0x51, 8 * KiB);
febbe308
PD
896 i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a);
897
898 i2c_slave_create_simple(i2c[50], TYPE_LM75, 0x4c);
ef0eb67e 899 at24c_eeprom_init(i2c[50], 0x52, 8 * KiB);
febbe308
PD
900 i2c_slave_create_simple(i2c[51], TYPE_TMP75, 0x48);
901 i2c_slave_create_simple(i2c[52], TYPE_TMP75, 0x49);
902
903 i2c_slave_create_simple(i2c[59], TYPE_TMP75, 0x48);
904 i2c_slave_create_simple(i2c[60], TYPE_TMP75, 0x49);
905
ef0eb67e 906 at24c_eeprom_init(i2c[65], 0x53, 8 * KiB);
febbe308
PD
907 i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x49);
908 i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x48);
ef0eb67e
SS
909 at24c_eeprom_init(i2c[68], 0x52, 8 * KiB);
910 at24c_eeprom_init(i2c[69], 0x52, 8 * KiB);
911 at24c_eeprom_init(i2c[70], 0x52, 8 * KiB);
912 at24c_eeprom_init(i2c[71], 0x52, 8 * KiB);
febbe308 913
ef0eb67e 914 at24c_eeprom_init(i2c[73], 0x53, 8 * KiB);
febbe308
PD
915 i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x49);
916 i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x48);
ef0eb67e
SS
917 at24c_eeprom_init(i2c[76], 0x52, 8 * KiB);
918 at24c_eeprom_init(i2c[77], 0x52, 8 * KiB);
919 at24c_eeprom_init(i2c[78], 0x52, 8 * KiB);
920 at24c_eeprom_init(i2c[79], 0x52, 8 * KiB);
921 at24c_eeprom_init(i2c[28], 0x50, 256);
febbe308
PD
922
923 for (int i = 0; i < 8; i++) {
9077e09a 924 at24c_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB);
febbe308
PD
925 i2c_slave_create_simple(i2c[82 + i * 8], TYPE_TMP75, 0x48);
926 i2c_slave_create_simple(i2c[83 + i * 8], TYPE_TMP75, 0x4b);
927 i2c_slave_create_simple(i2c[84 + i * 8], TYPE_TMP75, 0x4a);
928 }
929}
930
a20c54b1
PW
931#define TYPE_TMP421 "tmp421"
932
933static void bletchley_bmc_i2c_init(AspeedMachineState *bmc)
934{
3c392e87 935 AspeedSoCState *soc = bmc->soc;
a20c54b1
PW
936 I2CBus *i2c[13] = {};
937 for (int i = 0; i < 13; i++) {
938 if ((i == 8) || (i == 11)) {
939 continue;
940 }
941 i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
942 }
943
944 /* Bus 0 - 5 all have the same config. */
945 for (int i = 0; i < 6; i++) {
946 /* Missing model: ti,ina230 @ 0x45 */
947 /* Missing model: mps,mp5023 @ 0x40 */
948 i2c_slave_create_simple(i2c[i], TYPE_TMP421, 0x4f);
949 /* Missing model: nxp,pca9539 @ 0x76, but PCA9552 works enough */
950 i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x76);
951 i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x67);
952 /* Missing model: fsc,fusb302 @ 0x22 */
953 }
954
955 /* Bus 6 */
956 at24c_eeprom_init(i2c[6], 0x56, 65536);
957 /* Missing model: nxp,pcf85263 @ 0x51 , but ds1338 works enough */
958 i2c_slave_create_simple(i2c[6], "ds1338", 0x51);
959
960
961 /* Bus 7 */
962 at24c_eeprom_init(i2c[7], 0x54, 65536);
963
964 /* Bus 9 */
965 i2c_slave_create_simple(i2c[9], TYPE_TMP421, 0x4f);
966
967 /* Bus 10 */
968 i2c_slave_create_simple(i2c[10], TYPE_TMP421, 0x4f);
969 /* Missing model: ti,hdc1080 @ 0x40 */
970 i2c_slave_create_simple(i2c[10], TYPE_PCA9552, 0x67);
971
972 /* Bus 12 */
973 /* Missing model: adi,adm1278 @ 0x11 */
974 i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4c);
975 i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4d);
976 i2c_slave_create_simple(i2c[12], TYPE_PCA9552, 0x67);
977}
978
fa699e80
PD
979static void fby35_i2c_init(AspeedMachineState *bmc)
980{
3c392e87 981 AspeedSoCState *soc = bmc->soc;
fa699e80
PD
982 I2CBus *i2c[16];
983
984 for (int i = 0; i < 16; i++) {
985 i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
986 }
987
988 i2c_slave_create_simple(i2c[2], TYPE_LM75, 0x4f);
989 i2c_slave_create_simple(i2c[8], TYPE_TMP421, 0x1f);
990 /* Hotswap controller is actually supposed to be mp5920 or ltc4282. */
991 i2c_slave_create_simple(i2c[11], "adm1272", 0x44);
992 i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4e);
993 i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4f);
994
9077e09a
PD
995 at24c_eeprom_init(i2c[4], 0x51, 128 * KiB);
996 at24c_eeprom_init(i2c[6], 0x51, 128 * KiB);
c0216b94
PD
997 at24c_eeprom_init_rom(i2c[8], 0x50, 32 * KiB, fby35_nic_fruid,
998 fby35_nic_fruid_len);
999 at24c_eeprom_init_rom(i2c[11], 0x51, 128 * KiB, fby35_bb_fruid,
1000 fby35_bb_fruid_len);
1001 at24c_eeprom_init_rom(i2c[11], 0x54, 128 * KiB, fby35_bmc_fruid,
1002 fby35_bmc_fruid_len);
fa699e80
PD
1003
1004 /*
1005 * TODO: There is a multi-master i2c connection to an AST1030 MiniBMC on
1006 * buses 0, 1, 2, 3, and 9. Source address 0x10, target address 0x20 on
1007 * each.
1008 */
1009}
1010
fb6b3c8d
JHY
1011static void qcom_dc_scm_bmc_i2c_init(AspeedMachineState *bmc)
1012{
3c392e87 1013 AspeedSoCState *soc = bmc->soc;
fb6b3c8d
JHY
1014
1015 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 15), "tmp105", 0x4d);
1016}
1017
ece4cccd
GG
1018static void qcom_dc_scm_firework_i2c_init(AspeedMachineState *bmc)
1019{
3c392e87 1020 AspeedSoCState *soc = bmc->soc;
2a7a5d5c 1021 I2CSlave *therm_mux, *cpuvr_mux;
ece4cccd
GG
1022
1023 /* Create the generic DC-SCM hardware */
1024 qcom_dc_scm_bmc_i2c_init(bmc);
1025
1026 /* Now create the Firework specific hardware */
2a75e8c3 1027
2a7a5d5c
JHY
1028 /* I2C7 CPUVR MUX */
1029 cpuvr_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
1030 "pca9546", 0x70);
1031 i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 0), "pca9548", 0x72);
1032 i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 1), "pca9548", 0x72);
1033 i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 2), "pca9548", 0x72);
1034 i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 3), "pca9548", 0x72);
1035
cfc68f16
MK
1036 /* I2C8 Thermal Diodes*/
1037 therm_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
1038 "pca9548", 0x70);
1039 i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 0), TYPE_LM75, 0x4C);
1040 i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 1), TYPE_LM75, 0x4C);
1041 i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 2), TYPE_LM75, 0x48);
1042 i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 3), TYPE_LM75, 0x48);
1043 i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 4), TYPE_LM75, 0x48);
1044
2a75e8c3
MK
1045 /* I2C9 Fan Controller (MAX31785) */
1046 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x52);
1047 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x54);
ece4cccd
GG
1048}
1049
1a15311a
CLG
1050static bool aspeed_get_mmio_exec(Object *obj, Error **errp)
1051{
1052 return ASPEED_MACHINE(obj)->mmio_exec;
1053}
1054
1055static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp)
1056{
1057 ASPEED_MACHINE(obj)->mmio_exec = value;
1058}
1059
1060static void aspeed_machine_instance_init(Object *obj)
1061{
1062 ASPEED_MACHINE(obj)->mmio_exec = false;
1063}
1064
9820e52f
CLG
1065static char *aspeed_get_fmc_model(Object *obj, Error **errp)
1066{
1067 AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1068 return g_strdup(bmc->fmc_model);
1069}
1070
1071static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp)
1072{
1073 AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1074
1075 g_free(bmc->fmc_model);
1076 bmc->fmc_model = g_strdup(value);
1077}
1078
1079static char *aspeed_get_spi_model(Object *obj, Error **errp)
1080{
1081 AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1082 return g_strdup(bmc->spi_model);
1083}
1084
1085static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp)
1086{
1087 AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1088
1089 g_free(bmc->spi_model);
1090 bmc->spi_model = g_strdup(value);
1091}
1092
f65f6ad5
CLG
1093static char *aspeed_get_bmc_console(Object *obj, Error **errp)
1094{
1095 AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1096 AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
1097 int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default;
1098
944128ee 1099 return g_strdup_printf("uart%d", aspeed_uart_index(uart_chosen));
f65f6ad5
CLG
1100}
1101
1102static void aspeed_set_bmc_console(Object *obj, const char *value, Error **errp)
1103{
1104 AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1105 AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
1106 AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(amc->soc_name));
1107 int val;
944128ee
JL
1108 int uart_first = aspeed_uart_first(sc);
1109 int uart_last = aspeed_uart_last(sc);
f65f6ad5
CLG
1110
1111 if (sscanf(value, "uart%u", &val) != 1) {
1112 error_setg(errp, "Bad value for \"uart\" property");
1113 return;
1114 }
1115
1116 /* The number of UART depends on the SoC */
944128ee
JL
1117 if (val < uart_first || val > uart_last) {
1118 error_setg(errp, "\"uart\" should be in range [%d - %d]",
1119 uart_first, uart_last);
f65f6ad5
CLG
1120 return;
1121 }
944128ee 1122 bmc->uart_chosen = val + ASPEED_DEV_UART0;
f65f6ad5
CLG
1123}
1124
1a15311a
CLG
1125static void aspeed_machine_class_props_init(ObjectClass *oc)
1126{
1127 object_class_property_add_bool(oc, "execute-in-place",
1128 aspeed_get_mmio_exec,
d2623129 1129 aspeed_set_mmio_exec);
1a15311a 1130 object_class_property_set_description(oc, "execute-in-place",
7eecec7d 1131 "boot directly from CE0 flash device");
9820e52f 1132
f65f6ad5
CLG
1133 object_class_property_add_str(oc, "bmc-console", aspeed_get_bmc_console,
1134 aspeed_set_bmc_console);
1135 object_class_property_set_description(oc, "bmc-console",
1136 "Change the default UART to \"uartX\"");
1137
9820e52f
CLG
1138 object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model,
1139 aspeed_set_fmc_model);
1140 object_class_property_set_description(oc, "fmc-model",
1141 "Change the FMC Flash model");
1142 object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model,
1143 aspeed_set_spi_model);
1144 object_class_property_set_description(oc, "spi-model",
1145 "Change the SPI Flash model");
1a15311a
CLG
1146}
1147
43a0a5c9 1148static void aspeed_machine_class_init_cpus_defaults(MachineClass *mc)
b7f1a0cb 1149{
43a0a5c9
PMD
1150 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(mc);
1151 AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(amc->soc_name));
1152
1153 mc->default_cpus = sc->num_cpus;
1154 mc->min_cpus = sc->num_cpus;
1155 mc->max_cpus = sc->num_cpus;
dc13909e 1156 mc->valid_cpu_types = sc->valid_cpu_types;
b7f1a0cb
CLG
1157}
1158
fca9ca1b 1159static void aspeed_machine_class_init(ObjectClass *oc, void *data)
62c2c2eb
CLG
1160{
1161 MachineClass *mc = MACHINE_CLASS(oc);
d3bad7e7 1162 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
62c2c2eb 1163
fca9ca1b 1164 mc->init = aspeed_machine_init;
62c2c2eb
CLG
1165 mc->no_floppy = 1;
1166 mc->no_cdrom = 1;
1167 mc->no_parallel = 1;
afcbaed6 1168 mc->default_ram_id = "ram";
d3bad7e7 1169 amc->macs_mask = ASPEED_MAC0_ON;
5d63d0c7 1170 amc->uart_default = ASPEED_DEV_UART5;
1a15311a
CLG
1171
1172 aspeed_machine_class_props_init(oc);
62c2c2eb
CLG
1173}
1174
baa4732b
CLG
1175static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
1176{
1177 MachineClass *mc = MACHINE_CLASS(oc);
1178 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1179
1180 mc->desc = "OpenPOWER Palmetto BMC (ARM926EJ-S)";
1181 amc->soc_name = "ast2400-a1";
1182 amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1;
1183 amc->fmc_model = "n25q256a";
70322913 1184 amc->spi_model = "mx25l25635f";
baa4732b
CLG
1185 amc->num_cs = 1;
1186 amc->i2c_init = palmetto_bmc_i2c_init;
1187 mc->default_ram_size = 256 * MiB;
43a0a5c9 1188 aspeed_machine_class_init_cpus_defaults(mc);
baa4732b
CLG
1189};
1190
9cccb912
PV
1191static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data)
1192{
1193 MachineClass *mc = MACHINE_CLASS(oc);
1194 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1195
1196 mc->desc = "Quanta-Q71l BMC (ARM926EJ-S)";
1197 amc->soc_name = "ast2400-a1";
1198 amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1;
1199 amc->fmc_model = "n25q256a";
1200 amc->spi_model = "mx25l25635e";
1201 amc->num_cs = 1;
1202 amc->i2c_init = quanta_q71l_bmc_i2c_init;
1203 mc->default_ram_size = 128 * MiB;
43a0a5c9 1204 aspeed_machine_class_init_cpus_defaults(mc);
9cccb912
PV
1205}
1206
40a38df5
ES
1207static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc,
1208 void *data)
1209{
1210 MachineClass *mc = MACHINE_CLASS(oc);
1211 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1212
1213 mc->desc = "Supermicro X11 BMC (ARM926EJ-S)";
1214 amc->soc_name = "ast2400-a1";
1215 amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1;
1216 amc->fmc_model = "mx25l25635e";
1217 amc->spi_model = "mx25l25635e";
1218 amc->num_cs = 1;
1219 amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
1220 amc->i2c_init = palmetto_bmc_i2c_init;
1221 mc->default_ram_size = 256 * MiB;
43a0a5c9 1222 aspeed_machine_class_init_cpus_defaults(mc);
40a38df5
ES
1223}
1224
47936597
GR
1225static void aspeed_machine_supermicro_x11spi_bmc_class_init(ObjectClass *oc,
1226 void *data)
1227{
1228 MachineClass *mc = MACHINE_CLASS(oc);
1229 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1230
1231 mc->desc = "Supermicro X11 SPI BMC (ARM1176)";
1232 amc->soc_name = "ast2500-a1";
1233 amc->hw_strap1 = SUPERMICRO_X11SPI_BMC_HW_STRAP1;
1234 amc->fmc_model = "mx25l25635e";
1235 amc->spi_model = "mx25l25635e";
1236 amc->num_cs = 1;
1237 amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
1238 amc->i2c_init = palmetto_bmc_i2c_init;
1239 mc->default_ram_size = 512 * MiB;
43a0a5c9 1240 aspeed_machine_class_init_cpus_defaults(mc);
47936597
GR
1241}
1242
baa4732b
CLG
1243static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data)
1244{
1245 MachineClass *mc = MACHINE_CLASS(oc);
1246 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1247
1248 mc->desc = "Aspeed AST2500 EVB (ARM1176)";
1249 amc->soc_name = "ast2500-a1";
1250 amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
753abfc4 1251 amc->fmc_model = "mx25l25635e";
70322913 1252 amc->spi_model = "mx25l25635f";
baa4732b
CLG
1253 amc->num_cs = 1;
1254 amc->i2c_init = ast2500_evb_i2c_init;
1255 mc->default_ram_size = 512 * MiB;
43a0a5c9 1256 aspeed_machine_class_init_cpus_defaults(mc);
baa4732b
CLG
1257};
1258
34f73a81
KP
1259static void aspeed_machine_yosemitev2_class_init(ObjectClass *oc, void *data)
1260{
1261 MachineClass *mc = MACHINE_CLASS(oc);
1262 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1263
1264 mc->desc = "Facebook YosemiteV2 BMC (ARM1176)";
1265 amc->soc_name = "ast2500-a1";
1266 amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
1267 amc->hw_strap2 = 0;
1268 amc->fmc_model = "n25q256a";
1269 amc->spi_model = "mx25l25635e";
1270 amc->num_cs = 2;
1271 amc->i2c_init = yosemitev2_bmc_i2c_init;
1272 mc->default_ram_size = 512 * MiB;
43a0a5c9 1273 aspeed_machine_class_init_cpus_defaults(mc);
34f73a81
KP
1274};
1275
baa4732b
CLG
1276static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data)
1277{
1278 MachineClass *mc = MACHINE_CLASS(oc);
1279 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1280
1281 mc->desc = "OpenPOWER Romulus BMC (ARM1176)";
1282 amc->soc_name = "ast2500-a1";
1283 amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1;
1284 amc->fmc_model = "n25q256a";
1285 amc->spi_model = "mx66l1g45g";
1286 amc->num_cs = 2;
1287 amc->i2c_init = romulus_bmc_i2c_init;
1288 mc->default_ram_size = 512 * MiB;
43a0a5c9 1289 aspeed_machine_class_init_cpus_defaults(mc);
fca9ca1b
CLG
1290};
1291
6c323aba
KP
1292static void aspeed_machine_tiogapass_class_init(ObjectClass *oc, void *data)
1293{
1294 MachineClass *mc = MACHINE_CLASS(oc);
1295 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1296
1297 mc->desc = "Facebook Tiogapass BMC (ARM1176)";
1298 amc->soc_name = "ast2500-a1";
1299 amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
1300 amc->hw_strap2 = 0;
1301 amc->fmc_model = "n25q256a";
1302 amc->spi_model = "mx25l25635e";
1303 amc->num_cs = 2;
1304 amc->i2c_init = tiogapass_bmc_i2c_init;
1305 mc->default_ram_size = 1 * GiB;
43a0a5c9 1306 aspeed_machine_class_init_cpus_defaults(mc);
6c323aba
KP
1307};
1308
143b040f
PW
1309static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data)
1310{
1311 MachineClass *mc = MACHINE_CLASS(oc);
1312 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1313
1314 mc->desc = "OCP SonoraPass BMC (ARM1176)";
1315 amc->soc_name = "ast2500-a1";
1316 amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1;
1317 amc->fmc_model = "mx66l1g45g";
1318 amc->spi_model = "mx66l1g45g";
1319 amc->num_cs = 2;
1320 amc->i2c_init = sonorapass_bmc_i2c_init;
1321 mc->default_ram_size = 512 * MiB;
43a0a5c9 1322 aspeed_machine_class_init_cpus_defaults(mc);
143b040f
PW
1323};
1324
baa4732b
CLG
1325static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data)
1326{
1327 MachineClass *mc = MACHINE_CLASS(oc);
1328 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1329
1330 mc->desc = "OpenPOWER Witherspoon BMC (ARM1176)";
1331 amc->soc_name = "ast2500-a1";
1332 amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1;
70322913 1333 amc->fmc_model = "mx25l25635f";
baa4732b
CLG
1334 amc->spi_model = "mx66l1g45g";
1335 amc->num_cs = 2;
1336 amc->i2c_init = witherspoon_bmc_i2c_init;
1337 mc->default_ram_size = 512 * MiB;
43a0a5c9 1338 aspeed_machine_class_init_cpus_defaults(mc);
baa4732b
CLG
1339};
1340
1341static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
1342{
1343 MachineClass *mc = MACHINE_CLASS(oc);
1344 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1345
f548f201 1346 mc->desc = "Aspeed AST2600 EVB (Cortex-A7)";
c5811bb3 1347 amc->soc_name = "ast2600-a3";
baa4732b
CLG
1348 amc->hw_strap1 = AST2600_EVB_HW_STRAP1;
1349 amc->hw_strap2 = AST2600_EVB_HW_STRAP2;
753abfc4 1350 amc->fmc_model = "mx66u51235f";
baa4732b
CLG
1351 amc->spi_model = "mx66u51235f";
1352 amc->num_cs = 1;
29193286
GR
1353 amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON |
1354 ASPEED_MAC3_ON;
baa4732b
CLG
1355 amc->i2c_init = ast2600_evb_i2c_init;
1356 mc->default_ram_size = 1 * GiB;
43a0a5c9 1357 aspeed_machine_class_init_cpus_defaults(mc);
baa4732b
CLG
1358};
1359
63ceb818
CLG
1360static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data)
1361{
1362 MachineClass *mc = MACHINE_CLASS(oc);
1363 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1364
f548f201 1365 mc->desc = "OpenPOWER Tacoma BMC (Cortex-A7)";
c5811bb3 1366 amc->soc_name = "ast2600-a3";
63ceb818
CLG
1367 amc->hw_strap1 = TACOMA_BMC_HW_STRAP1;
1368 amc->hw_strap2 = TACOMA_BMC_HW_STRAP2;
1369 amc->fmc_model = "mx66l1g45g";
1370 amc->spi_model = "mx66l1g45g";
1371 amc->num_cs = 2;
d3bad7e7 1372 amc->macs_mask = ASPEED_MAC2_ON;
63ceb818
CLG
1373 amc->i2c_init = witherspoon_bmc_i2c_init; /* Same board layout */
1374 mc->default_ram_size = 1 * GiB;
43a0a5c9 1375 aspeed_machine_class_init_cpus_defaults(mc);
63ceb818
CLG
1376};
1377
95f068c8
JW
1378static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data)
1379{
1380 MachineClass *mc = MACHINE_CLASS(oc);
1381 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1382
1383 mc->desc = "Bytedance G220A BMC (ARM1176)";
1384 amc->soc_name = "ast2500-a1";
1385 amc->hw_strap1 = G220A_BMC_HW_STRAP1;
1386 amc->fmc_model = "n25q512a";
1387 amc->spi_model = "mx25l25635e";
1388 amc->num_cs = 2;
5bb825c8 1389 amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
95f068c8
JW
1390 amc->i2c_init = g220a_bmc_i2c_init;
1391 mc->default_ram_size = 1024 * MiB;
43a0a5c9 1392 aspeed_machine_class_init_cpus_defaults(mc);
95f068c8
JW
1393};
1394
82b6a3f6
JW
1395static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc, void *data)
1396{
1397 MachineClass *mc = MACHINE_CLASS(oc);
1398 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1399
1400 mc->desc = "Inspur FP5280G2 BMC (ARM1176)";
1401 amc->soc_name = "ast2500-a1";
1402 amc->hw_strap1 = FP5280G2_BMC_HW_STRAP1;
1403 amc->fmc_model = "n25q512a";
1404 amc->spi_model = "mx25l25635e";
1405 amc->num_cs = 2;
1406 amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
1407 amc->i2c_init = fp5280g2_bmc_i2c_init;
1408 mc->default_ram_size = 512 * MiB;
43a0a5c9 1409 aspeed_machine_class_init_cpus_defaults(mc);
82b6a3f6
JW
1410};
1411
58e52bdb
CLG
1412static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data)
1413{
1414 MachineClass *mc = MACHINE_CLASS(oc);
1415 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1416
f548f201 1417 mc->desc = "IBM Rainier BMC (Cortex-A7)";
c5811bb3 1418 amc->soc_name = "ast2600-a3";
58e52bdb
CLG
1419 amc->hw_strap1 = RAINIER_BMC_HW_STRAP1;
1420 amc->hw_strap2 = RAINIER_BMC_HW_STRAP2;
1421 amc->fmc_model = "mx66l1g45g";
1422 amc->spi_model = "mx66l1g45g";
1423 amc->num_cs = 2;
1424 amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1425 amc->i2c_init = rainier_bmc_i2c_init;
1426 mc->default_ram_size = 1 * GiB;
43a0a5c9 1427 aspeed_machine_class_init_cpus_defaults(mc);
58e52bdb
CLG
1428};
1429
1e2c22c9 1430#define FUJI_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB)
febbe308
PD
1431
1432static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data)
1433{
1434 MachineClass *mc = MACHINE_CLASS(oc);
1435 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1436
1437 mc->desc = "Facebook Fuji BMC (Cortex-A7)";
1438 amc->soc_name = "ast2600-a3";
1439 amc->hw_strap1 = FUJI_BMC_HW_STRAP1;
1440 amc->hw_strap2 = FUJI_BMC_HW_STRAP2;
1441 amc->fmc_model = "mx66l1g45g";
1442 amc->spi_model = "mx66l1g45g";
1443 amc->num_cs = 2;
1444 amc->macs_mask = ASPEED_MAC3_ON;
1445 amc->i2c_init = fuji_bmc_i2c_init;
1446 amc->uart_default = ASPEED_DEV_UART1;
1447 mc->default_ram_size = FUJI_BMC_RAM_SIZE;
43a0a5c9 1448 aspeed_machine_class_init_cpus_defaults(mc);
febbe308
PD
1449};
1450
1e2c22c9 1451#define BLETCHLEY_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB)
104bdaff 1452
a20c54b1
PW
1453static void aspeed_machine_bletchley_class_init(ObjectClass *oc, void *data)
1454{
1455 MachineClass *mc = MACHINE_CLASS(oc);
1456 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1457
1458 mc->desc = "Facebook Bletchley BMC (Cortex-A7)";
1459 amc->soc_name = "ast2600-a3";
1460 amc->hw_strap1 = BLETCHLEY_BMC_HW_STRAP1;
1461 amc->hw_strap2 = BLETCHLEY_BMC_HW_STRAP2;
1462 amc->fmc_model = "w25q01jvq";
1463 amc->spi_model = NULL;
1464 amc->num_cs = 2;
1465 amc->macs_mask = ASPEED_MAC2_ON;
1466 amc->i2c_init = bletchley_bmc_i2c_init;
104bdaff 1467 mc->default_ram_size = BLETCHLEY_BMC_RAM_SIZE;
43a0a5c9 1468 aspeed_machine_class_init_cpus_defaults(mc);
a20c54b1
PW
1469}
1470
7966d70f 1471static void fby35_reset(MachineState *state, ShutdownCause reason)
fa699e80
PD
1472{
1473 AspeedMachineState *bmc = ASPEED_MACHINE(state);
3c392e87 1474 AspeedGPIOState *gpio = &bmc->soc->gpio;
fa699e80 1475
7966d70f 1476 qemu_devices_reset(reason);
fa699e80 1477
f0418558 1478 /* Board ID: 7 (Class-1, 4 slots) */
fa699e80
PD
1479 object_property_set_bool(OBJECT(gpio), "gpioV4", true, &error_fatal);
1480 object_property_set_bool(OBJECT(gpio), "gpioV5", true, &error_fatal);
1481 object_property_set_bool(OBJECT(gpio), "gpioV6", true, &error_fatal);
1482 object_property_set_bool(OBJECT(gpio), "gpioV7", false, &error_fatal);
f0418558
PD
1483
1484 /* Slot presence pins, inverse polarity. (False means present) */
1485 object_property_set_bool(OBJECT(gpio), "gpioH4", false, &error_fatal);
1486 object_property_set_bool(OBJECT(gpio), "gpioH5", true, &error_fatal);
1487 object_property_set_bool(OBJECT(gpio), "gpioH6", true, &error_fatal);
1488 object_property_set_bool(OBJECT(gpio), "gpioH7", true, &error_fatal);
1489
1490 /* Slot 12v power pins, normal polarity. (True means powered-on) */
1491 object_property_set_bool(OBJECT(gpio), "gpioB2", true, &error_fatal);
1492 object_property_set_bool(OBJECT(gpio), "gpioB3", false, &error_fatal);
1493 object_property_set_bool(OBJECT(gpio), "gpioB4", false, &error_fatal);
1494 object_property_set_bool(OBJECT(gpio), "gpioB5", false, &error_fatal);
fa699e80
PD
1495}
1496
1497static void aspeed_machine_fby35_class_init(ObjectClass *oc, void *data)
1498{
1499 MachineClass *mc = MACHINE_CLASS(oc);
1500 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1501
1502 mc->desc = "Facebook fby35 BMC (Cortex-A7)";
1503 mc->reset = fby35_reset;
1504 amc->fmc_model = "mx66l1g45g";
1505 amc->num_cs = 2;
1506 amc->macs_mask = ASPEED_MAC3_ON;
1507 amc->i2c_init = fby35_i2c_init;
1508 /* FIXME: Replace this macro with something more general */
1509 mc->default_ram_size = FUJI_BMC_RAM_SIZE;
43a0a5c9 1510 aspeed_machine_class_init_cpus_defaults(mc);
fa699e80
PD
1511}
1512
66c895b8
JL
1513#define AST1030_INTERNAL_FLASH_SIZE (1024 * 1024)
1514/* Main SYSCLK frequency in Hz (200MHz) */
1515#define SYSCLK_FRQ 200000000ULL
1516
1517static void aspeed_minibmc_machine_init(MachineState *machine)
1518{
1519 AspeedMachineState *bmc = ASPEED_MACHINE(machine);
1520 AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
1521 Clock *sysclk;
1522
1523 sysclk = clock_new(OBJECT(machine), "SYSCLK");
1524 clock_set_hz(sysclk, SYSCLK_FRQ);
1525
3c392e87
PMD
1526 bmc->soc = ASPEED_SOC(object_new(amc->soc_name));
1527 object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc));
1528 object_unref(OBJECT(bmc->soc));
1529 qdev_connect_clock_in(DEVICE(bmc->soc), "sysclk", sysclk);
66c895b8 1530
3c392e87 1531 object_property_set_link(OBJECT(bmc->soc), "memory",
4dd9d554 1532 OBJECT(get_system_memory()), &error_abort);
d2b3eaef 1533 connect_serial_hds_to_uarts(bmc);
3c392e87 1534 qdev_realize(DEVICE(bmc->soc), NULL, &error_abort);
66c895b8 1535
3c392e87 1536 aspeed_board_init_flashes(&bmc->soc->fmc,
66c895b8
JL
1537 bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
1538 amc->num_cs,
1539 0);
1540
3c392e87 1541 aspeed_board_init_flashes(&bmc->soc->spi[0],
66c895b8
JL
1542 bmc->spi_model ? bmc->spi_model : amc->spi_model,
1543 amc->num_cs, amc->num_cs);
1544
3c392e87 1545 aspeed_board_init_flashes(&bmc->soc->spi[1],
66c895b8
JL
1546 bmc->spi_model ? bmc->spi_model : amc->spi_model,
1547 amc->num_cs, (amc->num_cs * 2));
1548
1549 if (amc->i2c_init) {
1550 amc->i2c_init(bmc);
1551 }
1552
1553 armv7m_load_kernel(ARM_CPU(first_cpu),
1554 machine->kernel_filename,
761c532a 1555 0,
66c895b8
JL
1556 AST1030_INTERNAL_FLASH_SIZE);
1557}
1558
4c70ab16
TL
1559static void ast1030_evb_i2c_init(AspeedMachineState *bmc)
1560{
3c392e87 1561 AspeedSoCState *soc = bmc->soc;
4c70ab16 1562
673d8215 1563 /* U10 24C08 connects to SDA/SCL Group 1 by default */
4c70ab16
TL
1564 uint8_t *eeprom_buf = g_malloc0(32 * 1024);
1565 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, eeprom_buf);
1566
1567 /* U11 LM75 connects to SDA/SCL Group 2 by default */
1568 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d);
1569}
1570
66c895b8
JL
1571static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc,
1572 void *data)
1573{
1574 MachineClass *mc = MACHINE_CLASS(oc);
1575 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1576
1577 mc->desc = "Aspeed AST1030 MiniBMC (Cortex-M4)";
1578 amc->soc_name = "ast1030-a1";
1579 amc->hw_strap1 = 0;
1580 amc->hw_strap2 = 0;
1581 mc->init = aspeed_minibmc_machine_init;
4c70ab16 1582 amc->i2c_init = ast1030_evb_i2c_init;
66c895b8 1583 mc->default_ram_size = 0;
66c895b8
JL
1584 amc->fmc_model = "sst25vf032b";
1585 amc->spi_model = "sst25vf032b";
1586 amc->num_cs = 2;
1587 amc->macs_mask = 0;
43a0a5c9 1588 aspeed_machine_class_init_cpus_defaults(mc);
66c895b8
JL
1589}
1590
fb6b3c8d
JHY
1591static void aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass *oc,
1592 void *data)
1593{
1594 MachineClass *mc = MACHINE_CLASS(oc);
1595 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1596
1597 mc->desc = "Qualcomm DC-SCM V1 BMC (Cortex A7)";
1598 amc->soc_name = "ast2600-a3";
1599 amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1600 amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1601 amc->fmc_model = "n25q512a";
1602 amc->spi_model = "n25q512a";
1603 amc->num_cs = 2;
1604 amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1605 amc->i2c_init = qcom_dc_scm_bmc_i2c_init;
1606 mc->default_ram_size = 1 * GiB;
43a0a5c9 1607 aspeed_machine_class_init_cpus_defaults(mc);
fb6b3c8d
JHY
1608};
1609
ece4cccd
GG
1610static void aspeed_machine_qcom_firework_class_init(ObjectClass *oc,
1611 void *data)
1612{
1613 MachineClass *mc = MACHINE_CLASS(oc);
1614 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1615
1616 mc->desc = "Qualcomm DC-SCM V1/Firework BMC (Cortex A7)";
1617 amc->soc_name = "ast2600-a3";
1618 amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1619 amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1620 amc->fmc_model = "n25q512a";
1621 amc->spi_model = "n25q512a";
1622 amc->num_cs = 2;
1623 amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1624 amc->i2c_init = qcom_dc_scm_firework_i2c_init;
1625 mc->default_ram_size = 1 * GiB;
43a0a5c9 1626 aspeed_machine_class_init_cpus_defaults(mc);
ece4cccd
GG
1627};
1628
baa4732b 1629static const TypeInfo aspeed_machine_types[] = {
fca9ca1b 1630 {
baa4732b
CLG
1631 .name = MACHINE_TYPE_NAME("palmetto-bmc"),
1632 .parent = TYPE_ASPEED_MACHINE,
1633 .class_init = aspeed_machine_palmetto_class_init,
40a38df5
ES
1634 }, {
1635 .name = MACHINE_TYPE_NAME("supermicrox11-bmc"),
1636 .parent = TYPE_ASPEED_MACHINE,
1637 .class_init = aspeed_machine_supermicrox11_bmc_class_init,
47936597
GR
1638 }, {
1639 .name = MACHINE_TYPE_NAME("supermicro-x11spi-bmc"),
1640 .parent = TYPE_ASPEED_MACHINE,
1641 .class_init = aspeed_machine_supermicro_x11spi_bmc_class_init,
fca9ca1b 1642 }, {
baa4732b
CLG
1643 .name = MACHINE_TYPE_NAME("ast2500-evb"),
1644 .parent = TYPE_ASPEED_MACHINE,
1645 .class_init = aspeed_machine_ast2500_evb_class_init,
fca9ca1b 1646 }, {
baa4732b
CLG
1647 .name = MACHINE_TYPE_NAME("romulus-bmc"),
1648 .parent = TYPE_ASPEED_MACHINE,
1649 .class_init = aspeed_machine_romulus_class_init,
143b040f
PW
1650 }, {
1651 .name = MACHINE_TYPE_NAME("sonorapass-bmc"),
1652 .parent = TYPE_ASPEED_MACHINE,
1653 .class_init = aspeed_machine_sonorapass_class_init,
fca9ca1b 1654 }, {
baa4732b
CLG
1655 .name = MACHINE_TYPE_NAME("witherspoon-bmc"),
1656 .parent = TYPE_ASPEED_MACHINE,
1657 .class_init = aspeed_machine_witherspoon_class_init,
ccc2c418 1658 }, {
baa4732b
CLG
1659 .name = MACHINE_TYPE_NAME("ast2600-evb"),
1660 .parent = TYPE_ASPEED_MACHINE,
1661 .class_init = aspeed_machine_ast2600_evb_class_init,
34f73a81
KP
1662 }, {
1663 .name = MACHINE_TYPE_NAME("yosemitev2-bmc"),
1664 .parent = TYPE_ASPEED_MACHINE,
1665 .class_init = aspeed_machine_yosemitev2_class_init,
63ceb818
CLG
1666 }, {
1667 .name = MACHINE_TYPE_NAME("tacoma-bmc"),
1668 .parent = TYPE_ASPEED_MACHINE,
1669 .class_init = aspeed_machine_tacoma_class_init,
6c323aba
KP
1670 }, {
1671 .name = MACHINE_TYPE_NAME("tiogapass-bmc"),
1672 .parent = TYPE_ASPEED_MACHINE,
1673 .class_init = aspeed_machine_tiogapass_class_init,
95f068c8
JW
1674 }, {
1675 .name = MACHINE_TYPE_NAME("g220a-bmc"),
1676 .parent = TYPE_ASPEED_MACHINE,
1677 .class_init = aspeed_machine_g220a_class_init,
fb6b3c8d
JHY
1678 }, {
1679 .name = MACHINE_TYPE_NAME("qcom-dc-scm-v1-bmc"),
1680 .parent = TYPE_ASPEED_MACHINE,
1681 .class_init = aspeed_machine_qcom_dc_scm_v1_class_init,
ece4cccd
GG
1682 }, {
1683 .name = MACHINE_TYPE_NAME("qcom-firework-bmc"),
1684 .parent = TYPE_ASPEED_MACHINE,
1685 .class_init = aspeed_machine_qcom_firework_class_init,
82b6a3f6
JW
1686 }, {
1687 .name = MACHINE_TYPE_NAME("fp5280g2-bmc"),
1688 .parent = TYPE_ASPEED_MACHINE,
1689 .class_init = aspeed_machine_fp5280g2_class_init,
9cccb912
PV
1690 }, {
1691 .name = MACHINE_TYPE_NAME("quanta-q71l-bmc"),
1692 .parent = TYPE_ASPEED_MACHINE,
1693 .class_init = aspeed_machine_quanta_q71l_class_init,
58e52bdb
CLG
1694 }, {
1695 .name = MACHINE_TYPE_NAME("rainier-bmc"),
1696 .parent = TYPE_ASPEED_MACHINE,
1697 .class_init = aspeed_machine_rainier_class_init,
febbe308
PD
1698 }, {
1699 .name = MACHINE_TYPE_NAME("fuji-bmc"),
1700 .parent = TYPE_ASPEED_MACHINE,
1701 .class_init = aspeed_machine_fuji_class_init,
a20c54b1
PW
1702 }, {
1703 .name = MACHINE_TYPE_NAME("bletchley-bmc"),
1704 .parent = TYPE_ASPEED_MACHINE,
1705 .class_init = aspeed_machine_bletchley_class_init,
fa699e80
PD
1706 }, {
1707 .name = MACHINE_TYPE_NAME("fby35-bmc"),
1708 .parent = MACHINE_TYPE_NAME("ast2600-evb"),
1709 .class_init = aspeed_machine_fby35_class_init,
66c895b8
JL
1710 }, {
1711 .name = MACHINE_TYPE_NAME("ast1030-evb"),
1712 .parent = TYPE_ASPEED_MACHINE,
1713 .class_init = aspeed_minibmc_machine_ast1030_evb_class_init,
baa4732b
CLG
1714 }, {
1715 .name = TYPE_ASPEED_MACHINE,
1716 .parent = TYPE_MACHINE,
888b2b03 1717 .instance_size = sizeof(AspeedMachineState),
1a15311a 1718 .instance_init = aspeed_machine_instance_init,
baa4732b
CLG
1719 .class_size = sizeof(AspeedMachineClass),
1720 .class_init = aspeed_machine_class_init,
1721 .abstract = true,
fca9ca1b 1722 }
baa4732b 1723};
74fb1f38 1724
baa4732b 1725DEFINE_TYPES(aspeed_machine_types)