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