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