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