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