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