hw/arm/aspeed: Replace drive_get_next() by drive_get()
[qemu/armbru.git] / hw / arm / aspeed.c
blobcf20ae0db5e58c553913837e5219fcbf6061db95
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/i2c/i2c_mux_pca954x.h"
18 #include "hw/i2c/smbus_eeprom.h"
19 #include "hw/misc/pca9552.h"
20 #include "hw/sensor/tmp105.h"
21 #include "hw/misc/led.h"
22 #include "hw/qdev-properties.h"
23 #include "sysemu/block-backend.h"
24 #include "hw/loader.h"
25 #include "qemu/error-report.h"
26 #include "qemu/units.h"
28 static struct arm_boot_info aspeed_board_binfo = {
29 .board_id = -1, /* device-tree-only board */
32 struct AspeedMachineState {
33 /* Private */
34 MachineState parent_obj;
35 /* Public */
37 AspeedSoCState soc;
38 MemoryRegion ram_container;
39 MemoryRegion max_ram;
40 bool mmio_exec;
41 char *fmc_model;
42 char *spi_model;
45 /* Palmetto hardware value: 0x120CE416 */
46 #define PALMETTO_BMC_HW_STRAP1 ( \
47 SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_256MB) | \
48 SCU_AST2400_HW_STRAP_DRAM_CONFIG(2 /* DDR3 with CL=6, CWL=5 */) | \
49 SCU_AST2400_HW_STRAP_ACPI_DIS | \
50 SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) | \
51 SCU_HW_STRAP_VGA_CLASS_CODE | \
52 SCU_HW_STRAP_LPC_RESET_PIN | \
53 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) | \
54 SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
55 SCU_HW_STRAP_SPI_WIDTH | \
56 SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \
57 SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
59 /* TODO: Find the actual hardware value */
60 #define SUPERMICROX11_BMC_HW_STRAP1 ( \
61 SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) | \
62 SCU_AST2400_HW_STRAP_DRAM_CONFIG(2) | \
63 SCU_AST2400_HW_STRAP_ACPI_DIS | \
64 SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) | \
65 SCU_HW_STRAP_VGA_CLASS_CODE | \
66 SCU_HW_STRAP_LPC_RESET_PIN | \
67 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) | \
68 SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
69 SCU_HW_STRAP_SPI_WIDTH | \
70 SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \
71 SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
73 /* AST2500 evb hardware value: 0xF100C2E6 */
74 #define AST2500_EVB_HW_STRAP1 (( \
75 AST2500_HW_STRAP1_DEFAULTS | \
76 SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \
77 SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \
78 SCU_AST2500_HW_STRAP_UART_DEBUG | \
79 SCU_AST2500_HW_STRAP_DDR4_ENABLE | \
80 SCU_HW_STRAP_MAC1_RGMII | \
81 SCU_HW_STRAP_MAC0_RGMII) & \
82 ~SCU_HW_STRAP_2ND_BOOT_WDT)
84 /* Romulus hardware value: 0xF10AD206 */
85 #define ROMULUS_BMC_HW_STRAP1 ( \
86 AST2500_HW_STRAP1_DEFAULTS | \
87 SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \
88 SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \
89 SCU_AST2500_HW_STRAP_UART_DEBUG | \
90 SCU_AST2500_HW_STRAP_DDR4_ENABLE | \
91 SCU_AST2500_HW_STRAP_ACPI_ENABLE | \
92 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER))
94 /* Sonorapass hardware value: 0xF100D216 */
95 #define SONORAPASS_BMC_HW_STRAP1 ( \
96 SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \
97 SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \
98 SCU_AST2500_HW_STRAP_UART_DEBUG | \
99 SCU_AST2500_HW_STRAP_RESERVED28 | \
100 SCU_AST2500_HW_STRAP_DDR4_ENABLE | \
101 SCU_HW_STRAP_VGA_CLASS_CODE | \
102 SCU_HW_STRAP_LPC_RESET_PIN | \
103 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \
104 SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \
105 SCU_HW_STRAP_VGA_BIOS_ROM | \
106 SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \
107 SCU_AST2500_HW_STRAP_RESERVED1)
109 /* Swift hardware value: 0xF11AD206 */
110 #define SWIFT_BMC_HW_STRAP1 ( \
111 AST2500_HW_STRAP1_DEFAULTS | \
112 SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \
113 SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \
114 SCU_AST2500_HW_STRAP_UART_DEBUG | \
115 SCU_AST2500_HW_STRAP_DDR4_ENABLE | \
116 SCU_H_PLL_BYPASS_EN | \
117 SCU_AST2500_HW_STRAP_ACPI_ENABLE | \
118 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER))
120 #define G220A_BMC_HW_STRAP1 ( \
121 SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \
122 SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \
123 SCU_AST2500_HW_STRAP_UART_DEBUG | \
124 SCU_AST2500_HW_STRAP_RESERVED28 | \
125 SCU_AST2500_HW_STRAP_DDR4_ENABLE | \
126 SCU_HW_STRAP_2ND_BOOT_WDT | \
127 SCU_HW_STRAP_VGA_CLASS_CODE | \
128 SCU_HW_STRAP_LPC_RESET_PIN | \
129 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \
130 SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \
131 SCU_HW_STRAP_VGA_SIZE_SET(VGA_64M_DRAM) | \
132 SCU_AST2500_HW_STRAP_RESERVED1)
134 /* FP5280G2 hardware value: 0XF100D286 */
135 #define FP5280G2_BMC_HW_STRAP1 ( \
136 SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \
137 SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \
138 SCU_AST2500_HW_STRAP_UART_DEBUG | \
139 SCU_AST2500_HW_STRAP_RESERVED28 | \
140 SCU_AST2500_HW_STRAP_DDR4_ENABLE | \
141 SCU_HW_STRAP_VGA_CLASS_CODE | \
142 SCU_HW_STRAP_LPC_RESET_PIN | \
143 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \
144 SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \
145 SCU_HW_STRAP_MAC1_RGMII | \
146 SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \
147 SCU_AST2500_HW_STRAP_RESERVED1)
149 /* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */
150 #define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1
152 /* Quanta-Q71l hardware value */
153 #define QUANTA_Q71L_BMC_HW_STRAP1 ( \
154 SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) | \
155 SCU_AST2400_HW_STRAP_DRAM_CONFIG(2/* DDR3 with CL=6, CWL=5 */) | \
156 SCU_AST2400_HW_STRAP_ACPI_DIS | \
157 SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_24M_IN) | \
158 SCU_HW_STRAP_VGA_CLASS_CODE | \
159 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_PASS_THROUGH) | \
160 SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
161 SCU_HW_STRAP_SPI_WIDTH | \
162 SCU_HW_STRAP_VGA_SIZE_SET(VGA_8M_DRAM) | \
163 SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
165 /* AST2600 evb hardware value */
166 #define AST2600_EVB_HW_STRAP1 0x000000C0
167 #define AST2600_EVB_HW_STRAP2 0x00000003
169 /* Tacoma hardware value */
170 #define TACOMA_BMC_HW_STRAP1 0x00000000
171 #define TACOMA_BMC_HW_STRAP2 0x00000040
173 /* Rainier hardware value: (QEMU prototype) */
174 #define RAINIER_BMC_HW_STRAP1 0x00000000
175 #define RAINIER_BMC_HW_STRAP2 0x00000000
177 /* Fuji hardware value */
178 #define FUJI_BMC_HW_STRAP1 0x00000000
179 #define FUJI_BMC_HW_STRAP2 0x00000000
182 * The max ram region is for firmwares that scan the address space
183 * with load/store to guess how much RAM the SoC has.
185 static uint64_t max_ram_read(void *opaque, hwaddr offset, unsigned size)
187 return 0;
190 static void max_ram_write(void *opaque, hwaddr offset, uint64_t value,
191 unsigned size)
193 /* Discard writes */
196 static const MemoryRegionOps max_ram_ops = {
197 .read = max_ram_read,
198 .write = max_ram_write,
199 .endianness = DEVICE_NATIVE_ENDIAN,
202 #define AST_SMP_MAILBOX_BASE 0x1e6e2180
203 #define AST_SMP_MBOX_FIELD_ENTRY (AST_SMP_MAILBOX_BASE + 0x0)
204 #define AST_SMP_MBOX_FIELD_GOSIGN (AST_SMP_MAILBOX_BASE + 0x4)
205 #define AST_SMP_MBOX_FIELD_READY (AST_SMP_MAILBOX_BASE + 0x8)
206 #define AST_SMP_MBOX_FIELD_POLLINSN (AST_SMP_MAILBOX_BASE + 0xc)
207 #define AST_SMP_MBOX_CODE (AST_SMP_MAILBOX_BASE + 0x10)
208 #define AST_SMP_MBOX_GOSIGN 0xabbaab00
210 static void aspeed_write_smpboot(ARMCPU *cpu,
211 const struct arm_boot_info *info)
213 static const uint32_t poll_mailbox_ready[] = {
215 * r2 = per-cpu go sign value
216 * r1 = AST_SMP_MBOX_FIELD_ENTRY
217 * r0 = AST_SMP_MBOX_FIELD_GOSIGN
219 0xee100fb0, /* mrc p15, 0, r0, c0, c0, 5 */
220 0xe21000ff, /* ands r0, r0, #255 */
221 0xe59f201c, /* ldr r2, [pc, #28] */
222 0xe1822000, /* orr r2, r2, r0 */
224 0xe59f1018, /* ldr r1, [pc, #24] */
225 0xe59f0018, /* ldr r0, [pc, #24] */
227 0xe320f002, /* wfe */
228 0xe5904000, /* ldr r4, [r0] */
229 0xe1520004, /* cmp r2, r4 */
230 0x1afffffb, /* bne <wfe> */
231 0xe591f000, /* ldr pc, [r1] */
232 AST_SMP_MBOX_GOSIGN,
233 AST_SMP_MBOX_FIELD_ENTRY,
234 AST_SMP_MBOX_FIELD_GOSIGN,
237 rom_add_blob_fixed("aspeed.smpboot", poll_mailbox_ready,
238 sizeof(poll_mailbox_ready),
239 info->smp_loader_start);
242 static void aspeed_reset_secondary(ARMCPU *cpu,
243 const struct arm_boot_info *info)
245 AddressSpace *as = arm_boot_address_space(cpu, info);
246 CPUState *cs = CPU(cpu);
248 /* info->smp_bootreg_addr */
249 address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0,
250 MEMTXATTRS_UNSPECIFIED, NULL);
251 cpu_set_pc(cs, info->smp_loader_start);
254 #define FIRMWARE_ADDR 0x0
256 static void write_boot_rom(DriveInfo *dinfo, hwaddr addr, size_t rom_size,
257 Error **errp)
259 BlockBackend *blk = blk_by_legacy_dinfo(dinfo);
260 uint8_t *storage;
261 int64_t size;
263 /* The block backend size should have already been 'validated' by
264 * the creation of the m25p80 object.
266 size = blk_getlength(blk);
267 if (size <= 0) {
268 error_setg(errp, "failed to get flash size");
269 return;
272 if (rom_size > size) {
273 rom_size = size;
276 storage = g_new0(uint8_t, rom_size);
277 if (blk_pread(blk, 0, storage, rom_size) < 0) {
278 error_setg(errp, "failed to read the initial flash content");
279 return;
282 rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr);
283 g_free(storage);
286 static void aspeed_board_init_flashes(AspeedSMCState *s,
287 const char *flashtype,
288 int unit0)
290 int i ;
292 for (i = 0; i < s->num_cs; ++i) {
293 DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i);
294 qemu_irq cs_line;
295 DeviceState *dev;
297 dev = qdev_new(flashtype);
298 if (dinfo) {
299 qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo));
301 qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal);
303 cs_line = qdev_get_gpio_in_named(dev, SSI_GPIO_CS, 0);
304 sysbus_connect_irq(SYS_BUS_DEVICE(s), i + 1, cs_line);
308 static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo)
310 DeviceState *card;
312 if (!dinfo) {
313 return;
315 card = qdev_new(TYPE_SD_CARD);
316 qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
317 &error_fatal);
318 qdev_realize_and_unref(card,
319 qdev_get_child_bus(DEVICE(sdhci), "sd-bus"),
320 &error_fatal);
323 static void aspeed_machine_init(MachineState *machine)
325 AspeedMachineState *bmc = ASPEED_MACHINE(machine);
326 AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
327 AspeedSoCClass *sc;
328 DriveInfo *drive0 = drive_get(IF_MTD, 0, 0);
329 ram_addr_t max_ram_size;
330 int i;
331 NICInfo *nd = &nd_table[0];
333 memory_region_init(&bmc->ram_container, NULL, "aspeed-ram-container",
334 4 * GiB);
335 memory_region_add_subregion(&bmc->ram_container, 0, machine->ram);
337 object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
339 sc = ASPEED_SOC_GET_CLASS(&bmc->soc);
342 * This will error out if isize is not supported by memory controller.
344 object_property_set_uint(OBJECT(&bmc->soc), "ram-size", machine->ram_size,
345 &error_fatal);
347 for (i = 0; i < sc->macs_num; i++) {
348 if ((amc->macs_mask & (1 << i)) && nd->used) {
349 qemu_check_nic_model(nd, TYPE_FTGMAC100);
350 qdev_set_nic_properties(DEVICE(&bmc->soc.ftgmac100[i]), nd);
351 nd++;
355 object_property_set_int(OBJECT(&bmc->soc), "hw-strap1", amc->hw_strap1,
356 &error_abort);
357 object_property_set_int(OBJECT(&bmc->soc), "hw-strap2", amc->hw_strap2,
358 &error_abort);
359 object_property_set_int(OBJECT(&bmc->soc), "num-cs", amc->num_cs,
360 &error_abort);
361 object_property_set_link(OBJECT(&bmc->soc), "dram",
362 OBJECT(machine->ram), &error_abort);
363 if (machine->kernel_filename) {
365 * When booting with a -kernel command line there is no u-boot
366 * that runs to unlock the SCU. In this case set the default to
367 * be unlocked as the kernel expects
369 object_property_set_int(OBJECT(&bmc->soc), "hw-prot-key",
370 ASPEED_SCU_PROT_KEY, &error_abort);
372 qdev_prop_set_uint32(DEVICE(&bmc->soc), "uart-default",
373 amc->uart_default);
374 qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
376 memory_region_add_subregion(get_system_memory(),
377 sc->memmap[ASPEED_DEV_SDRAM],
378 &bmc->ram_container);
380 max_ram_size = object_property_get_uint(OBJECT(&bmc->soc), "max-ram-size",
381 &error_abort);
382 memory_region_init_io(&bmc->max_ram, NULL, &max_ram_ops, NULL,
383 "max_ram", max_ram_size - machine->ram_size);
384 memory_region_add_subregion(&bmc->ram_container, machine->ram_size, &bmc->max_ram);
386 aspeed_board_init_flashes(&bmc->soc.fmc,
387 bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
389 aspeed_board_init_flashes(&bmc->soc.spi[0],
390 bmc->spi_model ? bmc->spi_model : amc->spi_model,
391 bmc->soc.fmc.num_cs);
393 /* Install first FMC flash content as a boot rom. */
394 if (drive0) {
395 AspeedSMCFlash *fl = &bmc->soc.fmc.flashes[0];
396 MemoryRegion *boot_rom = g_new(MemoryRegion, 1);
397 uint64_t size = memory_region_size(&fl->mmio);
400 * create a ROM region using the default mapping window size of
401 * the flash module. The window size is 64MB for the AST2400
402 * SoC and 128MB for the AST2500 SoC, which is twice as big as
403 * needed by the flash modules of the Aspeed machines.
405 if (ASPEED_MACHINE(machine)->mmio_exec) {
406 memory_region_init_alias(boot_rom, NULL, "aspeed.boot_rom",
407 &fl->mmio, 0, size);
408 memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
409 boot_rom);
410 } else {
411 memory_region_init_rom(boot_rom, NULL, "aspeed.boot_rom",
412 size, &error_abort);
413 memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
414 boot_rom);
415 write_boot_rom(drive0, FIRMWARE_ADDR, size, &error_abort);
419 if (machine->kernel_filename && sc->num_cpus > 1) {
420 /* With no u-boot we must set up a boot stub for the secondary CPU */
421 MemoryRegion *smpboot = g_new(MemoryRegion, 1);
422 memory_region_init_ram(smpboot, NULL, "aspeed.smpboot",
423 0x80, &error_abort);
424 memory_region_add_subregion(get_system_memory(),
425 AST_SMP_MAILBOX_BASE, smpboot);
427 aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot;
428 aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary;
429 aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE;
432 aspeed_board_binfo.ram_size = machine->ram_size;
433 aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM];
434 aspeed_board_binfo.nb_cpus = sc->num_cpus;
436 if (amc->i2c_init) {
437 amc->i2c_init(bmc);
440 for (i = 0; i < bmc->soc.sdhci.num_slots; i++) {
441 sdhci_attach_drive(&bmc->soc.sdhci.slots[i],
442 drive_get(IF_SD, 0, i));
445 if (bmc->soc.emmc.num_slots) {
446 sdhci_attach_drive(&bmc->soc.emmc.slots[0],
447 drive_get(IF_SD, 0, bmc->soc.sdhci.num_slots));
450 arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo);
453 static void at24c_eeprom_init(I2CBus *bus, uint8_t addr, uint32_t rsize)
455 I2CSlave *i2c_dev = i2c_slave_new("at24c-eeprom", addr);
456 DeviceState *dev = DEVICE(i2c_dev);
458 qdev_prop_set_uint32(dev, "rom-size", rsize);
459 i2c_slave_realize_and_unref(i2c_dev, bus, &error_abort);
462 static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
464 AspeedSoCState *soc = &bmc->soc;
465 DeviceState *dev;
466 uint8_t *eeprom_buf = g_malloc0(32 * 1024);
468 /* The palmetto platform expects a ds3231 RTC but a ds1338 is
469 * enough to provide basic RTC features. Alarms will be missing */
470 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
472 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
473 eeprom_buf);
475 /* add a TMP423 temperature sensor */
476 dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
477 "tmp423", 0x4c));
478 object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
479 object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
480 object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
481 object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort);
484 static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc)
486 AspeedSoCState *soc = &bmc->soc;
489 * The quanta-q71l platform expects tmp75s which are compatible with
490 * tmp105s.
492 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c);
493 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e);
494 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f);
496 /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */
497 /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */
498 /* TODO: Add Memory Riser i2c mux and eeproms. */
500 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74);
501 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77);
503 /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */
505 /* i2c-7 */
506 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70);
507 /* - i2c@0: pmbus@59 */
508 /* - i2c@1: pmbus@58 */
509 /* - i2c@2: pmbus@58 */
510 /* - i2c@3: pmbus@59 */
512 /* TODO: i2c-7: Add PDB FRU eeprom@52 */
513 /* TODO: i2c-8: Add BMC FRU eeprom@50 */
516 static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
518 AspeedSoCState *soc = &bmc->soc;
519 uint8_t *eeprom_buf = g_malloc0(8 * 1024);
521 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50,
522 eeprom_buf);
524 /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
525 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
526 TYPE_TMP105, 0x4d);
528 /* The AST2500 EVB does not have an RTC. Let's pretend that one is
529 * plugged on the I2C bus header */
530 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
533 static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
535 /* Start with some devices on our I2C busses */
536 ast2500_evb_i2c_init(bmc);
539 static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
541 AspeedSoCState *soc = &bmc->soc;
543 /* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
544 * good enough */
545 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
548 static void swift_bmc_i2c_init(AspeedMachineState *bmc)
550 AspeedSoCState *soc = &bmc->soc;
552 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "pca9552", 0x60);
554 /* The swift board expects a TMP275 but a TMP105 is compatible */
555 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "tmp105", 0x48);
556 /* The swift board expects a pca9551 but a pca9552 is compatible */
557 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9552", 0x60);
559 /* The swift board expects an Epson RX8900 RTC but a ds1338 is compatible */
560 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "ds1338", 0x32);
561 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x60);
563 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c);
564 /* The swift board expects a pca9539 but a pca9552 is compatible */
565 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "pca9552", 0x74);
567 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c);
568 /* The swift board expects a pca9539 but a pca9552 is compatible */
569 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "pca9552",
570 0x74);
572 /* The swift board expects a TMP275 but a TMP105 is compatible */
573 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12), "tmp105", 0x48);
574 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12), "tmp105", 0x4a);
577 static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc)
579 AspeedSoCState *soc = &bmc->soc;
581 /* bus 2 : */
582 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48);
583 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49);
584 /* bus 2 : pca9546 @ 0x73 */
586 /* bus 3 : pca9548 @ 0x70 */
588 /* bus 4 : */
589 uint8_t *eeprom4_54 = g_malloc0(8 * 1024);
590 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54,
591 eeprom4_54);
592 /* PCA9539 @ 0x76, but PCA9552 is compatible */
593 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "pca9552", 0x76);
594 /* PCA9539 @ 0x77, but PCA9552 is compatible */
595 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "pca9552", 0x77);
597 /* bus 6 : */
598 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48);
599 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49);
600 /* bus 6 : pca9546 @ 0x73 */
602 /* bus 8 : */
603 uint8_t *eeprom8_56 = g_malloc0(8 * 1024);
604 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56,
605 eeprom8_56);
606 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x60);
607 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x61);
608 /* bus 8 : adc128d818 @ 0x1d */
609 /* bus 8 : adc128d818 @ 0x1f */
612 * bus 13 : pca9548 @ 0x71
613 * - channel 3:
614 * - tmm421 @ 0x4c
615 * - tmp421 @ 0x4e
616 * - tmp421 @ 0x4f
621 static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
623 static const struct {
624 unsigned gpio_id;
625 LEDColor color;
626 const char *description;
627 bool gpio_polarity;
628 } pca1_leds[] = {
629 {13, LED_COLOR_GREEN, "front-fault-4", GPIO_POLARITY_ACTIVE_LOW},
630 {14, LED_COLOR_GREEN, "front-power-3", GPIO_POLARITY_ACTIVE_LOW},
631 {15, LED_COLOR_GREEN, "front-id-5", GPIO_POLARITY_ACTIVE_LOW},
633 AspeedSoCState *soc = &bmc->soc;
634 uint8_t *eeprom_buf = g_malloc0(8 * 1024);
635 DeviceState *dev;
636 LEDState *led;
638 /* Bus 3: TODO bmp280@77 */
639 /* Bus 3: TODO max31785@52 */
640 dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
641 qdev_prop_set_string(dev, "description", "pca1");
642 i2c_slave_realize_and_unref(I2C_SLAVE(dev),
643 aspeed_i2c_get_bus(&soc->i2c, 3),
644 &error_fatal);
646 for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) {
647 led = led_create_simple(OBJECT(bmc),
648 pca1_leds[i].gpio_polarity,
649 pca1_leds[i].color,
650 pca1_leds[i].description);
651 qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id,
652 qdev_get_gpio_in(DEVICE(led), 0));
654 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76);
655 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c);
656 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c);
658 /* The Witherspoon expects a TMP275 but a TMP105 is compatible */
659 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105,
660 0x4a);
662 /* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
663 * good enough */
664 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
666 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51,
667 eeprom_buf);
668 dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
669 qdev_prop_set_string(dev, "description", "pca0");
670 i2c_slave_realize_and_unref(I2C_SLAVE(dev),
671 aspeed_i2c_get_bus(&soc->i2c, 11),
672 &error_fatal);
673 /* Bus 11: TODO ucd90160@64 */
676 static void g220a_bmc_i2c_init(AspeedMachineState *bmc)
678 AspeedSoCState *soc = &bmc->soc;
679 DeviceState *dev;
681 dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3),
682 "emc1413", 0x4c));
683 object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
684 object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
685 object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
687 dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12),
688 "emc1413", 0x4c));
689 object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
690 object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
691 object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
693 dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13),
694 "emc1413", 0x4c));
695 object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
696 object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
697 object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
699 static uint8_t eeprom_buf[2 * 1024] = {
700 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe,
701 0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65,
702 0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32,
703 0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42,
704 0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45,
705 0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1,
706 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7,
708 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57,
709 eeprom_buf);
712 static void aspeed_eeprom_init(I2CBus *bus, uint8_t addr, uint32_t rsize)
714 I2CSlave *i2c_dev = i2c_slave_new("at24c-eeprom", addr);
715 DeviceState *dev = DEVICE(i2c_dev);
717 qdev_prop_set_uint32(dev, "rom-size", rsize);
718 i2c_slave_realize_and_unref(i2c_dev, bus, &error_abort);
721 static void fp5280g2_bmc_i2c_init(AspeedMachineState *bmc)
723 AspeedSoCState *soc = &bmc->soc;
724 I2CSlave *i2c_mux;
726 /* The at24c256 */
727 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 1), 0x50, 32768);
729 /* The fp5280g2 expects a TMP112 but a TMP105 is compatible */
730 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
731 0x48);
732 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
733 0x49);
735 i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
736 "pca9546", 0x70);
737 /* It expects a TMP112 but a TMP105 is compatible */
738 i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0), TYPE_TMP105,
739 0x4a);
741 /* It expects a ds3232 but a ds1338 is good enough */
742 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "ds1338", 0x68);
744 /* It expects a pca9555 but a pca9552 is compatible */
745 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_PCA9552,
746 0x20);
749 static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
751 AspeedSoCState *soc = &bmc->soc;
752 I2CSlave *i2c_mux;
754 aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB);
756 /* The rainier expects a TMP275 but a TMP105 is compatible */
757 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
758 0x48);
759 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
760 0x49);
761 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
762 0x4a);
763 i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4),
764 "pca9546", 0x70);
765 aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
766 aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
767 aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB);
769 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
770 0x48);
771 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
772 0x49);
773 i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5),
774 "pca9546", 0x70);
775 aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
776 aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
778 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
779 0x48);
780 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
781 0x4a);
782 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
783 0x4b);
784 i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6),
785 "pca9546", 0x70);
786 aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
787 aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
788 aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB);
789 aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB);
791 /* Bus 7: TODO max31785@52 */
792 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9552", 0x61);
793 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76);
794 /* Bus 7: TODO si7021-a20@20 */
795 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105,
796 0x48);
797 aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB);
798 aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB);
800 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
801 0x48);
802 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
803 0x4a);
804 aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50, 64 * KiB);
805 aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 64 * KiB);
806 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x61);
807 /* Bus 8: ucd90320@11 */
808 /* Bus 8: ucd90320@b */
809 /* Bus 8: ucd90320@c */
811 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c);
812 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d);
813 aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB);
815 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c);
816 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d);
817 aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB);
819 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
820 0x48);
821 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
822 0x49);
823 i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11),
824 "pca9546", 0x70);
825 aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
826 aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
829 aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB);
831 aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB);
833 aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB);
836 static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr,
837 I2CBus **channels)
839 I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr);
840 for (int i = 0; i < 8; i++) {
841 channels[i] = pca954x_i2c_get_bus(mux, i);
845 #define TYPE_LM75 TYPE_TMP105
846 #define TYPE_TMP75 TYPE_TMP105
847 #define TYPE_TMP422 "tmp422"
849 static void fuji_bmc_i2c_init(AspeedMachineState *bmc)
851 AspeedSoCState *soc = &bmc->soc;
852 I2CBus *i2c[144] = {};
854 for (int i = 0; i < 16; i++) {
855 i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
857 I2CBus *i2c180 = i2c[2];
858 I2CBus *i2c480 = i2c[8];
859 I2CBus *i2c600 = i2c[11];
861 get_pca9548_channels(i2c180, 0x70, &i2c[16]);
862 get_pca9548_channels(i2c480, 0x70, &i2c[24]);
863 /* NOTE: The device tree skips [32, 40) in the alias numbering */
864 get_pca9548_channels(i2c600, 0x77, &i2c[40]);
865 get_pca9548_channels(i2c[24], 0x71, &i2c[48]);
866 get_pca9548_channels(i2c[25], 0x72, &i2c[56]);
867 get_pca9548_channels(i2c[26], 0x76, &i2c[64]);
868 get_pca9548_channels(i2c[27], 0x76, &i2c[72]);
869 for (int i = 0; i < 8; i++) {
870 get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]);
873 i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c);
874 i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d);
876 aspeed_eeprom_init(i2c[19], 0x52, 64 * KiB);
877 aspeed_eeprom_init(i2c[20], 0x50, 2 * KiB);
878 aspeed_eeprom_init(i2c[22], 0x52, 2 * KiB);
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 aspeed_eeprom_init(i2c[8], 0x51, 64 * KiB);
886 i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a);
888 i2c_slave_create_simple(i2c[50], TYPE_LM75, 0x4c);
889 aspeed_eeprom_init(i2c[50], 0x52, 64 * 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 aspeed_eeprom_init(i2c[65], 0x53, 64 * KiB);
897 i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x49);
898 i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x48);
899 aspeed_eeprom_init(i2c[68], 0x52, 64 * KiB);
900 aspeed_eeprom_init(i2c[69], 0x52, 64 * KiB);
901 aspeed_eeprom_init(i2c[70], 0x52, 64 * KiB);
902 aspeed_eeprom_init(i2c[71], 0x52, 64 * KiB);
904 aspeed_eeprom_init(i2c[73], 0x53, 64 * KiB);
905 i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x49);
906 i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x48);
907 aspeed_eeprom_init(i2c[76], 0x52, 64 * KiB);
908 aspeed_eeprom_init(i2c[77], 0x52, 64 * KiB);
909 aspeed_eeprom_init(i2c[78], 0x52, 64 * KiB);
910 aspeed_eeprom_init(i2c[79], 0x52, 64 * KiB);
911 aspeed_eeprom_init(i2c[28], 0x50, 2 * KiB);
913 for (int i = 0; i < 8; i++) {
914 aspeed_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 static bool aspeed_get_mmio_exec(Object *obj, Error **errp)
923 return ASPEED_MACHINE(obj)->mmio_exec;
926 static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp)
928 ASPEED_MACHINE(obj)->mmio_exec = value;
931 static void aspeed_machine_instance_init(Object *obj)
933 ASPEED_MACHINE(obj)->mmio_exec = false;
936 static char *aspeed_get_fmc_model(Object *obj, Error **errp)
938 AspeedMachineState *bmc = ASPEED_MACHINE(obj);
939 return g_strdup(bmc->fmc_model);
942 static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp)
944 AspeedMachineState *bmc = ASPEED_MACHINE(obj);
946 g_free(bmc->fmc_model);
947 bmc->fmc_model = g_strdup(value);
950 static char *aspeed_get_spi_model(Object *obj, Error **errp)
952 AspeedMachineState *bmc = ASPEED_MACHINE(obj);
953 return g_strdup(bmc->spi_model);
956 static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp)
958 AspeedMachineState *bmc = ASPEED_MACHINE(obj);
960 g_free(bmc->spi_model);
961 bmc->spi_model = g_strdup(value);
964 static void aspeed_machine_class_props_init(ObjectClass *oc)
966 object_class_property_add_bool(oc, "execute-in-place",
967 aspeed_get_mmio_exec,
968 aspeed_set_mmio_exec);
969 object_class_property_set_description(oc, "execute-in-place",
970 "boot directly from CE0 flash device");
972 object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model,
973 aspeed_set_fmc_model);
974 object_class_property_set_description(oc, "fmc-model",
975 "Change the FMC Flash model");
976 object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model,
977 aspeed_set_spi_model);
978 object_class_property_set_description(oc, "spi-model",
979 "Change the SPI Flash model");
982 static int aspeed_soc_num_cpus(const char *soc_name)
984 AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(soc_name));
985 return sc->num_cpus;
988 static void aspeed_machine_class_init(ObjectClass *oc, void *data)
990 MachineClass *mc = MACHINE_CLASS(oc);
991 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
993 mc->init = aspeed_machine_init;
994 mc->no_floppy = 1;
995 mc->no_cdrom = 1;
996 mc->no_parallel = 1;
997 mc->default_ram_id = "ram";
998 amc->macs_mask = ASPEED_MAC0_ON;
999 amc->uart_default = ASPEED_DEV_UART5;
1001 aspeed_machine_class_props_init(oc);
1004 static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
1006 MachineClass *mc = MACHINE_CLASS(oc);
1007 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1009 mc->desc = "OpenPOWER Palmetto BMC (ARM926EJ-S)";
1010 amc->soc_name = "ast2400-a1";
1011 amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1;
1012 amc->fmc_model = "n25q256a";
1013 amc->spi_model = "mx25l25635e";
1014 amc->num_cs = 1;
1015 amc->i2c_init = palmetto_bmc_i2c_init;
1016 mc->default_ram_size = 256 * MiB;
1017 mc->default_cpus = mc->min_cpus = mc->max_cpus =
1018 aspeed_soc_num_cpus(amc->soc_name);
1021 static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data)
1023 MachineClass *mc = MACHINE_CLASS(oc);
1024 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1026 mc->desc = "Quanta-Q71l BMC (ARM926EJ-S)";
1027 amc->soc_name = "ast2400-a1";
1028 amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1;
1029 amc->fmc_model = "n25q256a";
1030 amc->spi_model = "mx25l25635e";
1031 amc->num_cs = 1;
1032 amc->i2c_init = quanta_q71l_bmc_i2c_init;
1033 mc->default_ram_size = 128 * MiB;
1034 mc->default_cpus = mc->min_cpus = mc->max_cpus =
1035 aspeed_soc_num_cpus(amc->soc_name);
1038 static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc,
1039 void *data)
1041 MachineClass *mc = MACHINE_CLASS(oc);
1042 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1044 mc->desc = "Supermicro X11 BMC (ARM926EJ-S)";
1045 amc->soc_name = "ast2400-a1";
1046 amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1;
1047 amc->fmc_model = "mx25l25635e";
1048 amc->spi_model = "mx25l25635e";
1049 amc->num_cs = 1;
1050 amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
1051 amc->i2c_init = palmetto_bmc_i2c_init;
1052 mc->default_ram_size = 256 * MiB;
1055 static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data)
1057 MachineClass *mc = MACHINE_CLASS(oc);
1058 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1060 mc->desc = "Aspeed AST2500 EVB (ARM1176)";
1061 amc->soc_name = "ast2500-a1";
1062 amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
1063 amc->fmc_model = "w25q256";
1064 amc->spi_model = "mx25l25635e";
1065 amc->num_cs = 1;
1066 amc->i2c_init = ast2500_evb_i2c_init;
1067 mc->default_ram_size = 512 * MiB;
1068 mc->default_cpus = mc->min_cpus = mc->max_cpus =
1069 aspeed_soc_num_cpus(amc->soc_name);
1072 static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data)
1074 MachineClass *mc = MACHINE_CLASS(oc);
1075 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1077 mc->desc = "OpenPOWER Romulus BMC (ARM1176)";
1078 amc->soc_name = "ast2500-a1";
1079 amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1;
1080 amc->fmc_model = "n25q256a";
1081 amc->spi_model = "mx66l1g45g";
1082 amc->num_cs = 2;
1083 amc->i2c_init = romulus_bmc_i2c_init;
1084 mc->default_ram_size = 512 * MiB;
1085 mc->default_cpus = mc->min_cpus = mc->max_cpus =
1086 aspeed_soc_num_cpus(amc->soc_name);
1089 static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data)
1091 MachineClass *mc = MACHINE_CLASS(oc);
1092 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1094 mc->desc = "OCP SonoraPass BMC (ARM1176)";
1095 amc->soc_name = "ast2500-a1";
1096 amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1;
1097 amc->fmc_model = "mx66l1g45g";
1098 amc->spi_model = "mx66l1g45g";
1099 amc->num_cs = 2;
1100 amc->i2c_init = sonorapass_bmc_i2c_init;
1101 mc->default_ram_size = 512 * MiB;
1102 mc->default_cpus = mc->min_cpus = mc->max_cpus =
1103 aspeed_soc_num_cpus(amc->soc_name);
1106 static void aspeed_machine_swift_class_init(ObjectClass *oc, void *data)
1108 MachineClass *mc = MACHINE_CLASS(oc);
1109 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1111 mc->desc = "OpenPOWER Swift BMC (ARM1176)";
1112 amc->soc_name = "ast2500-a1";
1113 amc->hw_strap1 = SWIFT_BMC_HW_STRAP1;
1114 amc->fmc_model = "mx66l1g45g";
1115 amc->spi_model = "mx66l1g45g";
1116 amc->num_cs = 2;
1117 amc->i2c_init = swift_bmc_i2c_init;
1118 mc->default_ram_size = 512 * MiB;
1119 mc->default_cpus = mc->min_cpus = mc->max_cpus =
1120 aspeed_soc_num_cpus(amc->soc_name);
1122 mc->deprecation_reason = "redundant system. Please use a similar "
1123 "OpenPOWER BMC, Witherspoon or Romulus.";
1126 static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data)
1128 MachineClass *mc = MACHINE_CLASS(oc);
1129 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1131 mc->desc = "OpenPOWER Witherspoon BMC (ARM1176)";
1132 amc->soc_name = "ast2500-a1";
1133 amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1;
1134 amc->fmc_model = "mx25l25635e";
1135 amc->spi_model = "mx66l1g45g";
1136 amc->num_cs = 2;
1137 amc->i2c_init = witherspoon_bmc_i2c_init;
1138 mc->default_ram_size = 512 * MiB;
1139 mc->default_cpus = mc->min_cpus = mc->max_cpus =
1140 aspeed_soc_num_cpus(amc->soc_name);
1143 static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
1145 MachineClass *mc = MACHINE_CLASS(oc);
1146 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1148 mc->desc = "Aspeed AST2600 EVB (Cortex-A7)";
1149 amc->soc_name = "ast2600-a3";
1150 amc->hw_strap1 = AST2600_EVB_HW_STRAP1;
1151 amc->hw_strap2 = AST2600_EVB_HW_STRAP2;
1152 amc->fmc_model = "w25q512jv";
1153 amc->spi_model = "mx66u51235f";
1154 amc->num_cs = 1;
1155 amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON |
1156 ASPEED_MAC3_ON;
1157 amc->i2c_init = ast2600_evb_i2c_init;
1158 mc->default_ram_size = 1 * GiB;
1159 mc->default_cpus = mc->min_cpus = mc->max_cpus =
1160 aspeed_soc_num_cpus(amc->soc_name);
1163 static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data)
1165 MachineClass *mc = MACHINE_CLASS(oc);
1166 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1168 mc->desc = "OpenPOWER Tacoma BMC (Cortex-A7)";
1169 amc->soc_name = "ast2600-a3";
1170 amc->hw_strap1 = TACOMA_BMC_HW_STRAP1;
1171 amc->hw_strap2 = TACOMA_BMC_HW_STRAP2;
1172 amc->fmc_model = "mx66l1g45g";
1173 amc->spi_model = "mx66l1g45g";
1174 amc->num_cs = 2;
1175 amc->macs_mask = ASPEED_MAC2_ON;
1176 amc->i2c_init = witherspoon_bmc_i2c_init; /* Same board layout */
1177 mc->default_ram_size = 1 * GiB;
1178 mc->default_cpus = mc->min_cpus = mc->max_cpus =
1179 aspeed_soc_num_cpus(amc->soc_name);
1182 static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data)
1184 MachineClass *mc = MACHINE_CLASS(oc);
1185 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1187 mc->desc = "Bytedance G220A BMC (ARM1176)";
1188 amc->soc_name = "ast2500-a1";
1189 amc->hw_strap1 = G220A_BMC_HW_STRAP1;
1190 amc->fmc_model = "n25q512a";
1191 amc->spi_model = "mx25l25635e";
1192 amc->num_cs = 2;
1193 amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
1194 amc->i2c_init = g220a_bmc_i2c_init;
1195 mc->default_ram_size = 1024 * MiB;
1196 mc->default_cpus = mc->min_cpus = mc->max_cpus =
1197 aspeed_soc_num_cpus(amc->soc_name);
1200 static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc, void *data)
1202 MachineClass *mc = MACHINE_CLASS(oc);
1203 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1205 mc->desc = "Inspur FP5280G2 BMC (ARM1176)";
1206 amc->soc_name = "ast2500-a1";
1207 amc->hw_strap1 = FP5280G2_BMC_HW_STRAP1;
1208 amc->fmc_model = "n25q512a";
1209 amc->spi_model = "mx25l25635e";
1210 amc->num_cs = 2;
1211 amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
1212 amc->i2c_init = fp5280g2_bmc_i2c_init;
1213 mc->default_ram_size = 512 * MiB;
1214 mc->default_cpus = mc->min_cpus = mc->max_cpus =
1215 aspeed_soc_num_cpus(amc->soc_name);
1218 static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data)
1220 MachineClass *mc = MACHINE_CLASS(oc);
1221 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1223 mc->desc = "IBM Rainier BMC (Cortex-A7)";
1224 amc->soc_name = "ast2600-a3";
1225 amc->hw_strap1 = RAINIER_BMC_HW_STRAP1;
1226 amc->hw_strap2 = RAINIER_BMC_HW_STRAP2;
1227 amc->fmc_model = "mx66l1g45g";
1228 amc->spi_model = "mx66l1g45g";
1229 amc->num_cs = 2;
1230 amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1231 amc->i2c_init = rainier_bmc_i2c_init;
1232 mc->default_ram_size = 1 * GiB;
1233 mc->default_cpus = mc->min_cpus = mc->max_cpus =
1234 aspeed_soc_num_cpus(amc->soc_name);
1237 /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */
1238 #if HOST_LONG_BITS == 32
1239 #define FUJI_BMC_RAM_SIZE (1 * GiB)
1240 #else
1241 #define FUJI_BMC_RAM_SIZE (2 * GiB)
1242 #endif
1244 static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data)
1246 MachineClass *mc = MACHINE_CLASS(oc);
1247 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1249 mc->desc = "Facebook Fuji BMC (Cortex-A7)";
1250 amc->soc_name = "ast2600-a3";
1251 amc->hw_strap1 = FUJI_BMC_HW_STRAP1;
1252 amc->hw_strap2 = FUJI_BMC_HW_STRAP2;
1253 amc->fmc_model = "mx66l1g45g";
1254 amc->spi_model = "mx66l1g45g";
1255 amc->num_cs = 2;
1256 amc->macs_mask = ASPEED_MAC3_ON;
1257 amc->i2c_init = fuji_bmc_i2c_init;
1258 amc->uart_default = ASPEED_DEV_UART1;
1259 mc->default_ram_size = FUJI_BMC_RAM_SIZE;
1260 mc->default_cpus = mc->min_cpus = mc->max_cpus =
1261 aspeed_soc_num_cpus(amc->soc_name);
1264 static const TypeInfo aspeed_machine_types[] = {
1266 .name = MACHINE_TYPE_NAME("palmetto-bmc"),
1267 .parent = TYPE_ASPEED_MACHINE,
1268 .class_init = aspeed_machine_palmetto_class_init,
1269 }, {
1270 .name = MACHINE_TYPE_NAME("supermicrox11-bmc"),
1271 .parent = TYPE_ASPEED_MACHINE,
1272 .class_init = aspeed_machine_supermicrox11_bmc_class_init,
1273 }, {
1274 .name = MACHINE_TYPE_NAME("ast2500-evb"),
1275 .parent = TYPE_ASPEED_MACHINE,
1276 .class_init = aspeed_machine_ast2500_evb_class_init,
1277 }, {
1278 .name = MACHINE_TYPE_NAME("romulus-bmc"),
1279 .parent = TYPE_ASPEED_MACHINE,
1280 .class_init = aspeed_machine_romulus_class_init,
1281 }, {
1282 .name = MACHINE_TYPE_NAME("swift-bmc"),
1283 .parent = TYPE_ASPEED_MACHINE,
1284 .class_init = aspeed_machine_swift_class_init,
1285 }, {
1286 .name = MACHINE_TYPE_NAME("sonorapass-bmc"),
1287 .parent = TYPE_ASPEED_MACHINE,
1288 .class_init = aspeed_machine_sonorapass_class_init,
1289 }, {
1290 .name = MACHINE_TYPE_NAME("witherspoon-bmc"),
1291 .parent = TYPE_ASPEED_MACHINE,
1292 .class_init = aspeed_machine_witherspoon_class_init,
1293 }, {
1294 .name = MACHINE_TYPE_NAME("ast2600-evb"),
1295 .parent = TYPE_ASPEED_MACHINE,
1296 .class_init = aspeed_machine_ast2600_evb_class_init,
1297 }, {
1298 .name = MACHINE_TYPE_NAME("tacoma-bmc"),
1299 .parent = TYPE_ASPEED_MACHINE,
1300 .class_init = aspeed_machine_tacoma_class_init,
1301 }, {
1302 .name = MACHINE_TYPE_NAME("g220a-bmc"),
1303 .parent = TYPE_ASPEED_MACHINE,
1304 .class_init = aspeed_machine_g220a_class_init,
1305 }, {
1306 .name = MACHINE_TYPE_NAME("fp5280g2-bmc"),
1307 .parent = TYPE_ASPEED_MACHINE,
1308 .class_init = aspeed_machine_fp5280g2_class_init,
1309 }, {
1310 .name = MACHINE_TYPE_NAME("quanta-q71l-bmc"),
1311 .parent = TYPE_ASPEED_MACHINE,
1312 .class_init = aspeed_machine_quanta_q71l_class_init,
1313 }, {
1314 .name = MACHINE_TYPE_NAME("rainier-bmc"),
1315 .parent = TYPE_ASPEED_MACHINE,
1316 .class_init = aspeed_machine_rainier_class_init,
1317 }, {
1318 .name = MACHINE_TYPE_NAME("fuji-bmc"),
1319 .parent = TYPE_ASPEED_MACHINE,
1320 .class_init = aspeed_machine_fuji_class_init,
1321 }, {
1322 .name = TYPE_ASPEED_MACHINE,
1323 .parent = TYPE_MACHINE,
1324 .instance_size = sizeof(AspeedMachineState),
1325 .instance_init = aspeed_machine_instance_init,
1326 .class_size = sizeof(AspeedMachineClass),
1327 .class_init = aspeed_machine_class_init,
1328 .abstract = true,
1332 DEFINE_TYPES(aspeed_machine_types)