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