xref: /qemu/hw/arm/aspeed.c (revision 902bba549fc386b4b9805320ed1a2e5b68478bdd)
1327d8e4eSAndrew Jeffery /*
2327d8e4eSAndrew Jeffery  * OpenPOWER Palmetto BMC
3327d8e4eSAndrew Jeffery  *
4327d8e4eSAndrew Jeffery  * Andrew Jeffery <andrew@aj.id.au>
5327d8e4eSAndrew Jeffery  *
6327d8e4eSAndrew Jeffery  * Copyright 2016 IBM Corp.
7327d8e4eSAndrew Jeffery  *
8327d8e4eSAndrew Jeffery  * This code is licensed under the GPL version 2 or later.  See
9327d8e4eSAndrew Jeffery  * the COPYING file in the top-level directory.
10327d8e4eSAndrew Jeffery  */
11327d8e4eSAndrew Jeffery 
12327d8e4eSAndrew Jeffery #include "qemu/osdep.h"
13da34e65cSMarkus Armbruster #include "qapi/error.h"
1412ec8bd5SPeter Maydell #include "hw/arm/boot.h"
15fca9ca1bSCédric Le Goater #include "hw/arm/aspeed.h"
1600442402SCédric Le Goater #include "hw/arm/aspeed_soc.h"
17c0216b94SPeter Delevoryas #include "hw/arm/aspeed_eeprom.h"
183ec75e39SPatrick Venture #include "hw/i2c/i2c_mux_pca954x.h"
1993198b6cSCorey Minyard #include "hw/i2c/smbus_eeprom.h"
20044475f3SPhilippe Mathieu-Daudé #include "hw/misc/pca9552.h"
219618ebaeSPeter Delevoryas #include "hw/nvram/eeprom_at24c.h"
225e9ae4b1SCorey Minyard #include "hw/sensor/tmp105.h"
237cfbde5eSPhilippe Mathieu-Daudé #include "hw/misc/led.h"
24a27bd6c7SMarkus Armbruster #include "hw/qdev-properties.h"
25e1ad9bc4SCédric Le Goater #include "sysemu/block-backend.h"
26fa699e80SPeter Delevoryas #include "sysemu/reset.h"
27d769a1daSCédric Le Goater #include "hw/loader.h"
28d769a1daSCédric Le Goater #include "qemu/error-report.h"
29a9df9622SJoel Stanley #include "qemu/units.h"
3066c895b8SJamin Lin #include "hw/qdev-clock.h"
31d2b3eaefSPeter Delevoryas #include "sysemu/sysemu.h"
32327d8e4eSAndrew Jeffery 
3374fb1f38SCédric Le Goater static struct arm_boot_info aspeed_board_binfo = {
34b033271fSCédric Le Goater     .board_id = -1, /* device-tree-only board */
35327d8e4eSAndrew Jeffery };
36327d8e4eSAndrew Jeffery 
37612b219aSPhilippe Mathieu-Daudé struct AspeedMachineState {
38888b2b03SPhilippe Mathieu-Daudé     /* Private */
39888b2b03SPhilippe Mathieu-Daudé     MachineState parent_obj;
40888b2b03SPhilippe Mathieu-Daudé     /* Public */
41888b2b03SPhilippe Mathieu-Daudé 
42ff90606fSCédric Le Goater     AspeedSoCState soc;
43888b2b03SPhilippe Mathieu-Daudé     bool mmio_exec;
449820e52fSCédric Le Goater     char *fmc_model;
459820e52fSCédric Le Goater     char *spi_model;
46ea066d39SThomas Huth };
47327d8e4eSAndrew Jeffery 
48ef17f836SCédric Le Goater /* Palmetto hardware value: 0x120CE416 */
498da33ef7SCédric Le Goater #define PALMETTO_BMC_HW_STRAP1 (                                        \
508da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_256MB) |               \
518da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2 /* DDR3 with CL=6, CWL=5 */) | \
528da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
538da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) |       \
548da33ef7SCédric Le Goater         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
558da33ef7SCédric Le Goater         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
568da33ef7SCédric Le Goater         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) |                \
578da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
588da33ef7SCédric Le Goater         SCU_HW_STRAP_SPI_WIDTH |                                        \
598da33ef7SCédric Le Goater         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
608da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
618da33ef7SCédric Le Goater 
6240a38df5SErik Smit /* TODO: Find the actual hardware value */
6340a38df5SErik Smit #define SUPERMICROX11_BMC_HW_STRAP1 (                                   \
6440a38df5SErik Smit         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) |               \
6540a38df5SErik Smit         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2) |                           \
6640a38df5SErik Smit         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
6740a38df5SErik Smit         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) |       \
6840a38df5SErik Smit         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
6940a38df5SErik Smit         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
7040a38df5SErik Smit         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) |                \
7140a38df5SErik Smit         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
7240a38df5SErik Smit         SCU_HW_STRAP_SPI_WIDTH |                                        \
7340a38df5SErik Smit         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
7440a38df5SErik Smit         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
7540a38df5SErik Smit 
7647936597SGuenter Roeck /* TODO: Find the actual hardware value */
7747936597SGuenter Roeck #define SUPERMICRO_X11SPI_BMC_HW_STRAP1 (                               \
7847936597SGuenter Roeck         AST2500_HW_STRAP1_DEFAULTS |                                    \
7947936597SGuenter Roeck         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
8047936597SGuenter Roeck         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
8147936597SGuenter Roeck         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
8247936597SGuenter Roeck         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
8347936597SGuenter Roeck         SCU_HW_STRAP_SPI_WIDTH |                                        \
8447936597SGuenter Roeck         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN))
8547936597SGuenter Roeck 
86ef17f836SCédric Le Goater /* AST2500 evb hardware value: 0xF100C2E6 */
879a7c1750SCédric Le Goater #define AST2500_EVB_HW_STRAP1 ((                                        \
889a7c1750SCédric Le Goater         AST2500_HW_STRAP1_DEFAULTS |                                    \
899a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
909a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
919a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
929a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
939a7c1750SCédric Le Goater         SCU_HW_STRAP_MAC1_RGMII |                                       \
949a7c1750SCédric Le Goater         SCU_HW_STRAP_MAC0_RGMII) &                                      \
959a7c1750SCédric Le Goater         ~SCU_HW_STRAP_2ND_BOOT_WDT)
969a7c1750SCédric Le Goater 
97ef17f836SCédric Le Goater /* Romulus hardware value: 0xF10AD206 */
98ef17f836SCédric Le Goater #define ROMULUS_BMC_HW_STRAP1 (                                         \
99ef17f836SCédric Le Goater         AST2500_HW_STRAP1_DEFAULTS |                                    \
100ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
101ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
102ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
103ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
104ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_ACPI_ENABLE |                              \
105ef17f836SCédric Le Goater         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER))
106ef17f836SCédric Le Goater 
107143b040fSPatrick Williams /* Sonorapass hardware value: 0xF100D216 */
108143b040fSPatrick Williams #define SONORAPASS_BMC_HW_STRAP1 (                                      \
109143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
110143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
111143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
112143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
113143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
114143b040fSPatrick Williams         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
115143b040fSPatrick Williams         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
116143b040fSPatrick Williams         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
117143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
118143b040fSPatrick Williams         SCU_HW_STRAP_VGA_BIOS_ROM |                                     \
119143b040fSPatrick Williams         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
120143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_RESERVED1)
121143b040fSPatrick Williams 
12295f068c8SJohn Wang #define G220A_BMC_HW_STRAP1 (                                      \
12395f068c8SJohn Wang         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
12495f068c8SJohn Wang         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
12595f068c8SJohn Wang         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
12695f068c8SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
12795f068c8SJohn Wang         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
12895f068c8SJohn Wang         SCU_HW_STRAP_2ND_BOOT_WDT |                                     \
12995f068c8SJohn Wang         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
13095f068c8SJohn Wang         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
13195f068c8SJohn Wang         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
13295f068c8SJohn Wang         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
13395f068c8SJohn Wang         SCU_HW_STRAP_VGA_SIZE_SET(VGA_64M_DRAM) |                       \
13495f068c8SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED1)
13595f068c8SJohn Wang 
13682b6a3f6SJohn Wang /* FP5280G2 hardware value: 0XF100D286 */
13782b6a3f6SJohn Wang #define FP5280G2_BMC_HW_STRAP1 (                                      \
13882b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
13982b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
14082b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
14182b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
14282b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
14382b6a3f6SJohn Wang         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
14482b6a3f6SJohn Wang         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
14582b6a3f6SJohn Wang         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
14682b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
14782b6a3f6SJohn Wang         SCU_HW_STRAP_MAC1_RGMII |                                       \
14882b6a3f6SJohn Wang         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
14982b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED1)
15082b6a3f6SJohn Wang 
15162c2c2ebSCédric Le Goater /* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */
15262c2c2ebSCédric Le Goater #define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1
15362c2c2ebSCédric Le Goater 
1549cccb912SPatrick Venture /* Quanta-Q71l hardware value */
1559cccb912SPatrick Venture #define QUANTA_Q71L_BMC_HW_STRAP1 (                                     \
1569cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) |               \
1579cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2/* DDR3 with CL=6, CWL=5 */) | \
1589cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
1599cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_24M_IN) |       \
1609cccb912SPatrick Venture         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
1619cccb912SPatrick Venture         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_PASS_THROUGH) |          \
1629cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
1639cccb912SPatrick Venture         SCU_HW_STRAP_SPI_WIDTH |                                        \
1649cccb912SPatrick Venture         SCU_HW_STRAP_VGA_SIZE_SET(VGA_8M_DRAM) |                        \
1659cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
1669cccb912SPatrick Venture 
167ccc2c418SCédric Le Goater /* AST2600 evb hardware value */
168ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP1 0x000000C0
169ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP2 0x00000003
170ccc2c418SCédric Le Goater 
17163ceb818SCédric Le Goater /* Tacoma hardware value */
17263ceb818SCédric Le Goater #define TACOMA_BMC_HW_STRAP1  0x00000000
1737582591aSJoel Stanley #define TACOMA_BMC_HW_STRAP2  0x00000040
17463ceb818SCédric Le Goater 
17558e52bdbSCédric Le Goater /* Rainier hardware value: (QEMU prototype) */
176b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP1 0x00422016
177b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP2 0x80000848
17858e52bdbSCédric Le Goater 
179febbe308SPeter Delevoryas /* Fuji hardware value */
180febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP1    0x00000000
181febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP2    0x00000000
182febbe308SPeter Delevoryas 
183a20c54b1SPatrick Williams /* Bletchley hardware value */
184a20c54b1SPatrick Williams /* TODO: Leave same as EVB for now. */
185a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP1 AST2600_EVB_HW_STRAP1
186a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP2 AST2600_EVB_HW_STRAP2
187a20c54b1SPatrick Williams 
188fb6b3c8dSJae Hyun Yoo /* Qualcomm DC-SCM hardware value */
189fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP1  0x00000000
190fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP2  0x00000041
191fb6b3c8dSJae Hyun Yoo 
1929bb6d140SJoel Stanley #define AST_SMP_MAILBOX_BASE            0x1e6e2180
1939bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_ENTRY        (AST_SMP_MAILBOX_BASE + 0x0)
1949bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_GOSIGN       (AST_SMP_MAILBOX_BASE + 0x4)
1959bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_READY        (AST_SMP_MAILBOX_BASE + 0x8)
1969bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_POLLINSN     (AST_SMP_MAILBOX_BASE + 0xc)
1979bb6d140SJoel Stanley #define AST_SMP_MBOX_CODE               (AST_SMP_MAILBOX_BASE + 0x10)
1989bb6d140SJoel Stanley #define AST_SMP_MBOX_GOSIGN             0xabbaab00
1999bb6d140SJoel Stanley 
2009bb6d140SJoel Stanley static void aspeed_write_smpboot(ARMCPU *cpu,
2019bb6d140SJoel Stanley                                  const struct arm_boot_info *info)
2029bb6d140SJoel Stanley {
203*902bba54SCédric Le Goater     AddressSpace *as = arm_boot_address_space(cpu, info);
204*902bba54SCédric Le Goater     static const ARMInsnFixup poll_mailbox_ready[] = {
2059bb6d140SJoel Stanley         /*
2069bb6d140SJoel Stanley          * r2 = per-cpu go sign value
2079bb6d140SJoel Stanley          * r1 = AST_SMP_MBOX_FIELD_ENTRY
2089bb6d140SJoel Stanley          * r0 = AST_SMP_MBOX_FIELD_GOSIGN
2099bb6d140SJoel Stanley          */
210*902bba54SCédric Le Goater         { 0xee100fb0 },  /* mrc     p15, 0, r0, c0, c0, 5 */
211*902bba54SCédric Le Goater         { 0xe21000ff },  /* ands    r0, r0, #255          */
212*902bba54SCédric Le Goater         { 0xe59f201c },  /* ldr     r2, [pc, #28]         */
213*902bba54SCédric Le Goater         { 0xe1822000 },  /* orr     r2, r2, r0            */
2149bb6d140SJoel Stanley 
215*902bba54SCédric Le Goater         { 0xe59f1018 },  /* ldr     r1, [pc, #24]         */
216*902bba54SCédric Le Goater         { 0xe59f0018 },  /* ldr     r0, [pc, #24]         */
2179bb6d140SJoel Stanley 
218*902bba54SCédric Le Goater         { 0xe320f002 },  /* wfe                           */
219*902bba54SCédric Le Goater         { 0xe5904000 },  /* ldr     r4, [r0]              */
220*902bba54SCédric Le Goater         { 0xe1520004 },  /* cmp     r2, r4                */
221*902bba54SCédric Le Goater         { 0x1afffffb },  /* bne     <wfe>                 */
222*902bba54SCédric Le Goater         { 0xe591f000 },  /* ldr     pc, [r1]              */
223*902bba54SCédric Le Goater         { AST_SMP_MBOX_GOSIGN },
224*902bba54SCédric Le Goater         { AST_SMP_MBOX_FIELD_ENTRY },
225*902bba54SCédric Le Goater         { AST_SMP_MBOX_FIELD_GOSIGN },
226*902bba54SCédric Le Goater         { 0, FIXUP_TERMINATOR }
2279bb6d140SJoel Stanley     };
228*902bba54SCédric Le Goater     static const uint32_t fixupcontext[FIXUP_MAX] = { 0 };
2299bb6d140SJoel Stanley 
230*902bba54SCédric Le Goater     arm_write_bootloader("aspeed.smpboot", as, info->smp_loader_start,
231*902bba54SCédric Le Goater                          poll_mailbox_ready, fixupcontext);
2329bb6d140SJoel Stanley }
2339bb6d140SJoel Stanley 
2349bb6d140SJoel Stanley static void aspeed_reset_secondary(ARMCPU *cpu,
2359bb6d140SJoel Stanley                                    const struct arm_boot_info *info)
2369bb6d140SJoel Stanley {
2379bb6d140SJoel Stanley     AddressSpace *as = arm_boot_address_space(cpu, info);
2389bb6d140SJoel Stanley     CPUState *cs = CPU(cpu);
2399bb6d140SJoel Stanley 
2409bb6d140SJoel Stanley     /* info->smp_bootreg_addr */
2419bb6d140SJoel Stanley     address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0,
2429bb6d140SJoel Stanley                                MEMTXATTRS_UNSPECIFIED, NULL);
2439bb6d140SJoel Stanley     cpu_set_pc(cs, info->smp_loader_start);
2449bb6d140SJoel Stanley }
2459bb6d140SJoel Stanley 
2468b744a6aSCédric Le Goater static void write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size,
247d769a1daSCédric Le Goater                            Error **errp)
248d769a1daSCédric Le Goater {
24905e6e40aSWentao_Liang     g_autofree void *storage = NULL;
2500c7209beSCédric Le Goater     int64_t size;
251d769a1daSCédric Le Goater 
2520c7209beSCédric Le Goater     /* The block backend size should have already been 'validated' by
2530c7209beSCédric Le Goater      * the creation of the m25p80 object.
2540c7209beSCédric Le Goater      */
2550c7209beSCédric Le Goater     size = blk_getlength(blk);
2560c7209beSCédric Le Goater     if (size <= 0) {
2570c7209beSCédric Le Goater         error_setg(errp, "failed to get flash size");
2580c7209beSCédric Le Goater         return;
2590c7209beSCédric Le Goater     }
2600c7209beSCédric Le Goater 
2610c7209beSCédric Le Goater     if (rom_size > size) {
2620c7209beSCédric Le Goater         rom_size = size;
263d769a1daSCédric Le Goater     }
264d769a1daSCédric Le Goater 
26505e6e40aSWentao_Liang     storage = g_malloc0(rom_size);
266a9262f55SAlberto Faria     if (blk_pread(blk, 0, rom_size, storage, 0) < 0) {
267d769a1daSCédric Le Goater         error_setg(errp, "failed to read the initial flash content");
268d769a1daSCédric Le Goater         return;
269d769a1daSCédric Le Goater     }
270d769a1daSCédric Le Goater 
271d769a1daSCédric Le Goater     rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr);
272d769a1daSCédric Le Goater }
273d769a1daSCédric Le Goater 
2748b744a6aSCédric Le Goater /*
2758b744a6aSCédric Le Goater  * Create a ROM and copy the flash contents at the expected address
2768b744a6aSCédric Le Goater  * (0x0). Boots faster than execute-in-place.
2778b744a6aSCédric Le Goater  */
2788b744a6aSCédric Le Goater static void aspeed_install_boot_rom(AspeedSoCState *soc, BlockBackend *blk,
2798b744a6aSCédric Le Goater                                     uint64_t rom_size)
2808b744a6aSCédric Le Goater {
2818b744a6aSCédric Le Goater     MemoryRegion *boot_rom = g_new(MemoryRegion, 1);
2828b744a6aSCédric Le Goater 
2838b744a6aSCédric Le Goater     memory_region_init_rom(boot_rom, NULL, "aspeed.boot_rom", rom_size,
2848b744a6aSCédric Le Goater                            &error_abort);
2858b744a6aSCédric Le Goater     memory_region_add_subregion_overlap(&soc->spi_boot_container, 0,
2868b744a6aSCédric Le Goater                                         boot_rom, 1);
2878b744a6aSCédric Le Goater     write_boot_rom(blk, ASPEED_SOC_SPI_BOOT_ADDR, rom_size, &error_abort);
2888b744a6aSCédric Le Goater }
2898b744a6aSCédric Le Goater 
2901099ad10SPeter Delevoryas void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
2919bd4ac61SCédric Le Goater                                       unsigned int count, int unit0)
292e1ad9bc4SCédric Le Goater {
293e1ad9bc4SCédric Le Goater     int i;
294179b2058SPatrick Williams 
295179b2058SPatrick Williams     if (!flashtype) {
296179b2058SPatrick Williams         return;
297179b2058SPatrick Williams     }
298e1ad9bc4SCédric Le Goater 
2999bd4ac61SCédric Le Goater     for (i = 0; i < count; ++i) {
3008ec239f2SMarkus Armbruster         DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i);
301e1ad9bc4SCédric Le Goater         qemu_irq cs_line;
302a7d78befSCédric Le Goater         DeviceState *dev;
303e1ad9bc4SCédric Le Goater 
304a7d78befSCédric Le Goater         dev = qdev_new(flashtype);
305e1ad9bc4SCédric Le Goater         if (dinfo) {
306a7d78befSCédric Le Goater             qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo));
307e1ad9bc4SCédric Le Goater         }
308a7d78befSCédric Le Goater         qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal);
309e1ad9bc4SCédric Le Goater 
310a7d78befSCédric Le Goater         cs_line = qdev_get_gpio_in_named(dev, SSI_GPIO_CS, 0);
311b22a2d40SCédric Le Goater         qdev_connect_gpio_out_named(DEVICE(s), "cs", i, cs_line);
312e1ad9bc4SCédric Le Goater     }
313e1ad9bc4SCédric Le Goater }
314e1ad9bc4SCédric Le Goater 
315a29e3e12SAndrew Jeffery static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo)
316a29e3e12SAndrew Jeffery {
317a29e3e12SAndrew Jeffery         DeviceState *card;
318a29e3e12SAndrew Jeffery 
319756f739bSPhilippe Mathieu-Daudé         if (!dinfo) {
320756f739bSPhilippe Mathieu-Daudé             return;
321756f739bSPhilippe Mathieu-Daudé         }
3223e80f690SMarkus Armbruster         card = qdev_new(TYPE_SD_CARD);
323934df912SMarkus Armbruster         qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
324a29e3e12SAndrew Jeffery                                 &error_fatal);
3253e80f690SMarkus Armbruster         qdev_realize_and_unref(card,
3263e80f690SMarkus Armbruster                                qdev_get_child_bus(DEVICE(sdhci), "sd-bus"),
3273e80f690SMarkus Armbruster                                &error_fatal);
328a29e3e12SAndrew Jeffery }
329a29e3e12SAndrew Jeffery 
330d2b3eaefSPeter Delevoryas static void connect_serial_hds_to_uarts(AspeedMachineState *bmc)
331d2b3eaefSPeter Delevoryas {
332d2b3eaefSPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
333d2b3eaefSPeter Delevoryas     AspeedSoCState *s = &bmc->soc;
334d2b3eaefSPeter Delevoryas     AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
335d2b3eaefSPeter Delevoryas 
336d2b3eaefSPeter Delevoryas     aspeed_soc_uart_set_chr(s, amc->uart_default, serial_hd(0));
337d2b3eaefSPeter Delevoryas     for (int i = 1, uart = ASPEED_DEV_UART1; i < sc->uarts_num; i++, uart++) {
338d2b3eaefSPeter Delevoryas         if (uart == amc->uart_default) {
339d2b3eaefSPeter Delevoryas             continue;
340d2b3eaefSPeter Delevoryas         }
341d2b3eaefSPeter Delevoryas         aspeed_soc_uart_set_chr(s, uart, serial_hd(i));
342d2b3eaefSPeter Delevoryas     }
343d2b3eaefSPeter Delevoryas }
344d2b3eaefSPeter Delevoryas 
345baa4732bSCédric Le Goater static void aspeed_machine_init(MachineState *machine)
346327d8e4eSAndrew Jeffery {
347888b2b03SPhilippe Mathieu-Daudé     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
348baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
349b033271fSCédric Le Goater     AspeedSoCClass *sc;
3502bea128cSEddie James     int i;
351d3bad7e7SCédric Le Goater     NICInfo *nd = &nd_table[0];
352327d8e4eSAndrew Jeffery 
3539fc7fc4dSMarkus Armbruster     object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
354327d8e4eSAndrew Jeffery 
355b033271fSCédric Le Goater     sc = ASPEED_SOC_GET_CLASS(&bmc->soc);
356b033271fSCédric Le Goater 
357533eb415SIgor Mammedov     /*
358346160cbSCédric Le Goater      * This will error out if the RAM size is not supported by the
359346160cbSCédric Le Goater      * memory controller of the SoC.
360533eb415SIgor Mammedov      */
3616e504a98SPaolo Bonzini     object_property_set_uint(OBJECT(&bmc->soc), "ram-size", machine->ram_size,
362533eb415SIgor Mammedov                              &error_fatal);
363533eb415SIgor Mammedov 
364d3bad7e7SCédric Le Goater     for (i = 0; i < sc->macs_num; i++) {
365d3bad7e7SCédric Le Goater         if ((amc->macs_mask & (1 << i)) && nd->used) {
366d3bad7e7SCédric Le Goater             qemu_check_nic_model(nd, TYPE_FTGMAC100);
367d3bad7e7SCédric Le Goater             qdev_set_nic_properties(DEVICE(&bmc->soc.ftgmac100[i]), nd);
368d3bad7e7SCédric Le Goater             nd++;
369d3bad7e7SCédric Le Goater         }
370d3bad7e7SCédric Le Goater     }
371d3bad7e7SCédric Le Goater 
3725325cc34SMarkus Armbruster     object_property_set_int(OBJECT(&bmc->soc), "hw-strap1", amc->hw_strap1,
37387e79af0SAndrew Jeffery                             &error_abort);
3745325cc34SMarkus Armbruster     object_property_set_int(OBJECT(&bmc->soc), "hw-strap2", amc->hw_strap2,
375ccc2c418SCédric Le Goater                             &error_abort);
3764dd9d554SPeter Delevoryas     object_property_set_link(OBJECT(&bmc->soc), "memory",
3774dd9d554SPeter Delevoryas                              OBJECT(get_system_memory()), &error_abort);
3785325cc34SMarkus Armbruster     object_property_set_link(OBJECT(&bmc->soc), "dram",
3790df2d9a6SCédric Le Goater                              OBJECT(machine->ram), &error_abort);
380b6e70d1dSJoel Stanley     if (machine->kernel_filename) {
381b6e70d1dSJoel Stanley         /*
382b6e70d1dSJoel Stanley          * When booting with a -kernel command line there is no u-boot
383b6e70d1dSJoel Stanley          * that runs to unlock the SCU. In this case set the default to
384b6e70d1dSJoel Stanley          * be unlocked as the kernel expects
385b6e70d1dSJoel Stanley          */
3865325cc34SMarkus Armbruster         object_property_set_int(OBJECT(&bmc->soc), "hw-prot-key",
3875325cc34SMarkus Armbruster                                 ASPEED_SCU_PROT_KEY, &error_abort);
388b6e70d1dSJoel Stanley     }
389d2b3eaefSPeter Delevoryas     connect_serial_hds_to_uarts(bmc);
390ce189ab2SMarkus Armbruster     qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
391327d8e4eSAndrew Jeffery 
3928ec239f2SMarkus Armbruster     aspeed_board_init_flashes(&bmc->soc.fmc,
3938ec239f2SMarkus Armbruster                               bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
3949bd4ac61SCédric Le Goater                               amc->num_cs, 0);
3958ec239f2SMarkus Armbruster     aspeed_board_init_flashes(&bmc->soc.spi[0],
3968ec239f2SMarkus Armbruster                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
3979bd4ac61SCédric Le Goater                               1, amc->num_cs);
398e1ad9bc4SCédric Le Goater 
399b7f1a0cbSCédric Le Goater     if (machine->kernel_filename && sc->num_cpus > 1) {
4009bb6d140SJoel Stanley         /* With no u-boot we must set up a boot stub for the secondary CPU */
4019bb6d140SJoel Stanley         MemoryRegion *smpboot = g_new(MemoryRegion, 1);
402f489960dSPhilippe Mathieu-Daudé         memory_region_init_ram(smpboot, NULL, "aspeed.smpboot",
4039bb6d140SJoel Stanley                                0x80, &error_abort);
4049bb6d140SJoel Stanley         memory_region_add_subregion(get_system_memory(),
4059bb6d140SJoel Stanley                                     AST_SMP_MAILBOX_BASE, smpboot);
4069bb6d140SJoel Stanley 
4079bb6d140SJoel Stanley         aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot;
4089bb6d140SJoel Stanley         aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary;
4099bb6d140SJoel Stanley         aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE;
4109bb6d140SJoel Stanley     }
4119bb6d140SJoel Stanley 
4126e504a98SPaolo Bonzini     aspeed_board_binfo.ram_size = machine->ram_size;
413347df6f8SEduardo Habkost     aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM];
414b033271fSCédric Le Goater 
415baa4732bSCédric Le Goater     if (amc->i2c_init) {
416baa4732bSCédric Le Goater         amc->i2c_init(bmc);
4172cf6cb50SCédric Le Goater     }
4182cf6cb50SCédric Le Goater 
4190e2c24c6SAndrew Jeffery     for (i = 0; i < bmc->soc.sdhci.num_slots; i++) {
4208ec239f2SMarkus Armbruster         sdhci_attach_drive(&bmc->soc.sdhci.slots[i],
4218ec239f2SMarkus Armbruster                            drive_get(IF_SD, 0, i));
422a29e3e12SAndrew Jeffery     }
4232bea128cSEddie James 
424a29e3e12SAndrew Jeffery     if (bmc->soc.emmc.num_slots) {
4258ec239f2SMarkus Armbruster         sdhci_attach_drive(&bmc->soc.emmc.slots[0],
4268ec239f2SMarkus Armbruster                            drive_get(IF_SD, 0, bmc->soc.sdhci.num_slots));
4272bea128cSEddie James     }
4282bea128cSEddie James 
4298b744a6aSCédric Le Goater     if (!bmc->mmio_exec) {
4308b744a6aSCédric Le Goater         DriveInfo *mtd0 = drive_get(IF_MTD, 0, 0);
4318b744a6aSCédric Le Goater 
4328b744a6aSCédric Le Goater         if (mtd0) {
4338b744a6aSCédric Le Goater             uint64_t rom_size = memory_region_size(&bmc->soc.spi_boot);
4348b744a6aSCédric Le Goater             aspeed_install_boot_rom(&bmc->soc, blk_by_legacy_dinfo(mtd0),
4358b744a6aSCédric Le Goater                                     rom_size);
4368b744a6aSCédric Le Goater         }
4378b744a6aSCédric Le Goater     }
4388b744a6aSCédric Le Goater 
4392744ece8STao Xu     arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo);
440327d8e4eSAndrew Jeffery }
441327d8e4eSAndrew Jeffery 
442612b219aSPhilippe Mathieu-Daudé static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
4432cf6cb50SCédric Le Goater {
4442cf6cb50SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
445a87e81b9SCédric Le Goater     DeviceState *dev;
4463d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
4472cf6cb50SCédric Le Goater 
4482cf6cb50SCédric Le Goater     /* The palmetto platform expects a ds3231 RTC but a ds1338 is
4492cf6cb50SCédric Le Goater      * enough to provide basic RTC features. Alarms will be missing */
4501373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
451a87e81b9SCédric Le Goater 
4527a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
4533d165f12SCédric Le Goater                           eeprom_buf);
4543d165f12SCédric Le Goater 
455a87e81b9SCédric Le Goater     /* add a TMP423 temperature sensor */
4561373b15bSPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
4571373b15bSPhilippe Mathieu-Daudé                                          "tmp423", 0x4c));
4585325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
4595325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
4605325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
4615325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort);
4622cf6cb50SCédric Le Goater }
4632cf6cb50SCédric Le Goater 
4649cccb912SPatrick Venture static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc)
4659cccb912SPatrick Venture {
4669cccb912SPatrick Venture     AspeedSoCState *soc = &bmc->soc;
4679cccb912SPatrick Venture 
4689cccb912SPatrick Venture     /*
4699cccb912SPatrick Venture      * The quanta-q71l platform expects tmp75s which are compatible with
4709cccb912SPatrick Venture      * tmp105s.
4719cccb912SPatrick Venture      */
4729cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c);
4739cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e);
4749cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f);
4759cccb912SPatrick Venture 
4769cccb912SPatrick Venture     /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */
4779cccb912SPatrick Venture     /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */
4789cccb912SPatrick Venture     /* TODO: Add Memory Riser i2c mux and eeproms. */
4799cccb912SPatrick Venture 
4803ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74);
4813ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77);
4823ec75e39SPatrick Venture 
4839cccb912SPatrick Venture     /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */
4843ec75e39SPatrick Venture 
4853ec75e39SPatrick Venture     /* i2c-7 */
4863ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70);
4879cccb912SPatrick Venture     /*        - i2c@0: pmbus@59 */
4889cccb912SPatrick Venture     /*        - i2c@1: pmbus@58 */
4899cccb912SPatrick Venture     /*        - i2c@2: pmbus@58 */
4909cccb912SPatrick Venture     /*        - i2c@3: pmbus@59 */
4913ec75e39SPatrick Venture 
4929cccb912SPatrick Venture     /* TODO: i2c-7: Add PDB FRU eeprom@52 */
4939cccb912SPatrick Venture     /* TODO: i2c-8: Add BMC FRU eeprom@50 */
4949cccb912SPatrick Venture }
4959cccb912SPatrick Venture 
496612b219aSPhilippe Mathieu-Daudé static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
4972cf6cb50SCédric Le Goater {
4982cf6cb50SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
4993d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
5003d165f12SCédric Le Goater 
5017a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50,
5023d165f12SCédric Le Goater                           eeprom_buf);
5032cf6cb50SCédric Le Goater 
5042cf6cb50SCédric Le Goater     /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
5051373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
506044475f3SPhilippe Mathieu-Daudé                      TYPE_TMP105, 0x4d);
5072cf6cb50SCédric Le Goater }
5082cf6cb50SCédric Le Goater 
509612b219aSPhilippe Mathieu-Daudé static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
510ccc2c418SCédric Le Goater {
51152bcd997SHoward Chiu     AspeedSoCState *soc = &bmc->soc;
51252bcd997SHoward Chiu     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
51352bcd997SHoward Chiu 
51452bcd997SHoward Chiu     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50,
51552bcd997SHoward Chiu                           eeprom_buf);
51652bcd997SHoward Chiu 
51752bcd997SHoward Chiu     /* LM75 is compatible with TMP105 driver */
51852bcd997SHoward Chiu     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
51952bcd997SHoward Chiu                      TYPE_TMP105, 0x4d);
520ccc2c418SCédric Le Goater }
521ccc2c418SCédric Le Goater 
52234f73a81SKarthikeyan Pasupathi static void yosemitev2_bmc_i2c_init(AspeedMachineState *bmc)
52334f73a81SKarthikeyan Pasupathi {
52434f73a81SKarthikeyan Pasupathi     AspeedSoCState *soc = &bmc->soc;
52534f73a81SKarthikeyan Pasupathi 
52634f73a81SKarthikeyan Pasupathi     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x51, 128 * KiB);
52734f73a81SKarthikeyan Pasupathi     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 128 * KiB,
52834f73a81SKarthikeyan Pasupathi                           yosemitev2_bmc_fruid, yosemitev2_bmc_fruid_len);
5290a1f86baSKarthikeyan Pasupathi     /* TMP421 */
5300a1f86baSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "tmp421", 0x1f);
5310a1f86baSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4e);
5320a1f86baSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4f);
5330a1f86baSKarthikeyan Pasupathi 
53434f73a81SKarthikeyan Pasupathi }
53534f73a81SKarthikeyan Pasupathi 
536612b219aSPhilippe Mathieu-Daudé static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
5376c4567c7SCédric Le Goater {
5386c4567c7SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
5396c4567c7SCédric Le Goater 
5406c4567c7SCédric Le Goater     /* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
5416c4567c7SCédric Le Goater      * good enough */
5421373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
5436c4567c7SCédric Le Goater }
5446c4567c7SCédric Le Goater 
5456c323abaSKarthikeyan Pasupathi static void tiogapass_bmc_i2c_init(AspeedMachineState *bmc)
5466c323abaSKarthikeyan Pasupathi {
5476c323abaSKarthikeyan Pasupathi     AspeedSoCState *soc = &bmc->soc;
5486c323abaSKarthikeyan Pasupathi 
5496c323abaSKarthikeyan Pasupathi     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 128 * KiB);
5506c323abaSKarthikeyan Pasupathi     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 6), 0x54, 128 * KiB,
5516c323abaSKarthikeyan Pasupathi                           tiogapass_bmc_fruid, tiogapass_bmc_fruid_len);
552a09d357dSKarthikeyan Pasupathi     /* TMP421 */
553a09d357dSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "tmp421", 0x1f);
554a09d357dSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4f);
555a09d357dSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4e);
5566c323abaSKarthikeyan Pasupathi }
5576c323abaSKarthikeyan Pasupathi 
558f4aec252SCédric Le Goater static void create_pca9552(AspeedSoCState *soc, int bus_id, int addr)
559f4aec252SCédric Le Goater {
560f4aec252SCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, bus_id),
561f4aec252SCédric Le Goater                             TYPE_PCA9552, addr);
562f4aec252SCédric Le Goater }
563f4aec252SCédric Le Goater 
564612b219aSPhilippe Mathieu-Daudé static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc)
565143b040fSPatrick Williams {
566143b040fSPatrick Williams     AspeedSoCState *soc = &bmc->soc;
567143b040fSPatrick Williams 
568143b040fSPatrick Williams     /* bus 2 : */
5691373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48);
5701373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49);
571143b040fSPatrick Williams     /* bus 2 : pca9546 @ 0x73 */
572143b040fSPatrick Williams 
573143b040fSPatrick Williams     /* bus 3 : pca9548 @ 0x70 */
574143b040fSPatrick Williams 
575143b040fSPatrick Williams     /* bus 4 : */
576143b040fSPatrick Williams     uint8_t *eeprom4_54 = g_malloc0(8 * 1024);
5777a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54,
578143b040fSPatrick Williams                           eeprom4_54);
579143b040fSPatrick Williams     /* PCA9539 @ 0x76, but PCA9552 is compatible */
580f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x76);
581143b040fSPatrick Williams     /* PCA9539 @ 0x77, but PCA9552 is compatible */
582f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x77);
583143b040fSPatrick Williams 
584143b040fSPatrick Williams     /* bus 6 : */
5851373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48);
5861373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49);
587143b040fSPatrick Williams     /* bus 6 : pca9546 @ 0x73 */
588143b040fSPatrick Williams 
589143b040fSPatrick Williams     /* bus 8 : */
590143b040fSPatrick Williams     uint8_t *eeprom8_56 = g_malloc0(8 * 1024);
5917a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56,
592143b040fSPatrick Williams                           eeprom8_56);
593f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x60);
594f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x61);
595143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1d */
596143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1f */
597143b040fSPatrick Williams 
598143b040fSPatrick Williams     /*
599143b040fSPatrick Williams      * bus 13 : pca9548 @ 0x71
600143b040fSPatrick Williams      *      - channel 3:
601143b040fSPatrick Williams      *          - tmm421 @ 0x4c
602143b040fSPatrick Williams      *          - tmp421 @ 0x4e
603143b040fSPatrick Williams      *          - tmp421 @ 0x4f
604143b040fSPatrick Williams      */
605143b040fSPatrick Williams 
606143b040fSPatrick Williams }
607143b040fSPatrick Williams 
608612b219aSPhilippe Mathieu-Daudé static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
60962c2c2ebSCédric Le Goater {
6107cfbde5eSPhilippe Mathieu-Daudé     static const struct {
6117cfbde5eSPhilippe Mathieu-Daudé         unsigned gpio_id;
6127cfbde5eSPhilippe Mathieu-Daudé         LEDColor color;
6137cfbde5eSPhilippe Mathieu-Daudé         const char *description;
6147cfbde5eSPhilippe Mathieu-Daudé         bool gpio_polarity;
6157cfbde5eSPhilippe Mathieu-Daudé     } pca1_leds[] = {
6167cfbde5eSPhilippe Mathieu-Daudé         {13, LED_COLOR_GREEN, "front-fault-4",  GPIO_POLARITY_ACTIVE_LOW},
6177cfbde5eSPhilippe Mathieu-Daudé         {14, LED_COLOR_GREEN, "front-power-3",  GPIO_POLARITY_ACTIVE_LOW},
6187cfbde5eSPhilippe Mathieu-Daudé         {15, LED_COLOR_GREEN, "front-id-5",     GPIO_POLARITY_ACTIVE_LOW},
6197cfbde5eSPhilippe Mathieu-Daudé     };
62062c2c2ebSCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
6213d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
62215ce12cfSPhilippe Mathieu-Daudé     DeviceState *dev;
6237cfbde5eSPhilippe Mathieu-Daudé     LEDState *led;
62462c2c2ebSCédric Le Goater 
62563ceb818SCédric Le Goater     /* Bus 3: TODO bmp280@77 */
626db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
62715ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca1");
6282616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
6292616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 3),
63015ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
6318c9a61d7SCédric Le Goater 
6327cfbde5eSPhilippe Mathieu-Daudé     for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) {
6337cfbde5eSPhilippe Mathieu-Daudé         led = led_create_simple(OBJECT(bmc),
6347cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].gpio_polarity,
6357cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].color,
6367cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].description);
6377cfbde5eSPhilippe Mathieu-Daudé         qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id,
6387cfbde5eSPhilippe Mathieu-Daudé                               qdev_get_gpio_in(DEVICE(led), 0));
6397cfbde5eSPhilippe Mathieu-Daudé     }
640b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76);
6412a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "max31785", 0x52);
6421373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c);
6431373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c);
64462c2c2ebSCédric Le Goater 
64562c2c2ebSCédric Le Goater     /* The Witherspoon expects a TMP275 but a TMP105 is compatible */
6461373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105,
647044475f3SPhilippe Mathieu-Daudé                      0x4a);
6486c4567c7SCédric Le Goater 
6496c4567c7SCédric Le Goater     /* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
6506c4567c7SCédric Le Goater      * good enough */
6511373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
6523d165f12SCédric Le Goater 
6537a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51,
6543d165f12SCédric Le Goater                           eeprom_buf);
655db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
65615ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca0");
6572616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
6582616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 11),
65915ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
66063ceb818SCédric Le Goater     /* Bus 11: TODO ucd90160@64 */
66162c2c2ebSCédric Le Goater }
66262c2c2ebSCédric Le Goater 
66395f068c8SJohn Wang static void g220a_bmc_i2c_init(AspeedMachineState *bmc)
66495f068c8SJohn Wang {
66595f068c8SJohn Wang     AspeedSoCState *soc = &bmc->soc;
66695f068c8SJohn Wang     DeviceState *dev;
66795f068c8SJohn Wang 
66895f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3),
66995f068c8SJohn Wang                                          "emc1413", 0x4c));
67095f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
67195f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
67295f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
67395f068c8SJohn Wang 
67495f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12),
67595f068c8SJohn Wang                                          "emc1413", 0x4c));
67695f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
67795f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
67895f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
67995f068c8SJohn Wang 
68095f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13),
68195f068c8SJohn Wang                                          "emc1413", 0x4c));
68295f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
68395f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
68495f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
6856f5f6507SJohn Wang 
6866f5f6507SJohn Wang     static uint8_t eeprom_buf[2 * 1024] = {
6876f5f6507SJohn Wang             0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe,
6886f5f6507SJohn Wang             0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65,
6896f5f6507SJohn Wang             0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32,
6906f5f6507SJohn Wang             0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42,
6916f5f6507SJohn Wang             0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45,
6926f5f6507SJohn Wang             0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1,
6936f5f6507SJohn Wang             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7,
6946f5f6507SJohn Wang     };
6956f5f6507SJohn Wang     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57,
6966f5f6507SJohn Wang                           eeprom_buf);
69795f068c8SJohn Wang }
69895f068c8SJohn Wang 
69982b6a3f6SJohn Wang static void fp5280g2_bmc_i2c_init(AspeedMachineState *bmc)
70082b6a3f6SJohn Wang {
70182b6a3f6SJohn Wang     AspeedSoCState *soc = &bmc->soc;
70282b6a3f6SJohn Wang     I2CSlave *i2c_mux;
70382b6a3f6SJohn Wang 
70482b6a3f6SJohn Wang     /* The at24c256 */
70582b6a3f6SJohn Wang     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 1), 0x50, 32768);
70682b6a3f6SJohn Wang 
70782b6a3f6SJohn Wang     /* The fp5280g2 expects a TMP112 but a TMP105 is compatible */
70882b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
70982b6a3f6SJohn Wang                      0x48);
71082b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
71182b6a3f6SJohn Wang                      0x49);
71282b6a3f6SJohn Wang 
71382b6a3f6SJohn Wang     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
71482b6a3f6SJohn Wang                      "pca9546", 0x70);
71582b6a3f6SJohn Wang     /* It expects a TMP112 but a TMP105 is compatible */
71682b6a3f6SJohn Wang     i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0), TYPE_TMP105,
71782b6a3f6SJohn Wang                      0x4a);
71882b6a3f6SJohn Wang 
71982b6a3f6SJohn Wang     /* It expects a ds3232 but a ds1338 is good enough */
72082b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "ds1338", 0x68);
72182b6a3f6SJohn Wang 
72282b6a3f6SJohn Wang     /* It expects a pca9555 but a pca9552 is compatible */
723f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x30);
72482b6a3f6SJohn Wang }
72582b6a3f6SJohn Wang 
72658e52bdbSCédric Le Goater static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
72758e52bdbSCédric Le Goater {
72858e52bdbSCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
729fa6d98c0SJoel Stanley     I2CSlave *i2c_mux;
730fa6d98c0SJoel Stanley 
7319077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB);
73258e52bdbSCédric Le Goater 
733f4aec252SCédric Le Goater     create_pca9552(soc, 3, 0x61);
734bcb122f8SJoel Stanley 
73558e52bdbSCédric Le Goater     /* The rainier expects a TMP275 but a TMP105 is compatible */
73658e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
73758e52bdbSCédric Le Goater                      0x48);
73858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
73958e52bdbSCédric Le Goater                      0x49);
74058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
74158e52bdbSCédric Le Goater                      0x4a);
742fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4),
743fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
7449077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
7459077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
7469077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB);
747f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x60);
74858e52bdbSCédric Le Goater 
74958e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
75058e52bdbSCédric Le Goater                      0x48);
75158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
75258e52bdbSCédric Le Goater                      0x49);
753f4aec252SCédric Le Goater     create_pca9552(soc, 5, 0x60);
754f4aec252SCédric Le Goater     create_pca9552(soc, 5, 0x61);
755fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5),
756fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
7579077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
7589077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
75958e52bdbSCédric Le Goater 
76058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
76158e52bdbSCédric Le Goater                      0x48);
76258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
76358e52bdbSCédric Le Goater                      0x4a);
76458e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
76558e52bdbSCédric Le Goater                      0x4b);
766fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6),
767fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
7689077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
7699077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
7709077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB);
7719077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB);
77258e52bdbSCédric Le Goater 
773f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x30);
774f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x31);
775f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x32);
776f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x33);
777f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x60);
778f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x61);
779b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76);
78058e52bdbSCédric Le Goater     /* Bus 7: TODO si7021-a20@20 */
78158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105,
78258e52bdbSCédric Le Goater                      0x48);
7832a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "max31785", 0x52);
7849077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB);
7859077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB);
78658e52bdbSCédric Le Goater 
78758e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
78858e52bdbSCédric Le Goater                      0x48);
78958e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
79058e52bdbSCédric Le Goater                      0x4a);
7919077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50, 64 * KiB);
7929077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 64 * KiB);
793f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x60);
794f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x61);
79558e52bdbSCédric Le Goater     /* Bus 8: ucd90320@11 */
79658e52bdbSCédric Le Goater     /* Bus 8: ucd90320@b */
79758e52bdbSCédric Le Goater     /* Bus 8: ucd90320@c */
79858e52bdbSCédric Le Goater 
79958e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c);
80058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d);
8019077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB);
80258e52bdbSCédric Le Goater 
80358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c);
80458e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d);
8059077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB);
80658e52bdbSCédric Le Goater 
80758e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
80858e52bdbSCédric Le Goater                      0x48);
80958e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
81058e52bdbSCédric Le Goater                      0x49);
811fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11),
812fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
8139077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
8149077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
815f4aec252SCédric Le Goater     create_pca9552(soc, 11, 0x60);
816fa6d98c0SJoel Stanley 
817fa6d98c0SJoel Stanley 
8189077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB);
819f4aec252SCédric Le Goater     create_pca9552(soc, 13, 0x60);
820fa6d98c0SJoel Stanley 
8219077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB);
822f4aec252SCédric Le Goater     create_pca9552(soc, 14, 0x60);
823fa6d98c0SJoel Stanley 
8249077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB);
825f4aec252SCédric Le Goater     create_pca9552(soc, 15, 0x60);
82658e52bdbSCédric Le Goater }
82758e52bdbSCédric Le Goater 
828febbe308SPeter Delevoryas static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr,
829febbe308SPeter Delevoryas                                  I2CBus **channels)
830febbe308SPeter Delevoryas {
831febbe308SPeter Delevoryas     I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr);
832febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
833febbe308SPeter Delevoryas         channels[i] = pca954x_i2c_get_bus(mux, i);
834febbe308SPeter Delevoryas     }
835febbe308SPeter Delevoryas }
836febbe308SPeter Delevoryas 
837febbe308SPeter Delevoryas #define TYPE_LM75 TYPE_TMP105
838febbe308SPeter Delevoryas #define TYPE_TMP75 TYPE_TMP105
839febbe308SPeter Delevoryas #define TYPE_TMP422 "tmp422"
840febbe308SPeter Delevoryas 
841febbe308SPeter Delevoryas static void fuji_bmc_i2c_init(AspeedMachineState *bmc)
842febbe308SPeter Delevoryas {
843febbe308SPeter Delevoryas     AspeedSoCState *soc = &bmc->soc;
844febbe308SPeter Delevoryas     I2CBus *i2c[144] = {};
845febbe308SPeter Delevoryas 
846febbe308SPeter Delevoryas     for (int i = 0; i < 16; i++) {
847febbe308SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
848febbe308SPeter Delevoryas     }
849febbe308SPeter Delevoryas     I2CBus *i2c180 = i2c[2];
850febbe308SPeter Delevoryas     I2CBus *i2c480 = i2c[8];
851febbe308SPeter Delevoryas     I2CBus *i2c600 = i2c[11];
852febbe308SPeter Delevoryas 
853febbe308SPeter Delevoryas     get_pca9548_channels(i2c180, 0x70, &i2c[16]);
854febbe308SPeter Delevoryas     get_pca9548_channels(i2c480, 0x70, &i2c[24]);
855febbe308SPeter Delevoryas     /* NOTE: The device tree skips [32, 40) in the alias numbering */
856febbe308SPeter Delevoryas     get_pca9548_channels(i2c600, 0x77, &i2c[40]);
857febbe308SPeter Delevoryas     get_pca9548_channels(i2c[24], 0x71, &i2c[48]);
858febbe308SPeter Delevoryas     get_pca9548_channels(i2c[25], 0x72, &i2c[56]);
859febbe308SPeter Delevoryas     get_pca9548_channels(i2c[26], 0x76, &i2c[64]);
860febbe308SPeter Delevoryas     get_pca9548_channels(i2c[27], 0x76, &i2c[72]);
861febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
862febbe308SPeter Delevoryas         get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]);
863febbe308SPeter Delevoryas     }
864febbe308SPeter Delevoryas 
865febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c);
866febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d);
867febbe308SPeter Delevoryas 
868ef0eb67eSSittisak Sinprem     /*
869ef0eb67eSSittisak Sinprem      * EEPROM 24c64 size is 64Kbits or 8 Kbytes
870ef0eb67eSSittisak Sinprem      *        24c02 size is 2Kbits or 256 bytes
871ef0eb67eSSittisak Sinprem      */
872ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[19], 0x52, 8 * KiB);
873ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[20], 0x50, 256);
874ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[22], 0x52, 256);
875febbe308SPeter Delevoryas 
876febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x48);
877febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x49);
878febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x4a);
879febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_TMP422, 0x4c);
880febbe308SPeter Delevoryas 
881ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[8], 0x51, 8 * KiB);
882febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a);
883febbe308SPeter Delevoryas 
884febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[50], TYPE_LM75, 0x4c);
885ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[50], 0x52, 8 * KiB);
886febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[51], TYPE_TMP75, 0x48);
887febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[52], TYPE_TMP75, 0x49);
888febbe308SPeter Delevoryas 
889febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[59], TYPE_TMP75, 0x48);
890febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[60], TYPE_TMP75, 0x49);
891febbe308SPeter Delevoryas 
892ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[65], 0x53, 8 * KiB);
893febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x49);
894febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x48);
895ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[68], 0x52, 8 * KiB);
896ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[69], 0x52, 8 * KiB);
897ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[70], 0x52, 8 * KiB);
898ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[71], 0x52, 8 * KiB);
899febbe308SPeter Delevoryas 
900ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[73], 0x53, 8 * KiB);
901febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x49);
902febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x48);
903ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[76], 0x52, 8 * KiB);
904ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[77], 0x52, 8 * KiB);
905ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[78], 0x52, 8 * KiB);
906ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[79], 0x52, 8 * KiB);
907ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[28], 0x50, 256);
908febbe308SPeter Delevoryas 
909febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
9109077e09aSPeter Delevoryas         at24c_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB);
911febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[82 + i * 8], TYPE_TMP75, 0x48);
912febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[83 + i * 8], TYPE_TMP75, 0x4b);
913febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[84 + i * 8], TYPE_TMP75, 0x4a);
914febbe308SPeter Delevoryas     }
915febbe308SPeter Delevoryas }
916febbe308SPeter Delevoryas 
917a20c54b1SPatrick Williams #define TYPE_TMP421 "tmp421"
918a20c54b1SPatrick Williams 
919a20c54b1SPatrick Williams static void bletchley_bmc_i2c_init(AspeedMachineState *bmc)
920a20c54b1SPatrick Williams {
921a20c54b1SPatrick Williams     AspeedSoCState *soc = &bmc->soc;
922a20c54b1SPatrick Williams     I2CBus *i2c[13] = {};
923a20c54b1SPatrick Williams     for (int i = 0; i < 13; i++) {
924a20c54b1SPatrick Williams         if ((i == 8) || (i == 11)) {
925a20c54b1SPatrick Williams             continue;
926a20c54b1SPatrick Williams         }
927a20c54b1SPatrick Williams         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
928a20c54b1SPatrick Williams     }
929a20c54b1SPatrick Williams 
930a20c54b1SPatrick Williams     /* Bus 0 - 5 all have the same config. */
931a20c54b1SPatrick Williams     for (int i = 0; i < 6; i++) {
932a20c54b1SPatrick Williams         /* Missing model: ti,ina230 @ 0x45 */
933a20c54b1SPatrick Williams         /* Missing model: mps,mp5023 @ 0x40 */
934a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_TMP421, 0x4f);
935a20c54b1SPatrick Williams         /* Missing model: nxp,pca9539 @ 0x76, but PCA9552 works enough */
936a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x76);
937a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x67);
938a20c54b1SPatrick Williams         /* Missing model: fsc,fusb302 @ 0x22 */
939a20c54b1SPatrick Williams     }
940a20c54b1SPatrick Williams 
941a20c54b1SPatrick Williams     /* Bus 6 */
942a20c54b1SPatrick Williams     at24c_eeprom_init(i2c[6], 0x56, 65536);
943a20c54b1SPatrick Williams     /* Missing model: nxp,pcf85263 @ 0x51 , but ds1338 works enough */
944a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[6], "ds1338", 0x51);
945a20c54b1SPatrick Williams 
946a20c54b1SPatrick Williams 
947a20c54b1SPatrick Williams     /* Bus 7 */
948a20c54b1SPatrick Williams     at24c_eeprom_init(i2c[7], 0x54, 65536);
949a20c54b1SPatrick Williams 
950a20c54b1SPatrick Williams     /* Bus 9 */
951a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[9], TYPE_TMP421, 0x4f);
952a20c54b1SPatrick Williams 
953a20c54b1SPatrick Williams     /* Bus 10 */
954a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[10], TYPE_TMP421, 0x4f);
955a20c54b1SPatrick Williams     /* Missing model: ti,hdc1080 @ 0x40 */
956a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[10], TYPE_PCA9552, 0x67);
957a20c54b1SPatrick Williams 
958a20c54b1SPatrick Williams     /* Bus 12 */
959a20c54b1SPatrick Williams     /* Missing model: adi,adm1278 @ 0x11 */
960a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4c);
961a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4d);
962a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_PCA9552, 0x67);
963a20c54b1SPatrick Williams }
964a20c54b1SPatrick Williams 
965fa699e80SPeter Delevoryas static void fby35_i2c_init(AspeedMachineState *bmc)
966fa699e80SPeter Delevoryas {
967fa699e80SPeter Delevoryas     AspeedSoCState *soc = &bmc->soc;
968fa699e80SPeter Delevoryas     I2CBus *i2c[16];
969fa699e80SPeter Delevoryas 
970fa699e80SPeter Delevoryas     for (int i = 0; i < 16; i++) {
971fa699e80SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
972fa699e80SPeter Delevoryas     }
973fa699e80SPeter Delevoryas 
974fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[2], TYPE_LM75, 0x4f);
975fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_TMP421, 0x1f);
976fa699e80SPeter Delevoryas     /* Hotswap controller is actually supposed to be mp5920 or ltc4282. */
977fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[11], "adm1272", 0x44);
978fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4e);
979fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4f);
980fa699e80SPeter Delevoryas 
9819077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[4], 0x51, 128 * KiB);
9829077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[6], 0x51, 128 * KiB);
983c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[8], 0x50, 32 * KiB, fby35_nic_fruid,
984c0216b94SPeter Delevoryas                           fby35_nic_fruid_len);
985c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[11], 0x51, 128 * KiB, fby35_bb_fruid,
986c0216b94SPeter Delevoryas                           fby35_bb_fruid_len);
987c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[11], 0x54, 128 * KiB, fby35_bmc_fruid,
988c0216b94SPeter Delevoryas                           fby35_bmc_fruid_len);
989fa699e80SPeter Delevoryas 
990fa699e80SPeter Delevoryas     /*
991fa699e80SPeter Delevoryas      * TODO: There is a multi-master i2c connection to an AST1030 MiniBMC on
992fa699e80SPeter Delevoryas      * buses 0, 1, 2, 3, and 9. Source address 0x10, target address 0x20 on
993fa699e80SPeter Delevoryas      * each.
994fa699e80SPeter Delevoryas      */
995fa699e80SPeter Delevoryas }
996fa699e80SPeter Delevoryas 
997fb6b3c8dSJae Hyun Yoo static void qcom_dc_scm_bmc_i2c_init(AspeedMachineState *bmc)
998fb6b3c8dSJae Hyun Yoo {
999fb6b3c8dSJae Hyun Yoo     AspeedSoCState *soc = &bmc->soc;
1000fb6b3c8dSJae Hyun Yoo 
1001fb6b3c8dSJae Hyun Yoo     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 15), "tmp105", 0x4d);
1002fb6b3c8dSJae Hyun Yoo }
1003fb6b3c8dSJae Hyun Yoo 
1004ece4cccdSGraeme Gregory static void qcom_dc_scm_firework_i2c_init(AspeedMachineState *bmc)
1005ece4cccdSGraeme Gregory {
1006ece4cccdSGraeme Gregory     AspeedSoCState *soc = &bmc->soc;
10072a7a5d5cSJae Hyun Yoo     I2CSlave *therm_mux, *cpuvr_mux;
1008ece4cccdSGraeme Gregory 
1009ece4cccdSGraeme Gregory     /* Create the generic DC-SCM hardware */
1010ece4cccdSGraeme Gregory     qcom_dc_scm_bmc_i2c_init(bmc);
1011ece4cccdSGraeme Gregory 
1012ece4cccdSGraeme Gregory     /* Now create the Firework specific hardware */
10132a75e8c3SMaheswara Kurapati 
10142a7a5d5cSJae Hyun Yoo     /* I2C7 CPUVR MUX */
10152a7a5d5cSJae Hyun Yoo     cpuvr_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
10162a7a5d5cSJae Hyun Yoo                                         "pca9546", 0x70);
10172a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 0), "pca9548", 0x72);
10182a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 1), "pca9548", 0x72);
10192a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 2), "pca9548", 0x72);
10202a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 3), "pca9548", 0x72);
10212a7a5d5cSJae Hyun Yoo 
1022cfc68f16SMaheswara Kurapati     /* I2C8 Thermal Diodes*/
1023cfc68f16SMaheswara Kurapati     therm_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
1024cfc68f16SMaheswara Kurapati                                         "pca9548", 0x70);
1025cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 0), TYPE_LM75, 0x4C);
1026cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 1), TYPE_LM75, 0x4C);
1027cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 2), TYPE_LM75, 0x48);
1028cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 3), TYPE_LM75, 0x48);
1029cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 4), TYPE_LM75, 0x48);
1030cfc68f16SMaheswara Kurapati 
10312a75e8c3SMaheswara Kurapati     /* I2C9 Fan Controller (MAX31785) */
10322a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x52);
10332a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x54);
1034ece4cccdSGraeme Gregory }
1035ece4cccdSGraeme Gregory 
10361a15311aSCédric Le Goater static bool aspeed_get_mmio_exec(Object *obj, Error **errp)
10371a15311aSCédric Le Goater {
10381a15311aSCédric Le Goater     return ASPEED_MACHINE(obj)->mmio_exec;
10391a15311aSCédric Le Goater }
10401a15311aSCédric Le Goater 
10411a15311aSCédric Le Goater static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp)
10421a15311aSCédric Le Goater {
10431a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = value;
10441a15311aSCédric Le Goater }
10451a15311aSCédric Le Goater 
10461a15311aSCédric Le Goater static void aspeed_machine_instance_init(Object *obj)
10471a15311aSCédric Le Goater {
10481a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = false;
10491a15311aSCédric Le Goater }
10501a15311aSCédric Le Goater 
10519820e52fSCédric Le Goater static char *aspeed_get_fmc_model(Object *obj, Error **errp)
10529820e52fSCédric Le Goater {
10539820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10549820e52fSCédric Le Goater     return g_strdup(bmc->fmc_model);
10559820e52fSCédric Le Goater }
10569820e52fSCédric Le Goater 
10579820e52fSCédric Le Goater static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp)
10589820e52fSCédric Le Goater {
10599820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10609820e52fSCédric Le Goater 
10619820e52fSCédric Le Goater     g_free(bmc->fmc_model);
10629820e52fSCédric Le Goater     bmc->fmc_model = g_strdup(value);
10639820e52fSCédric Le Goater }
10649820e52fSCédric Le Goater 
10659820e52fSCédric Le Goater static char *aspeed_get_spi_model(Object *obj, Error **errp)
10669820e52fSCédric Le Goater {
10679820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10689820e52fSCédric Le Goater     return g_strdup(bmc->spi_model);
10699820e52fSCédric Le Goater }
10709820e52fSCédric Le Goater 
10719820e52fSCédric Le Goater static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp)
10729820e52fSCédric Le Goater {
10739820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10749820e52fSCédric Le Goater 
10759820e52fSCédric Le Goater     g_free(bmc->spi_model);
10769820e52fSCédric Le Goater     bmc->spi_model = g_strdup(value);
10779820e52fSCédric Le Goater }
10789820e52fSCédric Le Goater 
10791a15311aSCédric Le Goater static void aspeed_machine_class_props_init(ObjectClass *oc)
10801a15311aSCédric Le Goater {
10811a15311aSCédric Le Goater     object_class_property_add_bool(oc, "execute-in-place",
10821a15311aSCédric Le Goater                                    aspeed_get_mmio_exec,
1083d2623129SMarkus Armbruster                                    aspeed_set_mmio_exec);
10841a15311aSCédric Le Goater     object_class_property_set_description(oc, "execute-in-place",
10857eecec7dSMarkus Armbruster                            "boot directly from CE0 flash device");
10869820e52fSCédric Le Goater 
10879820e52fSCédric Le Goater     object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model,
10889820e52fSCédric Le Goater                                    aspeed_set_fmc_model);
10899820e52fSCédric Le Goater     object_class_property_set_description(oc, "fmc-model",
10909820e52fSCédric Le Goater                                           "Change the FMC Flash model");
10919820e52fSCédric Le Goater     object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model,
10929820e52fSCédric Le Goater                                    aspeed_set_spi_model);
10939820e52fSCédric Le Goater     object_class_property_set_description(oc, "spi-model",
10949820e52fSCédric Le Goater                                           "Change the SPI Flash model");
10951a15311aSCédric Le Goater }
10961a15311aSCédric Le Goater 
1097b7f1a0cbSCédric Le Goater static int aspeed_soc_num_cpus(const char *soc_name)
1098b7f1a0cbSCédric Le Goater {
1099b7f1a0cbSCédric Le Goater    AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(soc_name));
1100b7f1a0cbSCédric Le Goater    return sc->num_cpus;
1101b7f1a0cbSCédric Le Goater }
1102b7f1a0cbSCédric Le Goater 
1103fca9ca1bSCédric Le Goater static void aspeed_machine_class_init(ObjectClass *oc, void *data)
110462c2c2ebSCédric Le Goater {
110562c2c2ebSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1106d3bad7e7SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
110762c2c2ebSCédric Le Goater 
1108fca9ca1bSCédric Le Goater     mc->init = aspeed_machine_init;
110962c2c2ebSCédric Le Goater     mc->no_floppy = 1;
111062c2c2ebSCédric Le Goater     mc->no_cdrom = 1;
111162c2c2ebSCédric Le Goater     mc->no_parallel = 1;
1112afcbaed6SIgor Mammedov     mc->default_ram_id = "ram";
1113d3bad7e7SCédric Le Goater     amc->macs_mask = ASPEED_MAC0_ON;
11145d63d0c7SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART5;
11151a15311aSCédric Le Goater 
11161a15311aSCédric Le Goater     aspeed_machine_class_props_init(oc);
111762c2c2ebSCédric Le Goater }
111862c2c2ebSCédric Le Goater 
1119baa4732bSCédric Le Goater static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
1120baa4732bSCédric Le Goater {
1121baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1122baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1123baa4732bSCédric Le Goater 
1124baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Palmetto BMC (ARM926EJ-S)";
1125baa4732bSCédric Le Goater     amc->soc_name  = "ast2400-a1";
1126baa4732bSCédric Le Goater     amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1;
1127baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
112870322913SCédric Le Goater     amc->spi_model = "mx25l25635f";
1129baa4732bSCédric Le Goater     amc->num_cs    = 1;
1130baa4732bSCédric Le Goater     amc->i2c_init  = palmetto_bmc_i2c_init;
1131baa4732bSCédric Le Goater     mc->default_ram_size       = 256 * MiB;
1132b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1133b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1134baa4732bSCédric Le Goater };
1135baa4732bSCédric Le Goater 
11369cccb912SPatrick Venture static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data)
11379cccb912SPatrick Venture {
11389cccb912SPatrick Venture     MachineClass *mc = MACHINE_CLASS(oc);
11399cccb912SPatrick Venture     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
11409cccb912SPatrick Venture 
11419cccb912SPatrick Venture     mc->desc       = "Quanta-Q71l BMC (ARM926EJ-S)";
11429cccb912SPatrick Venture     amc->soc_name  = "ast2400-a1";
11439cccb912SPatrick Venture     amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1;
11449cccb912SPatrick Venture     amc->fmc_model = "n25q256a";
11459cccb912SPatrick Venture     amc->spi_model = "mx25l25635e";
11469cccb912SPatrick Venture     amc->num_cs    = 1;
11479cccb912SPatrick Venture     amc->i2c_init  = quanta_q71l_bmc_i2c_init;
11489cccb912SPatrick Venture     mc->default_ram_size       = 128 * MiB;
11499cccb912SPatrick Venture     mc->default_cpus = mc->min_cpus = mc->max_cpus =
11509cccb912SPatrick Venture         aspeed_soc_num_cpus(amc->soc_name);
11519cccb912SPatrick Venture }
11529cccb912SPatrick Venture 
115340a38df5SErik Smit static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc,
115440a38df5SErik Smit                                                         void *data)
115540a38df5SErik Smit {
115640a38df5SErik Smit     MachineClass *mc = MACHINE_CLASS(oc);
115740a38df5SErik Smit     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
115840a38df5SErik Smit 
115940a38df5SErik Smit     mc->desc       = "Supermicro X11 BMC (ARM926EJ-S)";
116040a38df5SErik Smit     amc->soc_name  = "ast2400-a1";
116140a38df5SErik Smit     amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1;
116240a38df5SErik Smit     amc->fmc_model = "mx25l25635e";
116340a38df5SErik Smit     amc->spi_model = "mx25l25635e";
116440a38df5SErik Smit     amc->num_cs    = 1;
116540a38df5SErik Smit     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
116640a38df5SErik Smit     amc->i2c_init  = palmetto_bmc_i2c_init;
116740a38df5SErik Smit     mc->default_ram_size = 256 * MiB;
116840a38df5SErik Smit }
116940a38df5SErik Smit 
117047936597SGuenter Roeck static void aspeed_machine_supermicro_x11spi_bmc_class_init(ObjectClass *oc,
117147936597SGuenter Roeck                                                             void *data)
117247936597SGuenter Roeck {
117347936597SGuenter Roeck     MachineClass *mc = MACHINE_CLASS(oc);
117447936597SGuenter Roeck     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
117547936597SGuenter Roeck 
117647936597SGuenter Roeck     mc->desc       = "Supermicro X11 SPI BMC (ARM1176)";
117747936597SGuenter Roeck     amc->soc_name  = "ast2500-a1";
117847936597SGuenter Roeck     amc->hw_strap1 = SUPERMICRO_X11SPI_BMC_HW_STRAP1;
117947936597SGuenter Roeck     amc->fmc_model = "mx25l25635e";
118047936597SGuenter Roeck     amc->spi_model = "mx25l25635e";
118147936597SGuenter Roeck     amc->num_cs    = 1;
118247936597SGuenter Roeck     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
118347936597SGuenter Roeck     amc->i2c_init  = palmetto_bmc_i2c_init;
118447936597SGuenter Roeck     mc->default_ram_size = 512 * MiB;
118547936597SGuenter Roeck     mc->default_cpus = mc->min_cpus = mc->max_cpus =
118647936597SGuenter Roeck         aspeed_soc_num_cpus(amc->soc_name);
118747936597SGuenter Roeck }
118847936597SGuenter Roeck 
1189baa4732bSCédric Le Goater static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data)
1190baa4732bSCédric Le Goater {
1191baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1192baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1193baa4732bSCédric Le Goater 
1194baa4732bSCédric Le Goater     mc->desc       = "Aspeed AST2500 EVB (ARM1176)";
1195baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1196baa4732bSCédric Le Goater     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
1197753abfc4SJae Hyun Yoo     amc->fmc_model = "mx25l25635e";
119870322913SCédric Le Goater     amc->spi_model = "mx25l25635f";
1199baa4732bSCédric Le Goater     amc->num_cs    = 1;
1200baa4732bSCédric Le Goater     amc->i2c_init  = ast2500_evb_i2c_init;
1201baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
1202b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1203b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1204baa4732bSCédric Le Goater };
1205baa4732bSCédric Le Goater 
120634f73a81SKarthikeyan Pasupathi static void aspeed_machine_yosemitev2_class_init(ObjectClass *oc, void *data)
120734f73a81SKarthikeyan Pasupathi {
120834f73a81SKarthikeyan Pasupathi     MachineClass *mc = MACHINE_CLASS(oc);
120934f73a81SKarthikeyan Pasupathi     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
121034f73a81SKarthikeyan Pasupathi 
121134f73a81SKarthikeyan Pasupathi     mc->desc       = "Facebook YosemiteV2 BMC (ARM1176)";
121234f73a81SKarthikeyan Pasupathi     amc->soc_name  = "ast2500-a1";
121334f73a81SKarthikeyan Pasupathi     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
121434f73a81SKarthikeyan Pasupathi     amc->hw_strap2 = 0;
121534f73a81SKarthikeyan Pasupathi     amc->fmc_model = "n25q256a";
121634f73a81SKarthikeyan Pasupathi     amc->spi_model = "mx25l25635e";
121734f73a81SKarthikeyan Pasupathi     amc->num_cs    = 2;
121834f73a81SKarthikeyan Pasupathi     amc->i2c_init  = yosemitev2_bmc_i2c_init;
121934f73a81SKarthikeyan Pasupathi     mc->default_ram_size       = 512 * MiB;
122034f73a81SKarthikeyan Pasupathi     mc->default_cpus = mc->min_cpus = mc->max_cpus =
122134f73a81SKarthikeyan Pasupathi         aspeed_soc_num_cpus(amc->soc_name);
122234f73a81SKarthikeyan Pasupathi };
122334f73a81SKarthikeyan Pasupathi 
1224baa4732bSCédric Le Goater static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data)
1225baa4732bSCédric Le Goater {
1226baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1227baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1228baa4732bSCédric Le Goater 
1229baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Romulus BMC (ARM1176)";
1230baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1231baa4732bSCédric Le Goater     amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1;
1232baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
1233baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1234baa4732bSCédric Le Goater     amc->num_cs    = 2;
1235baa4732bSCédric Le Goater     amc->i2c_init  = romulus_bmc_i2c_init;
1236baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
1237b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1238b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1239baa4732bSCédric Le Goater };
1240baa4732bSCédric Le Goater 
12416c323abaSKarthikeyan Pasupathi static void aspeed_machine_tiogapass_class_init(ObjectClass *oc, void *data)
12426c323abaSKarthikeyan Pasupathi {
12436c323abaSKarthikeyan Pasupathi     MachineClass *mc = MACHINE_CLASS(oc);
12446c323abaSKarthikeyan Pasupathi     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
12456c323abaSKarthikeyan Pasupathi 
12466c323abaSKarthikeyan Pasupathi     mc->desc       = "Facebook Tiogapass BMC (ARM1176)";
12476c323abaSKarthikeyan Pasupathi     amc->soc_name  = "ast2500-a1";
12486c323abaSKarthikeyan Pasupathi     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
12496c323abaSKarthikeyan Pasupathi     amc->hw_strap2 = 0;
12506c323abaSKarthikeyan Pasupathi     amc->fmc_model = "n25q256a";
12516c323abaSKarthikeyan Pasupathi     amc->spi_model = "mx25l25635e";
12526c323abaSKarthikeyan Pasupathi     amc->num_cs    = 2;
12536c323abaSKarthikeyan Pasupathi     amc->i2c_init  = tiogapass_bmc_i2c_init;
12546c323abaSKarthikeyan Pasupathi     mc->default_ram_size       = 1 * GiB;
12556c323abaSKarthikeyan Pasupathi     mc->default_cpus = mc->min_cpus = mc->max_cpus =
12566c323abaSKarthikeyan Pasupathi         aspeed_soc_num_cpus(amc->soc_name);
12576c323abaSKarthikeyan Pasupathi         aspeed_soc_num_cpus(amc->soc_name);
12586c323abaSKarthikeyan Pasupathi };
12596c323abaSKarthikeyan Pasupathi 
1260143b040fSPatrick Williams static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data)
1261143b040fSPatrick Williams {
1262143b040fSPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1263143b040fSPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1264143b040fSPatrick Williams 
1265143b040fSPatrick Williams     mc->desc       = "OCP SonoraPass BMC (ARM1176)";
1266143b040fSPatrick Williams     amc->soc_name  = "ast2500-a1";
1267143b040fSPatrick Williams     amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1;
1268143b040fSPatrick Williams     amc->fmc_model = "mx66l1g45g";
1269143b040fSPatrick Williams     amc->spi_model = "mx66l1g45g";
1270143b040fSPatrick Williams     amc->num_cs    = 2;
1271143b040fSPatrick Williams     amc->i2c_init  = sonorapass_bmc_i2c_init;
1272143b040fSPatrick Williams     mc->default_ram_size       = 512 * MiB;
1273b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1274b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1275143b040fSPatrick Williams };
1276143b040fSPatrick Williams 
1277baa4732bSCédric Le Goater static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data)
1278baa4732bSCédric Le Goater {
1279baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1280baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1281baa4732bSCédric Le Goater 
1282baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Witherspoon BMC (ARM1176)";
1283baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1284baa4732bSCédric Le Goater     amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1;
128570322913SCédric Le Goater     amc->fmc_model = "mx25l25635f";
1286baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1287baa4732bSCédric Le Goater     amc->num_cs    = 2;
1288baa4732bSCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init;
1289baa4732bSCédric Le Goater     mc->default_ram_size = 512 * MiB;
1290b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1291b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1292baa4732bSCédric Le Goater };
1293baa4732bSCédric Le Goater 
1294baa4732bSCédric Le Goater static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
1295baa4732bSCédric Le Goater {
1296baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1297baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1298baa4732bSCédric Le Goater 
1299f548f201SPeter Maydell     mc->desc       = "Aspeed AST2600 EVB (Cortex-A7)";
1300c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
1301baa4732bSCédric Le Goater     amc->hw_strap1 = AST2600_EVB_HW_STRAP1;
1302baa4732bSCédric Le Goater     amc->hw_strap2 = AST2600_EVB_HW_STRAP2;
1303753abfc4SJae Hyun Yoo     amc->fmc_model = "mx66u51235f";
1304baa4732bSCédric Le Goater     amc->spi_model = "mx66u51235f";
1305baa4732bSCédric Le Goater     amc->num_cs    = 1;
130629193286SGuenter Roeck     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON |
130729193286SGuenter Roeck                      ASPEED_MAC3_ON;
1308baa4732bSCédric Le Goater     amc->i2c_init  = ast2600_evb_i2c_init;
1309baa4732bSCédric Le Goater     mc->default_ram_size = 1 * GiB;
1310b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1311b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1312baa4732bSCédric Le Goater };
1313baa4732bSCédric Le Goater 
131463ceb818SCédric Le Goater static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data)
131563ceb818SCédric Le Goater {
131663ceb818SCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
131763ceb818SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
131863ceb818SCédric Le Goater 
1319f548f201SPeter Maydell     mc->desc       = "OpenPOWER Tacoma BMC (Cortex-A7)";
1320c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
132163ceb818SCédric Le Goater     amc->hw_strap1 = TACOMA_BMC_HW_STRAP1;
132263ceb818SCédric Le Goater     amc->hw_strap2 = TACOMA_BMC_HW_STRAP2;
132363ceb818SCédric Le Goater     amc->fmc_model = "mx66l1g45g";
132463ceb818SCédric Le Goater     amc->spi_model = "mx66l1g45g";
132563ceb818SCédric Le Goater     amc->num_cs    = 2;
1326d3bad7e7SCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON;
132763ceb818SCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init; /* Same board layout */
132863ceb818SCédric Le Goater     mc->default_ram_size = 1 * GiB;
1329b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1330b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
133163ceb818SCédric Le Goater };
133263ceb818SCédric Le Goater 
133395f068c8SJohn Wang static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data)
133495f068c8SJohn Wang {
133595f068c8SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
133695f068c8SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
133795f068c8SJohn Wang 
133895f068c8SJohn Wang     mc->desc       = "Bytedance G220A BMC (ARM1176)";
133995f068c8SJohn Wang     amc->soc_name  = "ast2500-a1";
134095f068c8SJohn Wang     amc->hw_strap1 = G220A_BMC_HW_STRAP1;
134195f068c8SJohn Wang     amc->fmc_model = "n25q512a";
134295f068c8SJohn Wang     amc->spi_model = "mx25l25635e";
134395f068c8SJohn Wang     amc->num_cs    = 2;
13445bb825c8SGuenter Roeck     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
134595f068c8SJohn Wang     amc->i2c_init  = g220a_bmc_i2c_init;
134695f068c8SJohn Wang     mc->default_ram_size = 1024 * MiB;
134795f068c8SJohn Wang     mc->default_cpus = mc->min_cpus = mc->max_cpus =
134895f068c8SJohn Wang         aspeed_soc_num_cpus(amc->soc_name);
134995f068c8SJohn Wang };
135095f068c8SJohn Wang 
135182b6a3f6SJohn Wang static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc, void *data)
135282b6a3f6SJohn Wang {
135382b6a3f6SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
135482b6a3f6SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
135582b6a3f6SJohn Wang 
135682b6a3f6SJohn Wang     mc->desc       = "Inspur FP5280G2 BMC (ARM1176)";
135782b6a3f6SJohn Wang     amc->soc_name  = "ast2500-a1";
135882b6a3f6SJohn Wang     amc->hw_strap1 = FP5280G2_BMC_HW_STRAP1;
135982b6a3f6SJohn Wang     amc->fmc_model = "n25q512a";
136082b6a3f6SJohn Wang     amc->spi_model = "mx25l25635e";
136182b6a3f6SJohn Wang     amc->num_cs    = 2;
136282b6a3f6SJohn Wang     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
136382b6a3f6SJohn Wang     amc->i2c_init  = fp5280g2_bmc_i2c_init;
136482b6a3f6SJohn Wang     mc->default_ram_size = 512 * MiB;
136582b6a3f6SJohn Wang     mc->default_cpus = mc->min_cpus = mc->max_cpus =
136682b6a3f6SJohn Wang         aspeed_soc_num_cpus(amc->soc_name);
136782b6a3f6SJohn Wang };
136882b6a3f6SJohn Wang 
136958e52bdbSCédric Le Goater static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data)
137058e52bdbSCédric Le Goater {
137158e52bdbSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
137258e52bdbSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
137358e52bdbSCédric Le Goater 
1374f548f201SPeter Maydell     mc->desc       = "IBM Rainier BMC (Cortex-A7)";
1375c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
137658e52bdbSCédric Le Goater     amc->hw_strap1 = RAINIER_BMC_HW_STRAP1;
137758e52bdbSCédric Le Goater     amc->hw_strap2 = RAINIER_BMC_HW_STRAP2;
137858e52bdbSCédric Le Goater     amc->fmc_model = "mx66l1g45g";
137958e52bdbSCédric Le Goater     amc->spi_model = "mx66l1g45g";
138058e52bdbSCédric Le Goater     amc->num_cs    = 2;
138158e52bdbSCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
138258e52bdbSCédric Le Goater     amc->i2c_init  = rainier_bmc_i2c_init;
138358e52bdbSCédric Le Goater     mc->default_ram_size = 1 * GiB;
138458e52bdbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
138558e52bdbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
138658e52bdbSCédric Le Goater };
138758e52bdbSCédric Le Goater 
1388febbe308SPeter Delevoryas /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */
1389febbe308SPeter Delevoryas #if HOST_LONG_BITS == 32
1390febbe308SPeter Delevoryas #define FUJI_BMC_RAM_SIZE (1 * GiB)
1391febbe308SPeter Delevoryas #else
1392febbe308SPeter Delevoryas #define FUJI_BMC_RAM_SIZE (2 * GiB)
1393febbe308SPeter Delevoryas #endif
1394febbe308SPeter Delevoryas 
1395febbe308SPeter Delevoryas static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data)
1396febbe308SPeter Delevoryas {
1397febbe308SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1398febbe308SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1399febbe308SPeter Delevoryas 
1400febbe308SPeter Delevoryas     mc->desc = "Facebook Fuji BMC (Cortex-A7)";
1401febbe308SPeter Delevoryas     amc->soc_name = "ast2600-a3";
1402febbe308SPeter Delevoryas     amc->hw_strap1 = FUJI_BMC_HW_STRAP1;
1403febbe308SPeter Delevoryas     amc->hw_strap2 = FUJI_BMC_HW_STRAP2;
1404febbe308SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1405febbe308SPeter Delevoryas     amc->spi_model = "mx66l1g45g";
1406febbe308SPeter Delevoryas     amc->num_cs = 2;
1407febbe308SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1408febbe308SPeter Delevoryas     amc->i2c_init = fuji_bmc_i2c_init;
1409febbe308SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART1;
1410febbe308SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
1411febbe308SPeter Delevoryas     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1412febbe308SPeter Delevoryas         aspeed_soc_num_cpus(amc->soc_name);
1413febbe308SPeter Delevoryas };
1414febbe308SPeter Delevoryas 
1415104bdaffSPatrick Williams /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */
1416104bdaffSPatrick Williams #if HOST_LONG_BITS == 32
1417104bdaffSPatrick Williams #define BLETCHLEY_BMC_RAM_SIZE (1 * GiB)
1418104bdaffSPatrick Williams #else
1419104bdaffSPatrick Williams #define BLETCHLEY_BMC_RAM_SIZE (2 * GiB)
1420104bdaffSPatrick Williams #endif
1421104bdaffSPatrick Williams 
1422a20c54b1SPatrick Williams static void aspeed_machine_bletchley_class_init(ObjectClass *oc, void *data)
1423a20c54b1SPatrick Williams {
1424a20c54b1SPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1425a20c54b1SPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1426a20c54b1SPatrick Williams 
1427a20c54b1SPatrick Williams     mc->desc       = "Facebook Bletchley BMC (Cortex-A7)";
1428a20c54b1SPatrick Williams     amc->soc_name  = "ast2600-a3";
1429a20c54b1SPatrick Williams     amc->hw_strap1 = BLETCHLEY_BMC_HW_STRAP1;
1430a20c54b1SPatrick Williams     amc->hw_strap2 = BLETCHLEY_BMC_HW_STRAP2;
1431a20c54b1SPatrick Williams     amc->fmc_model = "w25q01jvq";
1432a20c54b1SPatrick Williams     amc->spi_model = NULL;
1433a20c54b1SPatrick Williams     amc->num_cs    = 2;
1434a20c54b1SPatrick Williams     amc->macs_mask = ASPEED_MAC2_ON;
1435a20c54b1SPatrick Williams     amc->i2c_init  = bletchley_bmc_i2c_init;
1436104bdaffSPatrick Williams     mc->default_ram_size = BLETCHLEY_BMC_RAM_SIZE;
1437a20c54b1SPatrick Williams     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1438a20c54b1SPatrick Williams         aspeed_soc_num_cpus(amc->soc_name);
1439a20c54b1SPatrick Williams }
1440a20c54b1SPatrick Williams 
14417966d70fSJason A. Donenfeld static void fby35_reset(MachineState *state, ShutdownCause reason)
1442fa699e80SPeter Delevoryas {
1443fa699e80SPeter Delevoryas     AspeedMachineState *bmc = ASPEED_MACHINE(state);
1444fa699e80SPeter Delevoryas     AspeedGPIOState *gpio = &bmc->soc.gpio;
1445fa699e80SPeter Delevoryas 
14467966d70fSJason A. Donenfeld     qemu_devices_reset(reason);
1447fa699e80SPeter Delevoryas 
1448f0418558SPeter Delevoryas     /* Board ID: 7 (Class-1, 4 slots) */
1449fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV4", true, &error_fatal);
1450fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV5", true, &error_fatal);
1451fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV6", true, &error_fatal);
1452fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV7", false, &error_fatal);
1453f0418558SPeter Delevoryas 
1454f0418558SPeter Delevoryas     /* Slot presence pins, inverse polarity. (False means present) */
1455f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH4", false, &error_fatal);
1456f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH5", true, &error_fatal);
1457f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH6", true, &error_fatal);
1458f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH7", true, &error_fatal);
1459f0418558SPeter Delevoryas 
1460f0418558SPeter Delevoryas     /* Slot 12v power pins, normal polarity. (True means powered-on) */
1461f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB2", true, &error_fatal);
1462f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB3", false, &error_fatal);
1463f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB4", false, &error_fatal);
1464f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB5", false, &error_fatal);
1465fa699e80SPeter Delevoryas }
1466fa699e80SPeter Delevoryas 
1467fa699e80SPeter Delevoryas static void aspeed_machine_fby35_class_init(ObjectClass *oc, void *data)
1468fa699e80SPeter Delevoryas {
1469fa699e80SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1470fa699e80SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1471fa699e80SPeter Delevoryas 
1472fa699e80SPeter Delevoryas     mc->desc       = "Facebook fby35 BMC (Cortex-A7)";
1473fa699e80SPeter Delevoryas     mc->reset      = fby35_reset;
1474fa699e80SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1475fa699e80SPeter Delevoryas     amc->num_cs    = 2;
1476fa699e80SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1477fa699e80SPeter Delevoryas     amc->i2c_init  = fby35_i2c_init;
1478fa699e80SPeter Delevoryas     /* FIXME: Replace this macro with something more general */
1479fa699e80SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
1480fa699e80SPeter Delevoryas }
1481fa699e80SPeter Delevoryas 
148266c895b8SJamin Lin #define AST1030_INTERNAL_FLASH_SIZE (1024 * 1024)
148366c895b8SJamin Lin /* Main SYSCLK frequency in Hz (200MHz) */
148466c895b8SJamin Lin #define SYSCLK_FRQ 200000000ULL
148566c895b8SJamin Lin 
148666c895b8SJamin Lin static void aspeed_minibmc_machine_init(MachineState *machine)
148766c895b8SJamin Lin {
148866c895b8SJamin Lin     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
148966c895b8SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
149066c895b8SJamin Lin     Clock *sysclk;
149166c895b8SJamin Lin 
149266c895b8SJamin Lin     sysclk = clock_new(OBJECT(machine), "SYSCLK");
149366c895b8SJamin Lin     clock_set_hz(sysclk, SYSCLK_FRQ);
149466c895b8SJamin Lin 
149566c895b8SJamin Lin     object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
149666c895b8SJamin Lin     qdev_connect_clock_in(DEVICE(&bmc->soc), "sysclk", sysclk);
149766c895b8SJamin Lin 
14984dd9d554SPeter Delevoryas     object_property_set_link(OBJECT(&bmc->soc), "memory",
14994dd9d554SPeter Delevoryas                              OBJECT(get_system_memory()), &error_abort);
1500d2b3eaefSPeter Delevoryas     connect_serial_hds_to_uarts(bmc);
150166c895b8SJamin Lin     qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
150266c895b8SJamin Lin 
150366c895b8SJamin Lin     aspeed_board_init_flashes(&bmc->soc.fmc,
150466c895b8SJamin Lin                               bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
150566c895b8SJamin Lin                               amc->num_cs,
150666c895b8SJamin Lin                               0);
150766c895b8SJamin Lin 
150866c895b8SJamin Lin     aspeed_board_init_flashes(&bmc->soc.spi[0],
150966c895b8SJamin Lin                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
151066c895b8SJamin Lin                               amc->num_cs, amc->num_cs);
151166c895b8SJamin Lin 
151266c895b8SJamin Lin     aspeed_board_init_flashes(&bmc->soc.spi[1],
151366c895b8SJamin Lin                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
151466c895b8SJamin Lin                               amc->num_cs, (amc->num_cs * 2));
151566c895b8SJamin Lin 
151666c895b8SJamin Lin     if (amc->i2c_init) {
151766c895b8SJamin Lin         amc->i2c_init(bmc);
151866c895b8SJamin Lin     }
151966c895b8SJamin Lin 
152066c895b8SJamin Lin     armv7m_load_kernel(ARM_CPU(first_cpu),
152166c895b8SJamin Lin                        machine->kernel_filename,
1522761c532aSPeter Maydell                        0,
152366c895b8SJamin Lin                        AST1030_INTERNAL_FLASH_SIZE);
152466c895b8SJamin Lin }
152566c895b8SJamin Lin 
15264c70ab16STroy Lee static void ast1030_evb_i2c_init(AspeedMachineState *bmc)
15274c70ab16STroy Lee {
15284c70ab16STroy Lee     AspeedSoCState *soc = &bmc->soc;
15294c70ab16STroy Lee 
15304c70ab16STroy Lee     /* U10 24C08 connects to SDA/SCL Groupt 1 by default */
15314c70ab16STroy Lee     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
15324c70ab16STroy Lee     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, eeprom_buf);
15334c70ab16STroy Lee 
15344c70ab16STroy Lee     /* U11 LM75 connects to SDA/SCL Group 2 by default */
15354c70ab16STroy Lee     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d);
15364c70ab16STroy Lee }
15374c70ab16STroy Lee 
153866c895b8SJamin Lin static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc,
153966c895b8SJamin Lin                                                           void *data)
154066c895b8SJamin Lin {
154166c895b8SJamin Lin     MachineClass *mc = MACHINE_CLASS(oc);
154266c895b8SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
154366c895b8SJamin Lin 
154466c895b8SJamin Lin     mc->desc = "Aspeed AST1030 MiniBMC (Cortex-M4)";
154566c895b8SJamin Lin     amc->soc_name = "ast1030-a1";
154666c895b8SJamin Lin     amc->hw_strap1 = 0;
154766c895b8SJamin Lin     amc->hw_strap2 = 0;
154866c895b8SJamin Lin     mc->init = aspeed_minibmc_machine_init;
15494c70ab16STroy Lee     amc->i2c_init = ast1030_evb_i2c_init;
155066c895b8SJamin Lin     mc->default_ram_size = 0;
155166c895b8SJamin Lin     mc->default_cpus = mc->min_cpus = mc->max_cpus = 1;
155266c895b8SJamin Lin     amc->fmc_model = "sst25vf032b";
155366c895b8SJamin Lin     amc->spi_model = "sst25vf032b";
155466c895b8SJamin Lin     amc->num_cs = 2;
155566c895b8SJamin Lin     amc->macs_mask = 0;
155666c895b8SJamin Lin }
155766c895b8SJamin Lin 
1558fb6b3c8dSJae Hyun Yoo static void aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass *oc,
1559fb6b3c8dSJae Hyun Yoo                                                      void *data)
1560fb6b3c8dSJae Hyun Yoo {
1561fb6b3c8dSJae Hyun Yoo     MachineClass *mc = MACHINE_CLASS(oc);
1562fb6b3c8dSJae Hyun Yoo     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1563fb6b3c8dSJae Hyun Yoo 
1564fb6b3c8dSJae Hyun Yoo     mc->desc       = "Qualcomm DC-SCM V1 BMC (Cortex A7)";
1565fb6b3c8dSJae Hyun Yoo     amc->soc_name  = "ast2600-a3";
1566fb6b3c8dSJae Hyun Yoo     amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1567fb6b3c8dSJae Hyun Yoo     amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1568fb6b3c8dSJae Hyun Yoo     amc->fmc_model = "n25q512a";
1569fb6b3c8dSJae Hyun Yoo     amc->spi_model = "n25q512a";
1570fb6b3c8dSJae Hyun Yoo     amc->num_cs    = 2;
1571fb6b3c8dSJae Hyun Yoo     amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1572fb6b3c8dSJae Hyun Yoo     amc->i2c_init  = qcom_dc_scm_bmc_i2c_init;
1573fb6b3c8dSJae Hyun Yoo     mc->default_ram_size = 1 * GiB;
1574fb6b3c8dSJae Hyun Yoo     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1575fb6b3c8dSJae Hyun Yoo         aspeed_soc_num_cpus(amc->soc_name);
1576fb6b3c8dSJae Hyun Yoo };
1577fb6b3c8dSJae Hyun Yoo 
1578ece4cccdSGraeme Gregory static void aspeed_machine_qcom_firework_class_init(ObjectClass *oc,
1579ece4cccdSGraeme Gregory                                                     void *data)
1580ece4cccdSGraeme Gregory {
1581ece4cccdSGraeme Gregory     MachineClass *mc = MACHINE_CLASS(oc);
1582ece4cccdSGraeme Gregory     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1583ece4cccdSGraeme Gregory 
1584ece4cccdSGraeme Gregory     mc->desc       = "Qualcomm DC-SCM V1/Firework BMC (Cortex A7)";
1585ece4cccdSGraeme Gregory     amc->soc_name  = "ast2600-a3";
1586ece4cccdSGraeme Gregory     amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1587ece4cccdSGraeme Gregory     amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1588ece4cccdSGraeme Gregory     amc->fmc_model = "n25q512a";
1589ece4cccdSGraeme Gregory     amc->spi_model = "n25q512a";
1590ece4cccdSGraeme Gregory     amc->num_cs    = 2;
1591ece4cccdSGraeme Gregory     amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1592ece4cccdSGraeme Gregory     amc->i2c_init  = qcom_dc_scm_firework_i2c_init;
1593ece4cccdSGraeme Gregory     mc->default_ram_size = 1 * GiB;
1594ece4cccdSGraeme Gregory     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1595ece4cccdSGraeme Gregory         aspeed_soc_num_cpus(amc->soc_name);
1596ece4cccdSGraeme Gregory };
1597ece4cccdSGraeme Gregory 
1598baa4732bSCédric Le Goater static const TypeInfo aspeed_machine_types[] = {
1599baa4732bSCédric Le Goater     {
1600baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("palmetto-bmc"),
1601baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1602baa4732bSCédric Le Goater         .class_init    = aspeed_machine_palmetto_class_init,
1603baa4732bSCédric Le Goater     }, {
160440a38df5SErik Smit         .name          = MACHINE_TYPE_NAME("supermicrox11-bmc"),
160540a38df5SErik Smit         .parent        = TYPE_ASPEED_MACHINE,
160640a38df5SErik Smit         .class_init    = aspeed_machine_supermicrox11_bmc_class_init,
160740a38df5SErik Smit     }, {
160847936597SGuenter Roeck         .name          = MACHINE_TYPE_NAME("supermicro-x11spi-bmc"),
160947936597SGuenter Roeck         .parent        = TYPE_ASPEED_MACHINE,
161047936597SGuenter Roeck         .class_init    = aspeed_machine_supermicro_x11spi_bmc_class_init,
161147936597SGuenter Roeck     }, {
1612baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2500-evb"),
1613baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1614baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2500_evb_class_init,
1615baa4732bSCédric Le Goater     }, {
1616baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("romulus-bmc"),
1617baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1618baa4732bSCédric Le Goater         .class_init    = aspeed_machine_romulus_class_init,
1619baa4732bSCédric Le Goater     }, {
1620143b040fSPatrick Williams         .name          = MACHINE_TYPE_NAME("sonorapass-bmc"),
1621143b040fSPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1622143b040fSPatrick Williams         .class_init    = aspeed_machine_sonorapass_class_init,
1623143b040fSPatrick Williams     }, {
1624baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("witherspoon-bmc"),
1625baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1626baa4732bSCédric Le Goater         .class_init    = aspeed_machine_witherspoon_class_init,
1627baa4732bSCédric Le Goater     }, {
1628baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2600-evb"),
1629baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1630baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2600_evb_class_init,
1631baa4732bSCédric Le Goater     }, {
163234f73a81SKarthikeyan Pasupathi         .name          = MACHINE_TYPE_NAME("yosemitev2-bmc"),
163334f73a81SKarthikeyan Pasupathi         .parent        = TYPE_ASPEED_MACHINE,
163434f73a81SKarthikeyan Pasupathi         .class_init    = aspeed_machine_yosemitev2_class_init,
163534f73a81SKarthikeyan Pasupathi     }, {
163663ceb818SCédric Le Goater         .name          = MACHINE_TYPE_NAME("tacoma-bmc"),
163763ceb818SCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
163863ceb818SCédric Le Goater         .class_init    = aspeed_machine_tacoma_class_init,
163963ceb818SCédric Le Goater     }, {
16406c323abaSKarthikeyan Pasupathi         .name          = MACHINE_TYPE_NAME("tiogapass-bmc"),
16416c323abaSKarthikeyan Pasupathi         .parent        = TYPE_ASPEED_MACHINE,
16426c323abaSKarthikeyan Pasupathi         .class_init    = aspeed_machine_tiogapass_class_init,
16436c323abaSKarthikeyan Pasupathi     }, {
164495f068c8SJohn Wang         .name          = MACHINE_TYPE_NAME("g220a-bmc"),
164595f068c8SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
164695f068c8SJohn Wang         .class_init    = aspeed_machine_g220a_class_init,
164795f068c8SJohn Wang     }, {
1648fb6b3c8dSJae Hyun Yoo         .name          = MACHINE_TYPE_NAME("qcom-dc-scm-v1-bmc"),
1649fb6b3c8dSJae Hyun Yoo         .parent        = TYPE_ASPEED_MACHINE,
1650fb6b3c8dSJae Hyun Yoo         .class_init    = aspeed_machine_qcom_dc_scm_v1_class_init,
1651fb6b3c8dSJae Hyun Yoo     }, {
1652ece4cccdSGraeme Gregory         .name          = MACHINE_TYPE_NAME("qcom-firework-bmc"),
1653ece4cccdSGraeme Gregory         .parent        = TYPE_ASPEED_MACHINE,
1654ece4cccdSGraeme Gregory         .class_init    = aspeed_machine_qcom_firework_class_init,
1655ece4cccdSGraeme Gregory     }, {
165682b6a3f6SJohn Wang         .name          = MACHINE_TYPE_NAME("fp5280g2-bmc"),
165782b6a3f6SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
165882b6a3f6SJohn Wang         .class_init    = aspeed_machine_fp5280g2_class_init,
165982b6a3f6SJohn Wang     }, {
16609cccb912SPatrick Venture         .name          = MACHINE_TYPE_NAME("quanta-q71l-bmc"),
16619cccb912SPatrick Venture         .parent        = TYPE_ASPEED_MACHINE,
16629cccb912SPatrick Venture         .class_init    = aspeed_machine_quanta_q71l_class_init,
16639cccb912SPatrick Venture     }, {
166458e52bdbSCédric Le Goater         .name          = MACHINE_TYPE_NAME("rainier-bmc"),
166558e52bdbSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
166658e52bdbSCédric Le Goater         .class_init    = aspeed_machine_rainier_class_init,
166758e52bdbSCédric Le Goater     }, {
1668febbe308SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fuji-bmc"),
1669febbe308SPeter Delevoryas         .parent        = TYPE_ASPEED_MACHINE,
1670febbe308SPeter Delevoryas         .class_init    = aspeed_machine_fuji_class_init,
1671febbe308SPeter Delevoryas     }, {
1672a20c54b1SPatrick Williams         .name          = MACHINE_TYPE_NAME("bletchley-bmc"),
1673a20c54b1SPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1674a20c54b1SPatrick Williams         .class_init    = aspeed_machine_bletchley_class_init,
1675a20c54b1SPatrick Williams     }, {
1676fa699e80SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fby35-bmc"),
1677fa699e80SPeter Delevoryas         .parent        = MACHINE_TYPE_NAME("ast2600-evb"),
1678fa699e80SPeter Delevoryas         .class_init    = aspeed_machine_fby35_class_init,
1679fa699e80SPeter Delevoryas     }, {
168066c895b8SJamin Lin         .name           = MACHINE_TYPE_NAME("ast1030-evb"),
168166c895b8SJamin Lin         .parent         = TYPE_ASPEED_MACHINE,
168266c895b8SJamin Lin         .class_init     = aspeed_minibmc_machine_ast1030_evb_class_init,
168366c895b8SJamin Lin     }, {
1684fca9ca1bSCédric Le Goater         .name          = TYPE_ASPEED_MACHINE,
168562c2c2ebSCédric Le Goater         .parent        = TYPE_MACHINE,
1686888b2b03SPhilippe Mathieu-Daudé         .instance_size = sizeof(AspeedMachineState),
16871a15311aSCédric Le Goater         .instance_init = aspeed_machine_instance_init,
1688fca9ca1bSCédric Le Goater         .class_size    = sizeof(AspeedMachineClass),
1689fca9ca1bSCédric Le Goater         .class_init    = aspeed_machine_class_init,
1690baa4732bSCédric Le Goater         .abstract      = true,
1691baa4732bSCédric Le Goater     }
1692fca9ca1bSCédric Le Goater };
169374fb1f38SCédric Le Goater 
1694baa4732bSCédric Le Goater DEFINE_TYPES(aspeed_machine_types)
1695