Merge tag 'pull-loongarch-20241016' of https://gitlab.com/gaosong/qemu into staging
[qemu/armbru.git] / hw / arm / aspeed.c
blobcf0c6c580b2a4a2909cf836b95ca8e24da3752f8
1 /*
2 * OpenPOWER Palmetto BMC
4 * Andrew Jeffery <andrew@aj.id.au>
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/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"
34 static struct arm_boot_info aspeed_board_binfo = {
35 .board_id = -1, /* device-tree-only board */
38 struct AspeedMachineState {
39 /* Private */
40 MachineState parent_obj;
41 /* Public */
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;
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
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))
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))
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))
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)
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))
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)
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)
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)
162 /* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */
163 #define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1
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))
178 /* AST2600 evb hardware value */
179 #define AST2600_EVB_HW_STRAP1 0x000000C0
180 #define AST2600_EVB_HW_STRAP2 0x00000003
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
188 /* Tacoma hardware value */
189 #define TACOMA_BMC_HW_STRAP1 0x00000000
190 #define TACOMA_BMC_HW_STRAP2 0x00000040
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
196 /* Fuji hardware value */
197 #define FUJI_BMC_HW_STRAP1 0x00000000
198 #define FUJI_BMC_HW_STRAP2 0x00000000
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
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
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
217 static void aspeed_write_smpboot(ARMCPU *cpu,
218 const struct arm_boot_info *info)
220 AddressSpace *as = arm_boot_address_space(cpu, info);
221 static const ARMInsnFixup poll_mailbox_ready[] = {
223 * r2 = per-cpu go sign value
224 * r1 = AST_SMP_MBOX_FIELD_ENTRY
225 * r0 = AST_SMP_MBOX_FIELD_GOSIGN
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 */
232 { 0xe59f1018 }, /* ldr r1, [pc, #24] */
233 { 0xe59f0018 }, /* ldr r0, [pc, #24] */
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 }
245 static const uint32_t fixupcontext[FIXUP_MAX] = { 0 };
247 arm_write_bootloader("aspeed.smpboot", as, info->smp_loader_start,
248 poll_mailbox_ready, fixupcontext);
251 static void aspeed_reset_secondary(ARMCPU *cpu,
252 const struct arm_boot_info *info)
254 AddressSpace *as = arm_boot_address_space(cpu, info);
255 CPUState *cs = CPU(cpu);
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);
263 static void write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size,
264 Error **errp)
266 g_autofree void *storage = NULL;
267 int64_t size;
270 * The block backend size should have already been 'validated' by
271 * the creation of the m25p80 object.
273 size = blk_getlength(blk);
274 if (size <= 0) {
275 error_setg(errp, "failed to get flash size");
276 return;
279 if (rom_size > size) {
280 rom_size = size;
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;
289 rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr);
293 * Create a ROM and copy the flash contents at the expected address
294 * (0x0). Boots faster than execute-in-place.
296 static void aspeed_install_boot_rom(AspeedMachineState *bmc, BlockBackend *blk,
297 uint64_t rom_size)
299 AspeedSoCState *soc = bmc->soc;
300 AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(soc);
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);
310 void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
311 unsigned int count, int unit0)
313 int i;
315 if (!flashtype) {
316 return;
319 for (i = 0; i < count; ++i) {
320 DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i);
321 DeviceState *dev;
323 dev = qdev_new(flashtype);
324 if (dinfo) {
325 qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo));
327 qdev_prop_set_uint8(dev, "cs", i);
328 qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal);
332 static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo, bool emmc,
333 bool boot_emmc)
335 DeviceState *card;
337 if (!dinfo) {
338 return;
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);
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);
353 static void connect_serial_hds_to_uarts(AspeedMachineState *bmc)
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;
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;
365 aspeed_soc_uart_set_chr(s, uart, serial_hd(i));
369 static void aspeed_machine_init(MachineState *machine)
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;
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);
384 * This will error out if the RAM size is not supported by the
385 * memory controller of the SoC.
387 object_property_set_uint(OBJECT(bmc->soc), "ram-size", machine->ram_size,
388 &error_fatal);
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 */
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) {
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
412 object_property_set_int(OBJECT(bmc->soc), "hw-prot-key",
413 ASPEED_SCU_PROT_KEY, &error_abort);
415 connect_serial_hds_to_uarts(bmc);
416 qdev_realize(DEVICE(bmc->soc), NULL, &error_abort);
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);
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);
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;
440 aspeed_board_binfo.ram_size = machine->ram_size;
441 aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM];
443 if (amc->i2c_init) {
444 amc->i2c_init(bmc);
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);
452 boot_emmc = sc->boot_from_emmc(bmc->soc);
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);
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;
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);
471 arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo);
474 static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
476 AspeedSoCState *soc = bmc->soc;
477 DeviceState *dev;
478 uint8_t *eeprom_buf = g_malloc0(32 * 1024);
481 * The palmetto platform expects a ds3231 RTC but a ds1338 is
482 * enough to provide basic RTC features. Alarms will be missing
484 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
486 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
487 eeprom_buf);
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);
498 static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc)
500 AspeedSoCState *soc = bmc->soc;
503 * The quanta-q71l platform expects tmp75s which are compatible with
504 * tmp105s.
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);
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. */
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);
517 /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */
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 */
526 /* TODO: i2c-7: Add PDB FRU eeprom@52 */
527 /* TODO: i2c-8: Add BMC FRU eeprom@50 */
530 static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
532 AspeedSoCState *soc = bmc->soc;
533 uint8_t *eeprom_buf = g_malloc0(8 * 1024);
535 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50,
536 eeprom_buf);
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);
543 static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
545 AspeedSoCState *soc = bmc->soc;
546 uint8_t *eeprom_buf = g_malloc0(8 * 1024);
548 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50,
549 eeprom_buf);
551 /* LM75 is compatible with TMP105 driver */
552 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
553 TYPE_TMP105, 0x4d);
556 static void yosemitev2_bmc_i2c_init(AspeedMachineState *bmc)
558 AspeedSoCState *soc = bmc->soc;
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);
570 static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
572 AspeedSoCState *soc = bmc->soc;
575 * The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
576 * good enough
578 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
581 static void tiogapass_bmc_i2c_init(AspeedMachineState *bmc)
583 AspeedSoCState *soc = bmc->soc;
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);
594 static void create_pca9552(AspeedSoCState *soc, int bus_id, int addr)
596 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, bus_id),
597 TYPE_PCA9552, addr);
600 static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc)
602 AspeedSoCState *soc = bmc->soc;
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 */
609 /* bus 3 : pca9548 @ 0x70 */
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);
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 */
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 */
635 * bus 13 : pca9548 @ 0x71
636 * - channel 3:
637 * - tmm421 @ 0x4c
638 * - tmp421 @ 0x4e
639 * - tmp421 @ 0x4f
644 static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
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},
656 AspeedSoCState *soc = bmc->soc;
657 uint8_t *eeprom_buf = g_malloc0(8 * 1024);
658 DeviceState *dev;
659 LEDState *led;
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);
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));
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);
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);
686 * The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
687 * good enough
689 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
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 */
701 static void g220a_bmc_i2c_init(AspeedMachineState *bmc)
703 AspeedSoCState *soc = bmc->soc;
704 DeviceState *dev;
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);
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);
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);
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,
733 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57,
734 eeprom_buf);
737 static void fp5280g2_bmc_i2c_init(AspeedMachineState *bmc)
739 AspeedSoCState *soc = bmc->soc;
740 I2CSlave *i2c_mux;
742 /* The at24c256 */
743 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 1), 0x50, 32768);
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);
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);
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);
760 /* It expects a pca9555 but a pca9552 is compatible */
761 create_pca9552(soc, 8, 0x30);
764 static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
766 AspeedSoCState *soc = bmc->soc;
767 I2CSlave *i2c_mux;
769 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB);
771 create_pca9552(soc, 3, 0x61);
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);
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);
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);
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);
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 */
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);
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);
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);
858 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB);
859 create_pca9552(soc, 13, 0x60);
861 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB);
862 create_pca9552(soc, 14, 0x60);
864 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB);
865 create_pca9552(soc, 15, 0x60);
868 static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr,
869 I2CBus **channels)
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);
877 #define TYPE_LM75 TYPE_TMP105
878 #define TYPE_TMP75 TYPE_TMP105
879 #define TYPE_TMP422 "tmp422"
881 static void fuji_bmc_i2c_init(AspeedMachineState *bmc)
883 AspeedSoCState *soc = bmc->soc;
884 I2CBus *i2c[144] = {};
886 for (int i = 0; i < 16; i++) {
887 i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
889 I2CBus *i2c180 = i2c[2];
890 I2CBus *i2c480 = i2c[8];
891 I2CBus *i2c600 = i2c[11];
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]);
905 i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c);
906 i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d);
909 * EEPROM 24c64 size is 64Kbits or 8 Kbytes
910 * 24c02 size is 2Kbits or 256 bytes
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);
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);
921 at24c_eeprom_init(i2c[8], 0x51, 8 * KiB);
922 i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a);
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);
929 i2c_slave_create_simple(i2c[59], TYPE_TMP75, 0x48);
930 i2c_slave_create_simple(i2c[60], TYPE_TMP75, 0x49);
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);
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);
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);
957 #define TYPE_TMP421 "tmp421"
959 static void bletchley_bmc_i2c_init(AspeedMachineState *bmc)
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;
967 i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
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 */
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);
987 /* Bus 7 */
988 at24c_eeprom_init(i2c[7], 0x54, 65536);
990 /* Bus 9 */
991 i2c_slave_create_simple(i2c[9], TYPE_TMP421, 0x4f);
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);
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);
1005 static void fby35_i2c_init(AspeedMachineState *bmc)
1007 AspeedSoCState *soc = bmc->soc;
1008 I2CBus *i2c[16];
1010 for (int i = 0; i < 16; i++) {
1011 i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
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);
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);
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.
1037 static void qcom_dc_scm_bmc_i2c_init(AspeedMachineState *bmc)
1039 AspeedSoCState *soc = bmc->soc;
1041 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 15), "tmp105", 0x4d);
1044 static void qcom_dc_scm_firework_i2c_init(AspeedMachineState *bmc)
1046 AspeedSoCState *soc = bmc->soc;
1047 I2CSlave *therm_mux, *cpuvr_mux;
1049 /* Create the generic DC-SCM hardware */
1050 qcom_dc_scm_bmc_i2c_init(bmc);
1052 /* Now create the Firework specific hardware */
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);
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);
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);
1076 static bool aspeed_get_mmio_exec(Object *obj, Error **errp)
1078 return ASPEED_MACHINE(obj)->mmio_exec;
1081 static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp)
1083 ASPEED_MACHINE(obj)->mmio_exec = value;
1086 static void aspeed_machine_instance_init(Object *obj)
1088 AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(obj);
1090 ASPEED_MACHINE(obj)->mmio_exec = false;
1091 ASPEED_MACHINE(obj)->hw_strap1 = amc->hw_strap1;
1094 static char *aspeed_get_fmc_model(Object *obj, Error **errp)
1096 AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1097 return g_strdup(bmc->fmc_model);
1100 static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp)
1102 AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1104 g_free(bmc->fmc_model);
1105 bmc->fmc_model = g_strdup(value);
1108 static char *aspeed_get_spi_model(Object *obj, Error **errp)
1110 AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1111 return g_strdup(bmc->spi_model);
1114 static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp)
1116 AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1118 g_free(bmc->spi_model);
1119 bmc->spi_model = g_strdup(value);
1122 static char *aspeed_get_bmc_console(Object *obj, Error **errp)
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;
1128 return g_strdup_printf("uart%d", aspeed_uart_index(uart_chosen));
1131 static void aspeed_set_bmc_console(Object *obj, const char *value, Error **errp)
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);
1140 if (sscanf(value, "uart%u", &val) != 1) {
1141 error_setg(errp, "Bad value for \"uart\" property");
1142 return;
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;
1151 bmc->uart_chosen = val + ASPEED_DEV_UART0;
1154 static void aspeed_machine_class_props_init(ObjectClass *oc)
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");
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\"");
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");
1177 static void aspeed_machine_class_init_cpus_defaults(MachineClass *mc)
1179 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(mc);
1180 AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(amc->soc_name));
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;
1188 static bool aspeed_machine_ast2600_get_boot_from_emmc(Object *obj, Error **errp)
1190 AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1192 return !!(bmc->hw_strap1 & SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC);
1195 static void aspeed_machine_ast2600_set_boot_from_emmc(Object *obj, bool value,
1196 Error **errp)
1198 AspeedMachineState *bmc = ASPEED_MACHINE(obj);
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;
1207 static void aspeed_machine_ast2600_class_emmc_init(ObjectClass *oc)
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");
1216 static void aspeed_machine_class_init(ObjectClass *oc, void *data)
1218 MachineClass *mc = MACHINE_CLASS(oc);
1219 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
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;
1229 aspeed_machine_class_props_init(oc);
1232 static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
1234 MachineClass *mc = MACHINE_CLASS(oc);
1235 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
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);
1248 static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data)
1250 MachineClass *mc = MACHINE_CLASS(oc);
1251 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
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);
1264 static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc,
1265 void *data)
1267 MachineClass *mc = MACHINE_CLASS(oc);
1268 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
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);
1282 static void aspeed_machine_supermicro_x11spi_bmc_class_init(ObjectClass *oc,
1283 void *data)
1285 MachineClass *mc = MACHINE_CLASS(oc);
1286 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
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);
1300 static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data)
1302 MachineClass *mc = MACHINE_CLASS(oc);
1303 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
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);
1316 static void aspeed_machine_yosemitev2_class_init(ObjectClass *oc, void *data)
1318 MachineClass *mc = MACHINE_CLASS(oc);
1319 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
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);
1333 static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data)
1335 MachineClass *mc = MACHINE_CLASS(oc);
1336 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
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);
1349 static void aspeed_machine_tiogapass_class_init(ObjectClass *oc, void *data)
1351 MachineClass *mc = MACHINE_CLASS(oc);
1352 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
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);
1366 static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data)
1368 MachineClass *mc = MACHINE_CLASS(oc);
1369 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
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);
1382 static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data)
1384 MachineClass *mc = MACHINE_CLASS(oc);
1385 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
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);
1398 static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
1400 MachineClass *mc = MACHINE_CLASS(oc);
1401 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
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);
1418 static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data)
1420 MachineClass *mc = MACHINE_CLASS(oc);
1421 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
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);
1435 mc->deprecation_reason = "Please use the similar 'rainier-bmc' machine";
1438 static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data)
1440 MachineClass *mc = MACHINE_CLASS(oc);
1441 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
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);
1455 static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc, void *data)
1457 MachineClass *mc = MACHINE_CLASS(oc);
1458 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
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);
1472 static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data)
1474 MachineClass *mc = MACHINE_CLASS(oc);
1475 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
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);
1491 #define FUJI_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB)
1493 static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data)
1495 MachineClass *mc = MACHINE_CLASS(oc);
1496 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
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);
1512 #define BLETCHLEY_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB)
1514 static void aspeed_machine_bletchley_class_init(ObjectClass *oc, void *data)
1516 MachineClass *mc = MACHINE_CLASS(oc);
1517 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
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);
1532 static void fby35_reset(MachineState *state, ResetType type)
1534 AspeedMachineState *bmc = ASPEED_MACHINE(state);
1535 AspeedGPIOState *gpio = &bmc->soc->gpio;
1537 qemu_devices_reset(type);
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);
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);
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);
1558 static void aspeed_machine_fby35_class_init(ObjectClass *oc, void *data)
1560 MachineClass *mc = MACHINE_CLASS(oc);
1561 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
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);
1574 #define AST1030_INTERNAL_FLASH_SIZE (1024 * 1024)
1575 /* Main SYSCLK frequency in Hz (200MHz) */
1576 #define SYSCLK_FRQ 200000000ULL
1578 static void aspeed_minibmc_machine_init(MachineState *machine)
1580 AspeedMachineState *bmc = ASPEED_MACHINE(machine);
1581 AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
1582 Clock *sysclk;
1584 sysclk = clock_new(OBJECT(machine), "SYSCLK");
1585 clock_set_hz(sysclk, SYSCLK_FRQ);
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);
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);
1597 aspeed_board_init_flashes(&bmc->soc->fmc,
1598 bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
1599 amc->num_cs,
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);
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));
1610 if (amc->i2c_init) {
1611 amc->i2c_init(bmc);
1614 armv7m_load_kernel(ARM_CPU(first_cpu),
1615 machine->kernel_filename,
1617 AST1030_INTERNAL_FLASH_SIZE);
1620 static void ast1030_evb_i2c_init(AspeedMachineState *bmc)
1622 AspeedSoCState *soc = bmc->soc;
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);
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);
1632 static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc,
1633 void *data)
1635 MachineClass *mc = MACHINE_CLASS(oc);
1636 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
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);
1652 #ifdef TARGET_AARCH64
1653 static void ast2700_evb_i2c_init(AspeedMachineState *bmc)
1655 AspeedSoCState *soc = bmc->soc;
1657 /* LM75 is compatible with TMP105 driver */
1658 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0),
1659 TYPE_TMP105, 0x4d);
1662 static void aspeed_machine_ast2700_evb_class_init(ObjectClass *oc, void *data)
1664 MachineClass *mc = MACHINE_CLASS(oc);
1665 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
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);
1680 #endif
1682 static void aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass *oc,
1683 void *data)
1685 MachineClass *mc = MACHINE_CLASS(oc);
1686 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
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);
1701 static void aspeed_machine_qcom_firework_class_init(ObjectClass *oc,
1702 void *data)
1704 MachineClass *mc = MACHINE_CLASS(oc);
1705 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
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);
1720 static const TypeInfo aspeed_machine_types[] = {
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,
1822 DEFINE_TYPES(aspeed_machine_types)