2 * OpenPOWER Palmetto BMC
6 * Copyright 2016 IBM Corp.
8 * This code is licensed under the GPL version 2 or later. See
9 * the COPYING file in the top-level directory.
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/i2c/i2c_mux_pca954x.h"
18 #include "hw/i2c/smbus_eeprom.h"
19 #include "hw/misc/pca9552.h"
20 #include "hw/sensor/tmp105.h"
21 #include "hw/misc/led.h"
22 #include "hw/qdev-properties.h"
23 #include "sysemu/block-backend.h"
24 #include "hw/loader.h"
25 #include "qemu/error-report.h"
26 #include "qemu/units.h"
28 static struct arm_boot_info aspeed_board_binfo = {
29 .board_id = -1, /* device-tree-only board */
32 struct AspeedMachineState {
34 MachineState parent_obj;
38 MemoryRegion ram_container;
45 /* Palmetto hardware value: 0x120CE416 */
46 #define PALMETTO_BMC_HW_STRAP1 ( \
47 SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_256MB) | \
48 SCU_AST2400_HW_STRAP_DRAM_CONFIG(2 /* DDR3 with CL=6, CWL=5 */) | \
49 SCU_AST2400_HW_STRAP_ACPI_DIS | \
50 SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) | \
51 SCU_HW_STRAP_VGA_CLASS_CODE | \
52 SCU_HW_STRAP_LPC_RESET_PIN | \
53 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) | \
54 SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
55 SCU_HW_STRAP_SPI_WIDTH | \
56 SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \
57 SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
59 /* TODO: Find the actual hardware value */
60 #define SUPERMICROX11_BMC_HW_STRAP1 ( \
61 SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) | \
62 SCU_AST2400_HW_STRAP_DRAM_CONFIG(2) | \
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))
73 /* AST2500 evb hardware value: 0xF100C2E6 */
74 #define AST2500_EVB_HW_STRAP1 (( \
75 AST2500_HW_STRAP1_DEFAULTS | \
76 SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \
77 SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \
78 SCU_AST2500_HW_STRAP_UART_DEBUG | \
79 SCU_AST2500_HW_STRAP_DDR4_ENABLE | \
80 SCU_HW_STRAP_MAC1_RGMII | \
81 SCU_HW_STRAP_MAC0_RGMII) & \
82 ~SCU_HW_STRAP_2ND_BOOT_WDT)
84 /* Romulus hardware value: 0xF10AD206 */
85 #define ROMULUS_BMC_HW_STRAP1 ( \
86 AST2500_HW_STRAP1_DEFAULTS | \
87 SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \
88 SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \
89 SCU_AST2500_HW_STRAP_UART_DEBUG | \
90 SCU_AST2500_HW_STRAP_DDR4_ENABLE | \
91 SCU_AST2500_HW_STRAP_ACPI_ENABLE | \
92 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER))
94 /* Sonorapass hardware value: 0xF100D216 */
95 #define SONORAPASS_BMC_HW_STRAP1 ( \
96 SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \
97 SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \
98 SCU_AST2500_HW_STRAP_UART_DEBUG | \
99 SCU_AST2500_HW_STRAP_RESERVED28 | \
100 SCU_AST2500_HW_STRAP_DDR4_ENABLE | \
101 SCU_HW_STRAP_VGA_CLASS_CODE | \
102 SCU_HW_STRAP_LPC_RESET_PIN | \
103 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \
104 SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \
105 SCU_HW_STRAP_VGA_BIOS_ROM | \
106 SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \
107 SCU_AST2500_HW_STRAP_RESERVED1)
109 /* Swift hardware value: 0xF11AD206 */
110 #define SWIFT_BMC_HW_STRAP1 ( \
111 AST2500_HW_STRAP1_DEFAULTS | \
112 SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \
113 SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \
114 SCU_AST2500_HW_STRAP_UART_DEBUG | \
115 SCU_AST2500_HW_STRAP_DDR4_ENABLE | \
116 SCU_H_PLL_BYPASS_EN | \
117 SCU_AST2500_HW_STRAP_ACPI_ENABLE | \
118 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER))
120 #define G220A_BMC_HW_STRAP1 ( \
121 SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \
122 SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \
123 SCU_AST2500_HW_STRAP_UART_DEBUG | \
124 SCU_AST2500_HW_STRAP_RESERVED28 | \
125 SCU_AST2500_HW_STRAP_DDR4_ENABLE | \
126 SCU_HW_STRAP_2ND_BOOT_WDT | \
127 SCU_HW_STRAP_VGA_CLASS_CODE | \
128 SCU_HW_STRAP_LPC_RESET_PIN | \
129 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \
130 SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \
131 SCU_HW_STRAP_VGA_SIZE_SET(VGA_64M_DRAM) | \
132 SCU_AST2500_HW_STRAP_RESERVED1)
134 /* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */
135 #define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1
137 /* Quanta-Q71l hardware value */
138 #define QUANTA_Q71L_BMC_HW_STRAP1 ( \
139 SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) | \
140 SCU_AST2400_HW_STRAP_DRAM_CONFIG(2/* DDR3 with CL=6, CWL=5 */) | \
141 SCU_AST2400_HW_STRAP_ACPI_DIS | \
142 SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_24M_IN) | \
143 SCU_HW_STRAP_VGA_CLASS_CODE | \
144 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_PASS_THROUGH) | \
145 SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
146 SCU_HW_STRAP_SPI_WIDTH | \
147 SCU_HW_STRAP_VGA_SIZE_SET(VGA_8M_DRAM) | \
148 SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
150 /* AST2600 evb hardware value */
151 #define AST2600_EVB_HW_STRAP1 0x000000C0
152 #define AST2600_EVB_HW_STRAP2 0x00000003
154 /* Tacoma hardware value */
155 #define TACOMA_BMC_HW_STRAP1 0x00000000
156 #define TACOMA_BMC_HW_STRAP2 0x00000040
158 /* Rainier hardware value: (QEMU prototype) */
159 #define RAINIER_BMC_HW_STRAP1 0x00000000
160 #define RAINIER_BMC_HW_STRAP2 0x00000000
163 * The max ram region is for firmwares that scan the address space
164 * with load/store to guess how much RAM the SoC has.
166 static uint64_t max_ram_read(void *opaque, hwaddr offset, unsigned size)
171 static void max_ram_write(void *opaque, hwaddr offset, uint64_t value,
177 static const MemoryRegionOps max_ram_ops = {
178 .read = max_ram_read,
179 .write = max_ram_write,
180 .endianness = DEVICE_NATIVE_ENDIAN,
183 #define AST_SMP_MAILBOX_BASE 0x1e6e2180
184 #define AST_SMP_MBOX_FIELD_ENTRY (AST_SMP_MAILBOX_BASE + 0x0)
185 #define AST_SMP_MBOX_FIELD_GOSIGN (AST_SMP_MAILBOX_BASE + 0x4)
186 #define AST_SMP_MBOX_FIELD_READY (AST_SMP_MAILBOX_BASE + 0x8)
187 #define AST_SMP_MBOX_FIELD_POLLINSN (AST_SMP_MAILBOX_BASE + 0xc)
188 #define AST_SMP_MBOX_CODE (AST_SMP_MAILBOX_BASE + 0x10)
189 #define AST_SMP_MBOX_GOSIGN 0xabbaab00
191 static void aspeed_write_smpboot(ARMCPU *cpu,
192 const struct arm_boot_info *info)
194 static const uint32_t poll_mailbox_ready[] = {
196 * r2 = per-cpu go sign value
197 * r1 = AST_SMP_MBOX_FIELD_ENTRY
198 * r0 = AST_SMP_MBOX_FIELD_GOSIGN
200 0xee100fb0, /* mrc p15, 0, r0, c0, c0, 5 */
201 0xe21000ff, /* ands r0, r0, #255 */
202 0xe59f201c, /* ldr r2, [pc, #28] */
203 0xe1822000, /* orr r2, r2, r0 */
205 0xe59f1018, /* ldr r1, [pc, #24] */
206 0xe59f0018, /* ldr r0, [pc, #24] */
208 0xe320f002, /* wfe */
209 0xe5904000, /* ldr r4, [r0] */
210 0xe1520004, /* cmp r2, r4 */
211 0x1afffffb, /* bne <wfe> */
212 0xe591f000, /* ldr pc, [r1] */
214 AST_SMP_MBOX_FIELD_ENTRY,
215 AST_SMP_MBOX_FIELD_GOSIGN,
218 rom_add_blob_fixed("aspeed.smpboot", poll_mailbox_ready,
219 sizeof(poll_mailbox_ready),
220 info->smp_loader_start);
223 static void aspeed_reset_secondary(ARMCPU *cpu,
224 const struct arm_boot_info *info)
226 AddressSpace *as = arm_boot_address_space(cpu, info);
227 CPUState *cs = CPU(cpu);
229 /* info->smp_bootreg_addr */
230 address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0,
231 MEMTXATTRS_UNSPECIFIED, NULL);
232 cpu_set_pc(cs, info->smp_loader_start);
235 #define FIRMWARE_ADDR 0x0
237 static void write_boot_rom(DriveInfo *dinfo, hwaddr addr, size_t rom_size,
240 BlockBackend *blk = blk_by_legacy_dinfo(dinfo);
244 /* The block backend size should have already been 'validated' by
245 * the creation of the m25p80 object.
247 size = blk_getlength(blk);
249 error_setg(errp, "failed to get flash size");
253 if (rom_size > size) {
257 storage = g_new0(uint8_t, rom_size);
258 if (blk_pread(blk, 0, storage, rom_size) < 0) {
259 error_setg(errp, "failed to read the initial flash content");
263 rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr);
267 static void aspeed_board_init_flashes(AspeedSMCState *s,
268 const char *flashtype)
272 for (i = 0; i < s->num_cs; ++i) {
273 AspeedSMCFlash *fl = &s->flashes[i];
274 DriveInfo *dinfo = drive_get_next(IF_MTD);
277 fl->flash = qdev_new(flashtype);
279 qdev_prop_set_drive(fl->flash, "drive",
280 blk_by_legacy_dinfo(dinfo));
282 qdev_realize_and_unref(fl->flash, BUS(s->spi), &error_fatal);
284 cs_line = qdev_get_gpio_in_named(fl->flash, SSI_GPIO_CS, 0);
285 sysbus_connect_irq(SYS_BUS_DEVICE(s), i + 1, cs_line);
289 static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo)
296 card = qdev_new(TYPE_SD_CARD);
297 qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
299 qdev_realize_and_unref(card,
300 qdev_get_child_bus(DEVICE(sdhci), "sd-bus"),
304 static void aspeed_machine_init(MachineState *machine)
306 AspeedMachineState *bmc = ASPEED_MACHINE(machine);
307 AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
309 DriveInfo *drive0 = drive_get(IF_MTD, 0, 0);
310 ram_addr_t max_ram_size;
312 NICInfo *nd = &nd_table[0];
314 memory_region_init(&bmc->ram_container, NULL, "aspeed-ram-container",
316 memory_region_add_subregion(&bmc->ram_container, 0, machine->ram);
318 object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
320 sc = ASPEED_SOC_GET_CLASS(&bmc->soc);
323 * This will error out if isize is not supported by memory controller.
325 object_property_set_uint(OBJECT(&bmc->soc), "ram-size", machine->ram_size,
328 for (i = 0; i < sc->macs_num; i++) {
329 if ((amc->macs_mask & (1 << i)) && nd->used) {
330 qemu_check_nic_model(nd, TYPE_FTGMAC100);
331 qdev_set_nic_properties(DEVICE(&bmc->soc.ftgmac100[i]), nd);
336 object_property_set_int(OBJECT(&bmc->soc), "hw-strap1", amc->hw_strap1,
338 object_property_set_int(OBJECT(&bmc->soc), "hw-strap2", amc->hw_strap2,
340 object_property_set_int(OBJECT(&bmc->soc), "num-cs", amc->num_cs,
342 object_property_set_link(OBJECT(&bmc->soc), "dram",
343 OBJECT(machine->ram), &error_abort);
344 if (machine->kernel_filename) {
346 * When booting with a -kernel command line there is no u-boot
347 * that runs to unlock the SCU. In this case set the default to
348 * be unlocked as the kernel expects
350 object_property_set_int(OBJECT(&bmc->soc), "hw-prot-key",
351 ASPEED_SCU_PROT_KEY, &error_abort);
353 qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
355 memory_region_add_subregion(get_system_memory(),
356 sc->memmap[ASPEED_DEV_SDRAM],
357 &bmc->ram_container);
359 max_ram_size = object_property_get_uint(OBJECT(&bmc->soc), "max-ram-size",
361 memory_region_init_io(&bmc->max_ram, NULL, &max_ram_ops, NULL,
362 "max_ram", max_ram_size - machine->ram_size);
363 memory_region_add_subregion(&bmc->ram_container, machine->ram_size, &bmc->max_ram);
365 aspeed_board_init_flashes(&bmc->soc.fmc, bmc->fmc_model ?
366 bmc->fmc_model : amc->fmc_model);
367 aspeed_board_init_flashes(&bmc->soc.spi[0], bmc->spi_model ?
368 bmc->spi_model : amc->spi_model);
370 /* Install first FMC flash content as a boot rom. */
372 AspeedSMCFlash *fl = &bmc->soc.fmc.flashes[0];
373 MemoryRegion *boot_rom = g_new(MemoryRegion, 1);
376 * create a ROM region using the default mapping window size of
377 * the flash module. The window size is 64MB for the AST2400
378 * SoC and 128MB for the AST2500 SoC, which is twice as big as
379 * needed by the flash modules of the Aspeed machines.
381 if (ASPEED_MACHINE(machine)->mmio_exec) {
382 memory_region_init_alias(boot_rom, NULL, "aspeed.boot_rom",
383 &fl->mmio, 0, fl->size);
384 memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
387 memory_region_init_rom(boot_rom, NULL, "aspeed.boot_rom",
388 fl->size, &error_abort);
389 memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
391 write_boot_rom(drive0, FIRMWARE_ADDR, fl->size, &error_abort);
395 if (machine->kernel_filename && sc->num_cpus > 1) {
396 /* With no u-boot we must set up a boot stub for the secondary CPU */
397 MemoryRegion *smpboot = g_new(MemoryRegion, 1);
398 memory_region_init_ram(smpboot, NULL, "aspeed.smpboot",
400 memory_region_add_subregion(get_system_memory(),
401 AST_SMP_MAILBOX_BASE, smpboot);
403 aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot;
404 aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary;
405 aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE;
408 aspeed_board_binfo.ram_size = machine->ram_size;
409 aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM];
410 aspeed_board_binfo.nb_cpus = sc->num_cpus;
416 for (i = 0; i < bmc->soc.sdhci.num_slots; i++) {
417 sdhci_attach_drive(&bmc->soc.sdhci.slots[i], drive_get_next(IF_SD));
420 if (bmc->soc.emmc.num_slots) {
421 sdhci_attach_drive(&bmc->soc.emmc.slots[0], drive_get_next(IF_SD));
424 arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo);
427 static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
429 AspeedSoCState *soc = &bmc->soc;
431 uint8_t *eeprom_buf = g_malloc0(32 * 1024);
433 /* The palmetto platform expects a ds3231 RTC but a ds1338 is
434 * enough to provide basic RTC features. Alarms will be missing */
435 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
437 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
440 /* add a TMP423 temperature sensor */
441 dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
443 object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
444 object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
445 object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
446 object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort);
449 static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc)
451 AspeedSoCState *soc = &bmc->soc;
454 * The quanta-q71l platform expects tmp75s which are compatible with
457 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c);
458 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e);
459 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f);
461 /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */
462 /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */
463 /* TODO: Add Memory Riser i2c mux and eeproms. */
465 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74);
466 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77);
468 /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */
471 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70);
472 /* - i2c@0: pmbus@59 */
473 /* - i2c@1: pmbus@58 */
474 /* - i2c@2: pmbus@58 */
475 /* - i2c@3: pmbus@59 */
477 /* TODO: i2c-7: Add PDB FRU eeprom@52 */
478 /* TODO: i2c-8: Add BMC FRU eeprom@50 */
481 static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
483 AspeedSoCState *soc = &bmc->soc;
484 uint8_t *eeprom_buf = g_malloc0(8 * 1024);
486 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50,
489 /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
490 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
493 /* The AST2500 EVB does not have an RTC. Let's pretend that one is
494 * plugged on the I2C bus header */
495 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
498 static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
500 /* Start with some devices on our I2C busses */
501 ast2500_evb_i2c_init(bmc);
504 static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
506 AspeedSoCState *soc = &bmc->soc;
508 /* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
510 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
513 static void swift_bmc_i2c_init(AspeedMachineState *bmc)
515 AspeedSoCState *soc = &bmc->soc;
517 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "pca9552", 0x60);
519 /* The swift board expects a TMP275 but a TMP105 is compatible */
520 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "tmp105", 0x48);
521 /* The swift board expects a pca9551 but a pca9552 is compatible */
522 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9552", 0x60);
524 /* The swift board expects an Epson RX8900 RTC but a ds1338 is compatible */
525 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "ds1338", 0x32);
526 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x60);
528 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c);
529 /* The swift board expects a pca9539 but a pca9552 is compatible */
530 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "pca9552", 0x74);
532 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c);
533 /* The swift board expects a pca9539 but a pca9552 is compatible */
534 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "pca9552",
537 /* The swift board expects a TMP275 but a TMP105 is compatible */
538 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12), "tmp105", 0x48);
539 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12), "tmp105", 0x4a);
542 static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc)
544 AspeedSoCState *soc = &bmc->soc;
547 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48);
548 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49);
549 /* bus 2 : pca9546 @ 0x73 */
551 /* bus 3 : pca9548 @ 0x70 */
554 uint8_t *eeprom4_54 = g_malloc0(8 * 1024);
555 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54,
557 /* PCA9539 @ 0x76, but PCA9552 is compatible */
558 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "pca9552", 0x76);
559 /* PCA9539 @ 0x77, but PCA9552 is compatible */
560 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "pca9552", 0x77);
563 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48);
564 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49);
565 /* bus 6 : pca9546 @ 0x73 */
568 uint8_t *eeprom8_56 = g_malloc0(8 * 1024);
569 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56,
571 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x60);
572 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x61);
573 /* bus 8 : adc128d818 @ 0x1d */
574 /* bus 8 : adc128d818 @ 0x1f */
577 * bus 13 : pca9548 @ 0x71
586 static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
588 static const struct {
591 const char *description;
594 {13, LED_COLOR_GREEN, "front-fault-4", GPIO_POLARITY_ACTIVE_LOW},
595 {14, LED_COLOR_GREEN, "front-power-3", GPIO_POLARITY_ACTIVE_LOW},
596 {15, LED_COLOR_GREEN, "front-id-5", GPIO_POLARITY_ACTIVE_LOW},
598 AspeedSoCState *soc = &bmc->soc;
599 uint8_t *eeprom_buf = g_malloc0(8 * 1024);
603 /* Bus 3: TODO bmp280@77 */
604 /* Bus 3: TODO max31785@52 */
605 /* Bus 3: TODO dps310@76 */
606 dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
607 qdev_prop_set_string(dev, "description", "pca1");
608 i2c_slave_realize_and_unref(I2C_SLAVE(dev),
609 aspeed_i2c_get_bus(&soc->i2c, 3),
612 for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) {
613 led = led_create_simple(OBJECT(bmc),
614 pca1_leds[i].gpio_polarity,
616 pca1_leds[i].description);
617 qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id,
618 qdev_get_gpio_in(DEVICE(led), 0));
620 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c);
621 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c);
623 /* The Witherspoon expects a TMP275 but a TMP105 is compatible */
624 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105,
627 /* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
629 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
631 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51,
633 dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
634 qdev_prop_set_string(dev, "description", "pca0");
635 i2c_slave_realize_and_unref(I2C_SLAVE(dev),
636 aspeed_i2c_get_bus(&soc->i2c, 11),
638 /* Bus 11: TODO ucd90160@64 */
641 static void g220a_bmc_i2c_init(AspeedMachineState *bmc)
643 AspeedSoCState *soc = &bmc->soc;
646 dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3),
648 object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
649 object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
650 object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
652 dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12),
654 object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
655 object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
656 object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
658 dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13),
660 object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
661 object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
662 object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
664 static uint8_t eeprom_buf[2 * 1024] = {
665 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe,
666 0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65,
667 0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32,
668 0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42,
669 0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45,
670 0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1,
671 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7,
673 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57,
677 static void aspeed_eeprom_init(I2CBus *bus, uint8_t addr, uint32_t rsize)
679 I2CSlave *i2c_dev = i2c_slave_new("at24c-eeprom", addr);
680 DeviceState *dev = DEVICE(i2c_dev);
682 qdev_prop_set_uint32(dev, "rom-size", rsize);
683 i2c_slave_realize_and_unref(i2c_dev, bus, &error_abort);
686 static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
688 AspeedSoCState *soc = &bmc->soc;
691 aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB);
693 /* The rainier expects a TMP275 but a TMP105 is compatible */
694 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
696 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
698 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
700 i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4),
702 aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
703 aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
704 aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB);
706 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
708 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
710 i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5),
712 aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
713 aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
715 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
717 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
719 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
721 i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6),
723 aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
724 aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
725 aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB);
726 aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB);
728 /* Bus 7: TODO dps310@76 */
729 /* Bus 7: TODO max31785@52 */
730 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9552", 0x61);
731 /* Bus 7: TODO si7021-a20@20 */
732 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105,
734 aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB);
735 aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB);
737 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
739 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
741 aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50, 64 * KiB);
742 aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 64 * KiB);
743 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x61);
744 /* Bus 8: ucd90320@11 */
745 /* Bus 8: ucd90320@b */
746 /* Bus 8: ucd90320@c */
748 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c);
749 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d);
750 aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB);
752 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c);
753 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d);
754 aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB);
756 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
758 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
760 i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11),
762 aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
763 aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
766 aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB);
768 aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB);
770 aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB);
773 static bool aspeed_get_mmio_exec(Object *obj, Error **errp)
775 return ASPEED_MACHINE(obj)->mmio_exec;
778 static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp)
780 ASPEED_MACHINE(obj)->mmio_exec = value;
783 static void aspeed_machine_instance_init(Object *obj)
785 ASPEED_MACHINE(obj)->mmio_exec = false;
788 static char *aspeed_get_fmc_model(Object *obj, Error **errp)
790 AspeedMachineState *bmc = ASPEED_MACHINE(obj);
791 return g_strdup(bmc->fmc_model);
794 static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp)
796 AspeedMachineState *bmc = ASPEED_MACHINE(obj);
798 g_free(bmc->fmc_model);
799 bmc->fmc_model = g_strdup(value);
802 static char *aspeed_get_spi_model(Object *obj, Error **errp)
804 AspeedMachineState *bmc = ASPEED_MACHINE(obj);
805 return g_strdup(bmc->spi_model);
808 static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp)
810 AspeedMachineState *bmc = ASPEED_MACHINE(obj);
812 g_free(bmc->spi_model);
813 bmc->spi_model = g_strdup(value);
816 static void aspeed_machine_class_props_init(ObjectClass *oc)
818 object_class_property_add_bool(oc, "execute-in-place",
819 aspeed_get_mmio_exec,
820 aspeed_set_mmio_exec);
821 object_class_property_set_description(oc, "execute-in-place",
822 "boot directly from CE0 flash device");
824 object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model,
825 aspeed_set_fmc_model);
826 object_class_property_set_description(oc, "fmc-model",
827 "Change the FMC Flash model");
828 object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model,
829 aspeed_set_spi_model);
830 object_class_property_set_description(oc, "spi-model",
831 "Change the SPI Flash model");
834 static int aspeed_soc_num_cpus(const char *soc_name)
836 AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(soc_name));
840 static void aspeed_machine_class_init(ObjectClass *oc, void *data)
842 MachineClass *mc = MACHINE_CLASS(oc);
843 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
845 mc->init = aspeed_machine_init;
849 mc->default_ram_id = "ram";
850 amc->macs_mask = ASPEED_MAC0_ON;
852 aspeed_machine_class_props_init(oc);
855 static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
857 MachineClass *mc = MACHINE_CLASS(oc);
858 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
860 mc->desc = "OpenPOWER Palmetto BMC (ARM926EJ-S)";
861 amc->soc_name = "ast2400-a1";
862 amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1;
863 amc->fmc_model = "n25q256a";
864 amc->spi_model = "mx25l25635e";
866 amc->i2c_init = palmetto_bmc_i2c_init;
867 mc->default_ram_size = 256 * MiB;
868 mc->default_cpus = mc->min_cpus = mc->max_cpus =
869 aspeed_soc_num_cpus(amc->soc_name);
872 static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data)
874 MachineClass *mc = MACHINE_CLASS(oc);
875 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
877 mc->desc = "Quanta-Q71l BMC (ARM926EJ-S)";
878 amc->soc_name = "ast2400-a1";
879 amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1;
880 amc->fmc_model = "n25q256a";
881 amc->spi_model = "mx25l25635e";
883 amc->i2c_init = quanta_q71l_bmc_i2c_init;
884 mc->default_ram_size = 128 * MiB;
885 mc->default_cpus = mc->min_cpus = mc->max_cpus =
886 aspeed_soc_num_cpus(amc->soc_name);
889 static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc,
892 MachineClass *mc = MACHINE_CLASS(oc);
893 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
895 mc->desc = "Supermicro X11 BMC (ARM926EJ-S)";
896 amc->soc_name = "ast2400-a1";
897 amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1;
898 amc->fmc_model = "mx25l25635e";
899 amc->spi_model = "mx25l25635e";
901 amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
902 amc->i2c_init = palmetto_bmc_i2c_init;
903 mc->default_ram_size = 256 * MiB;
906 static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data)
908 MachineClass *mc = MACHINE_CLASS(oc);
909 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
911 mc->desc = "Aspeed AST2500 EVB (ARM1176)";
912 amc->soc_name = "ast2500-a1";
913 amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
914 amc->fmc_model = "w25q256";
915 amc->spi_model = "mx25l25635e";
917 amc->i2c_init = ast2500_evb_i2c_init;
918 mc->default_ram_size = 512 * MiB;
919 mc->default_cpus = mc->min_cpus = mc->max_cpus =
920 aspeed_soc_num_cpus(amc->soc_name);
923 static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data)
925 MachineClass *mc = MACHINE_CLASS(oc);
926 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
928 mc->desc = "OpenPOWER Romulus BMC (ARM1176)";
929 amc->soc_name = "ast2500-a1";
930 amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1;
931 amc->fmc_model = "n25q256a";
932 amc->spi_model = "mx66l1g45g";
934 amc->i2c_init = romulus_bmc_i2c_init;
935 mc->default_ram_size = 512 * MiB;
936 mc->default_cpus = mc->min_cpus = mc->max_cpus =
937 aspeed_soc_num_cpus(amc->soc_name);
940 static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data)
942 MachineClass *mc = MACHINE_CLASS(oc);
943 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
945 mc->desc = "OCP SonoraPass BMC (ARM1176)";
946 amc->soc_name = "ast2500-a1";
947 amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1;
948 amc->fmc_model = "mx66l1g45g";
949 amc->spi_model = "mx66l1g45g";
951 amc->i2c_init = sonorapass_bmc_i2c_init;
952 mc->default_ram_size = 512 * MiB;
953 mc->default_cpus = mc->min_cpus = mc->max_cpus =
954 aspeed_soc_num_cpus(amc->soc_name);
957 static void aspeed_machine_swift_class_init(ObjectClass *oc, void *data)
959 MachineClass *mc = MACHINE_CLASS(oc);
960 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
962 mc->desc = "OpenPOWER Swift BMC (ARM1176)";
963 amc->soc_name = "ast2500-a1";
964 amc->hw_strap1 = SWIFT_BMC_HW_STRAP1;
965 amc->fmc_model = "mx66l1g45g";
966 amc->spi_model = "mx66l1g45g";
968 amc->i2c_init = swift_bmc_i2c_init;
969 mc->default_ram_size = 512 * MiB;
970 mc->default_cpus = mc->min_cpus = mc->max_cpus =
971 aspeed_soc_num_cpus(amc->soc_name);
973 mc->deprecation_reason = "redundant system. Please use a similar "
974 "OpenPOWER BMC, Witherspoon or Romulus.";
977 static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data)
979 MachineClass *mc = MACHINE_CLASS(oc);
980 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
982 mc->desc = "OpenPOWER Witherspoon BMC (ARM1176)";
983 amc->soc_name = "ast2500-a1";
984 amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1;
985 amc->fmc_model = "mx25l25635e";
986 amc->spi_model = "mx66l1g45g";
988 amc->i2c_init = witherspoon_bmc_i2c_init;
989 mc->default_ram_size = 512 * MiB;
990 mc->default_cpus = mc->min_cpus = mc->max_cpus =
991 aspeed_soc_num_cpus(amc->soc_name);
994 static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
996 MachineClass *mc = MACHINE_CLASS(oc);
997 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
999 mc->desc = "Aspeed AST2600 EVB (Cortex-A7)";
1000 amc->soc_name = "ast2600-a1";
1001 amc->hw_strap1 = AST2600_EVB_HW_STRAP1;
1002 amc->hw_strap2 = AST2600_EVB_HW_STRAP2;
1003 amc->fmc_model = "w25q512jv";
1004 amc->spi_model = "mx66u51235f";
1006 amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON |
1008 amc->i2c_init = ast2600_evb_i2c_init;
1009 mc->default_ram_size = 1 * GiB;
1010 mc->default_cpus = mc->min_cpus = mc->max_cpus =
1011 aspeed_soc_num_cpus(amc->soc_name);
1014 static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data)
1016 MachineClass *mc = MACHINE_CLASS(oc);
1017 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1019 mc->desc = "OpenPOWER Tacoma BMC (Cortex-A7)";
1020 amc->soc_name = "ast2600-a1";
1021 amc->hw_strap1 = TACOMA_BMC_HW_STRAP1;
1022 amc->hw_strap2 = TACOMA_BMC_HW_STRAP2;
1023 amc->fmc_model = "mx66l1g45g";
1024 amc->spi_model = "mx66l1g45g";
1026 amc->macs_mask = ASPEED_MAC2_ON;
1027 amc->i2c_init = witherspoon_bmc_i2c_init; /* Same board layout */
1028 mc->default_ram_size = 1 * GiB;
1029 mc->default_cpus = mc->min_cpus = mc->max_cpus =
1030 aspeed_soc_num_cpus(amc->soc_name);
1033 static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data)
1035 MachineClass *mc = MACHINE_CLASS(oc);
1036 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1038 mc->desc = "Bytedance G220A BMC (ARM1176)";
1039 amc->soc_name = "ast2500-a1";
1040 amc->hw_strap1 = G220A_BMC_HW_STRAP1;
1041 amc->fmc_model = "n25q512a";
1042 amc->spi_model = "mx25l25635e";
1044 amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
1045 amc->i2c_init = g220a_bmc_i2c_init;
1046 mc->default_ram_size = 1024 * MiB;
1047 mc->default_cpus = mc->min_cpus = mc->max_cpus =
1048 aspeed_soc_num_cpus(amc->soc_name);
1051 static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data)
1053 MachineClass *mc = MACHINE_CLASS(oc);
1054 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1056 mc->desc = "IBM Rainier BMC (Cortex-A7)";
1057 amc->soc_name = "ast2600-a1";
1058 amc->hw_strap1 = RAINIER_BMC_HW_STRAP1;
1059 amc->hw_strap2 = RAINIER_BMC_HW_STRAP2;
1060 amc->fmc_model = "mx66l1g45g";
1061 amc->spi_model = "mx66l1g45g";
1063 amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1064 amc->i2c_init = rainier_bmc_i2c_init;
1065 mc->default_ram_size = 1 * GiB;
1066 mc->default_cpus = mc->min_cpus = mc->max_cpus =
1067 aspeed_soc_num_cpus(amc->soc_name);
1070 static const TypeInfo aspeed_machine_types[] = {
1072 .name = MACHINE_TYPE_NAME("palmetto-bmc"),
1073 .parent = TYPE_ASPEED_MACHINE,
1074 .class_init = aspeed_machine_palmetto_class_init,
1076 .name = MACHINE_TYPE_NAME("supermicrox11-bmc"),
1077 .parent = TYPE_ASPEED_MACHINE,
1078 .class_init = aspeed_machine_supermicrox11_bmc_class_init,
1080 .name = MACHINE_TYPE_NAME("ast2500-evb"),
1081 .parent = TYPE_ASPEED_MACHINE,
1082 .class_init = aspeed_machine_ast2500_evb_class_init,
1084 .name = MACHINE_TYPE_NAME("romulus-bmc"),
1085 .parent = TYPE_ASPEED_MACHINE,
1086 .class_init = aspeed_machine_romulus_class_init,
1088 .name = MACHINE_TYPE_NAME("swift-bmc"),
1089 .parent = TYPE_ASPEED_MACHINE,
1090 .class_init = aspeed_machine_swift_class_init,
1092 .name = MACHINE_TYPE_NAME("sonorapass-bmc"),
1093 .parent = TYPE_ASPEED_MACHINE,
1094 .class_init = aspeed_machine_sonorapass_class_init,
1096 .name = MACHINE_TYPE_NAME("witherspoon-bmc"),
1097 .parent = TYPE_ASPEED_MACHINE,
1098 .class_init = aspeed_machine_witherspoon_class_init,
1100 .name = MACHINE_TYPE_NAME("ast2600-evb"),
1101 .parent = TYPE_ASPEED_MACHINE,
1102 .class_init = aspeed_machine_ast2600_evb_class_init,
1104 .name = MACHINE_TYPE_NAME("tacoma-bmc"),
1105 .parent = TYPE_ASPEED_MACHINE,
1106 .class_init = aspeed_machine_tacoma_class_init,
1108 .name = MACHINE_TYPE_NAME("g220a-bmc"),
1109 .parent = TYPE_ASPEED_MACHINE,
1110 .class_init = aspeed_machine_g220a_class_init,
1112 .name = MACHINE_TYPE_NAME("quanta-q71l-bmc"),
1113 .parent = TYPE_ASPEED_MACHINE,
1114 .class_init = aspeed_machine_quanta_q71l_class_init,
1116 .name = MACHINE_TYPE_NAME("rainier-bmc"),
1117 .parent = TYPE_ASPEED_MACHINE,
1118 .class_init = aspeed_machine_rainier_class_init,
1120 .name = TYPE_ASPEED_MACHINE,
1121 .parent = TYPE_MACHINE,
1122 .instance_size = sizeof(AspeedMachineState),
1123 .instance_init = aspeed_machine_instance_init,
1124 .class_size = sizeof(AspeedMachineClass),
1125 .class_init = aspeed_machine_class_init,
1130 DEFINE_TYPES(aspeed_machine_types)