aspeed: Introduce a "bmc-console" machine option
[qemu/kevin.git] / hw / arm / aspeed.c
blob6880998484cdbae806af9bf8d736f3d3ce2c6f34
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/i2c/i2c_mux_pca954x.h"
19 #include "hw/i2c/smbus_eeprom.h"
20 #include "hw/misc/pca9552.h"
21 #include "hw/nvram/eeprom_at24c.h"
22 #include "hw/sensor/tmp105.h"
23 #include "hw/misc/led.h"
24 #include "hw/qdev-properties.h"
25 #include "sysemu/block-backend.h"
26 #include "sysemu/reset.h"
27 #include "hw/loader.h"
28 #include "qemu/error-report.h"
29 #include "qemu/units.h"
30 #include "hw/qdev-clock.h"
31 #include "sysemu/sysemu.h"
33 static struct arm_boot_info aspeed_board_binfo = {
34 .board_id = -1, /* device-tree-only board */
37 struct AspeedMachineState {
38 /* Private */
39 MachineState parent_obj;
40 /* Public */
42 AspeedSoCState soc;
43 MemoryRegion boot_rom;
44 bool mmio_exec;
45 uint32_t uart_chosen;
46 char *fmc_model;
47 char *spi_model;
50 /* Palmetto hardware value: 0x120CE416 */
51 #define PALMETTO_BMC_HW_STRAP1 ( \
52 SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_256MB) | \
53 SCU_AST2400_HW_STRAP_DRAM_CONFIG(2 /* DDR3 with CL=6, CWL=5 */) | \
54 SCU_AST2400_HW_STRAP_ACPI_DIS | \
55 SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) | \
56 SCU_HW_STRAP_VGA_CLASS_CODE | \
57 SCU_HW_STRAP_LPC_RESET_PIN | \
58 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) | \
59 SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
60 SCU_HW_STRAP_SPI_WIDTH | \
61 SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \
62 SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
64 /* TODO: Find the actual hardware value */
65 #define SUPERMICROX11_BMC_HW_STRAP1 ( \
66 SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) | \
67 SCU_AST2400_HW_STRAP_DRAM_CONFIG(2) | \
68 SCU_AST2400_HW_STRAP_ACPI_DIS | \
69 SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) | \
70 SCU_HW_STRAP_VGA_CLASS_CODE | \
71 SCU_HW_STRAP_LPC_RESET_PIN | \
72 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) | \
73 SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
74 SCU_HW_STRAP_SPI_WIDTH | \
75 SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \
76 SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
78 /* TODO: Find the actual hardware value */
79 #define SUPERMICRO_X11SPI_BMC_HW_STRAP1 ( \
80 AST2500_HW_STRAP1_DEFAULTS | \
81 SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \
82 SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \
83 SCU_AST2500_HW_STRAP_UART_DEBUG | \
84 SCU_AST2500_HW_STRAP_DDR4_ENABLE | \
85 SCU_HW_STRAP_SPI_WIDTH | \
86 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN))
88 /* AST2500 evb hardware value: 0xF100C2E6 */
89 #define AST2500_EVB_HW_STRAP1 (( \
90 AST2500_HW_STRAP1_DEFAULTS | \
91 SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \
92 SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \
93 SCU_AST2500_HW_STRAP_UART_DEBUG | \
94 SCU_AST2500_HW_STRAP_DDR4_ENABLE | \
95 SCU_HW_STRAP_MAC1_RGMII | \
96 SCU_HW_STRAP_MAC0_RGMII) & \
97 ~SCU_HW_STRAP_2ND_BOOT_WDT)
99 /* Romulus hardware value: 0xF10AD206 */
100 #define ROMULUS_BMC_HW_STRAP1 ( \
101 AST2500_HW_STRAP1_DEFAULTS | \
102 SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \
103 SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \
104 SCU_AST2500_HW_STRAP_UART_DEBUG | \
105 SCU_AST2500_HW_STRAP_DDR4_ENABLE | \
106 SCU_AST2500_HW_STRAP_ACPI_ENABLE | \
107 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER))
109 /* Sonorapass hardware value: 0xF100D216 */
110 #define SONORAPASS_BMC_HW_STRAP1 ( \
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_RESERVED28 | \
115 SCU_AST2500_HW_STRAP_DDR4_ENABLE | \
116 SCU_HW_STRAP_VGA_CLASS_CODE | \
117 SCU_HW_STRAP_LPC_RESET_PIN | \
118 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \
119 SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \
120 SCU_HW_STRAP_VGA_BIOS_ROM | \
121 SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \
122 SCU_AST2500_HW_STRAP_RESERVED1)
124 #define G220A_BMC_HW_STRAP1 ( \
125 SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \
126 SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \
127 SCU_AST2500_HW_STRAP_UART_DEBUG | \
128 SCU_AST2500_HW_STRAP_RESERVED28 | \
129 SCU_AST2500_HW_STRAP_DDR4_ENABLE | \
130 SCU_HW_STRAP_2ND_BOOT_WDT | \
131 SCU_HW_STRAP_VGA_CLASS_CODE | \
132 SCU_HW_STRAP_LPC_RESET_PIN | \
133 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \
134 SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \
135 SCU_HW_STRAP_VGA_SIZE_SET(VGA_64M_DRAM) | \
136 SCU_AST2500_HW_STRAP_RESERVED1)
138 /* FP5280G2 hardware value: 0XF100D286 */
139 #define FP5280G2_BMC_HW_STRAP1 ( \
140 SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \
141 SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \
142 SCU_AST2500_HW_STRAP_UART_DEBUG | \
143 SCU_AST2500_HW_STRAP_RESERVED28 | \
144 SCU_AST2500_HW_STRAP_DDR4_ENABLE | \
145 SCU_HW_STRAP_VGA_CLASS_CODE | \
146 SCU_HW_STRAP_LPC_RESET_PIN | \
147 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \
148 SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \
149 SCU_HW_STRAP_MAC1_RGMII | \
150 SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \
151 SCU_AST2500_HW_STRAP_RESERVED1)
153 /* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */
154 #define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1
156 /* Quanta-Q71l hardware value */
157 #define QUANTA_Q71L_BMC_HW_STRAP1 ( \
158 SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) | \
159 SCU_AST2400_HW_STRAP_DRAM_CONFIG(2/* DDR3 with CL=6, CWL=5 */) | \
160 SCU_AST2400_HW_STRAP_ACPI_DIS | \
161 SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_24M_IN) | \
162 SCU_HW_STRAP_VGA_CLASS_CODE | \
163 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_PASS_THROUGH) | \
164 SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
165 SCU_HW_STRAP_SPI_WIDTH | \
166 SCU_HW_STRAP_VGA_SIZE_SET(VGA_8M_DRAM) | \
167 SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
169 /* AST2600 evb hardware value */
170 #define AST2600_EVB_HW_STRAP1 0x000000C0
171 #define AST2600_EVB_HW_STRAP2 0x00000003
173 /* Tacoma hardware value */
174 #define TACOMA_BMC_HW_STRAP1 0x00000000
175 #define TACOMA_BMC_HW_STRAP2 0x00000040
177 /* Rainier hardware value: (QEMU prototype) */
178 #define RAINIER_BMC_HW_STRAP1 0x00422016
179 #define RAINIER_BMC_HW_STRAP2 0x80000848
181 /* Fuji hardware value */
182 #define FUJI_BMC_HW_STRAP1 0x00000000
183 #define FUJI_BMC_HW_STRAP2 0x00000000
185 /* Bletchley hardware value */
186 /* TODO: Leave same as EVB for now. */
187 #define BLETCHLEY_BMC_HW_STRAP1 AST2600_EVB_HW_STRAP1
188 #define BLETCHLEY_BMC_HW_STRAP2 AST2600_EVB_HW_STRAP2
190 /* Qualcomm DC-SCM hardware value */
191 #define QCOM_DC_SCM_V1_BMC_HW_STRAP1 0x00000000
192 #define QCOM_DC_SCM_V1_BMC_HW_STRAP2 0x00000041
194 #define AST_SMP_MAILBOX_BASE 0x1e6e2180
195 #define AST_SMP_MBOX_FIELD_ENTRY (AST_SMP_MAILBOX_BASE + 0x0)
196 #define AST_SMP_MBOX_FIELD_GOSIGN (AST_SMP_MAILBOX_BASE + 0x4)
197 #define AST_SMP_MBOX_FIELD_READY (AST_SMP_MAILBOX_BASE + 0x8)
198 #define AST_SMP_MBOX_FIELD_POLLINSN (AST_SMP_MAILBOX_BASE + 0xc)
199 #define AST_SMP_MBOX_CODE (AST_SMP_MAILBOX_BASE + 0x10)
200 #define AST_SMP_MBOX_GOSIGN 0xabbaab00
202 static void aspeed_write_smpboot(ARMCPU *cpu,
203 const struct arm_boot_info *info)
205 AddressSpace *as = arm_boot_address_space(cpu, info);
206 static const ARMInsnFixup poll_mailbox_ready[] = {
208 * r2 = per-cpu go sign value
209 * r1 = AST_SMP_MBOX_FIELD_ENTRY
210 * r0 = AST_SMP_MBOX_FIELD_GOSIGN
212 { 0xee100fb0 }, /* mrc p15, 0, r0, c0, c0, 5 */
213 { 0xe21000ff }, /* ands r0, r0, #255 */
214 { 0xe59f201c }, /* ldr r2, [pc, #28] */
215 { 0xe1822000 }, /* orr r2, r2, r0 */
217 { 0xe59f1018 }, /* ldr r1, [pc, #24] */
218 { 0xe59f0018 }, /* ldr r0, [pc, #24] */
220 { 0xe320f002 }, /* wfe */
221 { 0xe5904000 }, /* ldr r4, [r0] */
222 { 0xe1520004 }, /* cmp r2, r4 */
223 { 0x1afffffb }, /* bne <wfe> */
224 { 0xe591f000 }, /* ldr pc, [r1] */
225 { AST_SMP_MBOX_GOSIGN },
226 { AST_SMP_MBOX_FIELD_ENTRY },
227 { AST_SMP_MBOX_FIELD_GOSIGN },
228 { 0, FIXUP_TERMINATOR }
230 static const uint32_t fixupcontext[FIXUP_MAX] = { 0 };
232 arm_write_bootloader("aspeed.smpboot", as, info->smp_loader_start,
233 poll_mailbox_ready, fixupcontext);
236 static void aspeed_reset_secondary(ARMCPU *cpu,
237 const struct arm_boot_info *info)
239 AddressSpace *as = arm_boot_address_space(cpu, info);
240 CPUState *cs = CPU(cpu);
242 /* info->smp_bootreg_addr */
243 address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0,
244 MEMTXATTRS_UNSPECIFIED, NULL);
245 cpu_set_pc(cs, info->smp_loader_start);
248 static void write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size,
249 Error **errp)
251 g_autofree void *storage = NULL;
252 int64_t size;
254 /* The block backend size should have already been 'validated' by
255 * the creation of the m25p80 object.
257 size = blk_getlength(blk);
258 if (size <= 0) {
259 error_setg(errp, "failed to get flash size");
260 return;
263 if (rom_size > size) {
264 rom_size = size;
267 storage = g_malloc0(rom_size);
268 if (blk_pread(blk, 0, rom_size, storage, 0) < 0) {
269 error_setg(errp, "failed to read the initial flash content");
270 return;
273 rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr);
277 * Create a ROM and copy the flash contents at the expected address
278 * (0x0). Boots faster than execute-in-place.
280 static void aspeed_install_boot_rom(AspeedMachineState *bmc, BlockBackend *blk,
281 uint64_t rom_size)
283 AspeedSoCState *soc = &bmc->soc;
285 memory_region_init_rom(&bmc->boot_rom, NULL, "aspeed.boot_rom", rom_size,
286 &error_abort);
287 memory_region_add_subregion_overlap(&soc->spi_boot_container, 0,
288 &bmc->boot_rom, 1);
289 write_boot_rom(blk, ASPEED_SOC_SPI_BOOT_ADDR, rom_size, &error_abort);
292 void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
293 unsigned int count, int unit0)
295 int i;
297 if (!flashtype) {
298 return;
301 for (i = 0; i < count; ++i) {
302 DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i);
303 qemu_irq cs_line;
304 DeviceState *dev;
306 dev = qdev_new(flashtype);
307 if (dinfo) {
308 qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo));
310 qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal);
312 cs_line = qdev_get_gpio_in_named(dev, SSI_GPIO_CS, 0);
313 qdev_connect_gpio_out_named(DEVICE(s), "cs", i, cs_line);
317 static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo)
319 DeviceState *card;
321 if (!dinfo) {
322 return;
324 card = qdev_new(TYPE_SD_CARD);
325 qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
326 &error_fatal);
327 qdev_realize_and_unref(card,
328 qdev_get_child_bus(DEVICE(sdhci), "sd-bus"),
329 &error_fatal);
332 static void connect_serial_hds_to_uarts(AspeedMachineState *bmc)
334 AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
335 AspeedSoCState *s = &bmc->soc;
336 AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
337 int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default;
339 aspeed_soc_uart_set_chr(s, uart_chosen, serial_hd(0));
340 for (int i = 1, uart = ASPEED_DEV_UART1; i < sc->uarts_num; i++, uart++) {
341 if (uart == uart_chosen) {
342 continue;
344 aspeed_soc_uart_set_chr(s, uart, serial_hd(i));
348 static void aspeed_machine_init(MachineState *machine)
350 AspeedMachineState *bmc = ASPEED_MACHINE(machine);
351 AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
352 AspeedSoCClass *sc;
353 int i;
354 NICInfo *nd = &nd_table[0];
356 object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
358 sc = ASPEED_SOC_GET_CLASS(&bmc->soc);
361 * This will error out if the RAM size is not supported by the
362 * memory controller of the SoC.
364 object_property_set_uint(OBJECT(&bmc->soc), "ram-size", machine->ram_size,
365 &error_fatal);
367 for (i = 0; i < sc->macs_num; i++) {
368 if ((amc->macs_mask & (1 << i)) && nd->used) {
369 qemu_check_nic_model(nd, TYPE_FTGMAC100);
370 qdev_set_nic_properties(DEVICE(&bmc->soc.ftgmac100[i]), nd);
371 nd++;
375 object_property_set_int(OBJECT(&bmc->soc), "hw-strap1", amc->hw_strap1,
376 &error_abort);
377 object_property_set_int(OBJECT(&bmc->soc), "hw-strap2", amc->hw_strap2,
378 &error_abort);
379 object_property_set_link(OBJECT(&bmc->soc), "memory",
380 OBJECT(get_system_memory()), &error_abort);
381 object_property_set_link(OBJECT(&bmc->soc), "dram",
382 OBJECT(machine->ram), &error_abort);
383 if (machine->kernel_filename) {
385 * When booting with a -kernel command line there is no u-boot
386 * that runs to unlock the SCU. In this case set the default to
387 * be unlocked as the kernel expects
389 object_property_set_int(OBJECT(&bmc->soc), "hw-prot-key",
390 ASPEED_SCU_PROT_KEY, &error_abort);
392 connect_serial_hds_to_uarts(bmc);
393 qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
395 aspeed_board_init_flashes(&bmc->soc.fmc,
396 bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
397 amc->num_cs, 0);
398 aspeed_board_init_flashes(&bmc->soc.spi[0],
399 bmc->spi_model ? bmc->spi_model : amc->spi_model,
400 1, amc->num_cs);
402 if (machine->kernel_filename && sc->num_cpus > 1) {
403 /* With no u-boot we must set up a boot stub for the secondary CPU */
404 MemoryRegion *smpboot = g_new(MemoryRegion, 1);
405 memory_region_init_ram(smpboot, NULL, "aspeed.smpboot",
406 0x80, &error_abort);
407 memory_region_add_subregion(get_system_memory(),
408 AST_SMP_MAILBOX_BASE, smpboot);
410 aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot;
411 aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary;
412 aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE;
415 aspeed_board_binfo.ram_size = machine->ram_size;
416 aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM];
418 if (amc->i2c_init) {
419 amc->i2c_init(bmc);
422 for (i = 0; i < bmc->soc.sdhci.num_slots; i++) {
423 sdhci_attach_drive(&bmc->soc.sdhci.slots[i],
424 drive_get(IF_SD, 0, i));
427 if (bmc->soc.emmc.num_slots) {
428 sdhci_attach_drive(&bmc->soc.emmc.slots[0],
429 drive_get(IF_SD, 0, bmc->soc.sdhci.num_slots));
432 if (!bmc->mmio_exec) {
433 DriveInfo *mtd0 = drive_get(IF_MTD, 0, 0);
435 if (mtd0) {
436 uint64_t rom_size = memory_region_size(&bmc->soc.spi_boot);
437 aspeed_install_boot_rom(bmc, blk_by_legacy_dinfo(mtd0), rom_size);
441 arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo);
444 static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
446 AspeedSoCState *soc = &bmc->soc;
447 DeviceState *dev;
448 uint8_t *eeprom_buf = g_malloc0(32 * 1024);
450 /* The palmetto platform expects a ds3231 RTC but a ds1338 is
451 * enough to provide basic RTC features. Alarms will be missing */
452 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
454 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
455 eeprom_buf);
457 /* add a TMP423 temperature sensor */
458 dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
459 "tmp423", 0x4c));
460 object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
461 object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
462 object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
463 object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort);
466 static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc)
468 AspeedSoCState *soc = &bmc->soc;
471 * The quanta-q71l platform expects tmp75s which are compatible with
472 * tmp105s.
474 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c);
475 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e);
476 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f);
478 /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */
479 /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */
480 /* TODO: Add Memory Riser i2c mux and eeproms. */
482 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74);
483 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77);
485 /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */
487 /* i2c-7 */
488 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70);
489 /* - i2c@0: pmbus@59 */
490 /* - i2c@1: pmbus@58 */
491 /* - i2c@2: pmbus@58 */
492 /* - i2c@3: pmbus@59 */
494 /* TODO: i2c-7: Add PDB FRU eeprom@52 */
495 /* TODO: i2c-8: Add BMC FRU eeprom@50 */
498 static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
500 AspeedSoCState *soc = &bmc->soc;
501 uint8_t *eeprom_buf = g_malloc0(8 * 1024);
503 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50,
504 eeprom_buf);
506 /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
507 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
508 TYPE_TMP105, 0x4d);
511 static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
513 AspeedSoCState *soc = &bmc->soc;
514 uint8_t *eeprom_buf = g_malloc0(8 * 1024);
516 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50,
517 eeprom_buf);
519 /* LM75 is compatible with TMP105 driver */
520 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
521 TYPE_TMP105, 0x4d);
524 static void yosemitev2_bmc_i2c_init(AspeedMachineState *bmc)
526 AspeedSoCState *soc = &bmc->soc;
528 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x51, 128 * KiB);
529 at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 128 * KiB,
530 yosemitev2_bmc_fruid, yosemitev2_bmc_fruid_len);
531 /* TMP421 */
532 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "tmp421", 0x1f);
533 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4e);
534 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4f);
538 static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
540 AspeedSoCState *soc = &bmc->soc;
542 /* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
543 * good enough */
544 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
547 static void tiogapass_bmc_i2c_init(AspeedMachineState *bmc)
549 AspeedSoCState *soc = &bmc->soc;
551 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 128 * KiB);
552 at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 6), 0x54, 128 * KiB,
553 tiogapass_bmc_fruid, tiogapass_bmc_fruid_len);
554 /* TMP421 */
555 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "tmp421", 0x1f);
556 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4f);
557 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4e);
560 static void create_pca9552(AspeedSoCState *soc, int bus_id, int addr)
562 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, bus_id),
563 TYPE_PCA9552, addr);
566 static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc)
568 AspeedSoCState *soc = &bmc->soc;
570 /* bus 2 : */
571 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48);
572 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49);
573 /* bus 2 : pca9546 @ 0x73 */
575 /* bus 3 : pca9548 @ 0x70 */
577 /* bus 4 : */
578 uint8_t *eeprom4_54 = g_malloc0(8 * 1024);
579 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54,
580 eeprom4_54);
581 /* PCA9539 @ 0x76, but PCA9552 is compatible */
582 create_pca9552(soc, 4, 0x76);
583 /* PCA9539 @ 0x77, but PCA9552 is compatible */
584 create_pca9552(soc, 4, 0x77);
586 /* bus 6 : */
587 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48);
588 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49);
589 /* bus 6 : pca9546 @ 0x73 */
591 /* bus 8 : */
592 uint8_t *eeprom8_56 = g_malloc0(8 * 1024);
593 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56,
594 eeprom8_56);
595 create_pca9552(soc, 8, 0x60);
596 create_pca9552(soc, 8, 0x61);
597 /* bus 8 : adc128d818 @ 0x1d */
598 /* bus 8 : adc128d818 @ 0x1f */
601 * bus 13 : pca9548 @ 0x71
602 * - channel 3:
603 * - tmm421 @ 0x4c
604 * - tmp421 @ 0x4e
605 * - tmp421 @ 0x4f
610 static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
612 static const struct {
613 unsigned gpio_id;
614 LEDColor color;
615 const char *description;
616 bool gpio_polarity;
617 } pca1_leds[] = {
618 {13, LED_COLOR_GREEN, "front-fault-4", GPIO_POLARITY_ACTIVE_LOW},
619 {14, LED_COLOR_GREEN, "front-power-3", GPIO_POLARITY_ACTIVE_LOW},
620 {15, LED_COLOR_GREEN, "front-id-5", GPIO_POLARITY_ACTIVE_LOW},
622 AspeedSoCState *soc = &bmc->soc;
623 uint8_t *eeprom_buf = g_malloc0(8 * 1024);
624 DeviceState *dev;
625 LEDState *led;
627 /* Bus 3: TODO bmp280@77 */
628 dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
629 qdev_prop_set_string(dev, "description", "pca1");
630 i2c_slave_realize_and_unref(I2C_SLAVE(dev),
631 aspeed_i2c_get_bus(&soc->i2c, 3),
632 &error_fatal);
634 for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) {
635 led = led_create_simple(OBJECT(bmc),
636 pca1_leds[i].gpio_polarity,
637 pca1_leds[i].color,
638 pca1_leds[i].description);
639 qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id,
640 qdev_get_gpio_in(DEVICE(led), 0));
642 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76);
643 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "max31785", 0x52);
644 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c);
645 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c);
647 /* The Witherspoon expects a TMP275 but a TMP105 is compatible */
648 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105,
649 0x4a);
651 /* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
652 * good enough */
653 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
655 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51,
656 eeprom_buf);
657 dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
658 qdev_prop_set_string(dev, "description", "pca0");
659 i2c_slave_realize_and_unref(I2C_SLAVE(dev),
660 aspeed_i2c_get_bus(&soc->i2c, 11),
661 &error_fatal);
662 /* Bus 11: TODO ucd90160@64 */
665 static void g220a_bmc_i2c_init(AspeedMachineState *bmc)
667 AspeedSoCState *soc = &bmc->soc;
668 DeviceState *dev;
670 dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3),
671 "emc1413", 0x4c));
672 object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
673 object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
674 object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
676 dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12),
677 "emc1413", 0x4c));
678 object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
679 object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
680 object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
682 dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13),
683 "emc1413", 0x4c));
684 object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
685 object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
686 object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
688 static uint8_t eeprom_buf[2 * 1024] = {
689 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe,
690 0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65,
691 0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32,
692 0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42,
693 0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45,
694 0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1,
695 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7,
697 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57,
698 eeprom_buf);
701 static void fp5280g2_bmc_i2c_init(AspeedMachineState *bmc)
703 AspeedSoCState *soc = &bmc->soc;
704 I2CSlave *i2c_mux;
706 /* The at24c256 */
707 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 1), 0x50, 32768);
709 /* The fp5280g2 expects a TMP112 but a TMP105 is compatible */
710 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
711 0x48);
712 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
713 0x49);
715 i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
716 "pca9546", 0x70);
717 /* It expects a TMP112 but a TMP105 is compatible */
718 i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0), TYPE_TMP105,
719 0x4a);
721 /* It expects a ds3232 but a ds1338 is good enough */
722 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "ds1338", 0x68);
724 /* It expects a pca9555 but a pca9552 is compatible */
725 create_pca9552(soc, 8, 0x30);
728 static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
730 AspeedSoCState *soc = &bmc->soc;
731 I2CSlave *i2c_mux;
733 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB);
735 create_pca9552(soc, 3, 0x61);
737 /* The rainier expects a TMP275 but a TMP105 is compatible */
738 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
739 0x48);
740 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
741 0x49);
742 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
743 0x4a);
744 i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4),
745 "pca9546", 0x70);
746 at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
747 at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
748 at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB);
749 create_pca9552(soc, 4, 0x60);
751 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
752 0x48);
753 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
754 0x49);
755 create_pca9552(soc, 5, 0x60);
756 create_pca9552(soc, 5, 0x61);
757 i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5),
758 "pca9546", 0x70);
759 at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
760 at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
762 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
763 0x48);
764 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
765 0x4a);
766 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
767 0x4b);
768 i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6),
769 "pca9546", 0x70);
770 at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
771 at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
772 at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB);
773 at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB);
775 create_pca9552(soc, 7, 0x30);
776 create_pca9552(soc, 7, 0x31);
777 create_pca9552(soc, 7, 0x32);
778 create_pca9552(soc, 7, 0x33);
779 create_pca9552(soc, 7, 0x60);
780 create_pca9552(soc, 7, 0x61);
781 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76);
782 /* Bus 7: TODO si7021-a20@20 */
783 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105,
784 0x48);
785 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "max31785", 0x52);
786 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB);
787 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB);
789 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
790 0x48);
791 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
792 0x4a);
793 at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50,
794 64 * KiB, rainier_bb_fruid, rainier_bb_fruid_len);
795 at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51,
796 64 * KiB, rainier_bmc_fruid, rainier_bmc_fruid_len);
797 create_pca9552(soc, 8, 0x60);
798 create_pca9552(soc, 8, 0x61);
799 /* Bus 8: ucd90320@11 */
800 /* Bus 8: ucd90320@b */
801 /* Bus 8: ucd90320@c */
803 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c);
804 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d);
805 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB);
807 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c);
808 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d);
809 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB);
811 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
812 0x48);
813 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
814 0x49);
815 i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11),
816 "pca9546", 0x70);
817 at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
818 at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
819 create_pca9552(soc, 11, 0x60);
822 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB);
823 create_pca9552(soc, 13, 0x60);
825 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB);
826 create_pca9552(soc, 14, 0x60);
828 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB);
829 create_pca9552(soc, 15, 0x60);
832 static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr,
833 I2CBus **channels)
835 I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr);
836 for (int i = 0; i < 8; i++) {
837 channels[i] = pca954x_i2c_get_bus(mux, i);
841 #define TYPE_LM75 TYPE_TMP105
842 #define TYPE_TMP75 TYPE_TMP105
843 #define TYPE_TMP422 "tmp422"
845 static void fuji_bmc_i2c_init(AspeedMachineState *bmc)
847 AspeedSoCState *soc = &bmc->soc;
848 I2CBus *i2c[144] = {};
850 for (int i = 0; i < 16; i++) {
851 i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
853 I2CBus *i2c180 = i2c[2];
854 I2CBus *i2c480 = i2c[8];
855 I2CBus *i2c600 = i2c[11];
857 get_pca9548_channels(i2c180, 0x70, &i2c[16]);
858 get_pca9548_channels(i2c480, 0x70, &i2c[24]);
859 /* NOTE: The device tree skips [32, 40) in the alias numbering */
860 get_pca9548_channels(i2c600, 0x77, &i2c[40]);
861 get_pca9548_channels(i2c[24], 0x71, &i2c[48]);
862 get_pca9548_channels(i2c[25], 0x72, &i2c[56]);
863 get_pca9548_channels(i2c[26], 0x76, &i2c[64]);
864 get_pca9548_channels(i2c[27], 0x76, &i2c[72]);
865 for (int i = 0; i < 8; i++) {
866 get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]);
869 i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c);
870 i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d);
873 * EEPROM 24c64 size is 64Kbits or 8 Kbytes
874 * 24c02 size is 2Kbits or 256 bytes
876 at24c_eeprom_init(i2c[19], 0x52, 8 * KiB);
877 at24c_eeprom_init(i2c[20], 0x50, 256);
878 at24c_eeprom_init(i2c[22], 0x52, 256);
880 i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x48);
881 i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x49);
882 i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x4a);
883 i2c_slave_create_simple(i2c[3], TYPE_TMP422, 0x4c);
885 at24c_eeprom_init(i2c[8], 0x51, 8 * KiB);
886 i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a);
888 i2c_slave_create_simple(i2c[50], TYPE_LM75, 0x4c);
889 at24c_eeprom_init(i2c[50], 0x52, 8 * KiB);
890 i2c_slave_create_simple(i2c[51], TYPE_TMP75, 0x48);
891 i2c_slave_create_simple(i2c[52], TYPE_TMP75, 0x49);
893 i2c_slave_create_simple(i2c[59], TYPE_TMP75, 0x48);
894 i2c_slave_create_simple(i2c[60], TYPE_TMP75, 0x49);
896 at24c_eeprom_init(i2c[65], 0x53, 8 * KiB);
897 i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x49);
898 i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x48);
899 at24c_eeprom_init(i2c[68], 0x52, 8 * KiB);
900 at24c_eeprom_init(i2c[69], 0x52, 8 * KiB);
901 at24c_eeprom_init(i2c[70], 0x52, 8 * KiB);
902 at24c_eeprom_init(i2c[71], 0x52, 8 * KiB);
904 at24c_eeprom_init(i2c[73], 0x53, 8 * KiB);
905 i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x49);
906 i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x48);
907 at24c_eeprom_init(i2c[76], 0x52, 8 * KiB);
908 at24c_eeprom_init(i2c[77], 0x52, 8 * KiB);
909 at24c_eeprom_init(i2c[78], 0x52, 8 * KiB);
910 at24c_eeprom_init(i2c[79], 0x52, 8 * KiB);
911 at24c_eeprom_init(i2c[28], 0x50, 256);
913 for (int i = 0; i < 8; i++) {
914 at24c_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB);
915 i2c_slave_create_simple(i2c[82 + i * 8], TYPE_TMP75, 0x48);
916 i2c_slave_create_simple(i2c[83 + i * 8], TYPE_TMP75, 0x4b);
917 i2c_slave_create_simple(i2c[84 + i * 8], TYPE_TMP75, 0x4a);
921 #define TYPE_TMP421 "tmp421"
923 static void bletchley_bmc_i2c_init(AspeedMachineState *bmc)
925 AspeedSoCState *soc = &bmc->soc;
926 I2CBus *i2c[13] = {};
927 for (int i = 0; i < 13; i++) {
928 if ((i == 8) || (i == 11)) {
929 continue;
931 i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
934 /* Bus 0 - 5 all have the same config. */
935 for (int i = 0; i < 6; i++) {
936 /* Missing model: ti,ina230 @ 0x45 */
937 /* Missing model: mps,mp5023 @ 0x40 */
938 i2c_slave_create_simple(i2c[i], TYPE_TMP421, 0x4f);
939 /* Missing model: nxp,pca9539 @ 0x76, but PCA9552 works enough */
940 i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x76);
941 i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x67);
942 /* Missing model: fsc,fusb302 @ 0x22 */
945 /* Bus 6 */
946 at24c_eeprom_init(i2c[6], 0x56, 65536);
947 /* Missing model: nxp,pcf85263 @ 0x51 , but ds1338 works enough */
948 i2c_slave_create_simple(i2c[6], "ds1338", 0x51);
951 /* Bus 7 */
952 at24c_eeprom_init(i2c[7], 0x54, 65536);
954 /* Bus 9 */
955 i2c_slave_create_simple(i2c[9], TYPE_TMP421, 0x4f);
957 /* Bus 10 */
958 i2c_slave_create_simple(i2c[10], TYPE_TMP421, 0x4f);
959 /* Missing model: ti,hdc1080 @ 0x40 */
960 i2c_slave_create_simple(i2c[10], TYPE_PCA9552, 0x67);
962 /* Bus 12 */
963 /* Missing model: adi,adm1278 @ 0x11 */
964 i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4c);
965 i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4d);
966 i2c_slave_create_simple(i2c[12], TYPE_PCA9552, 0x67);
969 static void fby35_i2c_init(AspeedMachineState *bmc)
971 AspeedSoCState *soc = &bmc->soc;
972 I2CBus *i2c[16];
974 for (int i = 0; i < 16; i++) {
975 i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
978 i2c_slave_create_simple(i2c[2], TYPE_LM75, 0x4f);
979 i2c_slave_create_simple(i2c[8], TYPE_TMP421, 0x1f);
980 /* Hotswap controller is actually supposed to be mp5920 or ltc4282. */
981 i2c_slave_create_simple(i2c[11], "adm1272", 0x44);
982 i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4e);
983 i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4f);
985 at24c_eeprom_init(i2c[4], 0x51, 128 * KiB);
986 at24c_eeprom_init(i2c[6], 0x51, 128 * KiB);
987 at24c_eeprom_init_rom(i2c[8], 0x50, 32 * KiB, fby35_nic_fruid,
988 fby35_nic_fruid_len);
989 at24c_eeprom_init_rom(i2c[11], 0x51, 128 * KiB, fby35_bb_fruid,
990 fby35_bb_fruid_len);
991 at24c_eeprom_init_rom(i2c[11], 0x54, 128 * KiB, fby35_bmc_fruid,
992 fby35_bmc_fruid_len);
995 * TODO: There is a multi-master i2c connection to an AST1030 MiniBMC on
996 * buses 0, 1, 2, 3, and 9. Source address 0x10, target address 0x20 on
997 * each.
1001 static void qcom_dc_scm_bmc_i2c_init(AspeedMachineState *bmc)
1003 AspeedSoCState *soc = &bmc->soc;
1005 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 15), "tmp105", 0x4d);
1008 static void qcom_dc_scm_firework_i2c_init(AspeedMachineState *bmc)
1010 AspeedSoCState *soc = &bmc->soc;
1011 I2CSlave *therm_mux, *cpuvr_mux;
1013 /* Create the generic DC-SCM hardware */
1014 qcom_dc_scm_bmc_i2c_init(bmc);
1016 /* Now create the Firework specific hardware */
1018 /* I2C7 CPUVR MUX */
1019 cpuvr_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
1020 "pca9546", 0x70);
1021 i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 0), "pca9548", 0x72);
1022 i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 1), "pca9548", 0x72);
1023 i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 2), "pca9548", 0x72);
1024 i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 3), "pca9548", 0x72);
1026 /* I2C8 Thermal Diodes*/
1027 therm_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
1028 "pca9548", 0x70);
1029 i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 0), TYPE_LM75, 0x4C);
1030 i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 1), TYPE_LM75, 0x4C);
1031 i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 2), TYPE_LM75, 0x48);
1032 i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 3), TYPE_LM75, 0x48);
1033 i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 4), TYPE_LM75, 0x48);
1035 /* I2C9 Fan Controller (MAX31785) */
1036 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x52);
1037 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x54);
1040 static bool aspeed_get_mmio_exec(Object *obj, Error **errp)
1042 return ASPEED_MACHINE(obj)->mmio_exec;
1045 static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp)
1047 ASPEED_MACHINE(obj)->mmio_exec = value;
1050 static void aspeed_machine_instance_init(Object *obj)
1052 ASPEED_MACHINE(obj)->mmio_exec = false;
1055 static char *aspeed_get_fmc_model(Object *obj, Error **errp)
1057 AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1058 return g_strdup(bmc->fmc_model);
1061 static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp)
1063 AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1065 g_free(bmc->fmc_model);
1066 bmc->fmc_model = g_strdup(value);
1069 static char *aspeed_get_spi_model(Object *obj, Error **errp)
1071 AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1072 return g_strdup(bmc->spi_model);
1075 static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp)
1077 AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1079 g_free(bmc->spi_model);
1080 bmc->spi_model = g_strdup(value);
1083 static char *aspeed_get_bmc_console(Object *obj, Error **errp)
1085 AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1086 AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
1087 int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default;
1089 return g_strdup_printf("uart%d", uart_chosen - ASPEED_DEV_UART1 + 1);
1092 static void aspeed_set_bmc_console(Object *obj, const char *value, Error **errp)
1094 AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1095 AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
1096 AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(amc->soc_name));
1097 int val;
1099 if (sscanf(value, "uart%u", &val) != 1) {
1100 error_setg(errp, "Bad value for \"uart\" property");
1101 return;
1104 /* The number of UART depends on the SoC */
1105 if (val < 1 || val > sc->uarts_num) {
1106 error_setg(errp, "\"uart\" should be in range [1 - %d]", sc->uarts_num);
1107 return;
1109 bmc->uart_chosen = ASPEED_DEV_UART1 + val - 1;
1112 static void aspeed_machine_class_props_init(ObjectClass *oc)
1114 object_class_property_add_bool(oc, "execute-in-place",
1115 aspeed_get_mmio_exec,
1116 aspeed_set_mmio_exec);
1117 object_class_property_set_description(oc, "execute-in-place",
1118 "boot directly from CE0 flash device");
1120 object_class_property_add_str(oc, "bmc-console", aspeed_get_bmc_console,
1121 aspeed_set_bmc_console);
1122 object_class_property_set_description(oc, "bmc-console",
1123 "Change the default UART to \"uartX\"");
1125 object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model,
1126 aspeed_set_fmc_model);
1127 object_class_property_set_description(oc, "fmc-model",
1128 "Change the FMC Flash model");
1129 object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model,
1130 aspeed_set_spi_model);
1131 object_class_property_set_description(oc, "spi-model",
1132 "Change the SPI Flash model");
1135 static int aspeed_soc_num_cpus(const char *soc_name)
1137 AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(soc_name));
1138 return sc->num_cpus;
1141 static void aspeed_machine_class_init(ObjectClass *oc, void *data)
1143 MachineClass *mc = MACHINE_CLASS(oc);
1144 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1146 mc->init = aspeed_machine_init;
1147 mc->no_floppy = 1;
1148 mc->no_cdrom = 1;
1149 mc->no_parallel = 1;
1150 mc->default_ram_id = "ram";
1151 amc->macs_mask = ASPEED_MAC0_ON;
1152 amc->uart_default = ASPEED_DEV_UART5;
1154 aspeed_machine_class_props_init(oc);
1157 static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
1159 MachineClass *mc = MACHINE_CLASS(oc);
1160 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1162 mc->desc = "OpenPOWER Palmetto BMC (ARM926EJ-S)";
1163 amc->soc_name = "ast2400-a1";
1164 amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1;
1165 amc->fmc_model = "n25q256a";
1166 amc->spi_model = "mx25l25635f";
1167 amc->num_cs = 1;
1168 amc->i2c_init = palmetto_bmc_i2c_init;
1169 mc->default_ram_size = 256 * MiB;
1170 mc->default_cpus = mc->min_cpus = mc->max_cpus =
1171 aspeed_soc_num_cpus(amc->soc_name);
1174 static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data)
1176 MachineClass *mc = MACHINE_CLASS(oc);
1177 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1179 mc->desc = "Quanta-Q71l BMC (ARM926EJ-S)";
1180 amc->soc_name = "ast2400-a1";
1181 amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1;
1182 amc->fmc_model = "n25q256a";
1183 amc->spi_model = "mx25l25635e";
1184 amc->num_cs = 1;
1185 amc->i2c_init = quanta_q71l_bmc_i2c_init;
1186 mc->default_ram_size = 128 * MiB;
1187 mc->default_cpus = mc->min_cpus = mc->max_cpus =
1188 aspeed_soc_num_cpus(amc->soc_name);
1191 static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc,
1192 void *data)
1194 MachineClass *mc = MACHINE_CLASS(oc);
1195 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1197 mc->desc = "Supermicro X11 BMC (ARM926EJ-S)";
1198 amc->soc_name = "ast2400-a1";
1199 amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1;
1200 amc->fmc_model = "mx25l25635e";
1201 amc->spi_model = "mx25l25635e";
1202 amc->num_cs = 1;
1203 amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
1204 amc->i2c_init = palmetto_bmc_i2c_init;
1205 mc->default_ram_size = 256 * MiB;
1208 static void aspeed_machine_supermicro_x11spi_bmc_class_init(ObjectClass *oc,
1209 void *data)
1211 MachineClass *mc = MACHINE_CLASS(oc);
1212 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1214 mc->desc = "Supermicro X11 SPI BMC (ARM1176)";
1215 amc->soc_name = "ast2500-a1";
1216 amc->hw_strap1 = SUPERMICRO_X11SPI_BMC_HW_STRAP1;
1217 amc->fmc_model = "mx25l25635e";
1218 amc->spi_model = "mx25l25635e";
1219 amc->num_cs = 1;
1220 amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
1221 amc->i2c_init = palmetto_bmc_i2c_init;
1222 mc->default_ram_size = 512 * MiB;
1223 mc->default_cpus = mc->min_cpus = mc->max_cpus =
1224 aspeed_soc_num_cpus(amc->soc_name);
1227 static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data)
1229 MachineClass *mc = MACHINE_CLASS(oc);
1230 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1232 mc->desc = "Aspeed AST2500 EVB (ARM1176)";
1233 amc->soc_name = "ast2500-a1";
1234 amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
1235 amc->fmc_model = "mx25l25635e";
1236 amc->spi_model = "mx25l25635f";
1237 amc->num_cs = 1;
1238 amc->i2c_init = ast2500_evb_i2c_init;
1239 mc->default_ram_size = 512 * MiB;
1240 mc->default_cpus = mc->min_cpus = mc->max_cpus =
1241 aspeed_soc_num_cpus(amc->soc_name);
1244 static void aspeed_machine_yosemitev2_class_init(ObjectClass *oc, void *data)
1246 MachineClass *mc = MACHINE_CLASS(oc);
1247 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1249 mc->desc = "Facebook YosemiteV2 BMC (ARM1176)";
1250 amc->soc_name = "ast2500-a1";
1251 amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
1252 amc->hw_strap2 = 0;
1253 amc->fmc_model = "n25q256a";
1254 amc->spi_model = "mx25l25635e";
1255 amc->num_cs = 2;
1256 amc->i2c_init = yosemitev2_bmc_i2c_init;
1257 mc->default_ram_size = 512 * MiB;
1258 mc->default_cpus = mc->min_cpus = mc->max_cpus =
1259 aspeed_soc_num_cpus(amc->soc_name);
1262 static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data)
1264 MachineClass *mc = MACHINE_CLASS(oc);
1265 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1267 mc->desc = "OpenPOWER Romulus BMC (ARM1176)";
1268 amc->soc_name = "ast2500-a1";
1269 amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1;
1270 amc->fmc_model = "n25q256a";
1271 amc->spi_model = "mx66l1g45g";
1272 amc->num_cs = 2;
1273 amc->i2c_init = romulus_bmc_i2c_init;
1274 mc->default_ram_size = 512 * MiB;
1275 mc->default_cpus = mc->min_cpus = mc->max_cpus =
1276 aspeed_soc_num_cpus(amc->soc_name);
1279 static void aspeed_machine_tiogapass_class_init(ObjectClass *oc, void *data)
1281 MachineClass *mc = MACHINE_CLASS(oc);
1282 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1284 mc->desc = "Facebook Tiogapass BMC (ARM1176)";
1285 amc->soc_name = "ast2500-a1";
1286 amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
1287 amc->hw_strap2 = 0;
1288 amc->fmc_model = "n25q256a";
1289 amc->spi_model = "mx25l25635e";
1290 amc->num_cs = 2;
1291 amc->i2c_init = tiogapass_bmc_i2c_init;
1292 mc->default_ram_size = 1 * GiB;
1293 mc->default_cpus = mc->min_cpus = mc->max_cpus =
1294 aspeed_soc_num_cpus(amc->soc_name);
1295 aspeed_soc_num_cpus(amc->soc_name);
1298 static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data)
1300 MachineClass *mc = MACHINE_CLASS(oc);
1301 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1303 mc->desc = "OCP SonoraPass BMC (ARM1176)";
1304 amc->soc_name = "ast2500-a1";
1305 amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1;
1306 amc->fmc_model = "mx66l1g45g";
1307 amc->spi_model = "mx66l1g45g";
1308 amc->num_cs = 2;
1309 amc->i2c_init = sonorapass_bmc_i2c_init;
1310 mc->default_ram_size = 512 * MiB;
1311 mc->default_cpus = mc->min_cpus = mc->max_cpus =
1312 aspeed_soc_num_cpus(amc->soc_name);
1315 static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data)
1317 MachineClass *mc = MACHINE_CLASS(oc);
1318 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1320 mc->desc = "OpenPOWER Witherspoon BMC (ARM1176)";
1321 amc->soc_name = "ast2500-a1";
1322 amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1;
1323 amc->fmc_model = "mx25l25635f";
1324 amc->spi_model = "mx66l1g45g";
1325 amc->num_cs = 2;
1326 amc->i2c_init = witherspoon_bmc_i2c_init;
1327 mc->default_ram_size = 512 * MiB;
1328 mc->default_cpus = mc->min_cpus = mc->max_cpus =
1329 aspeed_soc_num_cpus(amc->soc_name);
1332 static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
1334 MachineClass *mc = MACHINE_CLASS(oc);
1335 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1337 mc->desc = "Aspeed AST2600 EVB (Cortex-A7)";
1338 amc->soc_name = "ast2600-a3";
1339 amc->hw_strap1 = AST2600_EVB_HW_STRAP1;
1340 amc->hw_strap2 = AST2600_EVB_HW_STRAP2;
1341 amc->fmc_model = "mx66u51235f";
1342 amc->spi_model = "mx66u51235f";
1343 amc->num_cs = 1;
1344 amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON |
1345 ASPEED_MAC3_ON;
1346 amc->i2c_init = ast2600_evb_i2c_init;
1347 mc->default_ram_size = 1 * GiB;
1348 mc->default_cpus = mc->min_cpus = mc->max_cpus =
1349 aspeed_soc_num_cpus(amc->soc_name);
1352 static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data)
1354 MachineClass *mc = MACHINE_CLASS(oc);
1355 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1357 mc->desc = "OpenPOWER Tacoma BMC (Cortex-A7)";
1358 amc->soc_name = "ast2600-a3";
1359 amc->hw_strap1 = TACOMA_BMC_HW_STRAP1;
1360 amc->hw_strap2 = TACOMA_BMC_HW_STRAP2;
1361 amc->fmc_model = "mx66l1g45g";
1362 amc->spi_model = "mx66l1g45g";
1363 amc->num_cs = 2;
1364 amc->macs_mask = ASPEED_MAC2_ON;
1365 amc->i2c_init = witherspoon_bmc_i2c_init; /* Same board layout */
1366 mc->default_ram_size = 1 * GiB;
1367 mc->default_cpus = mc->min_cpus = mc->max_cpus =
1368 aspeed_soc_num_cpus(amc->soc_name);
1371 static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data)
1373 MachineClass *mc = MACHINE_CLASS(oc);
1374 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1376 mc->desc = "Bytedance G220A BMC (ARM1176)";
1377 amc->soc_name = "ast2500-a1";
1378 amc->hw_strap1 = G220A_BMC_HW_STRAP1;
1379 amc->fmc_model = "n25q512a";
1380 amc->spi_model = "mx25l25635e";
1381 amc->num_cs = 2;
1382 amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
1383 amc->i2c_init = g220a_bmc_i2c_init;
1384 mc->default_ram_size = 1024 * MiB;
1385 mc->default_cpus = mc->min_cpus = mc->max_cpus =
1386 aspeed_soc_num_cpus(amc->soc_name);
1389 static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc, void *data)
1391 MachineClass *mc = MACHINE_CLASS(oc);
1392 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1394 mc->desc = "Inspur FP5280G2 BMC (ARM1176)";
1395 amc->soc_name = "ast2500-a1";
1396 amc->hw_strap1 = FP5280G2_BMC_HW_STRAP1;
1397 amc->fmc_model = "n25q512a";
1398 amc->spi_model = "mx25l25635e";
1399 amc->num_cs = 2;
1400 amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
1401 amc->i2c_init = fp5280g2_bmc_i2c_init;
1402 mc->default_ram_size = 512 * MiB;
1403 mc->default_cpus = mc->min_cpus = mc->max_cpus =
1404 aspeed_soc_num_cpus(amc->soc_name);
1407 static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data)
1409 MachineClass *mc = MACHINE_CLASS(oc);
1410 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1412 mc->desc = "IBM Rainier BMC (Cortex-A7)";
1413 amc->soc_name = "ast2600-a3";
1414 amc->hw_strap1 = RAINIER_BMC_HW_STRAP1;
1415 amc->hw_strap2 = RAINIER_BMC_HW_STRAP2;
1416 amc->fmc_model = "mx66l1g45g";
1417 amc->spi_model = "mx66l1g45g";
1418 amc->num_cs = 2;
1419 amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1420 amc->i2c_init = rainier_bmc_i2c_init;
1421 mc->default_ram_size = 1 * GiB;
1422 mc->default_cpus = mc->min_cpus = mc->max_cpus =
1423 aspeed_soc_num_cpus(amc->soc_name);
1426 /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */
1427 #if HOST_LONG_BITS == 32
1428 #define FUJI_BMC_RAM_SIZE (1 * GiB)
1429 #else
1430 #define FUJI_BMC_RAM_SIZE (2 * GiB)
1431 #endif
1433 static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data)
1435 MachineClass *mc = MACHINE_CLASS(oc);
1436 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1438 mc->desc = "Facebook Fuji BMC (Cortex-A7)";
1439 amc->soc_name = "ast2600-a3";
1440 amc->hw_strap1 = FUJI_BMC_HW_STRAP1;
1441 amc->hw_strap2 = FUJI_BMC_HW_STRAP2;
1442 amc->fmc_model = "mx66l1g45g";
1443 amc->spi_model = "mx66l1g45g";
1444 amc->num_cs = 2;
1445 amc->macs_mask = ASPEED_MAC3_ON;
1446 amc->i2c_init = fuji_bmc_i2c_init;
1447 amc->uart_default = ASPEED_DEV_UART1;
1448 mc->default_ram_size = FUJI_BMC_RAM_SIZE;
1449 mc->default_cpus = mc->min_cpus = mc->max_cpus =
1450 aspeed_soc_num_cpus(amc->soc_name);
1453 /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */
1454 #if HOST_LONG_BITS == 32
1455 #define BLETCHLEY_BMC_RAM_SIZE (1 * GiB)
1456 #else
1457 #define BLETCHLEY_BMC_RAM_SIZE (2 * GiB)
1458 #endif
1460 static void aspeed_machine_bletchley_class_init(ObjectClass *oc, void *data)
1462 MachineClass *mc = MACHINE_CLASS(oc);
1463 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1465 mc->desc = "Facebook Bletchley BMC (Cortex-A7)";
1466 amc->soc_name = "ast2600-a3";
1467 amc->hw_strap1 = BLETCHLEY_BMC_HW_STRAP1;
1468 amc->hw_strap2 = BLETCHLEY_BMC_HW_STRAP2;
1469 amc->fmc_model = "w25q01jvq";
1470 amc->spi_model = NULL;
1471 amc->num_cs = 2;
1472 amc->macs_mask = ASPEED_MAC2_ON;
1473 amc->i2c_init = bletchley_bmc_i2c_init;
1474 mc->default_ram_size = BLETCHLEY_BMC_RAM_SIZE;
1475 mc->default_cpus = mc->min_cpus = mc->max_cpus =
1476 aspeed_soc_num_cpus(amc->soc_name);
1479 static void fby35_reset(MachineState *state, ShutdownCause reason)
1481 AspeedMachineState *bmc = ASPEED_MACHINE(state);
1482 AspeedGPIOState *gpio = &bmc->soc.gpio;
1484 qemu_devices_reset(reason);
1486 /* Board ID: 7 (Class-1, 4 slots) */
1487 object_property_set_bool(OBJECT(gpio), "gpioV4", true, &error_fatal);
1488 object_property_set_bool(OBJECT(gpio), "gpioV5", true, &error_fatal);
1489 object_property_set_bool(OBJECT(gpio), "gpioV6", true, &error_fatal);
1490 object_property_set_bool(OBJECT(gpio), "gpioV7", false, &error_fatal);
1492 /* Slot presence pins, inverse polarity. (False means present) */
1493 object_property_set_bool(OBJECT(gpio), "gpioH4", false, &error_fatal);
1494 object_property_set_bool(OBJECT(gpio), "gpioH5", true, &error_fatal);
1495 object_property_set_bool(OBJECT(gpio), "gpioH6", true, &error_fatal);
1496 object_property_set_bool(OBJECT(gpio), "gpioH7", true, &error_fatal);
1498 /* Slot 12v power pins, normal polarity. (True means powered-on) */
1499 object_property_set_bool(OBJECT(gpio), "gpioB2", true, &error_fatal);
1500 object_property_set_bool(OBJECT(gpio), "gpioB3", false, &error_fatal);
1501 object_property_set_bool(OBJECT(gpio), "gpioB4", false, &error_fatal);
1502 object_property_set_bool(OBJECT(gpio), "gpioB5", false, &error_fatal);
1505 static void aspeed_machine_fby35_class_init(ObjectClass *oc, void *data)
1507 MachineClass *mc = MACHINE_CLASS(oc);
1508 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1510 mc->desc = "Facebook fby35 BMC (Cortex-A7)";
1511 mc->reset = fby35_reset;
1512 amc->fmc_model = "mx66l1g45g";
1513 amc->num_cs = 2;
1514 amc->macs_mask = ASPEED_MAC3_ON;
1515 amc->i2c_init = fby35_i2c_init;
1516 /* FIXME: Replace this macro with something more general */
1517 mc->default_ram_size = FUJI_BMC_RAM_SIZE;
1520 #define AST1030_INTERNAL_FLASH_SIZE (1024 * 1024)
1521 /* Main SYSCLK frequency in Hz (200MHz) */
1522 #define SYSCLK_FRQ 200000000ULL
1524 static void aspeed_minibmc_machine_init(MachineState *machine)
1526 AspeedMachineState *bmc = ASPEED_MACHINE(machine);
1527 AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
1528 Clock *sysclk;
1530 sysclk = clock_new(OBJECT(machine), "SYSCLK");
1531 clock_set_hz(sysclk, SYSCLK_FRQ);
1533 object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
1534 qdev_connect_clock_in(DEVICE(&bmc->soc), "sysclk", sysclk);
1536 object_property_set_link(OBJECT(&bmc->soc), "memory",
1537 OBJECT(get_system_memory()), &error_abort);
1538 connect_serial_hds_to_uarts(bmc);
1539 qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
1541 aspeed_board_init_flashes(&bmc->soc.fmc,
1542 bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
1543 amc->num_cs,
1546 aspeed_board_init_flashes(&bmc->soc.spi[0],
1547 bmc->spi_model ? bmc->spi_model : amc->spi_model,
1548 amc->num_cs, amc->num_cs);
1550 aspeed_board_init_flashes(&bmc->soc.spi[1],
1551 bmc->spi_model ? bmc->spi_model : amc->spi_model,
1552 amc->num_cs, (amc->num_cs * 2));
1554 if (amc->i2c_init) {
1555 amc->i2c_init(bmc);
1558 armv7m_load_kernel(ARM_CPU(first_cpu),
1559 machine->kernel_filename,
1561 AST1030_INTERNAL_FLASH_SIZE);
1564 static void ast1030_evb_i2c_init(AspeedMachineState *bmc)
1566 AspeedSoCState *soc = &bmc->soc;
1568 /* U10 24C08 connects to SDA/SCL Groupt 1 by default */
1569 uint8_t *eeprom_buf = g_malloc0(32 * 1024);
1570 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, eeprom_buf);
1572 /* U11 LM75 connects to SDA/SCL Group 2 by default */
1573 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d);
1576 static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc,
1577 void *data)
1579 MachineClass *mc = MACHINE_CLASS(oc);
1580 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1582 mc->desc = "Aspeed AST1030 MiniBMC (Cortex-M4)";
1583 amc->soc_name = "ast1030-a1";
1584 amc->hw_strap1 = 0;
1585 amc->hw_strap2 = 0;
1586 mc->init = aspeed_minibmc_machine_init;
1587 amc->i2c_init = ast1030_evb_i2c_init;
1588 mc->default_ram_size = 0;
1589 mc->default_cpus = mc->min_cpus = mc->max_cpus = 1;
1590 amc->fmc_model = "sst25vf032b";
1591 amc->spi_model = "sst25vf032b";
1592 amc->num_cs = 2;
1593 amc->macs_mask = 0;
1596 static void aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass *oc,
1597 void *data)
1599 MachineClass *mc = MACHINE_CLASS(oc);
1600 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1602 mc->desc = "Qualcomm DC-SCM V1 BMC (Cortex A7)";
1603 amc->soc_name = "ast2600-a3";
1604 amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1605 amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1606 amc->fmc_model = "n25q512a";
1607 amc->spi_model = "n25q512a";
1608 amc->num_cs = 2;
1609 amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1610 amc->i2c_init = qcom_dc_scm_bmc_i2c_init;
1611 mc->default_ram_size = 1 * GiB;
1612 mc->default_cpus = mc->min_cpus = mc->max_cpus =
1613 aspeed_soc_num_cpus(amc->soc_name);
1616 static void aspeed_machine_qcom_firework_class_init(ObjectClass *oc,
1617 void *data)
1619 MachineClass *mc = MACHINE_CLASS(oc);
1620 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1622 mc->desc = "Qualcomm DC-SCM V1/Firework BMC (Cortex A7)";
1623 amc->soc_name = "ast2600-a3";
1624 amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1625 amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1626 amc->fmc_model = "n25q512a";
1627 amc->spi_model = "n25q512a";
1628 amc->num_cs = 2;
1629 amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1630 amc->i2c_init = qcom_dc_scm_firework_i2c_init;
1631 mc->default_ram_size = 1 * GiB;
1632 mc->default_cpus = mc->min_cpus = mc->max_cpus =
1633 aspeed_soc_num_cpus(amc->soc_name);
1636 static const TypeInfo aspeed_machine_types[] = {
1638 .name = MACHINE_TYPE_NAME("palmetto-bmc"),
1639 .parent = TYPE_ASPEED_MACHINE,
1640 .class_init = aspeed_machine_palmetto_class_init,
1641 }, {
1642 .name = MACHINE_TYPE_NAME("supermicrox11-bmc"),
1643 .parent = TYPE_ASPEED_MACHINE,
1644 .class_init = aspeed_machine_supermicrox11_bmc_class_init,
1645 }, {
1646 .name = MACHINE_TYPE_NAME("supermicro-x11spi-bmc"),
1647 .parent = TYPE_ASPEED_MACHINE,
1648 .class_init = aspeed_machine_supermicro_x11spi_bmc_class_init,
1649 }, {
1650 .name = MACHINE_TYPE_NAME("ast2500-evb"),
1651 .parent = TYPE_ASPEED_MACHINE,
1652 .class_init = aspeed_machine_ast2500_evb_class_init,
1653 }, {
1654 .name = MACHINE_TYPE_NAME("romulus-bmc"),
1655 .parent = TYPE_ASPEED_MACHINE,
1656 .class_init = aspeed_machine_romulus_class_init,
1657 }, {
1658 .name = MACHINE_TYPE_NAME("sonorapass-bmc"),
1659 .parent = TYPE_ASPEED_MACHINE,
1660 .class_init = aspeed_machine_sonorapass_class_init,
1661 }, {
1662 .name = MACHINE_TYPE_NAME("witherspoon-bmc"),
1663 .parent = TYPE_ASPEED_MACHINE,
1664 .class_init = aspeed_machine_witherspoon_class_init,
1665 }, {
1666 .name = MACHINE_TYPE_NAME("ast2600-evb"),
1667 .parent = TYPE_ASPEED_MACHINE,
1668 .class_init = aspeed_machine_ast2600_evb_class_init,
1669 }, {
1670 .name = MACHINE_TYPE_NAME("yosemitev2-bmc"),
1671 .parent = TYPE_ASPEED_MACHINE,
1672 .class_init = aspeed_machine_yosemitev2_class_init,
1673 }, {
1674 .name = MACHINE_TYPE_NAME("tacoma-bmc"),
1675 .parent = TYPE_ASPEED_MACHINE,
1676 .class_init = aspeed_machine_tacoma_class_init,
1677 }, {
1678 .name = MACHINE_TYPE_NAME("tiogapass-bmc"),
1679 .parent = TYPE_ASPEED_MACHINE,
1680 .class_init = aspeed_machine_tiogapass_class_init,
1681 }, {
1682 .name = MACHINE_TYPE_NAME("g220a-bmc"),
1683 .parent = TYPE_ASPEED_MACHINE,
1684 .class_init = aspeed_machine_g220a_class_init,
1685 }, {
1686 .name = MACHINE_TYPE_NAME("qcom-dc-scm-v1-bmc"),
1687 .parent = TYPE_ASPEED_MACHINE,
1688 .class_init = aspeed_machine_qcom_dc_scm_v1_class_init,
1689 }, {
1690 .name = MACHINE_TYPE_NAME("qcom-firework-bmc"),
1691 .parent = TYPE_ASPEED_MACHINE,
1692 .class_init = aspeed_machine_qcom_firework_class_init,
1693 }, {
1694 .name = MACHINE_TYPE_NAME("fp5280g2-bmc"),
1695 .parent = TYPE_ASPEED_MACHINE,
1696 .class_init = aspeed_machine_fp5280g2_class_init,
1697 }, {
1698 .name = MACHINE_TYPE_NAME("quanta-q71l-bmc"),
1699 .parent = TYPE_ASPEED_MACHINE,
1700 .class_init = aspeed_machine_quanta_q71l_class_init,
1701 }, {
1702 .name = MACHINE_TYPE_NAME("rainier-bmc"),
1703 .parent = TYPE_ASPEED_MACHINE,
1704 .class_init = aspeed_machine_rainier_class_init,
1705 }, {
1706 .name = MACHINE_TYPE_NAME("fuji-bmc"),
1707 .parent = TYPE_ASPEED_MACHINE,
1708 .class_init = aspeed_machine_fuji_class_init,
1709 }, {
1710 .name = MACHINE_TYPE_NAME("bletchley-bmc"),
1711 .parent = TYPE_ASPEED_MACHINE,
1712 .class_init = aspeed_machine_bletchley_class_init,
1713 }, {
1714 .name = MACHINE_TYPE_NAME("fby35-bmc"),
1715 .parent = MACHINE_TYPE_NAME("ast2600-evb"),
1716 .class_init = aspeed_machine_fby35_class_init,
1717 }, {
1718 .name = MACHINE_TYPE_NAME("ast1030-evb"),
1719 .parent = TYPE_ASPEED_MACHINE,
1720 .class_init = aspeed_minibmc_machine_ast1030_evb_class_init,
1721 }, {
1722 .name = TYPE_ASPEED_MACHINE,
1723 .parent = TYPE_MACHINE,
1724 .instance_size = sizeof(AspeedMachineState),
1725 .instance_init = aspeed_machine_instance_init,
1726 .class_size = sizeof(AspeedMachineClass),
1727 .class_init = aspeed_machine_class_init,
1728 .abstract = true,
1732 DEFINE_TYPES(aspeed_machine_types)