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