xref: /qemu/hw/arm/aspeed.c (revision f65f6ad5a749bc2d24a083da3544f47a19e7e81f)
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;
43262259eaSCédric Le Goater     MemoryRegion boot_rom;
44888b2b03SPhilippe Mathieu-Daudé     bool mmio_exec;
45*f65f6ad5SCédric Le Goater     uint32_t uart_chosen;
469820e52fSCédric Le Goater     char *fmc_model;
479820e52fSCédric Le Goater     char *spi_model;
48ea066d39SThomas Huth };
49327d8e4eSAndrew Jeffery 
50ef17f836SCédric Le Goater /* Palmetto hardware value: 0x120CE416 */
518da33ef7SCédric Le Goater #define PALMETTO_BMC_HW_STRAP1 (                                        \
528da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_256MB) |               \
538da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2 /* DDR3 with CL=6, CWL=5 */) | \
548da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
558da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) |       \
568da33ef7SCédric Le Goater         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
578da33ef7SCédric Le Goater         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
588da33ef7SCédric Le Goater         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) |                \
598da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
608da33ef7SCédric Le Goater         SCU_HW_STRAP_SPI_WIDTH |                                        \
618da33ef7SCédric Le Goater         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
628da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
638da33ef7SCédric Le Goater 
6440a38df5SErik Smit /* TODO: Find the actual hardware value */
6540a38df5SErik Smit #define SUPERMICROX11_BMC_HW_STRAP1 (                                   \
6640a38df5SErik Smit         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) |               \
6740a38df5SErik Smit         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2) |                           \
6840a38df5SErik Smit         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
6940a38df5SErik Smit         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) |       \
7040a38df5SErik Smit         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
7140a38df5SErik Smit         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
7240a38df5SErik Smit         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) |                \
7340a38df5SErik Smit         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
7440a38df5SErik Smit         SCU_HW_STRAP_SPI_WIDTH |                                        \
7540a38df5SErik Smit         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
7640a38df5SErik Smit         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
7740a38df5SErik Smit 
7847936597SGuenter Roeck /* TODO: Find the actual hardware value */
7947936597SGuenter Roeck #define SUPERMICRO_X11SPI_BMC_HW_STRAP1 (                               \
8047936597SGuenter Roeck         AST2500_HW_STRAP1_DEFAULTS |                                    \
8147936597SGuenter Roeck         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
8247936597SGuenter Roeck         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
8347936597SGuenter Roeck         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
8447936597SGuenter Roeck         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
8547936597SGuenter Roeck         SCU_HW_STRAP_SPI_WIDTH |                                        \
8647936597SGuenter Roeck         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN))
8747936597SGuenter Roeck 
88ef17f836SCédric Le Goater /* AST2500 evb hardware value: 0xF100C2E6 */
899a7c1750SCédric Le Goater #define AST2500_EVB_HW_STRAP1 ((                                        \
909a7c1750SCédric Le Goater         AST2500_HW_STRAP1_DEFAULTS |                                    \
919a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
929a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
939a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
949a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
959a7c1750SCédric Le Goater         SCU_HW_STRAP_MAC1_RGMII |                                       \
969a7c1750SCédric Le Goater         SCU_HW_STRAP_MAC0_RGMII) &                                      \
979a7c1750SCédric Le Goater         ~SCU_HW_STRAP_2ND_BOOT_WDT)
989a7c1750SCédric Le Goater 
99ef17f836SCédric Le Goater /* Romulus hardware value: 0xF10AD206 */
100ef17f836SCédric Le Goater #define ROMULUS_BMC_HW_STRAP1 (                                         \
101ef17f836SCédric Le Goater         AST2500_HW_STRAP1_DEFAULTS |                                    \
102ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
103ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
104ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
105ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
106ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_ACPI_ENABLE |                              \
107ef17f836SCédric Le Goater         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER))
108ef17f836SCédric Le Goater 
109143b040fSPatrick Williams /* Sonorapass hardware value: 0xF100D216 */
110143b040fSPatrick Williams #define SONORAPASS_BMC_HW_STRAP1 (                                      \
111143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
112143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
113143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
114143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
115143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
116143b040fSPatrick Williams         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
117143b040fSPatrick Williams         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
118143b040fSPatrick Williams         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
119143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
120143b040fSPatrick Williams         SCU_HW_STRAP_VGA_BIOS_ROM |                                     \
121143b040fSPatrick Williams         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
122143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_RESERVED1)
123143b040fSPatrick Williams 
12495f068c8SJohn Wang #define G220A_BMC_HW_STRAP1 (                                      \
12595f068c8SJohn Wang         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
12695f068c8SJohn Wang         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
12795f068c8SJohn Wang         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
12895f068c8SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
12995f068c8SJohn Wang         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
13095f068c8SJohn Wang         SCU_HW_STRAP_2ND_BOOT_WDT |                                     \
13195f068c8SJohn Wang         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
13295f068c8SJohn Wang         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
13395f068c8SJohn Wang         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
13495f068c8SJohn Wang         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
13595f068c8SJohn Wang         SCU_HW_STRAP_VGA_SIZE_SET(VGA_64M_DRAM) |                       \
13695f068c8SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED1)
13795f068c8SJohn Wang 
13882b6a3f6SJohn Wang /* FP5280G2 hardware value: 0XF100D286 */
13982b6a3f6SJohn Wang #define FP5280G2_BMC_HW_STRAP1 (                                      \
14082b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
14182b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
14282b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
14382b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
14482b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
14582b6a3f6SJohn Wang         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
14682b6a3f6SJohn Wang         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
14782b6a3f6SJohn Wang         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
14882b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
14982b6a3f6SJohn Wang         SCU_HW_STRAP_MAC1_RGMII |                                       \
15082b6a3f6SJohn Wang         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
15182b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED1)
15282b6a3f6SJohn Wang 
15362c2c2ebSCédric Le Goater /* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */
15462c2c2ebSCédric Le Goater #define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1
15562c2c2ebSCédric Le Goater 
1569cccb912SPatrick Venture /* Quanta-Q71l hardware value */
1579cccb912SPatrick Venture #define QUANTA_Q71L_BMC_HW_STRAP1 (                                     \
1589cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) |               \
1599cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2/* DDR3 with CL=6, CWL=5 */) | \
1609cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
1619cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_24M_IN) |       \
1629cccb912SPatrick Venture         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
1639cccb912SPatrick Venture         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_PASS_THROUGH) |          \
1649cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
1659cccb912SPatrick Venture         SCU_HW_STRAP_SPI_WIDTH |                                        \
1669cccb912SPatrick Venture         SCU_HW_STRAP_VGA_SIZE_SET(VGA_8M_DRAM) |                        \
1679cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
1689cccb912SPatrick Venture 
169ccc2c418SCédric Le Goater /* AST2600 evb hardware value */
170ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP1 0x000000C0
171ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP2 0x00000003
172ccc2c418SCédric Le Goater 
17363ceb818SCédric Le Goater /* Tacoma hardware value */
17463ceb818SCédric Le Goater #define TACOMA_BMC_HW_STRAP1  0x00000000
1757582591aSJoel Stanley #define TACOMA_BMC_HW_STRAP2  0x00000040
17663ceb818SCédric Le Goater 
17758e52bdbSCédric Le Goater /* Rainier hardware value: (QEMU prototype) */
178b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP1 0x00422016
179b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP2 0x80000848
18058e52bdbSCédric Le Goater 
181febbe308SPeter Delevoryas /* Fuji hardware value */
182febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP1    0x00000000
183febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP2    0x00000000
184febbe308SPeter Delevoryas 
185a20c54b1SPatrick Williams /* Bletchley hardware value */
186a20c54b1SPatrick Williams /* TODO: Leave same as EVB for now. */
187a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP1 AST2600_EVB_HW_STRAP1
188a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP2 AST2600_EVB_HW_STRAP2
189a20c54b1SPatrick Williams 
190fb6b3c8dSJae Hyun Yoo /* Qualcomm DC-SCM hardware value */
191fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP1  0x00000000
192fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP2  0x00000041
193fb6b3c8dSJae Hyun Yoo 
1949bb6d140SJoel Stanley #define AST_SMP_MAILBOX_BASE            0x1e6e2180
1959bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_ENTRY        (AST_SMP_MAILBOX_BASE + 0x0)
1969bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_GOSIGN       (AST_SMP_MAILBOX_BASE + 0x4)
1979bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_READY        (AST_SMP_MAILBOX_BASE + 0x8)
1989bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_POLLINSN     (AST_SMP_MAILBOX_BASE + 0xc)
1999bb6d140SJoel Stanley #define AST_SMP_MBOX_CODE               (AST_SMP_MAILBOX_BASE + 0x10)
2009bb6d140SJoel Stanley #define AST_SMP_MBOX_GOSIGN             0xabbaab00
2019bb6d140SJoel Stanley 
2029bb6d140SJoel Stanley static void aspeed_write_smpboot(ARMCPU *cpu,
2039bb6d140SJoel Stanley                                  const struct arm_boot_info *info)
2049bb6d140SJoel Stanley {
205902bba54SCédric Le Goater     AddressSpace *as = arm_boot_address_space(cpu, info);
206902bba54SCédric Le Goater     static const ARMInsnFixup poll_mailbox_ready[] = {
2079bb6d140SJoel Stanley         /*
2089bb6d140SJoel Stanley          * r2 = per-cpu go sign value
2099bb6d140SJoel Stanley          * r1 = AST_SMP_MBOX_FIELD_ENTRY
2109bb6d140SJoel Stanley          * r0 = AST_SMP_MBOX_FIELD_GOSIGN
2119bb6d140SJoel Stanley          */
212902bba54SCédric Le Goater         { 0xee100fb0 },  /* mrc     p15, 0, r0, c0, c0, 5 */
213902bba54SCédric Le Goater         { 0xe21000ff },  /* ands    r0, r0, #255          */
214902bba54SCédric Le Goater         { 0xe59f201c },  /* ldr     r2, [pc, #28]         */
215902bba54SCédric Le Goater         { 0xe1822000 },  /* orr     r2, r2, r0            */
2169bb6d140SJoel Stanley 
217902bba54SCédric Le Goater         { 0xe59f1018 },  /* ldr     r1, [pc, #24]         */
218902bba54SCédric Le Goater         { 0xe59f0018 },  /* ldr     r0, [pc, #24]         */
2199bb6d140SJoel Stanley 
220902bba54SCédric Le Goater         { 0xe320f002 },  /* wfe                           */
221902bba54SCédric Le Goater         { 0xe5904000 },  /* ldr     r4, [r0]              */
222902bba54SCédric Le Goater         { 0xe1520004 },  /* cmp     r2, r4                */
223902bba54SCédric Le Goater         { 0x1afffffb },  /* bne     <wfe>                 */
224902bba54SCédric Le Goater         { 0xe591f000 },  /* ldr     pc, [r1]              */
225902bba54SCédric Le Goater         { AST_SMP_MBOX_GOSIGN },
226902bba54SCédric Le Goater         { AST_SMP_MBOX_FIELD_ENTRY },
227902bba54SCédric Le Goater         { AST_SMP_MBOX_FIELD_GOSIGN },
228902bba54SCédric Le Goater         { 0, FIXUP_TERMINATOR }
2299bb6d140SJoel Stanley     };
230902bba54SCédric Le Goater     static const uint32_t fixupcontext[FIXUP_MAX] = { 0 };
2319bb6d140SJoel Stanley 
232902bba54SCédric Le Goater     arm_write_bootloader("aspeed.smpboot", as, info->smp_loader_start,
233902bba54SCédric Le Goater                          poll_mailbox_ready, fixupcontext);
2349bb6d140SJoel Stanley }
2359bb6d140SJoel Stanley 
2369bb6d140SJoel Stanley static void aspeed_reset_secondary(ARMCPU *cpu,
2379bb6d140SJoel Stanley                                    const struct arm_boot_info *info)
2389bb6d140SJoel Stanley {
2399bb6d140SJoel Stanley     AddressSpace *as = arm_boot_address_space(cpu, info);
2409bb6d140SJoel Stanley     CPUState *cs = CPU(cpu);
2419bb6d140SJoel Stanley 
2429bb6d140SJoel Stanley     /* info->smp_bootreg_addr */
2439bb6d140SJoel Stanley     address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0,
2449bb6d140SJoel Stanley                                MEMTXATTRS_UNSPECIFIED, NULL);
2459bb6d140SJoel Stanley     cpu_set_pc(cs, info->smp_loader_start);
2469bb6d140SJoel Stanley }
2479bb6d140SJoel Stanley 
2488b744a6aSCédric Le Goater static void write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size,
249d769a1daSCédric Le Goater                            Error **errp)
250d769a1daSCédric Le Goater {
25105e6e40aSWentao_Liang     g_autofree void *storage = NULL;
2520c7209beSCédric Le Goater     int64_t size;
253d769a1daSCédric Le Goater 
2540c7209beSCédric Le Goater     /* The block backend size should have already been 'validated' by
2550c7209beSCédric Le Goater      * the creation of the m25p80 object.
2560c7209beSCédric Le Goater      */
2570c7209beSCédric Le Goater     size = blk_getlength(blk);
2580c7209beSCédric Le Goater     if (size <= 0) {
2590c7209beSCédric Le Goater         error_setg(errp, "failed to get flash size");
2600c7209beSCédric Le Goater         return;
2610c7209beSCédric Le Goater     }
2620c7209beSCédric Le Goater 
2630c7209beSCédric Le Goater     if (rom_size > size) {
2640c7209beSCédric Le Goater         rom_size = size;
265d769a1daSCédric Le Goater     }
266d769a1daSCédric Le Goater 
26705e6e40aSWentao_Liang     storage = g_malloc0(rom_size);
268a9262f55SAlberto Faria     if (blk_pread(blk, 0, rom_size, storage, 0) < 0) {
269d769a1daSCédric Le Goater         error_setg(errp, "failed to read the initial flash content");
270d769a1daSCédric Le Goater         return;
271d769a1daSCédric Le Goater     }
272d769a1daSCédric Le Goater 
273d769a1daSCédric Le Goater     rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr);
274d769a1daSCédric Le Goater }
275d769a1daSCédric Le Goater 
2768b744a6aSCédric Le Goater /*
2778b744a6aSCédric Le Goater  * Create a ROM and copy the flash contents at the expected address
2788b744a6aSCédric Le Goater  * (0x0). Boots faster than execute-in-place.
2798b744a6aSCédric Le Goater  */
280262259eaSCédric Le Goater static void aspeed_install_boot_rom(AspeedMachineState *bmc, BlockBackend *blk,
2818b744a6aSCédric Le Goater                                     uint64_t rom_size)
2828b744a6aSCédric Le Goater {
283262259eaSCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
2848b744a6aSCédric Le Goater 
285262259eaSCédric Le Goater     memory_region_init_rom(&bmc->boot_rom, NULL, "aspeed.boot_rom", rom_size,
2868b744a6aSCédric Le Goater                            &error_abort);
2878b744a6aSCédric Le Goater     memory_region_add_subregion_overlap(&soc->spi_boot_container, 0,
288262259eaSCédric Le Goater                                         &bmc->boot_rom, 1);
2898b744a6aSCédric Le Goater     write_boot_rom(blk, ASPEED_SOC_SPI_BOOT_ADDR, rom_size, &error_abort);
2908b744a6aSCédric Le Goater }
2918b744a6aSCédric Le Goater 
2921099ad10SPeter Delevoryas void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
2939bd4ac61SCédric Le Goater                                       unsigned int count, int unit0)
294e1ad9bc4SCédric Le Goater {
295e1ad9bc4SCédric Le Goater     int i;
296179b2058SPatrick Williams 
297179b2058SPatrick Williams     if (!flashtype) {
298179b2058SPatrick Williams         return;
299179b2058SPatrick Williams     }
300e1ad9bc4SCédric Le Goater 
3019bd4ac61SCédric Le Goater     for (i = 0; i < count; ++i) {
3028ec239f2SMarkus Armbruster         DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i);
303e1ad9bc4SCédric Le Goater         qemu_irq cs_line;
304a7d78befSCédric Le Goater         DeviceState *dev;
305e1ad9bc4SCédric Le Goater 
306a7d78befSCédric Le Goater         dev = qdev_new(flashtype);
307e1ad9bc4SCédric Le Goater         if (dinfo) {
308a7d78befSCédric Le Goater             qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo));
309e1ad9bc4SCédric Le Goater         }
310a7d78befSCédric Le Goater         qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal);
311e1ad9bc4SCédric Le Goater 
312a7d78befSCédric Le Goater         cs_line = qdev_get_gpio_in_named(dev, SSI_GPIO_CS, 0);
313b22a2d40SCédric Le Goater         qdev_connect_gpio_out_named(DEVICE(s), "cs", i, cs_line);
314e1ad9bc4SCédric Le Goater     }
315e1ad9bc4SCédric Le Goater }
316e1ad9bc4SCédric Le Goater 
317a29e3e12SAndrew Jeffery static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo)
318a29e3e12SAndrew Jeffery {
319a29e3e12SAndrew Jeffery         DeviceState *card;
320a29e3e12SAndrew Jeffery 
321756f739bSPhilippe Mathieu-Daudé         if (!dinfo) {
322756f739bSPhilippe Mathieu-Daudé             return;
323756f739bSPhilippe Mathieu-Daudé         }
3243e80f690SMarkus Armbruster         card = qdev_new(TYPE_SD_CARD);
325934df912SMarkus Armbruster         qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
326a29e3e12SAndrew Jeffery                                 &error_fatal);
3273e80f690SMarkus Armbruster         qdev_realize_and_unref(card,
3283e80f690SMarkus Armbruster                                qdev_get_child_bus(DEVICE(sdhci), "sd-bus"),
3293e80f690SMarkus Armbruster                                &error_fatal);
330a29e3e12SAndrew Jeffery }
331a29e3e12SAndrew Jeffery 
332d2b3eaefSPeter Delevoryas static void connect_serial_hds_to_uarts(AspeedMachineState *bmc)
333d2b3eaefSPeter Delevoryas {
334d2b3eaefSPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
335d2b3eaefSPeter Delevoryas     AspeedSoCState *s = &bmc->soc;
336d2b3eaefSPeter Delevoryas     AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
337*f65f6ad5SCédric Le Goater     int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default;
338d2b3eaefSPeter Delevoryas 
339*f65f6ad5SCédric Le Goater     aspeed_soc_uart_set_chr(s, uart_chosen, serial_hd(0));
340d2b3eaefSPeter Delevoryas     for (int i = 1, uart = ASPEED_DEV_UART1; i < sc->uarts_num; i++, uart++) {
341*f65f6ad5SCédric Le Goater         if (uart == uart_chosen) {
342d2b3eaefSPeter Delevoryas             continue;
343d2b3eaefSPeter Delevoryas         }
344d2b3eaefSPeter Delevoryas         aspeed_soc_uart_set_chr(s, uart, serial_hd(i));
345d2b3eaefSPeter Delevoryas     }
346d2b3eaefSPeter Delevoryas }
347d2b3eaefSPeter Delevoryas 
348baa4732bSCédric Le Goater static void aspeed_machine_init(MachineState *machine)
349327d8e4eSAndrew Jeffery {
350888b2b03SPhilippe Mathieu-Daudé     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
351baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
352b033271fSCédric Le Goater     AspeedSoCClass *sc;
3532bea128cSEddie James     int i;
354d3bad7e7SCédric Le Goater     NICInfo *nd = &nd_table[0];
355327d8e4eSAndrew Jeffery 
3569fc7fc4dSMarkus Armbruster     object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
357327d8e4eSAndrew Jeffery 
358b033271fSCédric Le Goater     sc = ASPEED_SOC_GET_CLASS(&bmc->soc);
359b033271fSCédric Le Goater 
360533eb415SIgor Mammedov     /*
361346160cbSCédric Le Goater      * This will error out if the RAM size is not supported by the
362346160cbSCédric Le Goater      * memory controller of the SoC.
363533eb415SIgor Mammedov      */
3646e504a98SPaolo Bonzini     object_property_set_uint(OBJECT(&bmc->soc), "ram-size", machine->ram_size,
365533eb415SIgor Mammedov                              &error_fatal);
366533eb415SIgor Mammedov 
367d3bad7e7SCédric Le Goater     for (i = 0; i < sc->macs_num; i++) {
368d3bad7e7SCédric Le Goater         if ((amc->macs_mask & (1 << i)) && nd->used) {
369d3bad7e7SCédric Le Goater             qemu_check_nic_model(nd, TYPE_FTGMAC100);
370d3bad7e7SCédric Le Goater             qdev_set_nic_properties(DEVICE(&bmc->soc.ftgmac100[i]), nd);
371d3bad7e7SCédric Le Goater             nd++;
372d3bad7e7SCédric Le Goater         }
373d3bad7e7SCédric Le Goater     }
374d3bad7e7SCédric Le Goater 
3755325cc34SMarkus Armbruster     object_property_set_int(OBJECT(&bmc->soc), "hw-strap1", amc->hw_strap1,
37687e79af0SAndrew Jeffery                             &error_abort);
3775325cc34SMarkus Armbruster     object_property_set_int(OBJECT(&bmc->soc), "hw-strap2", amc->hw_strap2,
378ccc2c418SCédric Le Goater                             &error_abort);
3794dd9d554SPeter Delevoryas     object_property_set_link(OBJECT(&bmc->soc), "memory",
3804dd9d554SPeter Delevoryas                              OBJECT(get_system_memory()), &error_abort);
3815325cc34SMarkus Armbruster     object_property_set_link(OBJECT(&bmc->soc), "dram",
3820df2d9a6SCédric Le Goater                              OBJECT(machine->ram), &error_abort);
383b6e70d1dSJoel Stanley     if (machine->kernel_filename) {
384b6e70d1dSJoel Stanley         /*
385b6e70d1dSJoel Stanley          * When booting with a -kernel command line there is no u-boot
386b6e70d1dSJoel Stanley          * that runs to unlock the SCU. In this case set the default to
387b6e70d1dSJoel Stanley          * be unlocked as the kernel expects
388b6e70d1dSJoel Stanley          */
3895325cc34SMarkus Armbruster         object_property_set_int(OBJECT(&bmc->soc), "hw-prot-key",
3905325cc34SMarkus Armbruster                                 ASPEED_SCU_PROT_KEY, &error_abort);
391b6e70d1dSJoel Stanley     }
392d2b3eaefSPeter Delevoryas     connect_serial_hds_to_uarts(bmc);
393ce189ab2SMarkus Armbruster     qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
394327d8e4eSAndrew Jeffery 
3958ec239f2SMarkus Armbruster     aspeed_board_init_flashes(&bmc->soc.fmc,
3968ec239f2SMarkus Armbruster                               bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
3979bd4ac61SCédric Le Goater                               amc->num_cs, 0);
3988ec239f2SMarkus Armbruster     aspeed_board_init_flashes(&bmc->soc.spi[0],
3998ec239f2SMarkus Armbruster                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
4009bd4ac61SCédric Le Goater                               1, amc->num_cs);
401e1ad9bc4SCédric Le Goater 
402b7f1a0cbSCédric Le Goater     if (machine->kernel_filename && sc->num_cpus > 1) {
4039bb6d140SJoel Stanley         /* With no u-boot we must set up a boot stub for the secondary CPU */
4049bb6d140SJoel Stanley         MemoryRegion *smpboot = g_new(MemoryRegion, 1);
405f489960dSPhilippe Mathieu-Daudé         memory_region_init_ram(smpboot, NULL, "aspeed.smpboot",
4069bb6d140SJoel Stanley                                0x80, &error_abort);
4079bb6d140SJoel Stanley         memory_region_add_subregion(get_system_memory(),
4089bb6d140SJoel Stanley                                     AST_SMP_MAILBOX_BASE, smpboot);
4099bb6d140SJoel Stanley 
4109bb6d140SJoel Stanley         aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot;
4119bb6d140SJoel Stanley         aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary;
4129bb6d140SJoel Stanley         aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE;
4139bb6d140SJoel Stanley     }
4149bb6d140SJoel Stanley 
4156e504a98SPaolo Bonzini     aspeed_board_binfo.ram_size = machine->ram_size;
416347df6f8SEduardo Habkost     aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM];
417b033271fSCédric Le Goater 
418baa4732bSCédric Le Goater     if (amc->i2c_init) {
419baa4732bSCédric Le Goater         amc->i2c_init(bmc);
4202cf6cb50SCédric Le Goater     }
4212cf6cb50SCédric Le Goater 
4220e2c24c6SAndrew Jeffery     for (i = 0; i < bmc->soc.sdhci.num_slots; i++) {
4238ec239f2SMarkus Armbruster         sdhci_attach_drive(&bmc->soc.sdhci.slots[i],
4248ec239f2SMarkus Armbruster                            drive_get(IF_SD, 0, i));
425a29e3e12SAndrew Jeffery     }
4262bea128cSEddie James 
427a29e3e12SAndrew Jeffery     if (bmc->soc.emmc.num_slots) {
4288ec239f2SMarkus Armbruster         sdhci_attach_drive(&bmc->soc.emmc.slots[0],
4298ec239f2SMarkus Armbruster                            drive_get(IF_SD, 0, bmc->soc.sdhci.num_slots));
4302bea128cSEddie James     }
4312bea128cSEddie James 
4328b744a6aSCédric Le Goater     if (!bmc->mmio_exec) {
4338b744a6aSCédric Le Goater         DriveInfo *mtd0 = drive_get(IF_MTD, 0, 0);
4348b744a6aSCédric Le Goater 
4358b744a6aSCédric Le Goater         if (mtd0) {
4368b744a6aSCédric Le Goater             uint64_t rom_size = memory_region_size(&bmc->soc.spi_boot);
437262259eaSCédric Le Goater             aspeed_install_boot_rom(bmc, blk_by_legacy_dinfo(mtd0), rom_size);
4388b744a6aSCédric Le Goater         }
4398b744a6aSCédric Le Goater     }
4408b744a6aSCédric Le Goater 
4412744ece8STao Xu     arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo);
442327d8e4eSAndrew Jeffery }
443327d8e4eSAndrew Jeffery 
444612b219aSPhilippe Mathieu-Daudé static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
4452cf6cb50SCédric Le Goater {
4462cf6cb50SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
447a87e81b9SCédric Le Goater     DeviceState *dev;
4483d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
4492cf6cb50SCédric Le Goater 
4502cf6cb50SCédric Le Goater     /* The palmetto platform expects a ds3231 RTC but a ds1338 is
4512cf6cb50SCédric Le Goater      * enough to provide basic RTC features. Alarms will be missing */
4521373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
453a87e81b9SCédric Le Goater 
4547a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
4553d165f12SCédric Le Goater                           eeprom_buf);
4563d165f12SCédric Le Goater 
457a87e81b9SCédric Le Goater     /* add a TMP423 temperature sensor */
4581373b15bSPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
4591373b15bSPhilippe Mathieu-Daudé                                          "tmp423", 0x4c));
4605325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
4615325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
4625325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
4635325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort);
4642cf6cb50SCédric Le Goater }
4652cf6cb50SCédric Le Goater 
4669cccb912SPatrick Venture static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc)
4679cccb912SPatrick Venture {
4689cccb912SPatrick Venture     AspeedSoCState *soc = &bmc->soc;
4699cccb912SPatrick Venture 
4709cccb912SPatrick Venture     /*
4719cccb912SPatrick Venture      * The quanta-q71l platform expects tmp75s which are compatible with
4729cccb912SPatrick Venture      * tmp105s.
4739cccb912SPatrick Venture      */
4749cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c);
4759cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e);
4769cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f);
4779cccb912SPatrick Venture 
4789cccb912SPatrick Venture     /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */
4799cccb912SPatrick Venture     /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */
4809cccb912SPatrick Venture     /* TODO: Add Memory Riser i2c mux and eeproms. */
4819cccb912SPatrick Venture 
4823ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74);
4833ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77);
4843ec75e39SPatrick Venture 
4859cccb912SPatrick Venture     /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */
4863ec75e39SPatrick Venture 
4873ec75e39SPatrick Venture     /* i2c-7 */
4883ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70);
4899cccb912SPatrick Venture     /*        - i2c@0: pmbus@59 */
4909cccb912SPatrick Venture     /*        - i2c@1: pmbus@58 */
4919cccb912SPatrick Venture     /*        - i2c@2: pmbus@58 */
4929cccb912SPatrick Venture     /*        - i2c@3: pmbus@59 */
4933ec75e39SPatrick Venture 
4949cccb912SPatrick Venture     /* TODO: i2c-7: Add PDB FRU eeprom@52 */
4959cccb912SPatrick Venture     /* TODO: i2c-8: Add BMC FRU eeprom@50 */
4969cccb912SPatrick Venture }
4979cccb912SPatrick Venture 
498612b219aSPhilippe Mathieu-Daudé static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
4992cf6cb50SCédric Le Goater {
5002cf6cb50SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
5013d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
5023d165f12SCédric Le Goater 
5037a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50,
5043d165f12SCédric Le Goater                           eeprom_buf);
5052cf6cb50SCédric Le Goater 
5062cf6cb50SCédric Le Goater     /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
5071373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
508044475f3SPhilippe Mathieu-Daudé                      TYPE_TMP105, 0x4d);
5092cf6cb50SCédric Le Goater }
5102cf6cb50SCédric Le Goater 
511612b219aSPhilippe Mathieu-Daudé static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
512ccc2c418SCédric Le Goater {
51352bcd997SHoward Chiu     AspeedSoCState *soc = &bmc->soc;
51452bcd997SHoward Chiu     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
51552bcd997SHoward Chiu 
51652bcd997SHoward Chiu     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50,
51752bcd997SHoward Chiu                           eeprom_buf);
51852bcd997SHoward Chiu 
51952bcd997SHoward Chiu     /* LM75 is compatible with TMP105 driver */
52052bcd997SHoward Chiu     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
52152bcd997SHoward Chiu                      TYPE_TMP105, 0x4d);
522ccc2c418SCédric Le Goater }
523ccc2c418SCédric Le Goater 
52434f73a81SKarthikeyan Pasupathi static void yosemitev2_bmc_i2c_init(AspeedMachineState *bmc)
52534f73a81SKarthikeyan Pasupathi {
52634f73a81SKarthikeyan Pasupathi     AspeedSoCState *soc = &bmc->soc;
52734f73a81SKarthikeyan Pasupathi 
52834f73a81SKarthikeyan Pasupathi     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x51, 128 * KiB);
52934f73a81SKarthikeyan Pasupathi     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 128 * KiB,
53034f73a81SKarthikeyan Pasupathi                           yosemitev2_bmc_fruid, yosemitev2_bmc_fruid_len);
5310a1f86baSKarthikeyan Pasupathi     /* TMP421 */
5320a1f86baSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "tmp421", 0x1f);
5330a1f86baSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4e);
5340a1f86baSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4f);
5350a1f86baSKarthikeyan Pasupathi 
53634f73a81SKarthikeyan Pasupathi }
53734f73a81SKarthikeyan Pasupathi 
538612b219aSPhilippe Mathieu-Daudé static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
5396c4567c7SCédric Le Goater {
5406c4567c7SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
5416c4567c7SCédric Le Goater 
5426c4567c7SCédric Le Goater     /* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
5436c4567c7SCédric Le Goater      * good enough */
5441373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
5456c4567c7SCédric Le Goater }
5466c4567c7SCédric Le Goater 
5476c323abaSKarthikeyan Pasupathi static void tiogapass_bmc_i2c_init(AspeedMachineState *bmc)
5486c323abaSKarthikeyan Pasupathi {
5496c323abaSKarthikeyan Pasupathi     AspeedSoCState *soc = &bmc->soc;
5506c323abaSKarthikeyan Pasupathi 
5516c323abaSKarthikeyan Pasupathi     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 128 * KiB);
5526c323abaSKarthikeyan Pasupathi     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 6), 0x54, 128 * KiB,
5536c323abaSKarthikeyan Pasupathi                           tiogapass_bmc_fruid, tiogapass_bmc_fruid_len);
554a09d357dSKarthikeyan Pasupathi     /* TMP421 */
555a09d357dSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "tmp421", 0x1f);
556a09d357dSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4f);
557a09d357dSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4e);
5586c323abaSKarthikeyan Pasupathi }
5596c323abaSKarthikeyan Pasupathi 
560f4aec252SCédric Le Goater static void create_pca9552(AspeedSoCState *soc, int bus_id, int addr)
561f4aec252SCédric Le Goater {
562f4aec252SCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, bus_id),
563f4aec252SCédric Le Goater                             TYPE_PCA9552, addr);
564f4aec252SCédric Le Goater }
565f4aec252SCédric Le Goater 
566612b219aSPhilippe Mathieu-Daudé static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc)
567143b040fSPatrick Williams {
568143b040fSPatrick Williams     AspeedSoCState *soc = &bmc->soc;
569143b040fSPatrick Williams 
570143b040fSPatrick Williams     /* bus 2 : */
5711373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48);
5721373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49);
573143b040fSPatrick Williams     /* bus 2 : pca9546 @ 0x73 */
574143b040fSPatrick Williams 
575143b040fSPatrick Williams     /* bus 3 : pca9548 @ 0x70 */
576143b040fSPatrick Williams 
577143b040fSPatrick Williams     /* bus 4 : */
578143b040fSPatrick Williams     uint8_t *eeprom4_54 = g_malloc0(8 * 1024);
5797a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54,
580143b040fSPatrick Williams                           eeprom4_54);
581143b040fSPatrick Williams     /* PCA9539 @ 0x76, but PCA9552 is compatible */
582f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x76);
583143b040fSPatrick Williams     /* PCA9539 @ 0x77, but PCA9552 is compatible */
584f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x77);
585143b040fSPatrick Williams 
586143b040fSPatrick Williams     /* bus 6 : */
5871373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48);
5881373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49);
589143b040fSPatrick Williams     /* bus 6 : pca9546 @ 0x73 */
590143b040fSPatrick Williams 
591143b040fSPatrick Williams     /* bus 8 : */
592143b040fSPatrick Williams     uint8_t *eeprom8_56 = g_malloc0(8 * 1024);
5937a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56,
594143b040fSPatrick Williams                           eeprom8_56);
595f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x60);
596f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x61);
597143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1d */
598143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1f */
599143b040fSPatrick Williams 
600143b040fSPatrick Williams     /*
601143b040fSPatrick Williams      * bus 13 : pca9548 @ 0x71
602143b040fSPatrick Williams      *      - channel 3:
603143b040fSPatrick Williams      *          - tmm421 @ 0x4c
604143b040fSPatrick Williams      *          - tmp421 @ 0x4e
605143b040fSPatrick Williams      *          - tmp421 @ 0x4f
606143b040fSPatrick Williams      */
607143b040fSPatrick Williams 
608143b040fSPatrick Williams }
609143b040fSPatrick Williams 
610612b219aSPhilippe Mathieu-Daudé static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
61162c2c2ebSCédric Le Goater {
6127cfbde5eSPhilippe Mathieu-Daudé     static const struct {
6137cfbde5eSPhilippe Mathieu-Daudé         unsigned gpio_id;
6147cfbde5eSPhilippe Mathieu-Daudé         LEDColor color;
6157cfbde5eSPhilippe Mathieu-Daudé         const char *description;
6167cfbde5eSPhilippe Mathieu-Daudé         bool gpio_polarity;
6177cfbde5eSPhilippe Mathieu-Daudé     } pca1_leds[] = {
6187cfbde5eSPhilippe Mathieu-Daudé         {13, LED_COLOR_GREEN, "front-fault-4",  GPIO_POLARITY_ACTIVE_LOW},
6197cfbde5eSPhilippe Mathieu-Daudé         {14, LED_COLOR_GREEN, "front-power-3",  GPIO_POLARITY_ACTIVE_LOW},
6207cfbde5eSPhilippe Mathieu-Daudé         {15, LED_COLOR_GREEN, "front-id-5",     GPIO_POLARITY_ACTIVE_LOW},
6217cfbde5eSPhilippe Mathieu-Daudé     };
62262c2c2ebSCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
6233d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
62415ce12cfSPhilippe Mathieu-Daudé     DeviceState *dev;
6257cfbde5eSPhilippe Mathieu-Daudé     LEDState *led;
62662c2c2ebSCédric Le Goater 
62763ceb818SCédric Le Goater     /* Bus 3: TODO bmp280@77 */
628db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
62915ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca1");
6302616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
6312616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 3),
63215ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
6338c9a61d7SCédric Le Goater 
6347cfbde5eSPhilippe Mathieu-Daudé     for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) {
6357cfbde5eSPhilippe Mathieu-Daudé         led = led_create_simple(OBJECT(bmc),
6367cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].gpio_polarity,
6377cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].color,
6387cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].description);
6397cfbde5eSPhilippe Mathieu-Daudé         qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id,
6407cfbde5eSPhilippe Mathieu-Daudé                               qdev_get_gpio_in(DEVICE(led), 0));
6417cfbde5eSPhilippe Mathieu-Daudé     }
642b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76);
6432a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "max31785", 0x52);
6441373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c);
6451373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c);
64662c2c2ebSCédric Le Goater 
64762c2c2ebSCédric Le Goater     /* The Witherspoon expects a TMP275 but a TMP105 is compatible */
6481373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105,
649044475f3SPhilippe Mathieu-Daudé                      0x4a);
6506c4567c7SCédric Le Goater 
6516c4567c7SCédric Le Goater     /* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
6526c4567c7SCédric Le Goater      * good enough */
6531373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
6543d165f12SCédric Le Goater 
6557a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51,
6563d165f12SCédric Le Goater                           eeprom_buf);
657db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
65815ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca0");
6592616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
6602616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 11),
66115ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
66263ceb818SCédric Le Goater     /* Bus 11: TODO ucd90160@64 */
66362c2c2ebSCédric Le Goater }
66462c2c2ebSCédric Le Goater 
66595f068c8SJohn Wang static void g220a_bmc_i2c_init(AspeedMachineState *bmc)
66695f068c8SJohn Wang {
66795f068c8SJohn Wang     AspeedSoCState *soc = &bmc->soc;
66895f068c8SJohn Wang     DeviceState *dev;
66995f068c8SJohn Wang 
67095f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3),
67195f068c8SJohn Wang                                          "emc1413", 0x4c));
67295f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
67395f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
67495f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
67595f068c8SJohn Wang 
67695f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12),
67795f068c8SJohn Wang                                          "emc1413", 0x4c));
67895f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
67995f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
68095f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
68195f068c8SJohn Wang 
68295f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13),
68395f068c8SJohn Wang                                          "emc1413", 0x4c));
68495f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
68595f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
68695f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
6876f5f6507SJohn Wang 
6886f5f6507SJohn Wang     static uint8_t eeprom_buf[2 * 1024] = {
6896f5f6507SJohn Wang             0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe,
6906f5f6507SJohn Wang             0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65,
6916f5f6507SJohn Wang             0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32,
6926f5f6507SJohn Wang             0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42,
6936f5f6507SJohn Wang             0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45,
6946f5f6507SJohn Wang             0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1,
6956f5f6507SJohn Wang             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7,
6966f5f6507SJohn Wang     };
6976f5f6507SJohn Wang     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57,
6986f5f6507SJohn Wang                           eeprom_buf);
69995f068c8SJohn Wang }
70095f068c8SJohn Wang 
70182b6a3f6SJohn Wang static void fp5280g2_bmc_i2c_init(AspeedMachineState *bmc)
70282b6a3f6SJohn Wang {
70382b6a3f6SJohn Wang     AspeedSoCState *soc = &bmc->soc;
70482b6a3f6SJohn Wang     I2CSlave *i2c_mux;
70582b6a3f6SJohn Wang 
70682b6a3f6SJohn Wang     /* The at24c256 */
70782b6a3f6SJohn Wang     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 1), 0x50, 32768);
70882b6a3f6SJohn Wang 
70982b6a3f6SJohn Wang     /* The fp5280g2 expects a TMP112 but a TMP105 is compatible */
71082b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
71182b6a3f6SJohn Wang                      0x48);
71282b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
71382b6a3f6SJohn Wang                      0x49);
71482b6a3f6SJohn Wang 
71582b6a3f6SJohn Wang     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
71682b6a3f6SJohn Wang                      "pca9546", 0x70);
71782b6a3f6SJohn Wang     /* It expects a TMP112 but a TMP105 is compatible */
71882b6a3f6SJohn Wang     i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0), TYPE_TMP105,
71982b6a3f6SJohn Wang                      0x4a);
72082b6a3f6SJohn Wang 
72182b6a3f6SJohn Wang     /* It expects a ds3232 but a ds1338 is good enough */
72282b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "ds1338", 0x68);
72382b6a3f6SJohn Wang 
72482b6a3f6SJohn Wang     /* It expects a pca9555 but a pca9552 is compatible */
725f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x30);
72682b6a3f6SJohn Wang }
72782b6a3f6SJohn Wang 
72858e52bdbSCédric Le Goater static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
72958e52bdbSCédric Le Goater {
73058e52bdbSCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
731fa6d98c0SJoel Stanley     I2CSlave *i2c_mux;
732fa6d98c0SJoel Stanley 
7339077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB);
73458e52bdbSCédric Le Goater 
735f4aec252SCédric Le Goater     create_pca9552(soc, 3, 0x61);
736bcb122f8SJoel Stanley 
73758e52bdbSCédric Le Goater     /* The rainier expects a TMP275 but a TMP105 is compatible */
73858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
73958e52bdbSCédric Le Goater                      0x48);
74058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
74158e52bdbSCédric Le Goater                      0x49);
74258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
74358e52bdbSCédric Le Goater                      0x4a);
744fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4),
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);
7489077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB);
749f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x60);
75058e52bdbSCédric Le Goater 
75158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
75258e52bdbSCédric Le Goater                      0x48);
75358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
75458e52bdbSCédric Le Goater                      0x49);
755f4aec252SCédric Le Goater     create_pca9552(soc, 5, 0x60);
756f4aec252SCédric Le Goater     create_pca9552(soc, 5, 0x61);
757fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5),
758fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
7599077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
7609077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
76158e52bdbSCédric Le Goater 
76258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
76358e52bdbSCédric Le Goater                      0x48);
76458e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
76558e52bdbSCédric Le Goater                      0x4a);
76658e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
76758e52bdbSCédric Le Goater                      0x4b);
768fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6),
769fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
7709077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
7719077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
7729077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB);
7739077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB);
77458e52bdbSCédric Le Goater 
775f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x30);
776f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x31);
777f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x32);
778f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x33);
779f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x60);
780f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x61);
781b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76);
78258e52bdbSCédric Le Goater     /* Bus 7: TODO si7021-a20@20 */
78358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105,
78458e52bdbSCédric Le Goater                      0x48);
7852a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "max31785", 0x52);
7869077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB);
7879077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB);
78858e52bdbSCédric Le Goater 
78958e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
79058e52bdbSCédric Le Goater                      0x48);
79158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
79258e52bdbSCédric Le Goater                      0x4a);
793be85508fSNinad Palsule     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50,
794be85508fSNinad Palsule                           64 * KiB, rainier_bb_fruid, rainier_bb_fruid_len);
795be85508fSNinad Palsule     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51,
796be85508fSNinad Palsule                           64 * KiB, rainier_bmc_fruid, rainier_bmc_fruid_len);
797f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x60);
798f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x61);
79958e52bdbSCédric Le Goater     /* Bus 8: ucd90320@11 */
80058e52bdbSCédric Le Goater     /* Bus 8: ucd90320@b */
80158e52bdbSCédric Le Goater     /* Bus 8: ucd90320@c */
80258e52bdbSCédric Le Goater 
80358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c);
80458e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d);
8059077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB);
80658e52bdbSCédric Le Goater 
80758e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c);
80858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d);
8099077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB);
81058e52bdbSCédric Le Goater 
81158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
81258e52bdbSCédric Le Goater                      0x48);
81358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
81458e52bdbSCédric Le Goater                      0x49);
815fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11),
816fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
8179077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
8189077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
819f4aec252SCédric Le Goater     create_pca9552(soc, 11, 0x60);
820fa6d98c0SJoel Stanley 
821fa6d98c0SJoel Stanley 
8229077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB);
823f4aec252SCédric Le Goater     create_pca9552(soc, 13, 0x60);
824fa6d98c0SJoel Stanley 
8259077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB);
826f4aec252SCédric Le Goater     create_pca9552(soc, 14, 0x60);
827fa6d98c0SJoel Stanley 
8289077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB);
829f4aec252SCédric Le Goater     create_pca9552(soc, 15, 0x60);
83058e52bdbSCédric Le Goater }
83158e52bdbSCédric Le Goater 
832febbe308SPeter Delevoryas static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr,
833febbe308SPeter Delevoryas                                  I2CBus **channels)
834febbe308SPeter Delevoryas {
835febbe308SPeter Delevoryas     I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr);
836febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
837febbe308SPeter Delevoryas         channels[i] = pca954x_i2c_get_bus(mux, i);
838febbe308SPeter Delevoryas     }
839febbe308SPeter Delevoryas }
840febbe308SPeter Delevoryas 
841febbe308SPeter Delevoryas #define TYPE_LM75 TYPE_TMP105
842febbe308SPeter Delevoryas #define TYPE_TMP75 TYPE_TMP105
843febbe308SPeter Delevoryas #define TYPE_TMP422 "tmp422"
844febbe308SPeter Delevoryas 
845febbe308SPeter Delevoryas static void fuji_bmc_i2c_init(AspeedMachineState *bmc)
846febbe308SPeter Delevoryas {
847febbe308SPeter Delevoryas     AspeedSoCState *soc = &bmc->soc;
848febbe308SPeter Delevoryas     I2CBus *i2c[144] = {};
849febbe308SPeter Delevoryas 
850febbe308SPeter Delevoryas     for (int i = 0; i < 16; i++) {
851febbe308SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
852febbe308SPeter Delevoryas     }
853febbe308SPeter Delevoryas     I2CBus *i2c180 = i2c[2];
854febbe308SPeter Delevoryas     I2CBus *i2c480 = i2c[8];
855febbe308SPeter Delevoryas     I2CBus *i2c600 = i2c[11];
856febbe308SPeter Delevoryas 
857febbe308SPeter Delevoryas     get_pca9548_channels(i2c180, 0x70, &i2c[16]);
858febbe308SPeter Delevoryas     get_pca9548_channels(i2c480, 0x70, &i2c[24]);
859febbe308SPeter Delevoryas     /* NOTE: The device tree skips [32, 40) in the alias numbering */
860febbe308SPeter Delevoryas     get_pca9548_channels(i2c600, 0x77, &i2c[40]);
861febbe308SPeter Delevoryas     get_pca9548_channels(i2c[24], 0x71, &i2c[48]);
862febbe308SPeter Delevoryas     get_pca9548_channels(i2c[25], 0x72, &i2c[56]);
863febbe308SPeter Delevoryas     get_pca9548_channels(i2c[26], 0x76, &i2c[64]);
864febbe308SPeter Delevoryas     get_pca9548_channels(i2c[27], 0x76, &i2c[72]);
865febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
866febbe308SPeter Delevoryas         get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]);
867febbe308SPeter Delevoryas     }
868febbe308SPeter Delevoryas 
869febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c);
870febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d);
871febbe308SPeter Delevoryas 
872ef0eb67eSSittisak Sinprem     /*
873ef0eb67eSSittisak Sinprem      * EEPROM 24c64 size is 64Kbits or 8 Kbytes
874ef0eb67eSSittisak Sinprem      *        24c02 size is 2Kbits or 256 bytes
875ef0eb67eSSittisak Sinprem      */
876ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[19], 0x52, 8 * KiB);
877ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[20], 0x50, 256);
878ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[22], 0x52, 256);
879febbe308SPeter Delevoryas 
880febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x48);
881febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x49);
882febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x4a);
883febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_TMP422, 0x4c);
884febbe308SPeter Delevoryas 
885ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[8], 0x51, 8 * KiB);
886febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a);
887febbe308SPeter Delevoryas 
888febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[50], TYPE_LM75, 0x4c);
889ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[50], 0x52, 8 * KiB);
890febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[51], TYPE_TMP75, 0x48);
891febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[52], TYPE_TMP75, 0x49);
892febbe308SPeter Delevoryas 
893febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[59], TYPE_TMP75, 0x48);
894febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[60], TYPE_TMP75, 0x49);
895febbe308SPeter Delevoryas 
896ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[65], 0x53, 8 * KiB);
897febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x49);
898febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x48);
899ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[68], 0x52, 8 * KiB);
900ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[69], 0x52, 8 * KiB);
901ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[70], 0x52, 8 * KiB);
902ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[71], 0x52, 8 * KiB);
903febbe308SPeter Delevoryas 
904ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[73], 0x53, 8 * KiB);
905febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x49);
906febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x48);
907ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[76], 0x52, 8 * KiB);
908ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[77], 0x52, 8 * KiB);
909ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[78], 0x52, 8 * KiB);
910ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[79], 0x52, 8 * KiB);
911ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[28], 0x50, 256);
912febbe308SPeter Delevoryas 
913febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
9149077e09aSPeter Delevoryas         at24c_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB);
915febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[82 + i * 8], TYPE_TMP75, 0x48);
916febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[83 + i * 8], TYPE_TMP75, 0x4b);
917febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[84 + i * 8], TYPE_TMP75, 0x4a);
918febbe308SPeter Delevoryas     }
919febbe308SPeter Delevoryas }
920febbe308SPeter Delevoryas 
921a20c54b1SPatrick Williams #define TYPE_TMP421 "tmp421"
922a20c54b1SPatrick Williams 
923a20c54b1SPatrick Williams static void bletchley_bmc_i2c_init(AspeedMachineState *bmc)
924a20c54b1SPatrick Williams {
925a20c54b1SPatrick Williams     AspeedSoCState *soc = &bmc->soc;
926a20c54b1SPatrick Williams     I2CBus *i2c[13] = {};
927a20c54b1SPatrick Williams     for (int i = 0; i < 13; i++) {
928a20c54b1SPatrick Williams         if ((i == 8) || (i == 11)) {
929a20c54b1SPatrick Williams             continue;
930a20c54b1SPatrick Williams         }
931a20c54b1SPatrick Williams         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
932a20c54b1SPatrick Williams     }
933a20c54b1SPatrick Williams 
934a20c54b1SPatrick Williams     /* Bus 0 - 5 all have the same config. */
935a20c54b1SPatrick Williams     for (int i = 0; i < 6; i++) {
936a20c54b1SPatrick Williams         /* Missing model: ti,ina230 @ 0x45 */
937a20c54b1SPatrick Williams         /* Missing model: mps,mp5023 @ 0x40 */
938a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_TMP421, 0x4f);
939a20c54b1SPatrick Williams         /* Missing model: nxp,pca9539 @ 0x76, but PCA9552 works enough */
940a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x76);
941a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x67);
942a20c54b1SPatrick Williams         /* Missing model: fsc,fusb302 @ 0x22 */
943a20c54b1SPatrick Williams     }
944a20c54b1SPatrick Williams 
945a20c54b1SPatrick Williams     /* Bus 6 */
946a20c54b1SPatrick Williams     at24c_eeprom_init(i2c[6], 0x56, 65536);
947a20c54b1SPatrick Williams     /* Missing model: nxp,pcf85263 @ 0x51 , but ds1338 works enough */
948a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[6], "ds1338", 0x51);
949a20c54b1SPatrick Williams 
950a20c54b1SPatrick Williams 
951a20c54b1SPatrick Williams     /* Bus 7 */
952a20c54b1SPatrick Williams     at24c_eeprom_init(i2c[7], 0x54, 65536);
953a20c54b1SPatrick Williams 
954a20c54b1SPatrick Williams     /* Bus 9 */
955a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[9], TYPE_TMP421, 0x4f);
956a20c54b1SPatrick Williams 
957a20c54b1SPatrick Williams     /* Bus 10 */
958a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[10], TYPE_TMP421, 0x4f);
959a20c54b1SPatrick Williams     /* Missing model: ti,hdc1080 @ 0x40 */
960a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[10], TYPE_PCA9552, 0x67);
961a20c54b1SPatrick Williams 
962a20c54b1SPatrick Williams     /* Bus 12 */
963a20c54b1SPatrick Williams     /* Missing model: adi,adm1278 @ 0x11 */
964a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4c);
965a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4d);
966a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_PCA9552, 0x67);
967a20c54b1SPatrick Williams }
968a20c54b1SPatrick Williams 
969fa699e80SPeter Delevoryas static void fby35_i2c_init(AspeedMachineState *bmc)
970fa699e80SPeter Delevoryas {
971fa699e80SPeter Delevoryas     AspeedSoCState *soc = &bmc->soc;
972fa699e80SPeter Delevoryas     I2CBus *i2c[16];
973fa699e80SPeter Delevoryas 
974fa699e80SPeter Delevoryas     for (int i = 0; i < 16; i++) {
975fa699e80SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
976fa699e80SPeter Delevoryas     }
977fa699e80SPeter Delevoryas 
978fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[2], TYPE_LM75, 0x4f);
979fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_TMP421, 0x1f);
980fa699e80SPeter Delevoryas     /* Hotswap controller is actually supposed to be mp5920 or ltc4282. */
981fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[11], "adm1272", 0x44);
982fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4e);
983fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4f);
984fa699e80SPeter Delevoryas 
9859077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[4], 0x51, 128 * KiB);
9869077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[6], 0x51, 128 * KiB);
987c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[8], 0x50, 32 * KiB, fby35_nic_fruid,
988c0216b94SPeter Delevoryas                           fby35_nic_fruid_len);
989c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[11], 0x51, 128 * KiB, fby35_bb_fruid,
990c0216b94SPeter Delevoryas                           fby35_bb_fruid_len);
991c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[11], 0x54, 128 * KiB, fby35_bmc_fruid,
992c0216b94SPeter Delevoryas                           fby35_bmc_fruid_len);
993fa699e80SPeter Delevoryas 
994fa699e80SPeter Delevoryas     /*
995fa699e80SPeter Delevoryas      * TODO: There is a multi-master i2c connection to an AST1030 MiniBMC on
996fa699e80SPeter Delevoryas      * buses 0, 1, 2, 3, and 9. Source address 0x10, target address 0x20 on
997fa699e80SPeter Delevoryas      * each.
998fa699e80SPeter Delevoryas      */
999fa699e80SPeter Delevoryas }
1000fa699e80SPeter Delevoryas 
1001fb6b3c8dSJae Hyun Yoo static void qcom_dc_scm_bmc_i2c_init(AspeedMachineState *bmc)
1002fb6b3c8dSJae Hyun Yoo {
1003fb6b3c8dSJae Hyun Yoo     AspeedSoCState *soc = &bmc->soc;
1004fb6b3c8dSJae Hyun Yoo 
1005fb6b3c8dSJae Hyun Yoo     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 15), "tmp105", 0x4d);
1006fb6b3c8dSJae Hyun Yoo }
1007fb6b3c8dSJae Hyun Yoo 
1008ece4cccdSGraeme Gregory static void qcom_dc_scm_firework_i2c_init(AspeedMachineState *bmc)
1009ece4cccdSGraeme Gregory {
1010ece4cccdSGraeme Gregory     AspeedSoCState *soc = &bmc->soc;
10112a7a5d5cSJae Hyun Yoo     I2CSlave *therm_mux, *cpuvr_mux;
1012ece4cccdSGraeme Gregory 
1013ece4cccdSGraeme Gregory     /* Create the generic DC-SCM hardware */
1014ece4cccdSGraeme Gregory     qcom_dc_scm_bmc_i2c_init(bmc);
1015ece4cccdSGraeme Gregory 
1016ece4cccdSGraeme Gregory     /* Now create the Firework specific hardware */
10172a75e8c3SMaheswara Kurapati 
10182a7a5d5cSJae Hyun Yoo     /* I2C7 CPUVR MUX */
10192a7a5d5cSJae Hyun Yoo     cpuvr_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
10202a7a5d5cSJae Hyun Yoo                                         "pca9546", 0x70);
10212a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 0), "pca9548", 0x72);
10222a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 1), "pca9548", 0x72);
10232a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 2), "pca9548", 0x72);
10242a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 3), "pca9548", 0x72);
10252a7a5d5cSJae Hyun Yoo 
1026cfc68f16SMaheswara Kurapati     /* I2C8 Thermal Diodes*/
1027cfc68f16SMaheswara Kurapati     therm_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
1028cfc68f16SMaheswara Kurapati                                         "pca9548", 0x70);
1029cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 0), TYPE_LM75, 0x4C);
1030cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 1), TYPE_LM75, 0x4C);
1031cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 2), TYPE_LM75, 0x48);
1032cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 3), TYPE_LM75, 0x48);
1033cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 4), TYPE_LM75, 0x48);
1034cfc68f16SMaheswara Kurapati 
10352a75e8c3SMaheswara Kurapati     /* I2C9 Fan Controller (MAX31785) */
10362a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x52);
10372a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x54);
1038ece4cccdSGraeme Gregory }
1039ece4cccdSGraeme Gregory 
10401a15311aSCédric Le Goater static bool aspeed_get_mmio_exec(Object *obj, Error **errp)
10411a15311aSCédric Le Goater {
10421a15311aSCédric Le Goater     return ASPEED_MACHINE(obj)->mmio_exec;
10431a15311aSCédric Le Goater }
10441a15311aSCédric Le Goater 
10451a15311aSCédric Le Goater static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp)
10461a15311aSCédric Le Goater {
10471a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = value;
10481a15311aSCédric Le Goater }
10491a15311aSCédric Le Goater 
10501a15311aSCédric Le Goater static void aspeed_machine_instance_init(Object *obj)
10511a15311aSCédric Le Goater {
10521a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = false;
10531a15311aSCédric Le Goater }
10541a15311aSCédric Le Goater 
10559820e52fSCédric Le Goater static char *aspeed_get_fmc_model(Object *obj, Error **errp)
10569820e52fSCédric Le Goater {
10579820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10589820e52fSCédric Le Goater     return g_strdup(bmc->fmc_model);
10599820e52fSCédric Le Goater }
10609820e52fSCédric Le Goater 
10619820e52fSCédric Le Goater static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp)
10629820e52fSCédric Le Goater {
10639820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10649820e52fSCédric Le Goater 
10659820e52fSCédric Le Goater     g_free(bmc->fmc_model);
10669820e52fSCédric Le Goater     bmc->fmc_model = g_strdup(value);
10679820e52fSCédric Le Goater }
10689820e52fSCédric Le Goater 
10699820e52fSCédric Le Goater static char *aspeed_get_spi_model(Object *obj, Error **errp)
10709820e52fSCédric Le Goater {
10719820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10729820e52fSCédric Le Goater     return g_strdup(bmc->spi_model);
10739820e52fSCédric Le Goater }
10749820e52fSCédric Le Goater 
10759820e52fSCédric Le Goater static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp)
10769820e52fSCédric Le Goater {
10779820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10789820e52fSCédric Le Goater 
10799820e52fSCédric Le Goater     g_free(bmc->spi_model);
10809820e52fSCédric Le Goater     bmc->spi_model = g_strdup(value);
10819820e52fSCédric Le Goater }
10829820e52fSCédric Le Goater 
1083*f65f6ad5SCédric Le Goater static char *aspeed_get_bmc_console(Object *obj, Error **errp)
1084*f65f6ad5SCédric Le Goater {
1085*f65f6ad5SCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1086*f65f6ad5SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
1087*f65f6ad5SCédric Le Goater     int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default;
1088*f65f6ad5SCédric Le Goater 
1089*f65f6ad5SCédric Le Goater     return g_strdup_printf("uart%d", uart_chosen - ASPEED_DEV_UART1 + 1);
1090*f65f6ad5SCédric Le Goater }
1091*f65f6ad5SCédric Le Goater 
1092*f65f6ad5SCédric Le Goater static void aspeed_set_bmc_console(Object *obj, const char *value, Error **errp)
1093*f65f6ad5SCédric Le Goater {
1094*f65f6ad5SCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1095*f65f6ad5SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
1096*f65f6ad5SCédric Le Goater     AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(amc->soc_name));
1097*f65f6ad5SCédric Le Goater     int val;
1098*f65f6ad5SCédric Le Goater 
1099*f65f6ad5SCédric Le Goater     if (sscanf(value, "uart%u", &val) != 1) {
1100*f65f6ad5SCédric Le Goater         error_setg(errp, "Bad value for \"uart\" property");
1101*f65f6ad5SCédric Le Goater         return;
1102*f65f6ad5SCédric Le Goater     }
1103*f65f6ad5SCédric Le Goater 
1104*f65f6ad5SCédric Le Goater     /* The number of UART depends on the SoC */
1105*f65f6ad5SCédric Le Goater     if (val < 1 || val > sc->uarts_num) {
1106*f65f6ad5SCédric Le Goater         error_setg(errp, "\"uart\" should be in range [1 - %d]", sc->uarts_num);
1107*f65f6ad5SCédric Le Goater         return;
1108*f65f6ad5SCédric Le Goater     }
1109*f65f6ad5SCédric Le Goater     bmc->uart_chosen = ASPEED_DEV_UART1 + val - 1;
1110*f65f6ad5SCédric Le Goater }
1111*f65f6ad5SCédric Le Goater 
11121a15311aSCédric Le Goater static void aspeed_machine_class_props_init(ObjectClass *oc)
11131a15311aSCédric Le Goater {
11141a15311aSCédric Le Goater     object_class_property_add_bool(oc, "execute-in-place",
11151a15311aSCédric Le Goater                                    aspeed_get_mmio_exec,
1116d2623129SMarkus Armbruster                                    aspeed_set_mmio_exec);
11171a15311aSCédric Le Goater     object_class_property_set_description(oc, "execute-in-place",
11187eecec7dSMarkus Armbruster                            "boot directly from CE0 flash device");
11199820e52fSCédric Le Goater 
1120*f65f6ad5SCédric Le Goater     object_class_property_add_str(oc, "bmc-console", aspeed_get_bmc_console,
1121*f65f6ad5SCédric Le Goater                                   aspeed_set_bmc_console);
1122*f65f6ad5SCédric Le Goater     object_class_property_set_description(oc, "bmc-console",
1123*f65f6ad5SCédric Le Goater                            "Change the default UART to \"uartX\"");
1124*f65f6ad5SCédric Le Goater 
11259820e52fSCédric Le Goater     object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model,
11269820e52fSCédric Le Goater                                    aspeed_set_fmc_model);
11279820e52fSCédric Le Goater     object_class_property_set_description(oc, "fmc-model",
11289820e52fSCédric Le Goater                                           "Change the FMC Flash model");
11299820e52fSCédric Le Goater     object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model,
11309820e52fSCédric Le Goater                                    aspeed_set_spi_model);
11319820e52fSCédric Le Goater     object_class_property_set_description(oc, "spi-model",
11329820e52fSCédric Le Goater                                           "Change the SPI Flash model");
11331a15311aSCédric Le Goater }
11341a15311aSCédric Le Goater 
1135b7f1a0cbSCédric Le Goater static int aspeed_soc_num_cpus(const char *soc_name)
1136b7f1a0cbSCédric Le Goater {
1137b7f1a0cbSCédric Le Goater    AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(soc_name));
1138b7f1a0cbSCédric Le Goater    return sc->num_cpus;
1139b7f1a0cbSCédric Le Goater }
1140b7f1a0cbSCédric Le Goater 
1141fca9ca1bSCédric Le Goater static void aspeed_machine_class_init(ObjectClass *oc, void *data)
114262c2c2ebSCédric Le Goater {
114362c2c2ebSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1144d3bad7e7SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
114562c2c2ebSCédric Le Goater 
1146fca9ca1bSCédric Le Goater     mc->init = aspeed_machine_init;
114762c2c2ebSCédric Le Goater     mc->no_floppy = 1;
114862c2c2ebSCédric Le Goater     mc->no_cdrom = 1;
114962c2c2ebSCédric Le Goater     mc->no_parallel = 1;
1150afcbaed6SIgor Mammedov     mc->default_ram_id = "ram";
1151d3bad7e7SCédric Le Goater     amc->macs_mask = ASPEED_MAC0_ON;
11525d63d0c7SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART5;
11531a15311aSCédric Le Goater 
11541a15311aSCédric Le Goater     aspeed_machine_class_props_init(oc);
115562c2c2ebSCédric Le Goater }
115662c2c2ebSCédric Le Goater 
1157baa4732bSCédric Le Goater static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
1158baa4732bSCédric Le Goater {
1159baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1160baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1161baa4732bSCédric Le Goater 
1162baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Palmetto BMC (ARM926EJ-S)";
1163baa4732bSCédric Le Goater     amc->soc_name  = "ast2400-a1";
1164baa4732bSCédric Le Goater     amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1;
1165baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
116670322913SCédric Le Goater     amc->spi_model = "mx25l25635f";
1167baa4732bSCédric Le Goater     amc->num_cs    = 1;
1168baa4732bSCédric Le Goater     amc->i2c_init  = palmetto_bmc_i2c_init;
1169baa4732bSCédric Le Goater     mc->default_ram_size       = 256 * MiB;
1170b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1171b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1172baa4732bSCédric Le Goater };
1173baa4732bSCédric Le Goater 
11749cccb912SPatrick Venture static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data)
11759cccb912SPatrick Venture {
11769cccb912SPatrick Venture     MachineClass *mc = MACHINE_CLASS(oc);
11779cccb912SPatrick Venture     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
11789cccb912SPatrick Venture 
11799cccb912SPatrick Venture     mc->desc       = "Quanta-Q71l BMC (ARM926EJ-S)";
11809cccb912SPatrick Venture     amc->soc_name  = "ast2400-a1";
11819cccb912SPatrick Venture     amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1;
11829cccb912SPatrick Venture     amc->fmc_model = "n25q256a";
11839cccb912SPatrick Venture     amc->spi_model = "mx25l25635e";
11849cccb912SPatrick Venture     amc->num_cs    = 1;
11859cccb912SPatrick Venture     amc->i2c_init  = quanta_q71l_bmc_i2c_init;
11869cccb912SPatrick Venture     mc->default_ram_size       = 128 * MiB;
11879cccb912SPatrick Venture     mc->default_cpus = mc->min_cpus = mc->max_cpus =
11889cccb912SPatrick Venture         aspeed_soc_num_cpus(amc->soc_name);
11899cccb912SPatrick Venture }
11909cccb912SPatrick Venture 
119140a38df5SErik Smit static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc,
119240a38df5SErik Smit                                                         void *data)
119340a38df5SErik Smit {
119440a38df5SErik Smit     MachineClass *mc = MACHINE_CLASS(oc);
119540a38df5SErik Smit     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
119640a38df5SErik Smit 
119740a38df5SErik Smit     mc->desc       = "Supermicro X11 BMC (ARM926EJ-S)";
119840a38df5SErik Smit     amc->soc_name  = "ast2400-a1";
119940a38df5SErik Smit     amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1;
120040a38df5SErik Smit     amc->fmc_model = "mx25l25635e";
120140a38df5SErik Smit     amc->spi_model = "mx25l25635e";
120240a38df5SErik Smit     amc->num_cs    = 1;
120340a38df5SErik Smit     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
120440a38df5SErik Smit     amc->i2c_init  = palmetto_bmc_i2c_init;
120540a38df5SErik Smit     mc->default_ram_size = 256 * MiB;
120640a38df5SErik Smit }
120740a38df5SErik Smit 
120847936597SGuenter Roeck static void aspeed_machine_supermicro_x11spi_bmc_class_init(ObjectClass *oc,
120947936597SGuenter Roeck                                                             void *data)
121047936597SGuenter Roeck {
121147936597SGuenter Roeck     MachineClass *mc = MACHINE_CLASS(oc);
121247936597SGuenter Roeck     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
121347936597SGuenter Roeck 
121447936597SGuenter Roeck     mc->desc       = "Supermicro X11 SPI BMC (ARM1176)";
121547936597SGuenter Roeck     amc->soc_name  = "ast2500-a1";
121647936597SGuenter Roeck     amc->hw_strap1 = SUPERMICRO_X11SPI_BMC_HW_STRAP1;
121747936597SGuenter Roeck     amc->fmc_model = "mx25l25635e";
121847936597SGuenter Roeck     amc->spi_model = "mx25l25635e";
121947936597SGuenter Roeck     amc->num_cs    = 1;
122047936597SGuenter Roeck     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
122147936597SGuenter Roeck     amc->i2c_init  = palmetto_bmc_i2c_init;
122247936597SGuenter Roeck     mc->default_ram_size = 512 * MiB;
122347936597SGuenter Roeck     mc->default_cpus = mc->min_cpus = mc->max_cpus =
122447936597SGuenter Roeck         aspeed_soc_num_cpus(amc->soc_name);
122547936597SGuenter Roeck }
122647936597SGuenter Roeck 
1227baa4732bSCédric Le Goater static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data)
1228baa4732bSCédric Le Goater {
1229baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1230baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1231baa4732bSCédric Le Goater 
1232baa4732bSCédric Le Goater     mc->desc       = "Aspeed AST2500 EVB (ARM1176)";
1233baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1234baa4732bSCédric Le Goater     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
1235753abfc4SJae Hyun Yoo     amc->fmc_model = "mx25l25635e";
123670322913SCédric Le Goater     amc->spi_model = "mx25l25635f";
1237baa4732bSCédric Le Goater     amc->num_cs    = 1;
1238baa4732bSCédric Le Goater     amc->i2c_init  = ast2500_evb_i2c_init;
1239baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
1240b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1241b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1242baa4732bSCédric Le Goater };
1243baa4732bSCédric Le Goater 
124434f73a81SKarthikeyan Pasupathi static void aspeed_machine_yosemitev2_class_init(ObjectClass *oc, void *data)
124534f73a81SKarthikeyan Pasupathi {
124634f73a81SKarthikeyan Pasupathi     MachineClass *mc = MACHINE_CLASS(oc);
124734f73a81SKarthikeyan Pasupathi     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
124834f73a81SKarthikeyan Pasupathi 
124934f73a81SKarthikeyan Pasupathi     mc->desc       = "Facebook YosemiteV2 BMC (ARM1176)";
125034f73a81SKarthikeyan Pasupathi     amc->soc_name  = "ast2500-a1";
125134f73a81SKarthikeyan Pasupathi     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
125234f73a81SKarthikeyan Pasupathi     amc->hw_strap2 = 0;
125334f73a81SKarthikeyan Pasupathi     amc->fmc_model = "n25q256a";
125434f73a81SKarthikeyan Pasupathi     amc->spi_model = "mx25l25635e";
125534f73a81SKarthikeyan Pasupathi     amc->num_cs    = 2;
125634f73a81SKarthikeyan Pasupathi     amc->i2c_init  = yosemitev2_bmc_i2c_init;
125734f73a81SKarthikeyan Pasupathi     mc->default_ram_size       = 512 * MiB;
125834f73a81SKarthikeyan Pasupathi     mc->default_cpus = mc->min_cpus = mc->max_cpus =
125934f73a81SKarthikeyan Pasupathi         aspeed_soc_num_cpus(amc->soc_name);
126034f73a81SKarthikeyan Pasupathi };
126134f73a81SKarthikeyan Pasupathi 
1262baa4732bSCédric Le Goater static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data)
1263baa4732bSCédric Le Goater {
1264baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1265baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1266baa4732bSCédric Le Goater 
1267baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Romulus BMC (ARM1176)";
1268baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1269baa4732bSCédric Le Goater     amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1;
1270baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
1271baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1272baa4732bSCédric Le Goater     amc->num_cs    = 2;
1273baa4732bSCédric Le Goater     amc->i2c_init  = romulus_bmc_i2c_init;
1274baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
1275b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1276b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1277baa4732bSCédric Le Goater };
1278baa4732bSCédric Le Goater 
12796c323abaSKarthikeyan Pasupathi static void aspeed_machine_tiogapass_class_init(ObjectClass *oc, void *data)
12806c323abaSKarthikeyan Pasupathi {
12816c323abaSKarthikeyan Pasupathi     MachineClass *mc = MACHINE_CLASS(oc);
12826c323abaSKarthikeyan Pasupathi     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
12836c323abaSKarthikeyan Pasupathi 
12846c323abaSKarthikeyan Pasupathi     mc->desc       = "Facebook Tiogapass BMC (ARM1176)";
12856c323abaSKarthikeyan Pasupathi     amc->soc_name  = "ast2500-a1";
12866c323abaSKarthikeyan Pasupathi     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
12876c323abaSKarthikeyan Pasupathi     amc->hw_strap2 = 0;
12886c323abaSKarthikeyan Pasupathi     amc->fmc_model = "n25q256a";
12896c323abaSKarthikeyan Pasupathi     amc->spi_model = "mx25l25635e";
12906c323abaSKarthikeyan Pasupathi     amc->num_cs    = 2;
12916c323abaSKarthikeyan Pasupathi     amc->i2c_init  = tiogapass_bmc_i2c_init;
12926c323abaSKarthikeyan Pasupathi     mc->default_ram_size       = 1 * GiB;
12936c323abaSKarthikeyan Pasupathi     mc->default_cpus = mc->min_cpus = mc->max_cpus =
12946c323abaSKarthikeyan Pasupathi         aspeed_soc_num_cpus(amc->soc_name);
12956c323abaSKarthikeyan Pasupathi         aspeed_soc_num_cpus(amc->soc_name);
12966c323abaSKarthikeyan Pasupathi };
12976c323abaSKarthikeyan Pasupathi 
1298143b040fSPatrick Williams static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data)
1299143b040fSPatrick Williams {
1300143b040fSPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1301143b040fSPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1302143b040fSPatrick Williams 
1303143b040fSPatrick Williams     mc->desc       = "OCP SonoraPass BMC (ARM1176)";
1304143b040fSPatrick Williams     amc->soc_name  = "ast2500-a1";
1305143b040fSPatrick Williams     amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1;
1306143b040fSPatrick Williams     amc->fmc_model = "mx66l1g45g";
1307143b040fSPatrick Williams     amc->spi_model = "mx66l1g45g";
1308143b040fSPatrick Williams     amc->num_cs    = 2;
1309143b040fSPatrick Williams     amc->i2c_init  = sonorapass_bmc_i2c_init;
1310143b040fSPatrick Williams     mc->default_ram_size       = 512 * MiB;
1311b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1312b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1313143b040fSPatrick Williams };
1314143b040fSPatrick Williams 
1315baa4732bSCédric Le Goater static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data)
1316baa4732bSCédric Le Goater {
1317baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1318baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1319baa4732bSCédric Le Goater 
1320baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Witherspoon BMC (ARM1176)";
1321baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1322baa4732bSCédric Le Goater     amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1;
132370322913SCédric Le Goater     amc->fmc_model = "mx25l25635f";
1324baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1325baa4732bSCédric Le Goater     amc->num_cs    = 2;
1326baa4732bSCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init;
1327baa4732bSCédric Le Goater     mc->default_ram_size = 512 * MiB;
1328b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1329b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1330baa4732bSCédric Le Goater };
1331baa4732bSCédric Le Goater 
1332baa4732bSCédric Le Goater static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
1333baa4732bSCédric Le Goater {
1334baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1335baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1336baa4732bSCédric Le Goater 
1337f548f201SPeter Maydell     mc->desc       = "Aspeed AST2600 EVB (Cortex-A7)";
1338c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
1339baa4732bSCédric Le Goater     amc->hw_strap1 = AST2600_EVB_HW_STRAP1;
1340baa4732bSCédric Le Goater     amc->hw_strap2 = AST2600_EVB_HW_STRAP2;
1341753abfc4SJae Hyun Yoo     amc->fmc_model = "mx66u51235f";
1342baa4732bSCédric Le Goater     amc->spi_model = "mx66u51235f";
1343baa4732bSCédric Le Goater     amc->num_cs    = 1;
134429193286SGuenter Roeck     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON |
134529193286SGuenter Roeck                      ASPEED_MAC3_ON;
1346baa4732bSCédric Le Goater     amc->i2c_init  = ast2600_evb_i2c_init;
1347baa4732bSCédric Le Goater     mc->default_ram_size = 1 * GiB;
1348b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1349b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1350baa4732bSCédric Le Goater };
1351baa4732bSCédric Le Goater 
135263ceb818SCédric Le Goater static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data)
135363ceb818SCédric Le Goater {
135463ceb818SCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
135563ceb818SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
135663ceb818SCédric Le Goater 
1357f548f201SPeter Maydell     mc->desc       = "OpenPOWER Tacoma BMC (Cortex-A7)";
1358c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
135963ceb818SCédric Le Goater     amc->hw_strap1 = TACOMA_BMC_HW_STRAP1;
136063ceb818SCédric Le Goater     amc->hw_strap2 = TACOMA_BMC_HW_STRAP2;
136163ceb818SCédric Le Goater     amc->fmc_model = "mx66l1g45g";
136263ceb818SCédric Le Goater     amc->spi_model = "mx66l1g45g";
136363ceb818SCédric Le Goater     amc->num_cs    = 2;
1364d3bad7e7SCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON;
136563ceb818SCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init; /* Same board layout */
136663ceb818SCédric Le Goater     mc->default_ram_size = 1 * GiB;
1367b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1368b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
136963ceb818SCédric Le Goater };
137063ceb818SCédric Le Goater 
137195f068c8SJohn Wang static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data)
137295f068c8SJohn Wang {
137395f068c8SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
137495f068c8SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
137595f068c8SJohn Wang 
137695f068c8SJohn Wang     mc->desc       = "Bytedance G220A BMC (ARM1176)";
137795f068c8SJohn Wang     amc->soc_name  = "ast2500-a1";
137895f068c8SJohn Wang     amc->hw_strap1 = G220A_BMC_HW_STRAP1;
137995f068c8SJohn Wang     amc->fmc_model = "n25q512a";
138095f068c8SJohn Wang     amc->spi_model = "mx25l25635e";
138195f068c8SJohn Wang     amc->num_cs    = 2;
13825bb825c8SGuenter Roeck     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
138395f068c8SJohn Wang     amc->i2c_init  = g220a_bmc_i2c_init;
138495f068c8SJohn Wang     mc->default_ram_size = 1024 * MiB;
138595f068c8SJohn Wang     mc->default_cpus = mc->min_cpus = mc->max_cpus =
138695f068c8SJohn Wang         aspeed_soc_num_cpus(amc->soc_name);
138795f068c8SJohn Wang };
138895f068c8SJohn Wang 
138982b6a3f6SJohn Wang static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc, void *data)
139082b6a3f6SJohn Wang {
139182b6a3f6SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
139282b6a3f6SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
139382b6a3f6SJohn Wang 
139482b6a3f6SJohn Wang     mc->desc       = "Inspur FP5280G2 BMC (ARM1176)";
139582b6a3f6SJohn Wang     amc->soc_name  = "ast2500-a1";
139682b6a3f6SJohn Wang     amc->hw_strap1 = FP5280G2_BMC_HW_STRAP1;
139782b6a3f6SJohn Wang     amc->fmc_model = "n25q512a";
139882b6a3f6SJohn Wang     amc->spi_model = "mx25l25635e";
139982b6a3f6SJohn Wang     amc->num_cs    = 2;
140082b6a3f6SJohn Wang     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
140182b6a3f6SJohn Wang     amc->i2c_init  = fp5280g2_bmc_i2c_init;
140282b6a3f6SJohn Wang     mc->default_ram_size = 512 * MiB;
140382b6a3f6SJohn Wang     mc->default_cpus = mc->min_cpus = mc->max_cpus =
140482b6a3f6SJohn Wang         aspeed_soc_num_cpus(amc->soc_name);
140582b6a3f6SJohn Wang };
140682b6a3f6SJohn Wang 
140758e52bdbSCédric Le Goater static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data)
140858e52bdbSCédric Le Goater {
140958e52bdbSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
141058e52bdbSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
141158e52bdbSCédric Le Goater 
1412f548f201SPeter Maydell     mc->desc       = "IBM Rainier BMC (Cortex-A7)";
1413c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
141458e52bdbSCédric Le Goater     amc->hw_strap1 = RAINIER_BMC_HW_STRAP1;
141558e52bdbSCédric Le Goater     amc->hw_strap2 = RAINIER_BMC_HW_STRAP2;
141658e52bdbSCédric Le Goater     amc->fmc_model = "mx66l1g45g";
141758e52bdbSCédric Le Goater     amc->spi_model = "mx66l1g45g";
141858e52bdbSCédric Le Goater     amc->num_cs    = 2;
141958e52bdbSCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
142058e52bdbSCédric Le Goater     amc->i2c_init  = rainier_bmc_i2c_init;
142158e52bdbSCédric Le Goater     mc->default_ram_size = 1 * GiB;
142258e52bdbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
142358e52bdbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
142458e52bdbSCédric Le Goater };
142558e52bdbSCédric Le Goater 
1426febbe308SPeter Delevoryas /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */
1427febbe308SPeter Delevoryas #if HOST_LONG_BITS == 32
1428febbe308SPeter Delevoryas #define FUJI_BMC_RAM_SIZE (1 * GiB)
1429febbe308SPeter Delevoryas #else
1430febbe308SPeter Delevoryas #define FUJI_BMC_RAM_SIZE (2 * GiB)
1431febbe308SPeter Delevoryas #endif
1432febbe308SPeter Delevoryas 
1433febbe308SPeter Delevoryas static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data)
1434febbe308SPeter Delevoryas {
1435febbe308SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1436febbe308SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1437febbe308SPeter Delevoryas 
1438febbe308SPeter Delevoryas     mc->desc = "Facebook Fuji BMC (Cortex-A7)";
1439febbe308SPeter Delevoryas     amc->soc_name = "ast2600-a3";
1440febbe308SPeter Delevoryas     amc->hw_strap1 = FUJI_BMC_HW_STRAP1;
1441febbe308SPeter Delevoryas     amc->hw_strap2 = FUJI_BMC_HW_STRAP2;
1442febbe308SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1443febbe308SPeter Delevoryas     amc->spi_model = "mx66l1g45g";
1444febbe308SPeter Delevoryas     amc->num_cs = 2;
1445febbe308SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1446febbe308SPeter Delevoryas     amc->i2c_init = fuji_bmc_i2c_init;
1447febbe308SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART1;
1448febbe308SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
1449febbe308SPeter Delevoryas     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1450febbe308SPeter Delevoryas         aspeed_soc_num_cpus(amc->soc_name);
1451febbe308SPeter Delevoryas };
1452febbe308SPeter Delevoryas 
1453104bdaffSPatrick Williams /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */
1454104bdaffSPatrick Williams #if HOST_LONG_BITS == 32
1455104bdaffSPatrick Williams #define BLETCHLEY_BMC_RAM_SIZE (1 * GiB)
1456104bdaffSPatrick Williams #else
1457104bdaffSPatrick Williams #define BLETCHLEY_BMC_RAM_SIZE (2 * GiB)
1458104bdaffSPatrick Williams #endif
1459104bdaffSPatrick Williams 
1460a20c54b1SPatrick Williams static void aspeed_machine_bletchley_class_init(ObjectClass *oc, void *data)
1461a20c54b1SPatrick Williams {
1462a20c54b1SPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1463a20c54b1SPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1464a20c54b1SPatrick Williams 
1465a20c54b1SPatrick Williams     mc->desc       = "Facebook Bletchley BMC (Cortex-A7)";
1466a20c54b1SPatrick Williams     amc->soc_name  = "ast2600-a3";
1467a20c54b1SPatrick Williams     amc->hw_strap1 = BLETCHLEY_BMC_HW_STRAP1;
1468a20c54b1SPatrick Williams     amc->hw_strap2 = BLETCHLEY_BMC_HW_STRAP2;
1469a20c54b1SPatrick Williams     amc->fmc_model = "w25q01jvq";
1470a20c54b1SPatrick Williams     amc->spi_model = NULL;
1471a20c54b1SPatrick Williams     amc->num_cs    = 2;
1472a20c54b1SPatrick Williams     amc->macs_mask = ASPEED_MAC2_ON;
1473a20c54b1SPatrick Williams     amc->i2c_init  = bletchley_bmc_i2c_init;
1474104bdaffSPatrick Williams     mc->default_ram_size = BLETCHLEY_BMC_RAM_SIZE;
1475a20c54b1SPatrick Williams     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1476a20c54b1SPatrick Williams         aspeed_soc_num_cpus(amc->soc_name);
1477a20c54b1SPatrick Williams }
1478a20c54b1SPatrick Williams 
14797966d70fSJason A. Donenfeld static void fby35_reset(MachineState *state, ShutdownCause reason)
1480fa699e80SPeter Delevoryas {
1481fa699e80SPeter Delevoryas     AspeedMachineState *bmc = ASPEED_MACHINE(state);
1482fa699e80SPeter Delevoryas     AspeedGPIOState *gpio = &bmc->soc.gpio;
1483fa699e80SPeter Delevoryas 
14847966d70fSJason A. Donenfeld     qemu_devices_reset(reason);
1485fa699e80SPeter Delevoryas 
1486f0418558SPeter Delevoryas     /* Board ID: 7 (Class-1, 4 slots) */
1487fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV4", true, &error_fatal);
1488fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV5", true, &error_fatal);
1489fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV6", true, &error_fatal);
1490fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV7", false, &error_fatal);
1491f0418558SPeter Delevoryas 
1492f0418558SPeter Delevoryas     /* Slot presence pins, inverse polarity. (False means present) */
1493f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH4", false, &error_fatal);
1494f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH5", true, &error_fatal);
1495f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH6", true, &error_fatal);
1496f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH7", true, &error_fatal);
1497f0418558SPeter Delevoryas 
1498f0418558SPeter Delevoryas     /* Slot 12v power pins, normal polarity. (True means powered-on) */
1499f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB2", true, &error_fatal);
1500f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB3", false, &error_fatal);
1501f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB4", false, &error_fatal);
1502f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB5", false, &error_fatal);
1503fa699e80SPeter Delevoryas }
1504fa699e80SPeter Delevoryas 
1505fa699e80SPeter Delevoryas static void aspeed_machine_fby35_class_init(ObjectClass *oc, void *data)
1506fa699e80SPeter Delevoryas {
1507fa699e80SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1508fa699e80SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1509fa699e80SPeter Delevoryas 
1510fa699e80SPeter Delevoryas     mc->desc       = "Facebook fby35 BMC (Cortex-A7)";
1511fa699e80SPeter Delevoryas     mc->reset      = fby35_reset;
1512fa699e80SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1513fa699e80SPeter Delevoryas     amc->num_cs    = 2;
1514fa699e80SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1515fa699e80SPeter Delevoryas     amc->i2c_init  = fby35_i2c_init;
1516fa699e80SPeter Delevoryas     /* FIXME: Replace this macro with something more general */
1517fa699e80SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
1518fa699e80SPeter Delevoryas }
1519fa699e80SPeter Delevoryas 
152066c895b8SJamin Lin #define AST1030_INTERNAL_FLASH_SIZE (1024 * 1024)
152166c895b8SJamin Lin /* Main SYSCLK frequency in Hz (200MHz) */
152266c895b8SJamin Lin #define SYSCLK_FRQ 200000000ULL
152366c895b8SJamin Lin 
152466c895b8SJamin Lin static void aspeed_minibmc_machine_init(MachineState *machine)
152566c895b8SJamin Lin {
152666c895b8SJamin Lin     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
152766c895b8SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
152866c895b8SJamin Lin     Clock *sysclk;
152966c895b8SJamin Lin 
153066c895b8SJamin Lin     sysclk = clock_new(OBJECT(machine), "SYSCLK");
153166c895b8SJamin Lin     clock_set_hz(sysclk, SYSCLK_FRQ);
153266c895b8SJamin Lin 
153366c895b8SJamin Lin     object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
153466c895b8SJamin Lin     qdev_connect_clock_in(DEVICE(&bmc->soc), "sysclk", sysclk);
153566c895b8SJamin Lin 
15364dd9d554SPeter Delevoryas     object_property_set_link(OBJECT(&bmc->soc), "memory",
15374dd9d554SPeter Delevoryas                              OBJECT(get_system_memory()), &error_abort);
1538d2b3eaefSPeter Delevoryas     connect_serial_hds_to_uarts(bmc);
153966c895b8SJamin Lin     qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
154066c895b8SJamin Lin 
154166c895b8SJamin Lin     aspeed_board_init_flashes(&bmc->soc.fmc,
154266c895b8SJamin Lin                               bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
154366c895b8SJamin Lin                               amc->num_cs,
154466c895b8SJamin Lin                               0);
154566c895b8SJamin Lin 
154666c895b8SJamin Lin     aspeed_board_init_flashes(&bmc->soc.spi[0],
154766c895b8SJamin Lin                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
154866c895b8SJamin Lin                               amc->num_cs, amc->num_cs);
154966c895b8SJamin Lin 
155066c895b8SJamin Lin     aspeed_board_init_flashes(&bmc->soc.spi[1],
155166c895b8SJamin Lin                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
155266c895b8SJamin Lin                               amc->num_cs, (amc->num_cs * 2));
155366c895b8SJamin Lin 
155466c895b8SJamin Lin     if (amc->i2c_init) {
155566c895b8SJamin Lin         amc->i2c_init(bmc);
155666c895b8SJamin Lin     }
155766c895b8SJamin Lin 
155866c895b8SJamin Lin     armv7m_load_kernel(ARM_CPU(first_cpu),
155966c895b8SJamin Lin                        machine->kernel_filename,
1560761c532aSPeter Maydell                        0,
156166c895b8SJamin Lin                        AST1030_INTERNAL_FLASH_SIZE);
156266c895b8SJamin Lin }
156366c895b8SJamin Lin 
15644c70ab16STroy Lee static void ast1030_evb_i2c_init(AspeedMachineState *bmc)
15654c70ab16STroy Lee {
15664c70ab16STroy Lee     AspeedSoCState *soc = &bmc->soc;
15674c70ab16STroy Lee 
15684c70ab16STroy Lee     /* U10 24C08 connects to SDA/SCL Groupt 1 by default */
15694c70ab16STroy Lee     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
15704c70ab16STroy Lee     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, eeprom_buf);
15714c70ab16STroy Lee 
15724c70ab16STroy Lee     /* U11 LM75 connects to SDA/SCL Group 2 by default */
15734c70ab16STroy Lee     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d);
15744c70ab16STroy Lee }
15754c70ab16STroy Lee 
157666c895b8SJamin Lin static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc,
157766c895b8SJamin Lin                                                           void *data)
157866c895b8SJamin Lin {
157966c895b8SJamin Lin     MachineClass *mc = MACHINE_CLASS(oc);
158066c895b8SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
158166c895b8SJamin Lin 
158266c895b8SJamin Lin     mc->desc = "Aspeed AST1030 MiniBMC (Cortex-M4)";
158366c895b8SJamin Lin     amc->soc_name = "ast1030-a1";
158466c895b8SJamin Lin     amc->hw_strap1 = 0;
158566c895b8SJamin Lin     amc->hw_strap2 = 0;
158666c895b8SJamin Lin     mc->init = aspeed_minibmc_machine_init;
15874c70ab16STroy Lee     amc->i2c_init = ast1030_evb_i2c_init;
158866c895b8SJamin Lin     mc->default_ram_size = 0;
158966c895b8SJamin Lin     mc->default_cpus = mc->min_cpus = mc->max_cpus = 1;
159066c895b8SJamin Lin     amc->fmc_model = "sst25vf032b";
159166c895b8SJamin Lin     amc->spi_model = "sst25vf032b";
159266c895b8SJamin Lin     amc->num_cs = 2;
159366c895b8SJamin Lin     amc->macs_mask = 0;
159466c895b8SJamin Lin }
159566c895b8SJamin Lin 
1596fb6b3c8dSJae Hyun Yoo static void aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass *oc,
1597fb6b3c8dSJae Hyun Yoo                                                      void *data)
1598fb6b3c8dSJae Hyun Yoo {
1599fb6b3c8dSJae Hyun Yoo     MachineClass *mc = MACHINE_CLASS(oc);
1600fb6b3c8dSJae Hyun Yoo     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1601fb6b3c8dSJae Hyun Yoo 
1602fb6b3c8dSJae Hyun Yoo     mc->desc       = "Qualcomm DC-SCM V1 BMC (Cortex A7)";
1603fb6b3c8dSJae Hyun Yoo     amc->soc_name  = "ast2600-a3";
1604fb6b3c8dSJae Hyun Yoo     amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1605fb6b3c8dSJae Hyun Yoo     amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1606fb6b3c8dSJae Hyun Yoo     amc->fmc_model = "n25q512a";
1607fb6b3c8dSJae Hyun Yoo     amc->spi_model = "n25q512a";
1608fb6b3c8dSJae Hyun Yoo     amc->num_cs    = 2;
1609fb6b3c8dSJae Hyun Yoo     amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1610fb6b3c8dSJae Hyun Yoo     amc->i2c_init  = qcom_dc_scm_bmc_i2c_init;
1611fb6b3c8dSJae Hyun Yoo     mc->default_ram_size = 1 * GiB;
1612fb6b3c8dSJae Hyun Yoo     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1613fb6b3c8dSJae Hyun Yoo         aspeed_soc_num_cpus(amc->soc_name);
1614fb6b3c8dSJae Hyun Yoo };
1615fb6b3c8dSJae Hyun Yoo 
1616ece4cccdSGraeme Gregory static void aspeed_machine_qcom_firework_class_init(ObjectClass *oc,
1617ece4cccdSGraeme Gregory                                                     void *data)
1618ece4cccdSGraeme Gregory {
1619ece4cccdSGraeme Gregory     MachineClass *mc = MACHINE_CLASS(oc);
1620ece4cccdSGraeme Gregory     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1621ece4cccdSGraeme Gregory 
1622ece4cccdSGraeme Gregory     mc->desc       = "Qualcomm DC-SCM V1/Firework BMC (Cortex A7)";
1623ece4cccdSGraeme Gregory     amc->soc_name  = "ast2600-a3";
1624ece4cccdSGraeme Gregory     amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1625ece4cccdSGraeme Gregory     amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1626ece4cccdSGraeme Gregory     amc->fmc_model = "n25q512a";
1627ece4cccdSGraeme Gregory     amc->spi_model = "n25q512a";
1628ece4cccdSGraeme Gregory     amc->num_cs    = 2;
1629ece4cccdSGraeme Gregory     amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1630ece4cccdSGraeme Gregory     amc->i2c_init  = qcom_dc_scm_firework_i2c_init;
1631ece4cccdSGraeme Gregory     mc->default_ram_size = 1 * GiB;
1632ece4cccdSGraeme Gregory     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1633ece4cccdSGraeme Gregory         aspeed_soc_num_cpus(amc->soc_name);
1634ece4cccdSGraeme Gregory };
1635ece4cccdSGraeme Gregory 
1636baa4732bSCédric Le Goater static const TypeInfo aspeed_machine_types[] = {
1637baa4732bSCédric Le Goater     {
1638baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("palmetto-bmc"),
1639baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1640baa4732bSCédric Le Goater         .class_init    = aspeed_machine_palmetto_class_init,
1641baa4732bSCédric Le Goater     }, {
164240a38df5SErik Smit         .name          = MACHINE_TYPE_NAME("supermicrox11-bmc"),
164340a38df5SErik Smit         .parent        = TYPE_ASPEED_MACHINE,
164440a38df5SErik Smit         .class_init    = aspeed_machine_supermicrox11_bmc_class_init,
164540a38df5SErik Smit     }, {
164647936597SGuenter Roeck         .name          = MACHINE_TYPE_NAME("supermicro-x11spi-bmc"),
164747936597SGuenter Roeck         .parent        = TYPE_ASPEED_MACHINE,
164847936597SGuenter Roeck         .class_init    = aspeed_machine_supermicro_x11spi_bmc_class_init,
164947936597SGuenter Roeck     }, {
1650baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2500-evb"),
1651baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1652baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2500_evb_class_init,
1653baa4732bSCédric Le Goater     }, {
1654baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("romulus-bmc"),
1655baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1656baa4732bSCédric Le Goater         .class_init    = aspeed_machine_romulus_class_init,
1657baa4732bSCédric Le Goater     }, {
1658143b040fSPatrick Williams         .name          = MACHINE_TYPE_NAME("sonorapass-bmc"),
1659143b040fSPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1660143b040fSPatrick Williams         .class_init    = aspeed_machine_sonorapass_class_init,
1661143b040fSPatrick Williams     }, {
1662baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("witherspoon-bmc"),
1663baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1664baa4732bSCédric Le Goater         .class_init    = aspeed_machine_witherspoon_class_init,
1665baa4732bSCédric Le Goater     }, {
1666baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2600-evb"),
1667baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1668baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2600_evb_class_init,
1669baa4732bSCédric Le Goater     }, {
167034f73a81SKarthikeyan Pasupathi         .name          = MACHINE_TYPE_NAME("yosemitev2-bmc"),
167134f73a81SKarthikeyan Pasupathi         .parent        = TYPE_ASPEED_MACHINE,
167234f73a81SKarthikeyan Pasupathi         .class_init    = aspeed_machine_yosemitev2_class_init,
167334f73a81SKarthikeyan Pasupathi     }, {
167463ceb818SCédric Le Goater         .name          = MACHINE_TYPE_NAME("tacoma-bmc"),
167563ceb818SCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
167663ceb818SCédric Le Goater         .class_init    = aspeed_machine_tacoma_class_init,
167763ceb818SCédric Le Goater     }, {
16786c323abaSKarthikeyan Pasupathi         .name          = MACHINE_TYPE_NAME("tiogapass-bmc"),
16796c323abaSKarthikeyan Pasupathi         .parent        = TYPE_ASPEED_MACHINE,
16806c323abaSKarthikeyan Pasupathi         .class_init    = aspeed_machine_tiogapass_class_init,
16816c323abaSKarthikeyan Pasupathi     }, {
168295f068c8SJohn Wang         .name          = MACHINE_TYPE_NAME("g220a-bmc"),
168395f068c8SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
168495f068c8SJohn Wang         .class_init    = aspeed_machine_g220a_class_init,
168595f068c8SJohn Wang     }, {
1686fb6b3c8dSJae Hyun Yoo         .name          = MACHINE_TYPE_NAME("qcom-dc-scm-v1-bmc"),
1687fb6b3c8dSJae Hyun Yoo         .parent        = TYPE_ASPEED_MACHINE,
1688fb6b3c8dSJae Hyun Yoo         .class_init    = aspeed_machine_qcom_dc_scm_v1_class_init,
1689fb6b3c8dSJae Hyun Yoo     }, {
1690ece4cccdSGraeme Gregory         .name          = MACHINE_TYPE_NAME("qcom-firework-bmc"),
1691ece4cccdSGraeme Gregory         .parent        = TYPE_ASPEED_MACHINE,
1692ece4cccdSGraeme Gregory         .class_init    = aspeed_machine_qcom_firework_class_init,
1693ece4cccdSGraeme Gregory     }, {
169482b6a3f6SJohn Wang         .name          = MACHINE_TYPE_NAME("fp5280g2-bmc"),
169582b6a3f6SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
169682b6a3f6SJohn Wang         .class_init    = aspeed_machine_fp5280g2_class_init,
169782b6a3f6SJohn Wang     }, {
16989cccb912SPatrick Venture         .name          = MACHINE_TYPE_NAME("quanta-q71l-bmc"),
16999cccb912SPatrick Venture         .parent        = TYPE_ASPEED_MACHINE,
17009cccb912SPatrick Venture         .class_init    = aspeed_machine_quanta_q71l_class_init,
17019cccb912SPatrick Venture     }, {
170258e52bdbSCédric Le Goater         .name          = MACHINE_TYPE_NAME("rainier-bmc"),
170358e52bdbSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
170458e52bdbSCédric Le Goater         .class_init    = aspeed_machine_rainier_class_init,
170558e52bdbSCédric Le Goater     }, {
1706febbe308SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fuji-bmc"),
1707febbe308SPeter Delevoryas         .parent        = TYPE_ASPEED_MACHINE,
1708febbe308SPeter Delevoryas         .class_init    = aspeed_machine_fuji_class_init,
1709febbe308SPeter Delevoryas     }, {
1710a20c54b1SPatrick Williams         .name          = MACHINE_TYPE_NAME("bletchley-bmc"),
1711a20c54b1SPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1712a20c54b1SPatrick Williams         .class_init    = aspeed_machine_bletchley_class_init,
1713a20c54b1SPatrick Williams     }, {
1714fa699e80SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fby35-bmc"),
1715fa699e80SPeter Delevoryas         .parent        = MACHINE_TYPE_NAME("ast2600-evb"),
1716fa699e80SPeter Delevoryas         .class_init    = aspeed_machine_fby35_class_init,
1717fa699e80SPeter Delevoryas     }, {
171866c895b8SJamin Lin         .name           = MACHINE_TYPE_NAME("ast1030-evb"),
171966c895b8SJamin Lin         .parent         = TYPE_ASPEED_MACHINE,
172066c895b8SJamin Lin         .class_init     = aspeed_minibmc_machine_ast1030_evb_class_init,
172166c895b8SJamin Lin     }, {
1722fca9ca1bSCédric Le Goater         .name          = TYPE_ASPEED_MACHINE,
172362c2c2ebSCédric Le Goater         .parent        = TYPE_MACHINE,
1724888b2b03SPhilippe Mathieu-Daudé         .instance_size = sizeof(AspeedMachineState),
17251a15311aSCédric Le Goater         .instance_init = aspeed_machine_instance_init,
1726fca9ca1bSCédric Le Goater         .class_size    = sizeof(AspeedMachineClass),
1727fca9ca1bSCédric Le Goater         .class_init    = aspeed_machine_class_init,
1728baa4732bSCédric Le Goater         .abstract      = true,
1729baa4732bSCédric Le Goater     }
1730fca9ca1bSCédric Le Goater };
173174fb1f38SCédric Le Goater 
1732baa4732bSCédric Le Goater DEFINE_TYPES(aspeed_machine_types)
1733