xref: /qemu/hw/arm/aspeed.c (revision 8b744a6a473015a24d528f480b99faf95da50775)
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 {
2039bb6d140SJoel Stanley     static const uint32_t poll_mailbox_ready[] = {
2049bb6d140SJoel Stanley         /*
2059bb6d140SJoel Stanley          * r2 = per-cpu go sign value
2069bb6d140SJoel Stanley          * r1 = AST_SMP_MBOX_FIELD_ENTRY
2079bb6d140SJoel Stanley          * r0 = AST_SMP_MBOX_FIELD_GOSIGN
2089bb6d140SJoel Stanley          */
2099bb6d140SJoel Stanley         0xee100fb0,  /* mrc     p15, 0, r0, c0, c0, 5 */
2109bb6d140SJoel Stanley         0xe21000ff,  /* ands    r0, r0, #255          */
2119bb6d140SJoel Stanley         0xe59f201c,  /* ldr     r2, [pc, #28]         */
2129bb6d140SJoel Stanley         0xe1822000,  /* orr     r2, r2, r0            */
2139bb6d140SJoel Stanley 
2149bb6d140SJoel Stanley         0xe59f1018,  /* ldr     r1, [pc, #24]         */
2159bb6d140SJoel Stanley         0xe59f0018,  /* ldr     r0, [pc, #24]         */
2169bb6d140SJoel Stanley 
2179bb6d140SJoel Stanley         0xe320f002,  /* wfe                           */
2189bb6d140SJoel Stanley         0xe5904000,  /* ldr     r4, [r0]              */
2199bb6d140SJoel Stanley         0xe1520004,  /* cmp     r2, r4                */
2209bb6d140SJoel Stanley         0x1afffffb,  /* bne     <wfe>                 */
2219bb6d140SJoel Stanley         0xe591f000,  /* ldr     pc, [r1]              */
2229bb6d140SJoel Stanley         AST_SMP_MBOX_GOSIGN,
2239bb6d140SJoel Stanley         AST_SMP_MBOX_FIELD_ENTRY,
2249bb6d140SJoel Stanley         AST_SMP_MBOX_FIELD_GOSIGN,
2259bb6d140SJoel Stanley     };
2269bb6d140SJoel Stanley 
2279bb6d140SJoel Stanley     rom_add_blob_fixed("aspeed.smpboot", poll_mailbox_ready,
2289bb6d140SJoel Stanley                        sizeof(poll_mailbox_ready),
2299bb6d140SJoel Stanley                        info->smp_loader_start);
2309bb6d140SJoel Stanley }
2319bb6d140SJoel Stanley 
2329bb6d140SJoel Stanley static void aspeed_reset_secondary(ARMCPU *cpu,
2339bb6d140SJoel Stanley                                    const struct arm_boot_info *info)
2349bb6d140SJoel Stanley {
2359bb6d140SJoel Stanley     AddressSpace *as = arm_boot_address_space(cpu, info);
2369bb6d140SJoel Stanley     CPUState *cs = CPU(cpu);
2379bb6d140SJoel Stanley 
2389bb6d140SJoel Stanley     /* info->smp_bootreg_addr */
2399bb6d140SJoel Stanley     address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0,
2409bb6d140SJoel Stanley                                MEMTXATTRS_UNSPECIFIED, NULL);
2419bb6d140SJoel Stanley     cpu_set_pc(cs, info->smp_loader_start);
2429bb6d140SJoel Stanley }
2439bb6d140SJoel Stanley 
244*8b744a6aSCédric Le Goater static void write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size,
245d769a1daSCédric Le Goater                            Error **errp)
246d769a1daSCédric Le Goater {
24705e6e40aSWentao_Liang     g_autofree void *storage = NULL;
2480c7209beSCédric Le Goater     int64_t size;
249d769a1daSCédric Le Goater 
2500c7209beSCédric Le Goater     /* The block backend size should have already been 'validated' by
2510c7209beSCédric Le Goater      * the creation of the m25p80 object.
2520c7209beSCédric Le Goater      */
2530c7209beSCédric Le Goater     size = blk_getlength(blk);
2540c7209beSCédric Le Goater     if (size <= 0) {
2550c7209beSCédric Le Goater         error_setg(errp, "failed to get flash size");
2560c7209beSCédric Le Goater         return;
2570c7209beSCédric Le Goater     }
2580c7209beSCédric Le Goater 
2590c7209beSCédric Le Goater     if (rom_size > size) {
2600c7209beSCédric Le Goater         rom_size = size;
261d769a1daSCédric Le Goater     }
262d769a1daSCédric Le Goater 
26305e6e40aSWentao_Liang     storage = g_malloc0(rom_size);
264a9262f55SAlberto Faria     if (blk_pread(blk, 0, rom_size, storage, 0) < 0) {
265d769a1daSCédric Le Goater         error_setg(errp, "failed to read the initial flash content");
266d769a1daSCédric Le Goater         return;
267d769a1daSCédric Le Goater     }
268d769a1daSCédric Le Goater 
269d769a1daSCédric Le Goater     rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr);
270d769a1daSCédric Le Goater }
271d769a1daSCédric Le Goater 
272*8b744a6aSCédric Le Goater /*
273*8b744a6aSCédric Le Goater  * Create a ROM and copy the flash contents at the expected address
274*8b744a6aSCédric Le Goater  * (0x0). Boots faster than execute-in-place.
275*8b744a6aSCédric Le Goater  */
276*8b744a6aSCédric Le Goater static void aspeed_install_boot_rom(AspeedSoCState *soc, BlockBackend *blk,
277*8b744a6aSCédric Le Goater                                     uint64_t rom_size)
278*8b744a6aSCédric Le Goater {
279*8b744a6aSCédric Le Goater     MemoryRegion *boot_rom = g_new(MemoryRegion, 1);
280*8b744a6aSCédric Le Goater 
281*8b744a6aSCédric Le Goater     memory_region_init_rom(boot_rom, NULL, "aspeed.boot_rom", rom_size,
282*8b744a6aSCédric Le Goater                            &error_abort);
283*8b744a6aSCédric Le Goater     memory_region_add_subregion_overlap(&soc->spi_boot_container, 0,
284*8b744a6aSCédric Le Goater                                         boot_rom, 1);
285*8b744a6aSCédric Le Goater     write_boot_rom(blk, ASPEED_SOC_SPI_BOOT_ADDR, rom_size, &error_abort);
286*8b744a6aSCédric Le Goater }
287*8b744a6aSCédric Le Goater 
2881099ad10SPeter Delevoryas void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
2899bd4ac61SCédric Le Goater                                       unsigned int count, int unit0)
290e1ad9bc4SCédric Le Goater {
291e1ad9bc4SCédric Le Goater     int i;
292179b2058SPatrick Williams 
293179b2058SPatrick Williams     if (!flashtype) {
294179b2058SPatrick Williams         return;
295179b2058SPatrick Williams     }
296e1ad9bc4SCédric Le Goater 
2979bd4ac61SCédric Le Goater     for (i = 0; i < count; ++i) {
2988ec239f2SMarkus Armbruster         DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i);
299e1ad9bc4SCédric Le Goater         qemu_irq cs_line;
300a7d78befSCédric Le Goater         DeviceState *dev;
301e1ad9bc4SCédric Le Goater 
302a7d78befSCédric Le Goater         dev = qdev_new(flashtype);
303e1ad9bc4SCédric Le Goater         if (dinfo) {
304a7d78befSCédric Le Goater             qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo));
305e1ad9bc4SCédric Le Goater         }
306a7d78befSCédric Le Goater         qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal);
307e1ad9bc4SCédric Le Goater 
308a7d78befSCédric Le Goater         cs_line = qdev_get_gpio_in_named(dev, SSI_GPIO_CS, 0);
309e1ad9bc4SCédric Le Goater         sysbus_connect_irq(SYS_BUS_DEVICE(s), i + 1, cs_line);
310e1ad9bc4SCédric Le Goater     }
311e1ad9bc4SCédric Le Goater }
312e1ad9bc4SCédric Le Goater 
313a29e3e12SAndrew Jeffery static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo)
314a29e3e12SAndrew Jeffery {
315a29e3e12SAndrew Jeffery         DeviceState *card;
316a29e3e12SAndrew Jeffery 
317756f739bSPhilippe Mathieu-Daudé         if (!dinfo) {
318756f739bSPhilippe Mathieu-Daudé             return;
319756f739bSPhilippe Mathieu-Daudé         }
3203e80f690SMarkus Armbruster         card = qdev_new(TYPE_SD_CARD);
321934df912SMarkus Armbruster         qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
322a29e3e12SAndrew Jeffery                                 &error_fatal);
3233e80f690SMarkus Armbruster         qdev_realize_and_unref(card,
3243e80f690SMarkus Armbruster                                qdev_get_child_bus(DEVICE(sdhci), "sd-bus"),
3253e80f690SMarkus Armbruster                                &error_fatal);
326a29e3e12SAndrew Jeffery }
327a29e3e12SAndrew Jeffery 
328d2b3eaefSPeter Delevoryas static void connect_serial_hds_to_uarts(AspeedMachineState *bmc)
329d2b3eaefSPeter Delevoryas {
330d2b3eaefSPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
331d2b3eaefSPeter Delevoryas     AspeedSoCState *s = &bmc->soc;
332d2b3eaefSPeter Delevoryas     AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
333d2b3eaefSPeter Delevoryas 
334d2b3eaefSPeter Delevoryas     aspeed_soc_uart_set_chr(s, amc->uart_default, serial_hd(0));
335d2b3eaefSPeter Delevoryas     for (int i = 1, uart = ASPEED_DEV_UART1; i < sc->uarts_num; i++, uart++) {
336d2b3eaefSPeter Delevoryas         if (uart == amc->uart_default) {
337d2b3eaefSPeter Delevoryas             continue;
338d2b3eaefSPeter Delevoryas         }
339d2b3eaefSPeter Delevoryas         aspeed_soc_uart_set_chr(s, uart, serial_hd(i));
340d2b3eaefSPeter Delevoryas     }
341d2b3eaefSPeter Delevoryas }
342d2b3eaefSPeter Delevoryas 
343baa4732bSCédric Le Goater static void aspeed_machine_init(MachineState *machine)
344327d8e4eSAndrew Jeffery {
345888b2b03SPhilippe Mathieu-Daudé     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
346baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
347b033271fSCédric Le Goater     AspeedSoCClass *sc;
3482bea128cSEddie James     int i;
349d3bad7e7SCédric Le Goater     NICInfo *nd = &nd_table[0];
350327d8e4eSAndrew Jeffery 
3519fc7fc4dSMarkus Armbruster     object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
352327d8e4eSAndrew Jeffery 
353b033271fSCédric Le Goater     sc = ASPEED_SOC_GET_CLASS(&bmc->soc);
354b033271fSCédric Le Goater 
355533eb415SIgor Mammedov     /*
356346160cbSCédric Le Goater      * This will error out if the RAM size is not supported by the
357346160cbSCédric Le Goater      * memory controller of the SoC.
358533eb415SIgor Mammedov      */
3596e504a98SPaolo Bonzini     object_property_set_uint(OBJECT(&bmc->soc), "ram-size", machine->ram_size,
360533eb415SIgor Mammedov                              &error_fatal);
361533eb415SIgor Mammedov 
362d3bad7e7SCédric Le Goater     for (i = 0; i < sc->macs_num; i++) {
363d3bad7e7SCédric Le Goater         if ((amc->macs_mask & (1 << i)) && nd->used) {
364d3bad7e7SCédric Le Goater             qemu_check_nic_model(nd, TYPE_FTGMAC100);
365d3bad7e7SCédric Le Goater             qdev_set_nic_properties(DEVICE(&bmc->soc.ftgmac100[i]), nd);
366d3bad7e7SCédric Le Goater             nd++;
367d3bad7e7SCédric Le Goater         }
368d3bad7e7SCédric Le Goater     }
369d3bad7e7SCédric Le Goater 
3705325cc34SMarkus Armbruster     object_property_set_int(OBJECT(&bmc->soc), "hw-strap1", amc->hw_strap1,
37187e79af0SAndrew Jeffery                             &error_abort);
3725325cc34SMarkus Armbruster     object_property_set_int(OBJECT(&bmc->soc), "hw-strap2", amc->hw_strap2,
373ccc2c418SCédric Le Goater                             &error_abort);
3744dd9d554SPeter Delevoryas     object_property_set_link(OBJECT(&bmc->soc), "memory",
3754dd9d554SPeter Delevoryas                              OBJECT(get_system_memory()), &error_abort);
3765325cc34SMarkus Armbruster     object_property_set_link(OBJECT(&bmc->soc), "dram",
3770df2d9a6SCédric Le Goater                              OBJECT(machine->ram), &error_abort);
378b6e70d1dSJoel Stanley     if (machine->kernel_filename) {
379b6e70d1dSJoel Stanley         /*
380b6e70d1dSJoel Stanley          * When booting with a -kernel command line there is no u-boot
381b6e70d1dSJoel Stanley          * that runs to unlock the SCU. In this case set the default to
382b6e70d1dSJoel Stanley          * be unlocked as the kernel expects
383b6e70d1dSJoel Stanley          */
3845325cc34SMarkus Armbruster         object_property_set_int(OBJECT(&bmc->soc), "hw-prot-key",
3855325cc34SMarkus Armbruster                                 ASPEED_SCU_PROT_KEY, &error_abort);
386b6e70d1dSJoel Stanley     }
387d2b3eaefSPeter Delevoryas     connect_serial_hds_to_uarts(bmc);
388ce189ab2SMarkus Armbruster     qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
389327d8e4eSAndrew Jeffery 
3908ec239f2SMarkus Armbruster     aspeed_board_init_flashes(&bmc->soc.fmc,
3918ec239f2SMarkus Armbruster                               bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
3929bd4ac61SCédric Le Goater                               amc->num_cs, 0);
3938ec239f2SMarkus Armbruster     aspeed_board_init_flashes(&bmc->soc.spi[0],
3948ec239f2SMarkus Armbruster                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
3959bd4ac61SCédric Le Goater                               1, amc->num_cs);
396e1ad9bc4SCédric Le Goater 
397b7f1a0cbSCédric Le Goater     if (machine->kernel_filename && sc->num_cpus > 1) {
3989bb6d140SJoel Stanley         /* With no u-boot we must set up a boot stub for the secondary CPU */
3999bb6d140SJoel Stanley         MemoryRegion *smpboot = g_new(MemoryRegion, 1);
400f489960dSPhilippe Mathieu-Daudé         memory_region_init_ram(smpboot, NULL, "aspeed.smpboot",
4019bb6d140SJoel Stanley                                0x80, &error_abort);
4029bb6d140SJoel Stanley         memory_region_add_subregion(get_system_memory(),
4039bb6d140SJoel Stanley                                     AST_SMP_MAILBOX_BASE, smpboot);
4049bb6d140SJoel Stanley 
4059bb6d140SJoel Stanley         aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot;
4069bb6d140SJoel Stanley         aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary;
4079bb6d140SJoel Stanley         aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE;
4089bb6d140SJoel Stanley     }
4099bb6d140SJoel Stanley 
4106e504a98SPaolo Bonzini     aspeed_board_binfo.ram_size = machine->ram_size;
411347df6f8SEduardo Habkost     aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM];
412b033271fSCédric Le Goater 
413baa4732bSCédric Le Goater     if (amc->i2c_init) {
414baa4732bSCédric Le Goater         amc->i2c_init(bmc);
4152cf6cb50SCédric Le Goater     }
4162cf6cb50SCédric Le Goater 
4170e2c24c6SAndrew Jeffery     for (i = 0; i < bmc->soc.sdhci.num_slots; i++) {
4188ec239f2SMarkus Armbruster         sdhci_attach_drive(&bmc->soc.sdhci.slots[i],
4198ec239f2SMarkus Armbruster                            drive_get(IF_SD, 0, i));
420a29e3e12SAndrew Jeffery     }
4212bea128cSEddie James 
422a29e3e12SAndrew Jeffery     if (bmc->soc.emmc.num_slots) {
4238ec239f2SMarkus Armbruster         sdhci_attach_drive(&bmc->soc.emmc.slots[0],
4248ec239f2SMarkus Armbruster                            drive_get(IF_SD, 0, bmc->soc.sdhci.num_slots));
4252bea128cSEddie James     }
4262bea128cSEddie James 
427*8b744a6aSCédric Le Goater     if (!bmc->mmio_exec) {
428*8b744a6aSCédric Le Goater         DriveInfo *mtd0 = drive_get(IF_MTD, 0, 0);
429*8b744a6aSCédric Le Goater 
430*8b744a6aSCédric Le Goater         if (mtd0) {
431*8b744a6aSCédric Le Goater             uint64_t rom_size = memory_region_size(&bmc->soc.spi_boot);
432*8b744a6aSCédric Le Goater             aspeed_install_boot_rom(&bmc->soc, blk_by_legacy_dinfo(mtd0),
433*8b744a6aSCédric Le Goater                                     rom_size);
434*8b744a6aSCédric Le Goater         }
435*8b744a6aSCédric Le Goater     }
436*8b744a6aSCédric Le Goater 
4372744ece8STao Xu     arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo);
438327d8e4eSAndrew Jeffery }
439327d8e4eSAndrew Jeffery 
440612b219aSPhilippe Mathieu-Daudé static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
4412cf6cb50SCédric Le Goater {
4422cf6cb50SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
443a87e81b9SCédric Le Goater     DeviceState *dev;
4443d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
4452cf6cb50SCédric Le Goater 
4462cf6cb50SCédric Le Goater     /* The palmetto platform expects a ds3231 RTC but a ds1338 is
4472cf6cb50SCédric Le Goater      * enough to provide basic RTC features. Alarms will be missing */
4481373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
449a87e81b9SCédric Le Goater 
4507a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
4513d165f12SCédric Le Goater                           eeprom_buf);
4523d165f12SCédric Le Goater 
453a87e81b9SCédric Le Goater     /* add a TMP423 temperature sensor */
4541373b15bSPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
4551373b15bSPhilippe Mathieu-Daudé                                          "tmp423", 0x4c));
4565325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
4575325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
4585325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
4595325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort);
4602cf6cb50SCédric Le Goater }
4612cf6cb50SCédric Le Goater 
4629cccb912SPatrick Venture static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc)
4639cccb912SPatrick Venture {
4649cccb912SPatrick Venture     AspeedSoCState *soc = &bmc->soc;
4659cccb912SPatrick Venture 
4669cccb912SPatrick Venture     /*
4679cccb912SPatrick Venture      * The quanta-q71l platform expects tmp75s which are compatible with
4689cccb912SPatrick Venture      * tmp105s.
4699cccb912SPatrick Venture      */
4709cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c);
4719cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e);
4729cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f);
4739cccb912SPatrick Venture 
4749cccb912SPatrick Venture     /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */
4759cccb912SPatrick Venture     /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */
4769cccb912SPatrick Venture     /* TODO: Add Memory Riser i2c mux and eeproms. */
4779cccb912SPatrick Venture 
4783ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74);
4793ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77);
4803ec75e39SPatrick Venture 
4819cccb912SPatrick Venture     /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */
4823ec75e39SPatrick Venture 
4833ec75e39SPatrick Venture     /* i2c-7 */
4843ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70);
4859cccb912SPatrick Venture     /*        - i2c@0: pmbus@59 */
4869cccb912SPatrick Venture     /*        - i2c@1: pmbus@58 */
4879cccb912SPatrick Venture     /*        - i2c@2: pmbus@58 */
4889cccb912SPatrick Venture     /*        - i2c@3: pmbus@59 */
4893ec75e39SPatrick Venture 
4909cccb912SPatrick Venture     /* TODO: i2c-7: Add PDB FRU eeprom@52 */
4919cccb912SPatrick Venture     /* TODO: i2c-8: Add BMC FRU eeprom@50 */
4929cccb912SPatrick Venture }
4939cccb912SPatrick Venture 
494612b219aSPhilippe Mathieu-Daudé static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
4952cf6cb50SCédric Le Goater {
4962cf6cb50SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
4973d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
4983d165f12SCédric Le Goater 
4997a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50,
5003d165f12SCédric Le Goater                           eeprom_buf);
5012cf6cb50SCédric Le Goater 
5022cf6cb50SCédric Le Goater     /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
5031373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
504044475f3SPhilippe Mathieu-Daudé                      TYPE_TMP105, 0x4d);
5052cf6cb50SCédric Le Goater }
5062cf6cb50SCédric Le Goater 
507612b219aSPhilippe Mathieu-Daudé static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
508ccc2c418SCédric Le Goater {
50952bcd997SHoward Chiu     AspeedSoCState *soc = &bmc->soc;
51052bcd997SHoward Chiu     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
51152bcd997SHoward Chiu 
51252bcd997SHoward Chiu     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50,
51352bcd997SHoward Chiu                           eeprom_buf);
51452bcd997SHoward Chiu 
51552bcd997SHoward Chiu     /* LM75 is compatible with TMP105 driver */
51652bcd997SHoward Chiu     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
51752bcd997SHoward Chiu                      TYPE_TMP105, 0x4d);
518ccc2c418SCédric Le Goater }
519ccc2c418SCédric Le Goater 
52034f73a81SKarthikeyan Pasupathi static void yosemitev2_bmc_i2c_init(AspeedMachineState *bmc)
52134f73a81SKarthikeyan Pasupathi {
52234f73a81SKarthikeyan Pasupathi     AspeedSoCState *soc = &bmc->soc;
52334f73a81SKarthikeyan Pasupathi 
52434f73a81SKarthikeyan Pasupathi     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x51, 128 * KiB);
52534f73a81SKarthikeyan Pasupathi     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 128 * KiB,
52634f73a81SKarthikeyan Pasupathi                           yosemitev2_bmc_fruid, yosemitev2_bmc_fruid_len);
52734f73a81SKarthikeyan Pasupathi }
52834f73a81SKarthikeyan Pasupathi 
529612b219aSPhilippe Mathieu-Daudé static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
5306c4567c7SCédric Le Goater {
5316c4567c7SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
5326c4567c7SCédric Le Goater 
5336c4567c7SCédric Le Goater     /* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
5346c4567c7SCédric Le Goater      * good enough */
5351373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
5366c4567c7SCédric Le Goater }
5376c4567c7SCédric Le Goater 
5386c323abaSKarthikeyan Pasupathi static void tiogapass_bmc_i2c_init(AspeedMachineState *bmc)
5396c323abaSKarthikeyan Pasupathi {
5406c323abaSKarthikeyan Pasupathi     AspeedSoCState *soc = &bmc->soc;
5416c323abaSKarthikeyan Pasupathi 
5426c323abaSKarthikeyan Pasupathi     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 128 * KiB);
5436c323abaSKarthikeyan Pasupathi     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 6), 0x54, 128 * KiB,
5446c323abaSKarthikeyan Pasupathi                           tiogapass_bmc_fruid, tiogapass_bmc_fruid_len);
5456c323abaSKarthikeyan Pasupathi }
5466c323abaSKarthikeyan Pasupathi 
547f4aec252SCédric Le Goater static void create_pca9552(AspeedSoCState *soc, int bus_id, int addr)
548f4aec252SCédric Le Goater {
549f4aec252SCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, bus_id),
550f4aec252SCédric Le Goater                             TYPE_PCA9552, addr);
551f4aec252SCédric Le Goater }
552f4aec252SCédric Le Goater 
553612b219aSPhilippe Mathieu-Daudé static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc)
554143b040fSPatrick Williams {
555143b040fSPatrick Williams     AspeedSoCState *soc = &bmc->soc;
556143b040fSPatrick Williams 
557143b040fSPatrick Williams     /* bus 2 : */
5581373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48);
5591373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49);
560143b040fSPatrick Williams     /* bus 2 : pca9546 @ 0x73 */
561143b040fSPatrick Williams 
562143b040fSPatrick Williams     /* bus 3 : pca9548 @ 0x70 */
563143b040fSPatrick Williams 
564143b040fSPatrick Williams     /* bus 4 : */
565143b040fSPatrick Williams     uint8_t *eeprom4_54 = g_malloc0(8 * 1024);
5667a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54,
567143b040fSPatrick Williams                           eeprom4_54);
568143b040fSPatrick Williams     /* PCA9539 @ 0x76, but PCA9552 is compatible */
569f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x76);
570143b040fSPatrick Williams     /* PCA9539 @ 0x77, but PCA9552 is compatible */
571f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x77);
572143b040fSPatrick Williams 
573143b040fSPatrick Williams     /* bus 6 : */
5741373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48);
5751373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49);
576143b040fSPatrick Williams     /* bus 6 : pca9546 @ 0x73 */
577143b040fSPatrick Williams 
578143b040fSPatrick Williams     /* bus 8 : */
579143b040fSPatrick Williams     uint8_t *eeprom8_56 = g_malloc0(8 * 1024);
5807a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56,
581143b040fSPatrick Williams                           eeprom8_56);
582f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x60);
583f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x61);
584143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1d */
585143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1f */
586143b040fSPatrick Williams 
587143b040fSPatrick Williams     /*
588143b040fSPatrick Williams      * bus 13 : pca9548 @ 0x71
589143b040fSPatrick Williams      *      - channel 3:
590143b040fSPatrick Williams      *          - tmm421 @ 0x4c
591143b040fSPatrick Williams      *          - tmp421 @ 0x4e
592143b040fSPatrick Williams      *          - tmp421 @ 0x4f
593143b040fSPatrick Williams      */
594143b040fSPatrick Williams 
595143b040fSPatrick Williams }
596143b040fSPatrick Williams 
597612b219aSPhilippe Mathieu-Daudé static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
59862c2c2ebSCédric Le Goater {
5997cfbde5eSPhilippe Mathieu-Daudé     static const struct {
6007cfbde5eSPhilippe Mathieu-Daudé         unsigned gpio_id;
6017cfbde5eSPhilippe Mathieu-Daudé         LEDColor color;
6027cfbde5eSPhilippe Mathieu-Daudé         const char *description;
6037cfbde5eSPhilippe Mathieu-Daudé         bool gpio_polarity;
6047cfbde5eSPhilippe Mathieu-Daudé     } pca1_leds[] = {
6057cfbde5eSPhilippe Mathieu-Daudé         {13, LED_COLOR_GREEN, "front-fault-4",  GPIO_POLARITY_ACTIVE_LOW},
6067cfbde5eSPhilippe Mathieu-Daudé         {14, LED_COLOR_GREEN, "front-power-3",  GPIO_POLARITY_ACTIVE_LOW},
6077cfbde5eSPhilippe Mathieu-Daudé         {15, LED_COLOR_GREEN, "front-id-5",     GPIO_POLARITY_ACTIVE_LOW},
6087cfbde5eSPhilippe Mathieu-Daudé     };
60962c2c2ebSCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
6103d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
61115ce12cfSPhilippe Mathieu-Daudé     DeviceState *dev;
6127cfbde5eSPhilippe Mathieu-Daudé     LEDState *led;
61362c2c2ebSCédric Le Goater 
61463ceb818SCédric Le Goater     /* Bus 3: TODO bmp280@77 */
615db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
61615ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca1");
6172616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
6182616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 3),
61915ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
6208c9a61d7SCédric Le Goater 
6217cfbde5eSPhilippe Mathieu-Daudé     for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) {
6227cfbde5eSPhilippe Mathieu-Daudé         led = led_create_simple(OBJECT(bmc),
6237cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].gpio_polarity,
6247cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].color,
6257cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].description);
6267cfbde5eSPhilippe Mathieu-Daudé         qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id,
6277cfbde5eSPhilippe Mathieu-Daudé                               qdev_get_gpio_in(DEVICE(led), 0));
6287cfbde5eSPhilippe Mathieu-Daudé     }
629b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76);
6302a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "max31785", 0x52);
6311373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c);
6321373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c);
63362c2c2ebSCédric Le Goater 
63462c2c2ebSCédric Le Goater     /* The Witherspoon expects a TMP275 but a TMP105 is compatible */
6351373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105,
636044475f3SPhilippe Mathieu-Daudé                      0x4a);
6376c4567c7SCédric Le Goater 
6386c4567c7SCédric Le Goater     /* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
6396c4567c7SCédric Le Goater      * good enough */
6401373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
6413d165f12SCédric Le Goater 
6427a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51,
6433d165f12SCédric Le Goater                           eeprom_buf);
644db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
64515ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca0");
6462616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
6472616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 11),
64815ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
64963ceb818SCédric Le Goater     /* Bus 11: TODO ucd90160@64 */
65062c2c2ebSCédric Le Goater }
65162c2c2ebSCédric Le Goater 
65295f068c8SJohn Wang static void g220a_bmc_i2c_init(AspeedMachineState *bmc)
65395f068c8SJohn Wang {
65495f068c8SJohn Wang     AspeedSoCState *soc = &bmc->soc;
65595f068c8SJohn Wang     DeviceState *dev;
65695f068c8SJohn Wang 
65795f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3),
65895f068c8SJohn Wang                                          "emc1413", 0x4c));
65995f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
66095f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
66195f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
66295f068c8SJohn Wang 
66395f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12),
66495f068c8SJohn Wang                                          "emc1413", 0x4c));
66595f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
66695f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
66795f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
66895f068c8SJohn Wang 
66995f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13),
67095f068c8SJohn Wang                                          "emc1413", 0x4c));
67195f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
67295f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
67395f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
6746f5f6507SJohn Wang 
6756f5f6507SJohn Wang     static uint8_t eeprom_buf[2 * 1024] = {
6766f5f6507SJohn Wang             0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe,
6776f5f6507SJohn Wang             0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65,
6786f5f6507SJohn Wang             0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32,
6796f5f6507SJohn Wang             0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42,
6806f5f6507SJohn Wang             0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45,
6816f5f6507SJohn Wang             0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1,
6826f5f6507SJohn Wang             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7,
6836f5f6507SJohn Wang     };
6846f5f6507SJohn Wang     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57,
6856f5f6507SJohn Wang                           eeprom_buf);
68695f068c8SJohn Wang }
68795f068c8SJohn Wang 
68882b6a3f6SJohn Wang static void fp5280g2_bmc_i2c_init(AspeedMachineState *bmc)
68982b6a3f6SJohn Wang {
69082b6a3f6SJohn Wang     AspeedSoCState *soc = &bmc->soc;
69182b6a3f6SJohn Wang     I2CSlave *i2c_mux;
69282b6a3f6SJohn Wang 
69382b6a3f6SJohn Wang     /* The at24c256 */
69482b6a3f6SJohn Wang     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 1), 0x50, 32768);
69582b6a3f6SJohn Wang 
69682b6a3f6SJohn Wang     /* The fp5280g2 expects a TMP112 but a TMP105 is compatible */
69782b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
69882b6a3f6SJohn Wang                      0x48);
69982b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
70082b6a3f6SJohn Wang                      0x49);
70182b6a3f6SJohn Wang 
70282b6a3f6SJohn Wang     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
70382b6a3f6SJohn Wang                      "pca9546", 0x70);
70482b6a3f6SJohn Wang     /* It expects a TMP112 but a TMP105 is compatible */
70582b6a3f6SJohn Wang     i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0), TYPE_TMP105,
70682b6a3f6SJohn Wang                      0x4a);
70782b6a3f6SJohn Wang 
70882b6a3f6SJohn Wang     /* It expects a ds3232 but a ds1338 is good enough */
70982b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "ds1338", 0x68);
71082b6a3f6SJohn Wang 
71182b6a3f6SJohn Wang     /* It expects a pca9555 but a pca9552 is compatible */
712f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x30);
71382b6a3f6SJohn Wang }
71482b6a3f6SJohn Wang 
71558e52bdbSCédric Le Goater static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
71658e52bdbSCédric Le Goater {
71758e52bdbSCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
718fa6d98c0SJoel Stanley     I2CSlave *i2c_mux;
719fa6d98c0SJoel Stanley 
7209077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB);
72158e52bdbSCédric Le Goater 
722f4aec252SCédric Le Goater     create_pca9552(soc, 3, 0x61);
723bcb122f8SJoel Stanley 
72458e52bdbSCédric Le Goater     /* The rainier expects a TMP275 but a TMP105 is compatible */
72558e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
72658e52bdbSCédric Le Goater                      0x48);
72758e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
72858e52bdbSCédric Le Goater                      0x49);
72958e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
73058e52bdbSCédric Le Goater                      0x4a);
731fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4),
732fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
7339077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
7349077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
7359077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB);
736f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x60);
73758e52bdbSCédric Le Goater 
73858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
73958e52bdbSCédric Le Goater                      0x48);
74058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
74158e52bdbSCédric Le Goater                      0x49);
742f4aec252SCédric Le Goater     create_pca9552(soc, 5, 0x60);
743f4aec252SCédric Le Goater     create_pca9552(soc, 5, 0x61);
744fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5),
745fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
7469077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
7479077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
74858e52bdbSCédric Le Goater 
74958e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
75058e52bdbSCédric Le Goater                      0x48);
75158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
75258e52bdbSCédric Le Goater                      0x4a);
75358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
75458e52bdbSCédric Le Goater                      0x4b);
755fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6),
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);
7599077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB);
7609077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB);
76158e52bdbSCédric Le Goater 
762f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x30);
763f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x31);
764f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x32);
765f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x33);
766f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x60);
767f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x61);
768b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76);
76958e52bdbSCédric Le Goater     /* Bus 7: TODO si7021-a20@20 */
77058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105,
77158e52bdbSCédric Le Goater                      0x48);
7722a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "max31785", 0x52);
7739077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB);
7749077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB);
77558e52bdbSCédric Le Goater 
77658e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
77758e52bdbSCédric Le Goater                      0x48);
77858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
77958e52bdbSCédric Le Goater                      0x4a);
7809077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50, 64 * KiB);
7819077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 64 * KiB);
782f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x60);
783f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x61);
78458e52bdbSCédric Le Goater     /* Bus 8: ucd90320@11 */
78558e52bdbSCédric Le Goater     /* Bus 8: ucd90320@b */
78658e52bdbSCédric Le Goater     /* Bus 8: ucd90320@c */
78758e52bdbSCédric Le Goater 
78858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c);
78958e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d);
7909077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB);
79158e52bdbSCédric Le Goater 
79258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c);
79358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d);
7949077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB);
79558e52bdbSCédric Le Goater 
79658e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
79758e52bdbSCédric Le Goater                      0x48);
79858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
79958e52bdbSCédric Le Goater                      0x49);
800fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11),
801fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
8029077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
8039077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
804f4aec252SCédric Le Goater     create_pca9552(soc, 11, 0x60);
805fa6d98c0SJoel Stanley 
806fa6d98c0SJoel Stanley 
8079077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB);
808f4aec252SCédric Le Goater     create_pca9552(soc, 13, 0x60);
809fa6d98c0SJoel Stanley 
8109077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB);
811f4aec252SCédric Le Goater     create_pca9552(soc, 14, 0x60);
812fa6d98c0SJoel Stanley 
8139077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB);
814f4aec252SCédric Le Goater     create_pca9552(soc, 15, 0x60);
81558e52bdbSCédric Le Goater }
81658e52bdbSCédric Le Goater 
817febbe308SPeter Delevoryas static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr,
818febbe308SPeter Delevoryas                                  I2CBus **channels)
819febbe308SPeter Delevoryas {
820febbe308SPeter Delevoryas     I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr);
821febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
822febbe308SPeter Delevoryas         channels[i] = pca954x_i2c_get_bus(mux, i);
823febbe308SPeter Delevoryas     }
824febbe308SPeter Delevoryas }
825febbe308SPeter Delevoryas 
826febbe308SPeter Delevoryas #define TYPE_LM75 TYPE_TMP105
827febbe308SPeter Delevoryas #define TYPE_TMP75 TYPE_TMP105
828febbe308SPeter Delevoryas #define TYPE_TMP422 "tmp422"
829febbe308SPeter Delevoryas 
830febbe308SPeter Delevoryas static void fuji_bmc_i2c_init(AspeedMachineState *bmc)
831febbe308SPeter Delevoryas {
832febbe308SPeter Delevoryas     AspeedSoCState *soc = &bmc->soc;
833febbe308SPeter Delevoryas     I2CBus *i2c[144] = {};
834febbe308SPeter Delevoryas 
835febbe308SPeter Delevoryas     for (int i = 0; i < 16; i++) {
836febbe308SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
837febbe308SPeter Delevoryas     }
838febbe308SPeter Delevoryas     I2CBus *i2c180 = i2c[2];
839febbe308SPeter Delevoryas     I2CBus *i2c480 = i2c[8];
840febbe308SPeter Delevoryas     I2CBus *i2c600 = i2c[11];
841febbe308SPeter Delevoryas 
842febbe308SPeter Delevoryas     get_pca9548_channels(i2c180, 0x70, &i2c[16]);
843febbe308SPeter Delevoryas     get_pca9548_channels(i2c480, 0x70, &i2c[24]);
844febbe308SPeter Delevoryas     /* NOTE: The device tree skips [32, 40) in the alias numbering */
845febbe308SPeter Delevoryas     get_pca9548_channels(i2c600, 0x77, &i2c[40]);
846febbe308SPeter Delevoryas     get_pca9548_channels(i2c[24], 0x71, &i2c[48]);
847febbe308SPeter Delevoryas     get_pca9548_channels(i2c[25], 0x72, &i2c[56]);
848febbe308SPeter Delevoryas     get_pca9548_channels(i2c[26], 0x76, &i2c[64]);
849febbe308SPeter Delevoryas     get_pca9548_channels(i2c[27], 0x76, &i2c[72]);
850febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
851febbe308SPeter Delevoryas         get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]);
852febbe308SPeter Delevoryas     }
853febbe308SPeter Delevoryas 
854febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c);
855febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d);
856febbe308SPeter Delevoryas 
857ef0eb67eSSittisak Sinprem     /*
858ef0eb67eSSittisak Sinprem      * EEPROM 24c64 size is 64Kbits or 8 Kbytes
859ef0eb67eSSittisak Sinprem      *        24c02 size is 2Kbits or 256 bytes
860ef0eb67eSSittisak Sinprem      */
861ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[19], 0x52, 8 * KiB);
862ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[20], 0x50, 256);
863ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[22], 0x52, 256);
864febbe308SPeter Delevoryas 
865febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x48);
866febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x49);
867febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x4a);
868febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_TMP422, 0x4c);
869febbe308SPeter Delevoryas 
870ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[8], 0x51, 8 * KiB);
871febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a);
872febbe308SPeter Delevoryas 
873febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[50], TYPE_LM75, 0x4c);
874ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[50], 0x52, 8 * KiB);
875febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[51], TYPE_TMP75, 0x48);
876febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[52], TYPE_TMP75, 0x49);
877febbe308SPeter Delevoryas 
878febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[59], TYPE_TMP75, 0x48);
879febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[60], TYPE_TMP75, 0x49);
880febbe308SPeter Delevoryas 
881ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[65], 0x53, 8 * KiB);
882febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x49);
883febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x48);
884ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[68], 0x52, 8 * KiB);
885ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[69], 0x52, 8 * KiB);
886ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[70], 0x52, 8 * KiB);
887ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[71], 0x52, 8 * KiB);
888febbe308SPeter Delevoryas 
889ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[73], 0x53, 8 * KiB);
890febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x49);
891febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x48);
892ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[76], 0x52, 8 * KiB);
893ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[77], 0x52, 8 * KiB);
894ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[78], 0x52, 8 * KiB);
895ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[79], 0x52, 8 * KiB);
896ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[28], 0x50, 256);
897febbe308SPeter Delevoryas 
898febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
8999077e09aSPeter Delevoryas         at24c_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB);
900febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[82 + i * 8], TYPE_TMP75, 0x48);
901febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[83 + i * 8], TYPE_TMP75, 0x4b);
902febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[84 + i * 8], TYPE_TMP75, 0x4a);
903febbe308SPeter Delevoryas     }
904febbe308SPeter Delevoryas }
905febbe308SPeter Delevoryas 
906a20c54b1SPatrick Williams #define TYPE_TMP421 "tmp421"
907a20c54b1SPatrick Williams 
908a20c54b1SPatrick Williams static void bletchley_bmc_i2c_init(AspeedMachineState *bmc)
909a20c54b1SPatrick Williams {
910a20c54b1SPatrick Williams     AspeedSoCState *soc = &bmc->soc;
911a20c54b1SPatrick Williams     I2CBus *i2c[13] = {};
912a20c54b1SPatrick Williams     for (int i = 0; i < 13; i++) {
913a20c54b1SPatrick Williams         if ((i == 8) || (i == 11)) {
914a20c54b1SPatrick Williams             continue;
915a20c54b1SPatrick Williams         }
916a20c54b1SPatrick Williams         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
917a20c54b1SPatrick Williams     }
918a20c54b1SPatrick Williams 
919a20c54b1SPatrick Williams     /* Bus 0 - 5 all have the same config. */
920a20c54b1SPatrick Williams     for (int i = 0; i < 6; i++) {
921a20c54b1SPatrick Williams         /* Missing model: ti,ina230 @ 0x45 */
922a20c54b1SPatrick Williams         /* Missing model: mps,mp5023 @ 0x40 */
923a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_TMP421, 0x4f);
924a20c54b1SPatrick Williams         /* Missing model: nxp,pca9539 @ 0x76, but PCA9552 works enough */
925a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x76);
926a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x67);
927a20c54b1SPatrick Williams         /* Missing model: fsc,fusb302 @ 0x22 */
928a20c54b1SPatrick Williams     }
929a20c54b1SPatrick Williams 
930a20c54b1SPatrick Williams     /* Bus 6 */
931a20c54b1SPatrick Williams     at24c_eeprom_init(i2c[6], 0x56, 65536);
932a20c54b1SPatrick Williams     /* Missing model: nxp,pcf85263 @ 0x51 , but ds1338 works enough */
933a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[6], "ds1338", 0x51);
934a20c54b1SPatrick Williams 
935a20c54b1SPatrick Williams 
936a20c54b1SPatrick Williams     /* Bus 7 */
937a20c54b1SPatrick Williams     at24c_eeprom_init(i2c[7], 0x54, 65536);
938a20c54b1SPatrick Williams 
939a20c54b1SPatrick Williams     /* Bus 9 */
940a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[9], TYPE_TMP421, 0x4f);
941a20c54b1SPatrick Williams 
942a20c54b1SPatrick Williams     /* Bus 10 */
943a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[10], TYPE_TMP421, 0x4f);
944a20c54b1SPatrick Williams     /* Missing model: ti,hdc1080 @ 0x40 */
945a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[10], TYPE_PCA9552, 0x67);
946a20c54b1SPatrick Williams 
947a20c54b1SPatrick Williams     /* Bus 12 */
948a20c54b1SPatrick Williams     /* Missing model: adi,adm1278 @ 0x11 */
949a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4c);
950a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4d);
951a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_PCA9552, 0x67);
952a20c54b1SPatrick Williams }
953a20c54b1SPatrick Williams 
954fa699e80SPeter Delevoryas static void fby35_i2c_init(AspeedMachineState *bmc)
955fa699e80SPeter Delevoryas {
956fa699e80SPeter Delevoryas     AspeedSoCState *soc = &bmc->soc;
957fa699e80SPeter Delevoryas     I2CBus *i2c[16];
958fa699e80SPeter Delevoryas 
959fa699e80SPeter Delevoryas     for (int i = 0; i < 16; i++) {
960fa699e80SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
961fa699e80SPeter Delevoryas     }
962fa699e80SPeter Delevoryas 
963fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[2], TYPE_LM75, 0x4f);
964fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_TMP421, 0x1f);
965fa699e80SPeter Delevoryas     /* Hotswap controller is actually supposed to be mp5920 or ltc4282. */
966fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[11], "adm1272", 0x44);
967fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4e);
968fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4f);
969fa699e80SPeter Delevoryas 
9709077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[4], 0x51, 128 * KiB);
9719077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[6], 0x51, 128 * KiB);
972c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[8], 0x50, 32 * KiB, fby35_nic_fruid,
973c0216b94SPeter Delevoryas                           fby35_nic_fruid_len);
974c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[11], 0x51, 128 * KiB, fby35_bb_fruid,
975c0216b94SPeter Delevoryas                           fby35_bb_fruid_len);
976c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[11], 0x54, 128 * KiB, fby35_bmc_fruid,
977c0216b94SPeter Delevoryas                           fby35_bmc_fruid_len);
978fa699e80SPeter Delevoryas 
979fa699e80SPeter Delevoryas     /*
980fa699e80SPeter Delevoryas      * TODO: There is a multi-master i2c connection to an AST1030 MiniBMC on
981fa699e80SPeter Delevoryas      * buses 0, 1, 2, 3, and 9. Source address 0x10, target address 0x20 on
982fa699e80SPeter Delevoryas      * each.
983fa699e80SPeter Delevoryas      */
984fa699e80SPeter Delevoryas }
985fa699e80SPeter Delevoryas 
986fb6b3c8dSJae Hyun Yoo static void qcom_dc_scm_bmc_i2c_init(AspeedMachineState *bmc)
987fb6b3c8dSJae Hyun Yoo {
988fb6b3c8dSJae Hyun Yoo     AspeedSoCState *soc = &bmc->soc;
989fb6b3c8dSJae Hyun Yoo 
990fb6b3c8dSJae Hyun Yoo     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 15), "tmp105", 0x4d);
991fb6b3c8dSJae Hyun Yoo }
992fb6b3c8dSJae Hyun Yoo 
993ece4cccdSGraeme Gregory static void qcom_dc_scm_firework_i2c_init(AspeedMachineState *bmc)
994ece4cccdSGraeme Gregory {
995ece4cccdSGraeme Gregory     AspeedSoCState *soc = &bmc->soc;
9962a7a5d5cSJae Hyun Yoo     I2CSlave *therm_mux, *cpuvr_mux;
997ece4cccdSGraeme Gregory 
998ece4cccdSGraeme Gregory     /* Create the generic DC-SCM hardware */
999ece4cccdSGraeme Gregory     qcom_dc_scm_bmc_i2c_init(bmc);
1000ece4cccdSGraeme Gregory 
1001ece4cccdSGraeme Gregory     /* Now create the Firework specific hardware */
10022a75e8c3SMaheswara Kurapati 
10032a7a5d5cSJae Hyun Yoo     /* I2C7 CPUVR MUX */
10042a7a5d5cSJae Hyun Yoo     cpuvr_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
10052a7a5d5cSJae Hyun Yoo                                         "pca9546", 0x70);
10062a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 0), "pca9548", 0x72);
10072a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 1), "pca9548", 0x72);
10082a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 2), "pca9548", 0x72);
10092a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 3), "pca9548", 0x72);
10102a7a5d5cSJae Hyun Yoo 
1011cfc68f16SMaheswara Kurapati     /* I2C8 Thermal Diodes*/
1012cfc68f16SMaheswara Kurapati     therm_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
1013cfc68f16SMaheswara Kurapati                                         "pca9548", 0x70);
1014cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 0), TYPE_LM75, 0x4C);
1015cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 1), TYPE_LM75, 0x4C);
1016cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 2), TYPE_LM75, 0x48);
1017cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 3), TYPE_LM75, 0x48);
1018cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 4), TYPE_LM75, 0x48);
1019cfc68f16SMaheswara Kurapati 
10202a75e8c3SMaheswara Kurapati     /* I2C9 Fan Controller (MAX31785) */
10212a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x52);
10222a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x54);
1023ece4cccdSGraeme Gregory }
1024ece4cccdSGraeme Gregory 
10251a15311aSCédric Le Goater static bool aspeed_get_mmio_exec(Object *obj, Error **errp)
10261a15311aSCédric Le Goater {
10271a15311aSCédric Le Goater     return ASPEED_MACHINE(obj)->mmio_exec;
10281a15311aSCédric Le Goater }
10291a15311aSCédric Le Goater 
10301a15311aSCédric Le Goater static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp)
10311a15311aSCédric Le Goater {
10321a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = value;
10331a15311aSCédric Le Goater }
10341a15311aSCédric Le Goater 
10351a15311aSCédric Le Goater static void aspeed_machine_instance_init(Object *obj)
10361a15311aSCédric Le Goater {
10371a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = false;
10381a15311aSCédric Le Goater }
10391a15311aSCédric Le Goater 
10409820e52fSCédric Le Goater static char *aspeed_get_fmc_model(Object *obj, Error **errp)
10419820e52fSCédric Le Goater {
10429820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10439820e52fSCédric Le Goater     return g_strdup(bmc->fmc_model);
10449820e52fSCédric Le Goater }
10459820e52fSCédric Le Goater 
10469820e52fSCédric Le Goater static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp)
10479820e52fSCédric Le Goater {
10489820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10499820e52fSCédric Le Goater 
10509820e52fSCédric Le Goater     g_free(bmc->fmc_model);
10519820e52fSCédric Le Goater     bmc->fmc_model = g_strdup(value);
10529820e52fSCédric Le Goater }
10539820e52fSCédric Le Goater 
10549820e52fSCédric Le Goater static char *aspeed_get_spi_model(Object *obj, Error **errp)
10559820e52fSCédric Le Goater {
10569820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10579820e52fSCédric Le Goater     return g_strdup(bmc->spi_model);
10589820e52fSCédric Le Goater }
10599820e52fSCédric Le Goater 
10609820e52fSCédric Le Goater static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp)
10619820e52fSCédric Le Goater {
10629820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10639820e52fSCédric Le Goater 
10649820e52fSCédric Le Goater     g_free(bmc->spi_model);
10659820e52fSCédric Le Goater     bmc->spi_model = g_strdup(value);
10669820e52fSCédric Le Goater }
10679820e52fSCédric Le Goater 
10681a15311aSCédric Le Goater static void aspeed_machine_class_props_init(ObjectClass *oc)
10691a15311aSCédric Le Goater {
10701a15311aSCédric Le Goater     object_class_property_add_bool(oc, "execute-in-place",
10711a15311aSCédric Le Goater                                    aspeed_get_mmio_exec,
1072d2623129SMarkus Armbruster                                    aspeed_set_mmio_exec);
10731a15311aSCédric Le Goater     object_class_property_set_description(oc, "execute-in-place",
10747eecec7dSMarkus Armbruster                            "boot directly from CE0 flash device");
10759820e52fSCédric Le Goater 
10769820e52fSCédric Le Goater     object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model,
10779820e52fSCédric Le Goater                                    aspeed_set_fmc_model);
10789820e52fSCédric Le Goater     object_class_property_set_description(oc, "fmc-model",
10799820e52fSCédric Le Goater                                           "Change the FMC Flash model");
10809820e52fSCédric Le Goater     object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model,
10819820e52fSCédric Le Goater                                    aspeed_set_spi_model);
10829820e52fSCédric Le Goater     object_class_property_set_description(oc, "spi-model",
10839820e52fSCédric Le Goater                                           "Change the SPI Flash model");
10841a15311aSCédric Le Goater }
10851a15311aSCédric Le Goater 
1086b7f1a0cbSCédric Le Goater static int aspeed_soc_num_cpus(const char *soc_name)
1087b7f1a0cbSCédric Le Goater {
1088b7f1a0cbSCédric Le Goater    AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(soc_name));
1089b7f1a0cbSCédric Le Goater    return sc->num_cpus;
1090b7f1a0cbSCédric Le Goater }
1091b7f1a0cbSCédric Le Goater 
1092fca9ca1bSCédric Le Goater static void aspeed_machine_class_init(ObjectClass *oc, void *data)
109362c2c2ebSCédric Le Goater {
109462c2c2ebSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1095d3bad7e7SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
109662c2c2ebSCédric Le Goater 
1097fca9ca1bSCédric Le Goater     mc->init = aspeed_machine_init;
109862c2c2ebSCédric Le Goater     mc->no_floppy = 1;
109962c2c2ebSCédric Le Goater     mc->no_cdrom = 1;
110062c2c2ebSCédric Le Goater     mc->no_parallel = 1;
1101afcbaed6SIgor Mammedov     mc->default_ram_id = "ram";
1102d3bad7e7SCédric Le Goater     amc->macs_mask = ASPEED_MAC0_ON;
11035d63d0c7SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART5;
11041a15311aSCédric Le Goater 
11051a15311aSCédric Le Goater     aspeed_machine_class_props_init(oc);
110662c2c2ebSCédric Le Goater }
110762c2c2ebSCédric Le Goater 
1108baa4732bSCédric Le Goater static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
1109baa4732bSCédric Le Goater {
1110baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1111baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1112baa4732bSCédric Le Goater 
1113baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Palmetto BMC (ARM926EJ-S)";
1114baa4732bSCédric Le Goater     amc->soc_name  = "ast2400-a1";
1115baa4732bSCédric Le Goater     amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1;
1116baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
111770322913SCédric Le Goater     amc->spi_model = "mx25l25635f";
1118baa4732bSCédric Le Goater     amc->num_cs    = 1;
1119baa4732bSCédric Le Goater     amc->i2c_init  = palmetto_bmc_i2c_init;
1120baa4732bSCédric Le Goater     mc->default_ram_size       = 256 * MiB;
1121b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1122b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1123baa4732bSCédric Le Goater };
1124baa4732bSCédric Le Goater 
11259cccb912SPatrick Venture static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data)
11269cccb912SPatrick Venture {
11279cccb912SPatrick Venture     MachineClass *mc = MACHINE_CLASS(oc);
11289cccb912SPatrick Venture     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
11299cccb912SPatrick Venture 
11309cccb912SPatrick Venture     mc->desc       = "Quanta-Q71l BMC (ARM926EJ-S)";
11319cccb912SPatrick Venture     amc->soc_name  = "ast2400-a1";
11329cccb912SPatrick Venture     amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1;
11339cccb912SPatrick Venture     amc->fmc_model = "n25q256a";
11349cccb912SPatrick Venture     amc->spi_model = "mx25l25635e";
11359cccb912SPatrick Venture     amc->num_cs    = 1;
11369cccb912SPatrick Venture     amc->i2c_init  = quanta_q71l_bmc_i2c_init;
11379cccb912SPatrick Venture     mc->default_ram_size       = 128 * MiB;
11389cccb912SPatrick Venture     mc->default_cpus = mc->min_cpus = mc->max_cpus =
11399cccb912SPatrick Venture         aspeed_soc_num_cpus(amc->soc_name);
11409cccb912SPatrick Venture }
11419cccb912SPatrick Venture 
114240a38df5SErik Smit static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc,
114340a38df5SErik Smit                                                         void *data)
114440a38df5SErik Smit {
114540a38df5SErik Smit     MachineClass *mc = MACHINE_CLASS(oc);
114640a38df5SErik Smit     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
114740a38df5SErik Smit 
114840a38df5SErik Smit     mc->desc       = "Supermicro X11 BMC (ARM926EJ-S)";
114940a38df5SErik Smit     amc->soc_name  = "ast2400-a1";
115040a38df5SErik Smit     amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1;
115140a38df5SErik Smit     amc->fmc_model = "mx25l25635e";
115240a38df5SErik Smit     amc->spi_model = "mx25l25635e";
115340a38df5SErik Smit     amc->num_cs    = 1;
115440a38df5SErik Smit     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
115540a38df5SErik Smit     amc->i2c_init  = palmetto_bmc_i2c_init;
115640a38df5SErik Smit     mc->default_ram_size = 256 * MiB;
115740a38df5SErik Smit }
115840a38df5SErik Smit 
115947936597SGuenter Roeck static void aspeed_machine_supermicro_x11spi_bmc_class_init(ObjectClass *oc,
116047936597SGuenter Roeck                                                             void *data)
116147936597SGuenter Roeck {
116247936597SGuenter Roeck     MachineClass *mc = MACHINE_CLASS(oc);
116347936597SGuenter Roeck     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
116447936597SGuenter Roeck 
116547936597SGuenter Roeck     mc->desc       = "Supermicro X11 SPI BMC (ARM1176)";
116647936597SGuenter Roeck     amc->soc_name  = "ast2500-a1";
116747936597SGuenter Roeck     amc->hw_strap1 = SUPERMICRO_X11SPI_BMC_HW_STRAP1;
116847936597SGuenter Roeck     amc->fmc_model = "mx25l25635e";
116947936597SGuenter Roeck     amc->spi_model = "mx25l25635e";
117047936597SGuenter Roeck     amc->num_cs    = 1;
117147936597SGuenter Roeck     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
117247936597SGuenter Roeck     amc->i2c_init  = palmetto_bmc_i2c_init;
117347936597SGuenter Roeck     mc->default_ram_size = 512 * MiB;
117447936597SGuenter Roeck     mc->default_cpus = mc->min_cpus = mc->max_cpus =
117547936597SGuenter Roeck         aspeed_soc_num_cpus(amc->soc_name);
117647936597SGuenter Roeck }
117747936597SGuenter Roeck 
1178baa4732bSCédric Le Goater static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data)
1179baa4732bSCédric Le Goater {
1180baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1181baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1182baa4732bSCédric Le Goater 
1183baa4732bSCédric Le Goater     mc->desc       = "Aspeed AST2500 EVB (ARM1176)";
1184baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1185baa4732bSCédric Le Goater     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
1186753abfc4SJae Hyun Yoo     amc->fmc_model = "mx25l25635e";
118770322913SCédric Le Goater     amc->spi_model = "mx25l25635f";
1188baa4732bSCédric Le Goater     amc->num_cs    = 1;
1189baa4732bSCédric Le Goater     amc->i2c_init  = ast2500_evb_i2c_init;
1190baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
1191b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1192b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1193baa4732bSCédric Le Goater };
1194baa4732bSCédric Le Goater 
119534f73a81SKarthikeyan Pasupathi static void aspeed_machine_yosemitev2_class_init(ObjectClass *oc, void *data)
119634f73a81SKarthikeyan Pasupathi {
119734f73a81SKarthikeyan Pasupathi     MachineClass *mc = MACHINE_CLASS(oc);
119834f73a81SKarthikeyan Pasupathi     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
119934f73a81SKarthikeyan Pasupathi 
120034f73a81SKarthikeyan Pasupathi     mc->desc       = "Facebook YosemiteV2 BMC (ARM1176)";
120134f73a81SKarthikeyan Pasupathi     amc->soc_name  = "ast2500-a1";
120234f73a81SKarthikeyan Pasupathi     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
120334f73a81SKarthikeyan Pasupathi     amc->hw_strap2 = 0;
120434f73a81SKarthikeyan Pasupathi     amc->fmc_model = "n25q256a";
120534f73a81SKarthikeyan Pasupathi     amc->spi_model = "mx25l25635e";
120634f73a81SKarthikeyan Pasupathi     amc->num_cs    = 2;
120734f73a81SKarthikeyan Pasupathi     amc->i2c_init  = yosemitev2_bmc_i2c_init;
120834f73a81SKarthikeyan Pasupathi     mc->default_ram_size       = 512 * MiB;
120934f73a81SKarthikeyan Pasupathi     mc->default_cpus = mc->min_cpus = mc->max_cpus =
121034f73a81SKarthikeyan Pasupathi         aspeed_soc_num_cpus(amc->soc_name);
121134f73a81SKarthikeyan Pasupathi };
121234f73a81SKarthikeyan Pasupathi 
1213baa4732bSCédric Le Goater static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data)
1214baa4732bSCédric Le Goater {
1215baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1216baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1217baa4732bSCédric Le Goater 
1218baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Romulus BMC (ARM1176)";
1219baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1220baa4732bSCédric Le Goater     amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1;
1221baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
1222baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1223baa4732bSCédric Le Goater     amc->num_cs    = 2;
1224baa4732bSCédric Le Goater     amc->i2c_init  = romulus_bmc_i2c_init;
1225baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
1226b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1227b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1228baa4732bSCédric Le Goater };
1229baa4732bSCédric Le Goater 
12306c323abaSKarthikeyan Pasupathi static void aspeed_machine_tiogapass_class_init(ObjectClass *oc, void *data)
12316c323abaSKarthikeyan Pasupathi {
12326c323abaSKarthikeyan Pasupathi     MachineClass *mc = MACHINE_CLASS(oc);
12336c323abaSKarthikeyan Pasupathi     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
12346c323abaSKarthikeyan Pasupathi 
12356c323abaSKarthikeyan Pasupathi     mc->desc       = "Facebook Tiogapass BMC (ARM1176)";
12366c323abaSKarthikeyan Pasupathi     amc->soc_name  = "ast2500-a1";
12376c323abaSKarthikeyan Pasupathi     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
12386c323abaSKarthikeyan Pasupathi     amc->hw_strap2 = 0;
12396c323abaSKarthikeyan Pasupathi     amc->fmc_model = "n25q256a";
12406c323abaSKarthikeyan Pasupathi     amc->spi_model = "mx25l25635e";
12416c323abaSKarthikeyan Pasupathi     amc->num_cs    = 2;
12426c323abaSKarthikeyan Pasupathi     amc->i2c_init  = tiogapass_bmc_i2c_init;
12436c323abaSKarthikeyan Pasupathi     mc->default_ram_size       = 1 * GiB;
12446c323abaSKarthikeyan Pasupathi     mc->default_cpus = mc->min_cpus = mc->max_cpus =
12456c323abaSKarthikeyan Pasupathi         aspeed_soc_num_cpus(amc->soc_name);
12466c323abaSKarthikeyan Pasupathi         aspeed_soc_num_cpus(amc->soc_name);
12476c323abaSKarthikeyan Pasupathi };
12486c323abaSKarthikeyan Pasupathi 
1249143b040fSPatrick Williams static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data)
1250143b040fSPatrick Williams {
1251143b040fSPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1252143b040fSPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1253143b040fSPatrick Williams 
1254143b040fSPatrick Williams     mc->desc       = "OCP SonoraPass BMC (ARM1176)";
1255143b040fSPatrick Williams     amc->soc_name  = "ast2500-a1";
1256143b040fSPatrick Williams     amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1;
1257143b040fSPatrick Williams     amc->fmc_model = "mx66l1g45g";
1258143b040fSPatrick Williams     amc->spi_model = "mx66l1g45g";
1259143b040fSPatrick Williams     amc->num_cs    = 2;
1260143b040fSPatrick Williams     amc->i2c_init  = sonorapass_bmc_i2c_init;
1261143b040fSPatrick Williams     mc->default_ram_size       = 512 * MiB;
1262b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1263b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1264143b040fSPatrick Williams };
1265143b040fSPatrick Williams 
1266baa4732bSCédric Le Goater static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data)
1267baa4732bSCédric Le Goater {
1268baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1269baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1270baa4732bSCédric Le Goater 
1271baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Witherspoon BMC (ARM1176)";
1272baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1273baa4732bSCédric Le Goater     amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1;
127470322913SCédric Le Goater     amc->fmc_model = "mx25l25635f";
1275baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1276baa4732bSCédric Le Goater     amc->num_cs    = 2;
1277baa4732bSCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init;
1278baa4732bSCédric Le Goater     mc->default_ram_size = 512 * MiB;
1279b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1280b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1281baa4732bSCédric Le Goater };
1282baa4732bSCédric Le Goater 
1283baa4732bSCédric Le Goater static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
1284baa4732bSCédric Le Goater {
1285baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1286baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1287baa4732bSCédric Le Goater 
1288f548f201SPeter Maydell     mc->desc       = "Aspeed AST2600 EVB (Cortex-A7)";
1289c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
1290baa4732bSCédric Le Goater     amc->hw_strap1 = AST2600_EVB_HW_STRAP1;
1291baa4732bSCédric Le Goater     amc->hw_strap2 = AST2600_EVB_HW_STRAP2;
1292753abfc4SJae Hyun Yoo     amc->fmc_model = "mx66u51235f";
1293baa4732bSCédric Le Goater     amc->spi_model = "mx66u51235f";
1294baa4732bSCédric Le Goater     amc->num_cs    = 1;
129529193286SGuenter Roeck     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON |
129629193286SGuenter Roeck                      ASPEED_MAC3_ON;
1297baa4732bSCédric Le Goater     amc->i2c_init  = ast2600_evb_i2c_init;
1298baa4732bSCédric Le Goater     mc->default_ram_size = 1 * GiB;
1299b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1300b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1301baa4732bSCédric Le Goater };
1302baa4732bSCédric Le Goater 
130363ceb818SCédric Le Goater static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data)
130463ceb818SCédric Le Goater {
130563ceb818SCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
130663ceb818SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
130763ceb818SCédric Le Goater 
1308f548f201SPeter Maydell     mc->desc       = "OpenPOWER Tacoma BMC (Cortex-A7)";
1309c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
131063ceb818SCédric Le Goater     amc->hw_strap1 = TACOMA_BMC_HW_STRAP1;
131163ceb818SCédric Le Goater     amc->hw_strap2 = TACOMA_BMC_HW_STRAP2;
131263ceb818SCédric Le Goater     amc->fmc_model = "mx66l1g45g";
131363ceb818SCédric Le Goater     amc->spi_model = "mx66l1g45g";
131463ceb818SCédric Le Goater     amc->num_cs    = 2;
1315d3bad7e7SCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON;
131663ceb818SCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init; /* Same board layout */
131763ceb818SCédric Le Goater     mc->default_ram_size = 1 * GiB;
1318b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1319b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
132063ceb818SCédric Le Goater };
132163ceb818SCédric Le Goater 
132295f068c8SJohn Wang static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data)
132395f068c8SJohn Wang {
132495f068c8SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
132595f068c8SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
132695f068c8SJohn Wang 
132795f068c8SJohn Wang     mc->desc       = "Bytedance G220A BMC (ARM1176)";
132895f068c8SJohn Wang     amc->soc_name  = "ast2500-a1";
132995f068c8SJohn Wang     amc->hw_strap1 = G220A_BMC_HW_STRAP1;
133095f068c8SJohn Wang     amc->fmc_model = "n25q512a";
133195f068c8SJohn Wang     amc->spi_model = "mx25l25635e";
133295f068c8SJohn Wang     amc->num_cs    = 2;
13335bb825c8SGuenter Roeck     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
133495f068c8SJohn Wang     amc->i2c_init  = g220a_bmc_i2c_init;
133595f068c8SJohn Wang     mc->default_ram_size = 1024 * MiB;
133695f068c8SJohn Wang     mc->default_cpus = mc->min_cpus = mc->max_cpus =
133795f068c8SJohn Wang         aspeed_soc_num_cpus(amc->soc_name);
133895f068c8SJohn Wang };
133995f068c8SJohn Wang 
134082b6a3f6SJohn Wang static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc, void *data)
134182b6a3f6SJohn Wang {
134282b6a3f6SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
134382b6a3f6SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
134482b6a3f6SJohn Wang 
134582b6a3f6SJohn Wang     mc->desc       = "Inspur FP5280G2 BMC (ARM1176)";
134682b6a3f6SJohn Wang     amc->soc_name  = "ast2500-a1";
134782b6a3f6SJohn Wang     amc->hw_strap1 = FP5280G2_BMC_HW_STRAP1;
134882b6a3f6SJohn Wang     amc->fmc_model = "n25q512a";
134982b6a3f6SJohn Wang     amc->spi_model = "mx25l25635e";
135082b6a3f6SJohn Wang     amc->num_cs    = 2;
135182b6a3f6SJohn Wang     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
135282b6a3f6SJohn Wang     amc->i2c_init  = fp5280g2_bmc_i2c_init;
135382b6a3f6SJohn Wang     mc->default_ram_size = 512 * MiB;
135482b6a3f6SJohn Wang     mc->default_cpus = mc->min_cpus = mc->max_cpus =
135582b6a3f6SJohn Wang         aspeed_soc_num_cpus(amc->soc_name);
135682b6a3f6SJohn Wang };
135782b6a3f6SJohn Wang 
135858e52bdbSCédric Le Goater static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data)
135958e52bdbSCédric Le Goater {
136058e52bdbSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
136158e52bdbSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
136258e52bdbSCédric Le Goater 
1363f548f201SPeter Maydell     mc->desc       = "IBM Rainier BMC (Cortex-A7)";
1364c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
136558e52bdbSCédric Le Goater     amc->hw_strap1 = RAINIER_BMC_HW_STRAP1;
136658e52bdbSCédric Le Goater     amc->hw_strap2 = RAINIER_BMC_HW_STRAP2;
136758e52bdbSCédric Le Goater     amc->fmc_model = "mx66l1g45g";
136858e52bdbSCédric Le Goater     amc->spi_model = "mx66l1g45g";
136958e52bdbSCédric Le Goater     amc->num_cs    = 2;
137058e52bdbSCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
137158e52bdbSCédric Le Goater     amc->i2c_init  = rainier_bmc_i2c_init;
137258e52bdbSCédric Le Goater     mc->default_ram_size = 1 * GiB;
137358e52bdbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
137458e52bdbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
137558e52bdbSCédric Le Goater };
137658e52bdbSCédric Le Goater 
1377febbe308SPeter Delevoryas /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */
1378febbe308SPeter Delevoryas #if HOST_LONG_BITS == 32
1379febbe308SPeter Delevoryas #define FUJI_BMC_RAM_SIZE (1 * GiB)
1380febbe308SPeter Delevoryas #else
1381febbe308SPeter Delevoryas #define FUJI_BMC_RAM_SIZE (2 * GiB)
1382febbe308SPeter Delevoryas #endif
1383febbe308SPeter Delevoryas 
1384febbe308SPeter Delevoryas static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data)
1385febbe308SPeter Delevoryas {
1386febbe308SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1387febbe308SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1388febbe308SPeter Delevoryas 
1389febbe308SPeter Delevoryas     mc->desc = "Facebook Fuji BMC (Cortex-A7)";
1390febbe308SPeter Delevoryas     amc->soc_name = "ast2600-a3";
1391febbe308SPeter Delevoryas     amc->hw_strap1 = FUJI_BMC_HW_STRAP1;
1392febbe308SPeter Delevoryas     amc->hw_strap2 = FUJI_BMC_HW_STRAP2;
1393febbe308SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1394febbe308SPeter Delevoryas     amc->spi_model = "mx66l1g45g";
1395febbe308SPeter Delevoryas     amc->num_cs = 2;
1396febbe308SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1397febbe308SPeter Delevoryas     amc->i2c_init = fuji_bmc_i2c_init;
1398febbe308SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART1;
1399febbe308SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
1400febbe308SPeter Delevoryas     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1401febbe308SPeter Delevoryas         aspeed_soc_num_cpus(amc->soc_name);
1402febbe308SPeter Delevoryas };
1403febbe308SPeter Delevoryas 
1404104bdaffSPatrick Williams /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */
1405104bdaffSPatrick Williams #if HOST_LONG_BITS == 32
1406104bdaffSPatrick Williams #define BLETCHLEY_BMC_RAM_SIZE (1 * GiB)
1407104bdaffSPatrick Williams #else
1408104bdaffSPatrick Williams #define BLETCHLEY_BMC_RAM_SIZE (2 * GiB)
1409104bdaffSPatrick Williams #endif
1410104bdaffSPatrick Williams 
1411a20c54b1SPatrick Williams static void aspeed_machine_bletchley_class_init(ObjectClass *oc, void *data)
1412a20c54b1SPatrick Williams {
1413a20c54b1SPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1414a20c54b1SPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1415a20c54b1SPatrick Williams 
1416a20c54b1SPatrick Williams     mc->desc       = "Facebook Bletchley BMC (Cortex-A7)";
1417a20c54b1SPatrick Williams     amc->soc_name  = "ast2600-a3";
1418a20c54b1SPatrick Williams     amc->hw_strap1 = BLETCHLEY_BMC_HW_STRAP1;
1419a20c54b1SPatrick Williams     amc->hw_strap2 = BLETCHLEY_BMC_HW_STRAP2;
1420a20c54b1SPatrick Williams     amc->fmc_model = "w25q01jvq";
1421a20c54b1SPatrick Williams     amc->spi_model = NULL;
1422a20c54b1SPatrick Williams     amc->num_cs    = 2;
1423a20c54b1SPatrick Williams     amc->macs_mask = ASPEED_MAC2_ON;
1424a20c54b1SPatrick Williams     amc->i2c_init  = bletchley_bmc_i2c_init;
1425104bdaffSPatrick Williams     mc->default_ram_size = BLETCHLEY_BMC_RAM_SIZE;
1426a20c54b1SPatrick Williams     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1427a20c54b1SPatrick Williams         aspeed_soc_num_cpus(amc->soc_name);
1428a20c54b1SPatrick Williams }
1429a20c54b1SPatrick Williams 
14307966d70fSJason A. Donenfeld static void fby35_reset(MachineState *state, ShutdownCause reason)
1431fa699e80SPeter Delevoryas {
1432fa699e80SPeter Delevoryas     AspeedMachineState *bmc = ASPEED_MACHINE(state);
1433fa699e80SPeter Delevoryas     AspeedGPIOState *gpio = &bmc->soc.gpio;
1434fa699e80SPeter Delevoryas 
14357966d70fSJason A. Donenfeld     qemu_devices_reset(reason);
1436fa699e80SPeter Delevoryas 
1437f0418558SPeter Delevoryas     /* Board ID: 7 (Class-1, 4 slots) */
1438fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV4", true, &error_fatal);
1439fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV5", true, &error_fatal);
1440fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV6", true, &error_fatal);
1441fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV7", false, &error_fatal);
1442f0418558SPeter Delevoryas 
1443f0418558SPeter Delevoryas     /* Slot presence pins, inverse polarity. (False means present) */
1444f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH4", false, &error_fatal);
1445f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH5", true, &error_fatal);
1446f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH6", true, &error_fatal);
1447f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH7", true, &error_fatal);
1448f0418558SPeter Delevoryas 
1449f0418558SPeter Delevoryas     /* Slot 12v power pins, normal polarity. (True means powered-on) */
1450f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB2", true, &error_fatal);
1451f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB3", false, &error_fatal);
1452f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB4", false, &error_fatal);
1453f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB5", false, &error_fatal);
1454fa699e80SPeter Delevoryas }
1455fa699e80SPeter Delevoryas 
1456fa699e80SPeter Delevoryas static void aspeed_machine_fby35_class_init(ObjectClass *oc, void *data)
1457fa699e80SPeter Delevoryas {
1458fa699e80SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1459fa699e80SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1460fa699e80SPeter Delevoryas 
1461fa699e80SPeter Delevoryas     mc->desc       = "Facebook fby35 BMC (Cortex-A7)";
1462fa699e80SPeter Delevoryas     mc->reset      = fby35_reset;
1463fa699e80SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1464fa699e80SPeter Delevoryas     amc->num_cs    = 2;
1465fa699e80SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1466fa699e80SPeter Delevoryas     amc->i2c_init  = fby35_i2c_init;
1467fa699e80SPeter Delevoryas     /* FIXME: Replace this macro with something more general */
1468fa699e80SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
1469fa699e80SPeter Delevoryas }
1470fa699e80SPeter Delevoryas 
147166c895b8SJamin Lin #define AST1030_INTERNAL_FLASH_SIZE (1024 * 1024)
147266c895b8SJamin Lin /* Main SYSCLK frequency in Hz (200MHz) */
147366c895b8SJamin Lin #define SYSCLK_FRQ 200000000ULL
147466c895b8SJamin Lin 
147566c895b8SJamin Lin static void aspeed_minibmc_machine_init(MachineState *machine)
147666c895b8SJamin Lin {
147766c895b8SJamin Lin     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
147866c895b8SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
147966c895b8SJamin Lin     Clock *sysclk;
148066c895b8SJamin Lin 
148166c895b8SJamin Lin     sysclk = clock_new(OBJECT(machine), "SYSCLK");
148266c895b8SJamin Lin     clock_set_hz(sysclk, SYSCLK_FRQ);
148366c895b8SJamin Lin 
148466c895b8SJamin Lin     object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
148566c895b8SJamin Lin     qdev_connect_clock_in(DEVICE(&bmc->soc), "sysclk", sysclk);
148666c895b8SJamin Lin 
14874dd9d554SPeter Delevoryas     object_property_set_link(OBJECT(&bmc->soc), "memory",
14884dd9d554SPeter Delevoryas                              OBJECT(get_system_memory()), &error_abort);
1489d2b3eaefSPeter Delevoryas     connect_serial_hds_to_uarts(bmc);
149066c895b8SJamin Lin     qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
149166c895b8SJamin Lin 
149266c895b8SJamin Lin     aspeed_board_init_flashes(&bmc->soc.fmc,
149366c895b8SJamin Lin                               bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
149466c895b8SJamin Lin                               amc->num_cs,
149566c895b8SJamin Lin                               0);
149666c895b8SJamin Lin 
149766c895b8SJamin Lin     aspeed_board_init_flashes(&bmc->soc.spi[0],
149866c895b8SJamin Lin                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
149966c895b8SJamin Lin                               amc->num_cs, amc->num_cs);
150066c895b8SJamin Lin 
150166c895b8SJamin Lin     aspeed_board_init_flashes(&bmc->soc.spi[1],
150266c895b8SJamin Lin                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
150366c895b8SJamin Lin                               amc->num_cs, (amc->num_cs * 2));
150466c895b8SJamin Lin 
150566c895b8SJamin Lin     if (amc->i2c_init) {
150666c895b8SJamin Lin         amc->i2c_init(bmc);
150766c895b8SJamin Lin     }
150866c895b8SJamin Lin 
150966c895b8SJamin Lin     armv7m_load_kernel(ARM_CPU(first_cpu),
151066c895b8SJamin Lin                        machine->kernel_filename,
1511761c532aSPeter Maydell                        0,
151266c895b8SJamin Lin                        AST1030_INTERNAL_FLASH_SIZE);
151366c895b8SJamin Lin }
151466c895b8SJamin Lin 
15154c70ab16STroy Lee static void ast1030_evb_i2c_init(AspeedMachineState *bmc)
15164c70ab16STroy Lee {
15174c70ab16STroy Lee     AspeedSoCState *soc = &bmc->soc;
15184c70ab16STroy Lee 
15194c70ab16STroy Lee     /* U10 24C08 connects to SDA/SCL Groupt 1 by default */
15204c70ab16STroy Lee     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
15214c70ab16STroy Lee     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, eeprom_buf);
15224c70ab16STroy Lee 
15234c70ab16STroy Lee     /* U11 LM75 connects to SDA/SCL Group 2 by default */
15244c70ab16STroy Lee     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d);
15254c70ab16STroy Lee }
15264c70ab16STroy Lee 
152766c895b8SJamin Lin static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc,
152866c895b8SJamin Lin                                                           void *data)
152966c895b8SJamin Lin {
153066c895b8SJamin Lin     MachineClass *mc = MACHINE_CLASS(oc);
153166c895b8SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
153266c895b8SJamin Lin 
153366c895b8SJamin Lin     mc->desc = "Aspeed AST1030 MiniBMC (Cortex-M4)";
153466c895b8SJamin Lin     amc->soc_name = "ast1030-a1";
153566c895b8SJamin Lin     amc->hw_strap1 = 0;
153666c895b8SJamin Lin     amc->hw_strap2 = 0;
153766c895b8SJamin Lin     mc->init = aspeed_minibmc_machine_init;
15384c70ab16STroy Lee     amc->i2c_init = ast1030_evb_i2c_init;
153966c895b8SJamin Lin     mc->default_ram_size = 0;
154066c895b8SJamin Lin     mc->default_cpus = mc->min_cpus = mc->max_cpus = 1;
154166c895b8SJamin Lin     amc->fmc_model = "sst25vf032b";
154266c895b8SJamin Lin     amc->spi_model = "sst25vf032b";
154366c895b8SJamin Lin     amc->num_cs = 2;
154466c895b8SJamin Lin     amc->macs_mask = 0;
154566c895b8SJamin Lin }
154666c895b8SJamin Lin 
1547fb6b3c8dSJae Hyun Yoo static void aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass *oc,
1548fb6b3c8dSJae Hyun Yoo                                                      void *data)
1549fb6b3c8dSJae Hyun Yoo {
1550fb6b3c8dSJae Hyun Yoo     MachineClass *mc = MACHINE_CLASS(oc);
1551fb6b3c8dSJae Hyun Yoo     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1552fb6b3c8dSJae Hyun Yoo 
1553fb6b3c8dSJae Hyun Yoo     mc->desc       = "Qualcomm DC-SCM V1 BMC (Cortex A7)";
1554fb6b3c8dSJae Hyun Yoo     amc->soc_name  = "ast2600-a3";
1555fb6b3c8dSJae Hyun Yoo     amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1556fb6b3c8dSJae Hyun Yoo     amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1557fb6b3c8dSJae Hyun Yoo     amc->fmc_model = "n25q512a";
1558fb6b3c8dSJae Hyun Yoo     amc->spi_model = "n25q512a";
1559fb6b3c8dSJae Hyun Yoo     amc->num_cs    = 2;
1560fb6b3c8dSJae Hyun Yoo     amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1561fb6b3c8dSJae Hyun Yoo     amc->i2c_init  = qcom_dc_scm_bmc_i2c_init;
1562fb6b3c8dSJae Hyun Yoo     mc->default_ram_size = 1 * GiB;
1563fb6b3c8dSJae Hyun Yoo     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1564fb6b3c8dSJae Hyun Yoo         aspeed_soc_num_cpus(amc->soc_name);
1565fb6b3c8dSJae Hyun Yoo };
1566fb6b3c8dSJae Hyun Yoo 
1567ece4cccdSGraeme Gregory static void aspeed_machine_qcom_firework_class_init(ObjectClass *oc,
1568ece4cccdSGraeme Gregory                                                     void *data)
1569ece4cccdSGraeme Gregory {
1570ece4cccdSGraeme Gregory     MachineClass *mc = MACHINE_CLASS(oc);
1571ece4cccdSGraeme Gregory     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1572ece4cccdSGraeme Gregory 
1573ece4cccdSGraeme Gregory     mc->desc       = "Qualcomm DC-SCM V1/Firework BMC (Cortex A7)";
1574ece4cccdSGraeme Gregory     amc->soc_name  = "ast2600-a3";
1575ece4cccdSGraeme Gregory     amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1576ece4cccdSGraeme Gregory     amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1577ece4cccdSGraeme Gregory     amc->fmc_model = "n25q512a";
1578ece4cccdSGraeme Gregory     amc->spi_model = "n25q512a";
1579ece4cccdSGraeme Gregory     amc->num_cs    = 2;
1580ece4cccdSGraeme Gregory     amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1581ece4cccdSGraeme Gregory     amc->i2c_init  = qcom_dc_scm_firework_i2c_init;
1582ece4cccdSGraeme Gregory     mc->default_ram_size = 1 * GiB;
1583ece4cccdSGraeme Gregory     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1584ece4cccdSGraeme Gregory         aspeed_soc_num_cpus(amc->soc_name);
1585ece4cccdSGraeme Gregory };
1586ece4cccdSGraeme Gregory 
1587baa4732bSCédric Le Goater static const TypeInfo aspeed_machine_types[] = {
1588baa4732bSCédric Le Goater     {
1589baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("palmetto-bmc"),
1590baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1591baa4732bSCédric Le Goater         .class_init    = aspeed_machine_palmetto_class_init,
1592baa4732bSCédric Le Goater     }, {
159340a38df5SErik Smit         .name          = MACHINE_TYPE_NAME("supermicrox11-bmc"),
159440a38df5SErik Smit         .parent        = TYPE_ASPEED_MACHINE,
159540a38df5SErik Smit         .class_init    = aspeed_machine_supermicrox11_bmc_class_init,
159640a38df5SErik Smit     }, {
159747936597SGuenter Roeck         .name          = MACHINE_TYPE_NAME("supermicro-x11spi-bmc"),
159847936597SGuenter Roeck         .parent        = TYPE_ASPEED_MACHINE,
159947936597SGuenter Roeck         .class_init    = aspeed_machine_supermicro_x11spi_bmc_class_init,
160047936597SGuenter Roeck     }, {
1601baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2500-evb"),
1602baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1603baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2500_evb_class_init,
1604baa4732bSCédric Le Goater     }, {
1605baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("romulus-bmc"),
1606baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1607baa4732bSCédric Le Goater         .class_init    = aspeed_machine_romulus_class_init,
1608baa4732bSCédric Le Goater     }, {
1609143b040fSPatrick Williams         .name          = MACHINE_TYPE_NAME("sonorapass-bmc"),
1610143b040fSPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1611143b040fSPatrick Williams         .class_init    = aspeed_machine_sonorapass_class_init,
1612143b040fSPatrick Williams     }, {
1613baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("witherspoon-bmc"),
1614baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1615baa4732bSCédric Le Goater         .class_init    = aspeed_machine_witherspoon_class_init,
1616baa4732bSCédric Le Goater     }, {
1617baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2600-evb"),
1618baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1619baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2600_evb_class_init,
1620baa4732bSCédric Le Goater     }, {
162134f73a81SKarthikeyan Pasupathi         .name          = MACHINE_TYPE_NAME("yosemitev2-bmc"),
162234f73a81SKarthikeyan Pasupathi         .parent        = TYPE_ASPEED_MACHINE,
162334f73a81SKarthikeyan Pasupathi         .class_init    = aspeed_machine_yosemitev2_class_init,
162434f73a81SKarthikeyan Pasupathi     }, {
162563ceb818SCédric Le Goater         .name          = MACHINE_TYPE_NAME("tacoma-bmc"),
162663ceb818SCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
162763ceb818SCédric Le Goater         .class_init    = aspeed_machine_tacoma_class_init,
162863ceb818SCédric Le Goater     }, {
16296c323abaSKarthikeyan Pasupathi         .name          = MACHINE_TYPE_NAME("tiogapass-bmc"),
16306c323abaSKarthikeyan Pasupathi         .parent        = TYPE_ASPEED_MACHINE,
16316c323abaSKarthikeyan Pasupathi         .class_init    = aspeed_machine_tiogapass_class_init,
16326c323abaSKarthikeyan Pasupathi     }, {
163395f068c8SJohn Wang         .name          = MACHINE_TYPE_NAME("g220a-bmc"),
163495f068c8SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
163595f068c8SJohn Wang         .class_init    = aspeed_machine_g220a_class_init,
163695f068c8SJohn Wang     }, {
1637fb6b3c8dSJae Hyun Yoo         .name          = MACHINE_TYPE_NAME("qcom-dc-scm-v1-bmc"),
1638fb6b3c8dSJae Hyun Yoo         .parent        = TYPE_ASPEED_MACHINE,
1639fb6b3c8dSJae Hyun Yoo         .class_init    = aspeed_machine_qcom_dc_scm_v1_class_init,
1640fb6b3c8dSJae Hyun Yoo     }, {
1641ece4cccdSGraeme Gregory         .name          = MACHINE_TYPE_NAME("qcom-firework-bmc"),
1642ece4cccdSGraeme Gregory         .parent        = TYPE_ASPEED_MACHINE,
1643ece4cccdSGraeme Gregory         .class_init    = aspeed_machine_qcom_firework_class_init,
1644ece4cccdSGraeme Gregory     }, {
164582b6a3f6SJohn Wang         .name          = MACHINE_TYPE_NAME("fp5280g2-bmc"),
164682b6a3f6SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
164782b6a3f6SJohn Wang         .class_init    = aspeed_machine_fp5280g2_class_init,
164882b6a3f6SJohn Wang     }, {
16499cccb912SPatrick Venture         .name          = MACHINE_TYPE_NAME("quanta-q71l-bmc"),
16509cccb912SPatrick Venture         .parent        = TYPE_ASPEED_MACHINE,
16519cccb912SPatrick Venture         .class_init    = aspeed_machine_quanta_q71l_class_init,
16529cccb912SPatrick Venture     }, {
165358e52bdbSCédric Le Goater         .name          = MACHINE_TYPE_NAME("rainier-bmc"),
165458e52bdbSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
165558e52bdbSCédric Le Goater         .class_init    = aspeed_machine_rainier_class_init,
165658e52bdbSCédric Le Goater     }, {
1657febbe308SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fuji-bmc"),
1658febbe308SPeter Delevoryas         .parent        = TYPE_ASPEED_MACHINE,
1659febbe308SPeter Delevoryas         .class_init    = aspeed_machine_fuji_class_init,
1660febbe308SPeter Delevoryas     }, {
1661a20c54b1SPatrick Williams         .name          = MACHINE_TYPE_NAME("bletchley-bmc"),
1662a20c54b1SPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1663a20c54b1SPatrick Williams         .class_init    = aspeed_machine_bletchley_class_init,
1664a20c54b1SPatrick Williams     }, {
1665fa699e80SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fby35-bmc"),
1666fa699e80SPeter Delevoryas         .parent        = MACHINE_TYPE_NAME("ast2600-evb"),
1667fa699e80SPeter Delevoryas         .class_init    = aspeed_machine_fby35_class_init,
1668fa699e80SPeter Delevoryas     }, {
166966c895b8SJamin Lin         .name           = MACHINE_TYPE_NAME("ast1030-evb"),
167066c895b8SJamin Lin         .parent         = TYPE_ASPEED_MACHINE,
167166c895b8SJamin Lin         .class_init     = aspeed_minibmc_machine_ast1030_evb_class_init,
167266c895b8SJamin Lin     }, {
1673fca9ca1bSCédric Le Goater         .name          = TYPE_ASPEED_MACHINE,
167462c2c2ebSCédric Le Goater         .parent        = TYPE_MACHINE,
1675888b2b03SPhilippe Mathieu-Daudé         .instance_size = sizeof(AspeedMachineState),
16761a15311aSCédric Le Goater         .instance_init = aspeed_machine_instance_init,
1677fca9ca1bSCédric Le Goater         .class_size    = sizeof(AspeedMachineClass),
1678fca9ca1bSCédric Le Goater         .class_init    = aspeed_machine_class_init,
1679baa4732bSCédric Le Goater         .abstract      = true,
1680baa4732bSCédric Le Goater     }
1681fca9ca1bSCédric Le Goater };
168274fb1f38SCédric Le Goater 
1683baa4732bSCédric Le Goater DEFINE_TYPES(aspeed_machine_types)
1684