xref: /qemu/hw/arm/aspeed.c (revision 27a2c66c92ec1f7a1e6456c8b274ae538d68ae7f)
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;
45f65f6ad5SCé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 
501e2c22c9SCédric Le Goater /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */
511e2c22c9SCédric Le Goater #if HOST_LONG_BITS == 32
521e2c22c9SCédric Le Goater #define ASPEED_RAM_SIZE(sz) MIN((sz), 1 * GiB)
531e2c22c9SCédric Le Goater #else
541e2c22c9SCédric Le Goater #define ASPEED_RAM_SIZE(sz) (sz)
551e2c22c9SCédric Le Goater #endif
561e2c22c9SCédric Le Goater 
57ef17f836SCédric Le Goater /* Palmetto hardware value: 0x120CE416 */
588da33ef7SCédric Le Goater #define PALMETTO_BMC_HW_STRAP1 (                                        \
598da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_256MB) |               \
608da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2 /* DDR3 with CL=6, CWL=5 */) | \
618da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
628da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) |       \
638da33ef7SCédric Le Goater         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
648da33ef7SCédric Le Goater         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
658da33ef7SCédric Le Goater         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) |                \
668da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
678da33ef7SCédric Le Goater         SCU_HW_STRAP_SPI_WIDTH |                                        \
688da33ef7SCédric Le Goater         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
698da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
708da33ef7SCédric Le Goater 
7140a38df5SErik Smit /* TODO: Find the actual hardware value */
7240a38df5SErik Smit #define SUPERMICROX11_BMC_HW_STRAP1 (                                   \
7340a38df5SErik Smit         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) |               \
7440a38df5SErik Smit         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2) |                           \
7540a38df5SErik Smit         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
7640a38df5SErik Smit         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) |       \
7740a38df5SErik Smit         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
7840a38df5SErik Smit         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
7940a38df5SErik Smit         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) |                \
8040a38df5SErik Smit         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
8140a38df5SErik Smit         SCU_HW_STRAP_SPI_WIDTH |                                        \
8240a38df5SErik Smit         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
8340a38df5SErik Smit         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
8440a38df5SErik Smit 
8547936597SGuenter Roeck /* TODO: Find the actual hardware value */
8647936597SGuenter Roeck #define SUPERMICRO_X11SPI_BMC_HW_STRAP1 (                               \
8747936597SGuenter Roeck         AST2500_HW_STRAP1_DEFAULTS |                                    \
8847936597SGuenter Roeck         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
8947936597SGuenter Roeck         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
9047936597SGuenter Roeck         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
9147936597SGuenter Roeck         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
9247936597SGuenter Roeck         SCU_HW_STRAP_SPI_WIDTH |                                        \
9347936597SGuenter Roeck         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN))
9447936597SGuenter Roeck 
95ef17f836SCédric Le Goater /* AST2500 evb hardware value: 0xF100C2E6 */
969a7c1750SCédric Le Goater #define AST2500_EVB_HW_STRAP1 ((                                        \
979a7c1750SCédric Le Goater         AST2500_HW_STRAP1_DEFAULTS |                                    \
989a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
999a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
1009a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
1019a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
1029a7c1750SCédric Le Goater         SCU_HW_STRAP_MAC1_RGMII |                                       \
1039a7c1750SCédric Le Goater         SCU_HW_STRAP_MAC0_RGMII) &                                      \
1049a7c1750SCédric Le Goater         ~SCU_HW_STRAP_2ND_BOOT_WDT)
1059a7c1750SCédric Le Goater 
106ef17f836SCédric Le Goater /* Romulus hardware value: 0xF10AD206 */
107ef17f836SCédric Le Goater #define ROMULUS_BMC_HW_STRAP1 (                                         \
108ef17f836SCédric Le Goater         AST2500_HW_STRAP1_DEFAULTS |                                    \
109ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
110ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
111ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
112ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
113ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_ACPI_ENABLE |                              \
114ef17f836SCédric Le Goater         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER))
115ef17f836SCédric Le Goater 
116143b040fSPatrick Williams /* Sonorapass hardware value: 0xF100D216 */
117143b040fSPatrick Williams #define SONORAPASS_BMC_HW_STRAP1 (                                      \
118143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
119143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
120143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
121143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
122143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
123143b040fSPatrick Williams         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
124143b040fSPatrick Williams         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
125143b040fSPatrick Williams         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
126143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
127143b040fSPatrick Williams         SCU_HW_STRAP_VGA_BIOS_ROM |                                     \
128143b040fSPatrick Williams         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
129143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_RESERVED1)
130143b040fSPatrick Williams 
13195f068c8SJohn Wang #define G220A_BMC_HW_STRAP1 (                                      \
13295f068c8SJohn Wang         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
13395f068c8SJohn Wang         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
13495f068c8SJohn Wang         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
13595f068c8SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
13695f068c8SJohn Wang         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
13795f068c8SJohn Wang         SCU_HW_STRAP_2ND_BOOT_WDT |                                     \
13895f068c8SJohn Wang         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
13995f068c8SJohn Wang         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
14095f068c8SJohn Wang         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
14195f068c8SJohn Wang         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
14295f068c8SJohn Wang         SCU_HW_STRAP_VGA_SIZE_SET(VGA_64M_DRAM) |                       \
14395f068c8SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED1)
14495f068c8SJohn Wang 
14582b6a3f6SJohn Wang /* FP5280G2 hardware value: 0XF100D286 */
14682b6a3f6SJohn Wang #define FP5280G2_BMC_HW_STRAP1 (                                      \
14782b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
14882b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
14982b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
15082b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
15182b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
15282b6a3f6SJohn Wang         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
15382b6a3f6SJohn Wang         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
15482b6a3f6SJohn Wang         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
15582b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
15682b6a3f6SJohn Wang         SCU_HW_STRAP_MAC1_RGMII |                                       \
15782b6a3f6SJohn Wang         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
15882b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED1)
15982b6a3f6SJohn Wang 
16062c2c2ebSCédric Le Goater /* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */
16162c2c2ebSCédric Le Goater #define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1
16262c2c2ebSCédric Le Goater 
1639cccb912SPatrick Venture /* Quanta-Q71l hardware value */
1649cccb912SPatrick Venture #define QUANTA_Q71L_BMC_HW_STRAP1 (                                     \
1659cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) |               \
1669cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2/* DDR3 with CL=6, CWL=5 */) | \
1679cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
1689cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_24M_IN) |       \
1699cccb912SPatrick Venture         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
1709cccb912SPatrick Venture         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_PASS_THROUGH) |          \
1719cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
1729cccb912SPatrick Venture         SCU_HW_STRAP_SPI_WIDTH |                                        \
1739cccb912SPatrick Venture         SCU_HW_STRAP_VGA_SIZE_SET(VGA_8M_DRAM) |                        \
1749cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
1759cccb912SPatrick Venture 
176ccc2c418SCédric Le Goater /* AST2600 evb hardware value */
177ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP1 0x000000C0
178ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP2 0x00000003
179ccc2c418SCédric Le Goater 
18063ceb818SCédric Le Goater /* Tacoma hardware value */
18163ceb818SCédric Le Goater #define TACOMA_BMC_HW_STRAP1  0x00000000
1827582591aSJoel Stanley #define TACOMA_BMC_HW_STRAP2  0x00000040
18363ceb818SCédric Le Goater 
18458e52bdbSCédric Le Goater /* Rainier hardware value: (QEMU prototype) */
185b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP1 0x00422016
186b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP2 0x80000848
18758e52bdbSCédric Le Goater 
188febbe308SPeter Delevoryas /* Fuji hardware value */
189febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP1    0x00000000
190febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP2    0x00000000
191febbe308SPeter Delevoryas 
192a20c54b1SPatrick Williams /* Bletchley hardware value */
193a20c54b1SPatrick Williams /* TODO: Leave same as EVB for now. */
194a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP1 AST2600_EVB_HW_STRAP1
195a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP2 AST2600_EVB_HW_STRAP2
196a20c54b1SPatrick Williams 
197fb6b3c8dSJae Hyun Yoo /* Qualcomm DC-SCM hardware value */
198fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP1  0x00000000
199fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP2  0x00000041
200fb6b3c8dSJae Hyun Yoo 
2019bb6d140SJoel Stanley #define AST_SMP_MAILBOX_BASE            0x1e6e2180
2029bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_ENTRY        (AST_SMP_MAILBOX_BASE + 0x0)
2039bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_GOSIGN       (AST_SMP_MAILBOX_BASE + 0x4)
2049bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_READY        (AST_SMP_MAILBOX_BASE + 0x8)
2059bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_POLLINSN     (AST_SMP_MAILBOX_BASE + 0xc)
2069bb6d140SJoel Stanley #define AST_SMP_MBOX_CODE               (AST_SMP_MAILBOX_BASE + 0x10)
2079bb6d140SJoel Stanley #define AST_SMP_MBOX_GOSIGN             0xabbaab00
2089bb6d140SJoel Stanley 
2099bb6d140SJoel Stanley static void aspeed_write_smpboot(ARMCPU *cpu,
2109bb6d140SJoel Stanley                                  const struct arm_boot_info *info)
2119bb6d140SJoel Stanley {
212902bba54SCédric Le Goater     AddressSpace *as = arm_boot_address_space(cpu, info);
213902bba54SCédric Le Goater     static const ARMInsnFixup poll_mailbox_ready[] = {
2149bb6d140SJoel Stanley         /*
2159bb6d140SJoel Stanley          * r2 = per-cpu go sign value
2169bb6d140SJoel Stanley          * r1 = AST_SMP_MBOX_FIELD_ENTRY
2179bb6d140SJoel Stanley          * r0 = AST_SMP_MBOX_FIELD_GOSIGN
2189bb6d140SJoel Stanley          */
219902bba54SCédric Le Goater         { 0xee100fb0 },  /* mrc     p15, 0, r0, c0, c0, 5 */
220902bba54SCédric Le Goater         { 0xe21000ff },  /* ands    r0, r0, #255          */
221902bba54SCédric Le Goater         { 0xe59f201c },  /* ldr     r2, [pc, #28]         */
222902bba54SCédric Le Goater         { 0xe1822000 },  /* orr     r2, r2, r0            */
2239bb6d140SJoel Stanley 
224902bba54SCédric Le Goater         { 0xe59f1018 },  /* ldr     r1, [pc, #24]         */
225902bba54SCédric Le Goater         { 0xe59f0018 },  /* ldr     r0, [pc, #24]         */
2269bb6d140SJoel Stanley 
227902bba54SCédric Le Goater         { 0xe320f002 },  /* wfe                           */
228902bba54SCédric Le Goater         { 0xe5904000 },  /* ldr     r4, [r0]              */
229902bba54SCédric Le Goater         { 0xe1520004 },  /* cmp     r2, r4                */
230902bba54SCédric Le Goater         { 0x1afffffb },  /* bne     <wfe>                 */
231902bba54SCédric Le Goater         { 0xe591f000 },  /* ldr     pc, [r1]              */
232902bba54SCédric Le Goater         { AST_SMP_MBOX_GOSIGN },
233902bba54SCédric Le Goater         { AST_SMP_MBOX_FIELD_ENTRY },
234902bba54SCédric Le Goater         { AST_SMP_MBOX_FIELD_GOSIGN },
235902bba54SCédric Le Goater         { 0, FIXUP_TERMINATOR }
2369bb6d140SJoel Stanley     };
237902bba54SCédric Le Goater     static const uint32_t fixupcontext[FIXUP_MAX] = { 0 };
2389bb6d140SJoel Stanley 
239902bba54SCédric Le Goater     arm_write_bootloader("aspeed.smpboot", as, info->smp_loader_start,
240902bba54SCédric Le Goater                          poll_mailbox_ready, fixupcontext);
2419bb6d140SJoel Stanley }
2429bb6d140SJoel Stanley 
2439bb6d140SJoel Stanley static void aspeed_reset_secondary(ARMCPU *cpu,
2449bb6d140SJoel Stanley                                    const struct arm_boot_info *info)
2459bb6d140SJoel Stanley {
2469bb6d140SJoel Stanley     AddressSpace *as = arm_boot_address_space(cpu, info);
2479bb6d140SJoel Stanley     CPUState *cs = CPU(cpu);
2489bb6d140SJoel Stanley 
2499bb6d140SJoel Stanley     /* info->smp_bootreg_addr */
2509bb6d140SJoel Stanley     address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0,
2519bb6d140SJoel Stanley                                MEMTXATTRS_UNSPECIFIED, NULL);
2529bb6d140SJoel Stanley     cpu_set_pc(cs, info->smp_loader_start);
2539bb6d140SJoel Stanley }
2549bb6d140SJoel Stanley 
2558b744a6aSCédric Le Goater static void write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size,
256d769a1daSCédric Le Goater                            Error **errp)
257d769a1daSCédric Le Goater {
25805e6e40aSWentao_Liang     g_autofree void *storage = NULL;
2590c7209beSCédric Le Goater     int64_t size;
260d769a1daSCédric Le Goater 
2610c7209beSCédric Le Goater     /* The block backend size should have already been 'validated' by
2620c7209beSCédric Le Goater      * the creation of the m25p80 object.
2630c7209beSCédric Le Goater      */
2640c7209beSCédric Le Goater     size = blk_getlength(blk);
2650c7209beSCédric Le Goater     if (size <= 0) {
2660c7209beSCédric Le Goater         error_setg(errp, "failed to get flash size");
2670c7209beSCédric Le Goater         return;
2680c7209beSCédric Le Goater     }
2690c7209beSCédric Le Goater 
2700c7209beSCédric Le Goater     if (rom_size > size) {
2710c7209beSCédric Le Goater         rom_size = size;
272d769a1daSCédric Le Goater     }
273d769a1daSCédric Le Goater 
27405e6e40aSWentao_Liang     storage = g_malloc0(rom_size);
275a9262f55SAlberto Faria     if (blk_pread(blk, 0, rom_size, storage, 0) < 0) {
276d769a1daSCédric Le Goater         error_setg(errp, "failed to read the initial flash content");
277d769a1daSCédric Le Goater         return;
278d769a1daSCédric Le Goater     }
279d769a1daSCédric Le Goater 
280d769a1daSCédric Le Goater     rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr);
281d769a1daSCédric Le Goater }
282d769a1daSCédric Le Goater 
2838b744a6aSCédric Le Goater /*
2848b744a6aSCédric Le Goater  * Create a ROM and copy the flash contents at the expected address
2858b744a6aSCédric Le Goater  * (0x0). Boots faster than execute-in-place.
2868b744a6aSCédric Le Goater  */
287262259eaSCédric Le Goater static void aspeed_install_boot_rom(AspeedMachineState *bmc, BlockBackend *blk,
2888b744a6aSCédric Le Goater                                     uint64_t rom_size)
2898b744a6aSCédric Le Goater {
290262259eaSCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
2918b744a6aSCédric Le Goater 
292262259eaSCédric Le Goater     memory_region_init_rom(&bmc->boot_rom, NULL, "aspeed.boot_rom", rom_size,
2938b744a6aSCédric Le Goater                            &error_abort);
2948b744a6aSCédric Le Goater     memory_region_add_subregion_overlap(&soc->spi_boot_container, 0,
295262259eaSCédric Le Goater                                         &bmc->boot_rom, 1);
2968b744a6aSCédric Le Goater     write_boot_rom(blk, ASPEED_SOC_SPI_BOOT_ADDR, rom_size, &error_abort);
2978b744a6aSCédric Le Goater }
2988b744a6aSCédric Le Goater 
2991099ad10SPeter Delevoryas void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
3009bd4ac61SCédric Le Goater                                       unsigned int count, int unit0)
301e1ad9bc4SCédric Le Goater {
302e1ad9bc4SCédric Le Goater     int i;
303179b2058SPatrick Williams 
304179b2058SPatrick Williams     if (!flashtype) {
305179b2058SPatrick Williams         return;
306179b2058SPatrick Williams     }
307e1ad9bc4SCédric Le Goater 
3089bd4ac61SCédric Le Goater     for (i = 0; i < count; ++i) {
3098ec239f2SMarkus Armbruster         DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i);
310a7d78befSCédric Le Goater         DeviceState *dev;
311e1ad9bc4SCédric Le Goater 
312a7d78befSCédric Le Goater         dev = qdev_new(flashtype);
313e1ad9bc4SCédric Le Goater         if (dinfo) {
314a7d78befSCédric Le Goater             qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo));
315e1ad9bc4SCédric Le Goater         }
316*27a2c66cSCédric Le Goater         qdev_prop_set_uint8(dev, "cs", i);
317a7d78befSCédric Le Goater         qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal);
318e1ad9bc4SCédric Le Goater     }
319e1ad9bc4SCédric Le Goater }
320e1ad9bc4SCédric Le Goater 
321a29e3e12SAndrew Jeffery static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo)
322a29e3e12SAndrew Jeffery {
323a29e3e12SAndrew Jeffery         DeviceState *card;
324a29e3e12SAndrew Jeffery 
325756f739bSPhilippe Mathieu-Daudé         if (!dinfo) {
326756f739bSPhilippe Mathieu-Daudé             return;
327756f739bSPhilippe Mathieu-Daudé         }
3283e80f690SMarkus Armbruster         card = qdev_new(TYPE_SD_CARD);
329934df912SMarkus Armbruster         qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
330a29e3e12SAndrew Jeffery                                 &error_fatal);
3313e80f690SMarkus Armbruster         qdev_realize_and_unref(card,
3323e80f690SMarkus Armbruster                                qdev_get_child_bus(DEVICE(sdhci), "sd-bus"),
3333e80f690SMarkus Armbruster                                &error_fatal);
334a29e3e12SAndrew Jeffery }
335a29e3e12SAndrew Jeffery 
336d2b3eaefSPeter Delevoryas static void connect_serial_hds_to_uarts(AspeedMachineState *bmc)
337d2b3eaefSPeter Delevoryas {
338d2b3eaefSPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
339d2b3eaefSPeter Delevoryas     AspeedSoCState *s = &bmc->soc;
340d2b3eaefSPeter Delevoryas     AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
341f65f6ad5SCédric Le Goater     int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default;
342d2b3eaefSPeter Delevoryas 
343f65f6ad5SCédric Le Goater     aspeed_soc_uart_set_chr(s, uart_chosen, serial_hd(0));
344d2b3eaefSPeter Delevoryas     for (int i = 1, uart = ASPEED_DEV_UART1; i < sc->uarts_num; i++, uart++) {
345f65f6ad5SCédric Le Goater         if (uart == uart_chosen) {
346d2b3eaefSPeter Delevoryas             continue;
347d2b3eaefSPeter Delevoryas         }
348d2b3eaefSPeter Delevoryas         aspeed_soc_uart_set_chr(s, uart, serial_hd(i));
349d2b3eaefSPeter Delevoryas     }
350d2b3eaefSPeter Delevoryas }
351d2b3eaefSPeter Delevoryas 
352baa4732bSCédric Le Goater static void aspeed_machine_init(MachineState *machine)
353327d8e4eSAndrew Jeffery {
354888b2b03SPhilippe Mathieu-Daudé     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
355baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
356b033271fSCédric Le Goater     AspeedSoCClass *sc;
3572bea128cSEddie James     int i;
358d3bad7e7SCédric Le Goater     NICInfo *nd = &nd_table[0];
359327d8e4eSAndrew Jeffery 
3609fc7fc4dSMarkus Armbruster     object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
361327d8e4eSAndrew Jeffery 
362b033271fSCédric Le Goater     sc = ASPEED_SOC_GET_CLASS(&bmc->soc);
363b033271fSCédric Le Goater 
364533eb415SIgor Mammedov     /*
365346160cbSCédric Le Goater      * This will error out if the RAM size is not supported by the
366346160cbSCédric Le Goater      * memory controller of the SoC.
367533eb415SIgor Mammedov      */
3686e504a98SPaolo Bonzini     object_property_set_uint(OBJECT(&bmc->soc), "ram-size", machine->ram_size,
369533eb415SIgor Mammedov                              &error_fatal);
370533eb415SIgor Mammedov 
371d3bad7e7SCédric Le Goater     for (i = 0; i < sc->macs_num; i++) {
372d3bad7e7SCédric Le Goater         if ((amc->macs_mask & (1 << i)) && nd->used) {
373d3bad7e7SCédric Le Goater             qemu_check_nic_model(nd, TYPE_FTGMAC100);
374d3bad7e7SCédric Le Goater             qdev_set_nic_properties(DEVICE(&bmc->soc.ftgmac100[i]), nd);
375d3bad7e7SCédric Le Goater             nd++;
376d3bad7e7SCédric Le Goater         }
377d3bad7e7SCédric Le Goater     }
378d3bad7e7SCédric Le Goater 
3795325cc34SMarkus Armbruster     object_property_set_int(OBJECT(&bmc->soc), "hw-strap1", amc->hw_strap1,
38087e79af0SAndrew Jeffery                             &error_abort);
3815325cc34SMarkus Armbruster     object_property_set_int(OBJECT(&bmc->soc), "hw-strap2", amc->hw_strap2,
382ccc2c418SCédric Le Goater                             &error_abort);
3834dd9d554SPeter Delevoryas     object_property_set_link(OBJECT(&bmc->soc), "memory",
3844dd9d554SPeter Delevoryas                              OBJECT(get_system_memory()), &error_abort);
3855325cc34SMarkus Armbruster     object_property_set_link(OBJECT(&bmc->soc), "dram",
3860df2d9a6SCédric Le Goater                              OBJECT(machine->ram), &error_abort);
387b6e70d1dSJoel Stanley     if (machine->kernel_filename) {
388b6e70d1dSJoel Stanley         /*
389b6e70d1dSJoel Stanley          * When booting with a -kernel command line there is no u-boot
390b6e70d1dSJoel Stanley          * that runs to unlock the SCU. In this case set the default to
391b6e70d1dSJoel Stanley          * be unlocked as the kernel expects
392b6e70d1dSJoel Stanley          */
3935325cc34SMarkus Armbruster         object_property_set_int(OBJECT(&bmc->soc), "hw-prot-key",
3945325cc34SMarkus Armbruster                                 ASPEED_SCU_PROT_KEY, &error_abort);
395b6e70d1dSJoel Stanley     }
396d2b3eaefSPeter Delevoryas     connect_serial_hds_to_uarts(bmc);
397ce189ab2SMarkus Armbruster     qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
398327d8e4eSAndrew Jeffery 
3998ec239f2SMarkus Armbruster     aspeed_board_init_flashes(&bmc->soc.fmc,
4008ec239f2SMarkus Armbruster                               bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
4019bd4ac61SCédric Le Goater                               amc->num_cs, 0);
4028ec239f2SMarkus Armbruster     aspeed_board_init_flashes(&bmc->soc.spi[0],
4038ec239f2SMarkus Armbruster                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
4049bd4ac61SCédric Le Goater                               1, amc->num_cs);
405e1ad9bc4SCédric Le Goater 
406b7f1a0cbSCédric Le Goater     if (machine->kernel_filename && sc->num_cpus > 1) {
4079bb6d140SJoel Stanley         /* With no u-boot we must set up a boot stub for the secondary CPU */
4089bb6d140SJoel Stanley         MemoryRegion *smpboot = g_new(MemoryRegion, 1);
409f489960dSPhilippe Mathieu-Daudé         memory_region_init_ram(smpboot, NULL, "aspeed.smpboot",
4109bb6d140SJoel Stanley                                0x80, &error_abort);
4119bb6d140SJoel Stanley         memory_region_add_subregion(get_system_memory(),
4129bb6d140SJoel Stanley                                     AST_SMP_MAILBOX_BASE, smpboot);
4139bb6d140SJoel Stanley 
4149bb6d140SJoel Stanley         aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot;
4159bb6d140SJoel Stanley         aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary;
4169bb6d140SJoel Stanley         aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE;
4179bb6d140SJoel Stanley     }
4189bb6d140SJoel Stanley 
4196e504a98SPaolo Bonzini     aspeed_board_binfo.ram_size = machine->ram_size;
420347df6f8SEduardo Habkost     aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM];
421b033271fSCédric Le Goater 
422baa4732bSCédric Le Goater     if (amc->i2c_init) {
423baa4732bSCédric Le Goater         amc->i2c_init(bmc);
4242cf6cb50SCédric Le Goater     }
4252cf6cb50SCédric Le Goater 
4260e2c24c6SAndrew Jeffery     for (i = 0; i < bmc->soc.sdhci.num_slots; i++) {
4278ec239f2SMarkus Armbruster         sdhci_attach_drive(&bmc->soc.sdhci.slots[i],
4288ec239f2SMarkus Armbruster                            drive_get(IF_SD, 0, i));
429a29e3e12SAndrew Jeffery     }
4302bea128cSEddie James 
431a29e3e12SAndrew Jeffery     if (bmc->soc.emmc.num_slots) {
4328ec239f2SMarkus Armbruster         sdhci_attach_drive(&bmc->soc.emmc.slots[0],
4338ec239f2SMarkus Armbruster                            drive_get(IF_SD, 0, bmc->soc.sdhci.num_slots));
4342bea128cSEddie James     }
4352bea128cSEddie James 
4368b744a6aSCédric Le Goater     if (!bmc->mmio_exec) {
4378b744a6aSCédric Le Goater         DriveInfo *mtd0 = drive_get(IF_MTD, 0, 0);
4388b744a6aSCédric Le Goater 
4398b744a6aSCédric Le Goater         if (mtd0) {
4408b744a6aSCédric Le Goater             uint64_t rom_size = memory_region_size(&bmc->soc.spi_boot);
441262259eaSCédric Le Goater             aspeed_install_boot_rom(bmc, blk_by_legacy_dinfo(mtd0), rom_size);
4428b744a6aSCédric Le Goater         }
4438b744a6aSCédric Le Goater     }
4448b744a6aSCédric Le Goater 
4452744ece8STao Xu     arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo);
446327d8e4eSAndrew Jeffery }
447327d8e4eSAndrew Jeffery 
448612b219aSPhilippe Mathieu-Daudé static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
4492cf6cb50SCédric Le Goater {
4502cf6cb50SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
451a87e81b9SCédric Le Goater     DeviceState *dev;
4523d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
4532cf6cb50SCédric Le Goater 
4542cf6cb50SCédric Le Goater     /* The palmetto platform expects a ds3231 RTC but a ds1338 is
4552cf6cb50SCédric Le Goater      * enough to provide basic RTC features. Alarms will be missing */
4561373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
457a87e81b9SCédric Le Goater 
4587a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
4593d165f12SCédric Le Goater                           eeprom_buf);
4603d165f12SCédric Le Goater 
461a87e81b9SCédric Le Goater     /* add a TMP423 temperature sensor */
4621373b15bSPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
4631373b15bSPhilippe Mathieu-Daudé                                          "tmp423", 0x4c));
4645325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
4655325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
4665325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
4675325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort);
4682cf6cb50SCédric Le Goater }
4692cf6cb50SCédric Le Goater 
4709cccb912SPatrick Venture static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc)
4719cccb912SPatrick Venture {
4729cccb912SPatrick Venture     AspeedSoCState *soc = &bmc->soc;
4739cccb912SPatrick Venture 
4749cccb912SPatrick Venture     /*
4759cccb912SPatrick Venture      * The quanta-q71l platform expects tmp75s which are compatible with
4769cccb912SPatrick Venture      * tmp105s.
4779cccb912SPatrick Venture      */
4789cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c);
4799cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e);
4809cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f);
4819cccb912SPatrick Venture 
4829cccb912SPatrick Venture     /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */
4839cccb912SPatrick Venture     /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */
4849cccb912SPatrick Venture     /* TODO: Add Memory Riser i2c mux and eeproms. */
4859cccb912SPatrick Venture 
4863ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74);
4873ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77);
4883ec75e39SPatrick Venture 
4899cccb912SPatrick Venture     /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */
4903ec75e39SPatrick Venture 
4913ec75e39SPatrick Venture     /* i2c-7 */
4923ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70);
4939cccb912SPatrick Venture     /*        - i2c@0: pmbus@59 */
4949cccb912SPatrick Venture     /*        - i2c@1: pmbus@58 */
4959cccb912SPatrick Venture     /*        - i2c@2: pmbus@58 */
4969cccb912SPatrick Venture     /*        - i2c@3: pmbus@59 */
4973ec75e39SPatrick Venture 
4989cccb912SPatrick Venture     /* TODO: i2c-7: Add PDB FRU eeprom@52 */
4999cccb912SPatrick Venture     /* TODO: i2c-8: Add BMC FRU eeprom@50 */
5009cccb912SPatrick Venture }
5019cccb912SPatrick Venture 
502612b219aSPhilippe Mathieu-Daudé static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
5032cf6cb50SCédric Le Goater {
5042cf6cb50SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
5053d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
5063d165f12SCédric Le Goater 
5077a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50,
5083d165f12SCédric Le Goater                           eeprom_buf);
5092cf6cb50SCédric Le Goater 
5102cf6cb50SCédric Le Goater     /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
5111373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
512044475f3SPhilippe Mathieu-Daudé                      TYPE_TMP105, 0x4d);
5132cf6cb50SCédric Le Goater }
5142cf6cb50SCédric Le Goater 
515612b219aSPhilippe Mathieu-Daudé static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
516ccc2c418SCédric Le Goater {
51752bcd997SHoward Chiu     AspeedSoCState *soc = &bmc->soc;
51852bcd997SHoward Chiu     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
51952bcd997SHoward Chiu 
52052bcd997SHoward Chiu     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50,
52152bcd997SHoward Chiu                           eeprom_buf);
52252bcd997SHoward Chiu 
52352bcd997SHoward Chiu     /* LM75 is compatible with TMP105 driver */
52452bcd997SHoward Chiu     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
52552bcd997SHoward Chiu                      TYPE_TMP105, 0x4d);
526ccc2c418SCédric Le Goater }
527ccc2c418SCédric Le Goater 
52834f73a81SKarthikeyan Pasupathi static void yosemitev2_bmc_i2c_init(AspeedMachineState *bmc)
52934f73a81SKarthikeyan Pasupathi {
53034f73a81SKarthikeyan Pasupathi     AspeedSoCState *soc = &bmc->soc;
53134f73a81SKarthikeyan Pasupathi 
53234f73a81SKarthikeyan Pasupathi     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x51, 128 * KiB);
53334f73a81SKarthikeyan Pasupathi     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 128 * KiB,
53434f73a81SKarthikeyan Pasupathi                           yosemitev2_bmc_fruid, yosemitev2_bmc_fruid_len);
5350a1f86baSKarthikeyan Pasupathi     /* TMP421 */
5360a1f86baSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "tmp421", 0x1f);
5370a1f86baSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4e);
5380a1f86baSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4f);
5390a1f86baSKarthikeyan Pasupathi 
54034f73a81SKarthikeyan Pasupathi }
54134f73a81SKarthikeyan Pasupathi 
542612b219aSPhilippe Mathieu-Daudé static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
5436c4567c7SCédric Le Goater {
5446c4567c7SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
5456c4567c7SCédric Le Goater 
5466c4567c7SCédric Le Goater     /* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
5476c4567c7SCédric Le Goater      * good enough */
5481373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
5496c4567c7SCédric Le Goater }
5506c4567c7SCédric Le Goater 
5516c323abaSKarthikeyan Pasupathi static void tiogapass_bmc_i2c_init(AspeedMachineState *bmc)
5526c323abaSKarthikeyan Pasupathi {
5536c323abaSKarthikeyan Pasupathi     AspeedSoCState *soc = &bmc->soc;
5546c323abaSKarthikeyan Pasupathi 
5556c323abaSKarthikeyan Pasupathi     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 128 * KiB);
5566c323abaSKarthikeyan Pasupathi     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 6), 0x54, 128 * KiB,
5576c323abaSKarthikeyan Pasupathi                           tiogapass_bmc_fruid, tiogapass_bmc_fruid_len);
558a09d357dSKarthikeyan Pasupathi     /* TMP421 */
559a09d357dSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "tmp421", 0x1f);
560a09d357dSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4f);
561a09d357dSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4e);
5626c323abaSKarthikeyan Pasupathi }
5636c323abaSKarthikeyan Pasupathi 
564f4aec252SCédric Le Goater static void create_pca9552(AspeedSoCState *soc, int bus_id, int addr)
565f4aec252SCédric Le Goater {
566f4aec252SCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, bus_id),
567f4aec252SCédric Le Goater                             TYPE_PCA9552, addr);
568f4aec252SCédric Le Goater }
569f4aec252SCédric Le Goater 
570612b219aSPhilippe Mathieu-Daudé static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc)
571143b040fSPatrick Williams {
572143b040fSPatrick Williams     AspeedSoCState *soc = &bmc->soc;
573143b040fSPatrick Williams 
574143b040fSPatrick Williams     /* bus 2 : */
5751373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48);
5761373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49);
577143b040fSPatrick Williams     /* bus 2 : pca9546 @ 0x73 */
578143b040fSPatrick Williams 
579143b040fSPatrick Williams     /* bus 3 : pca9548 @ 0x70 */
580143b040fSPatrick Williams 
581143b040fSPatrick Williams     /* bus 4 : */
582143b040fSPatrick Williams     uint8_t *eeprom4_54 = g_malloc0(8 * 1024);
5837a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54,
584143b040fSPatrick Williams                           eeprom4_54);
585143b040fSPatrick Williams     /* PCA9539 @ 0x76, but PCA9552 is compatible */
586f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x76);
587143b040fSPatrick Williams     /* PCA9539 @ 0x77, but PCA9552 is compatible */
588f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x77);
589143b040fSPatrick Williams 
590143b040fSPatrick Williams     /* bus 6 : */
5911373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48);
5921373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49);
593143b040fSPatrick Williams     /* bus 6 : pca9546 @ 0x73 */
594143b040fSPatrick Williams 
595143b040fSPatrick Williams     /* bus 8 : */
596143b040fSPatrick Williams     uint8_t *eeprom8_56 = g_malloc0(8 * 1024);
5977a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56,
598143b040fSPatrick Williams                           eeprom8_56);
599f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x60);
600f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x61);
601143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1d */
602143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1f */
603143b040fSPatrick Williams 
604143b040fSPatrick Williams     /*
605143b040fSPatrick Williams      * bus 13 : pca9548 @ 0x71
606143b040fSPatrick Williams      *      - channel 3:
607143b040fSPatrick Williams      *          - tmm421 @ 0x4c
608143b040fSPatrick Williams      *          - tmp421 @ 0x4e
609143b040fSPatrick Williams      *          - tmp421 @ 0x4f
610143b040fSPatrick Williams      */
611143b040fSPatrick Williams 
612143b040fSPatrick Williams }
613143b040fSPatrick Williams 
614612b219aSPhilippe Mathieu-Daudé static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
61562c2c2ebSCédric Le Goater {
6167cfbde5eSPhilippe Mathieu-Daudé     static const struct {
6177cfbde5eSPhilippe Mathieu-Daudé         unsigned gpio_id;
6187cfbde5eSPhilippe Mathieu-Daudé         LEDColor color;
6197cfbde5eSPhilippe Mathieu-Daudé         const char *description;
6207cfbde5eSPhilippe Mathieu-Daudé         bool gpio_polarity;
6217cfbde5eSPhilippe Mathieu-Daudé     } pca1_leds[] = {
6227cfbde5eSPhilippe Mathieu-Daudé         {13, LED_COLOR_GREEN, "front-fault-4",  GPIO_POLARITY_ACTIVE_LOW},
6237cfbde5eSPhilippe Mathieu-Daudé         {14, LED_COLOR_GREEN, "front-power-3",  GPIO_POLARITY_ACTIVE_LOW},
6247cfbde5eSPhilippe Mathieu-Daudé         {15, LED_COLOR_GREEN, "front-id-5",     GPIO_POLARITY_ACTIVE_LOW},
6257cfbde5eSPhilippe Mathieu-Daudé     };
62662c2c2ebSCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
6273d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
62815ce12cfSPhilippe Mathieu-Daudé     DeviceState *dev;
6297cfbde5eSPhilippe Mathieu-Daudé     LEDState *led;
63062c2c2ebSCédric Le Goater 
63163ceb818SCédric Le Goater     /* Bus 3: TODO bmp280@77 */
632db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
63315ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca1");
6342616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
6352616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 3),
63615ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
6378c9a61d7SCédric Le Goater 
6387cfbde5eSPhilippe Mathieu-Daudé     for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) {
6397cfbde5eSPhilippe Mathieu-Daudé         led = led_create_simple(OBJECT(bmc),
6407cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].gpio_polarity,
6417cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].color,
6427cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].description);
6437cfbde5eSPhilippe Mathieu-Daudé         qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id,
6447cfbde5eSPhilippe Mathieu-Daudé                               qdev_get_gpio_in(DEVICE(led), 0));
6457cfbde5eSPhilippe Mathieu-Daudé     }
646b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76);
6472a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "max31785", 0x52);
6481373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c);
6491373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c);
65062c2c2ebSCédric Le Goater 
65162c2c2ebSCédric Le Goater     /* The Witherspoon expects a TMP275 but a TMP105 is compatible */
6521373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105,
653044475f3SPhilippe Mathieu-Daudé                      0x4a);
6546c4567c7SCédric Le Goater 
6556c4567c7SCédric Le Goater     /* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
6566c4567c7SCédric Le Goater      * good enough */
6571373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
6583d165f12SCédric Le Goater 
6597a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51,
6603d165f12SCédric Le Goater                           eeprom_buf);
661db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
66215ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca0");
6632616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
6642616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 11),
66515ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
66663ceb818SCédric Le Goater     /* Bus 11: TODO ucd90160@64 */
66762c2c2ebSCédric Le Goater }
66862c2c2ebSCédric Le Goater 
66995f068c8SJohn Wang static void g220a_bmc_i2c_init(AspeedMachineState *bmc)
67095f068c8SJohn Wang {
67195f068c8SJohn Wang     AspeedSoCState *soc = &bmc->soc;
67295f068c8SJohn Wang     DeviceState *dev;
67395f068c8SJohn Wang 
67495f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3),
67595f068c8SJohn Wang                                          "emc1413", 0x4c));
67695f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
67795f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
67895f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
67995f068c8SJohn Wang 
68095f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12),
68195f068c8SJohn Wang                                          "emc1413", 0x4c));
68295f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
68395f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
68495f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
68595f068c8SJohn Wang 
68695f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13),
68795f068c8SJohn Wang                                          "emc1413", 0x4c));
68895f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
68995f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
69095f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
6916f5f6507SJohn Wang 
6926f5f6507SJohn Wang     static uint8_t eeprom_buf[2 * 1024] = {
6936f5f6507SJohn Wang             0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe,
6946f5f6507SJohn Wang             0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65,
6956f5f6507SJohn Wang             0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32,
6966f5f6507SJohn Wang             0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42,
6976f5f6507SJohn Wang             0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45,
6986f5f6507SJohn Wang             0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1,
6996f5f6507SJohn Wang             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7,
7006f5f6507SJohn Wang     };
7016f5f6507SJohn Wang     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57,
7026f5f6507SJohn Wang                           eeprom_buf);
70395f068c8SJohn Wang }
70495f068c8SJohn Wang 
70582b6a3f6SJohn Wang static void fp5280g2_bmc_i2c_init(AspeedMachineState *bmc)
70682b6a3f6SJohn Wang {
70782b6a3f6SJohn Wang     AspeedSoCState *soc = &bmc->soc;
70882b6a3f6SJohn Wang     I2CSlave *i2c_mux;
70982b6a3f6SJohn Wang 
71082b6a3f6SJohn Wang     /* The at24c256 */
71182b6a3f6SJohn Wang     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 1), 0x50, 32768);
71282b6a3f6SJohn Wang 
71382b6a3f6SJohn Wang     /* The fp5280g2 expects a TMP112 but a TMP105 is compatible */
71482b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
71582b6a3f6SJohn Wang                      0x48);
71682b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
71782b6a3f6SJohn Wang                      0x49);
71882b6a3f6SJohn Wang 
71982b6a3f6SJohn Wang     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
72082b6a3f6SJohn Wang                      "pca9546", 0x70);
72182b6a3f6SJohn Wang     /* It expects a TMP112 but a TMP105 is compatible */
72282b6a3f6SJohn Wang     i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0), TYPE_TMP105,
72382b6a3f6SJohn Wang                      0x4a);
72482b6a3f6SJohn Wang 
72582b6a3f6SJohn Wang     /* It expects a ds3232 but a ds1338 is good enough */
72682b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "ds1338", 0x68);
72782b6a3f6SJohn Wang 
72882b6a3f6SJohn Wang     /* It expects a pca9555 but a pca9552 is compatible */
729f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x30);
73082b6a3f6SJohn Wang }
73182b6a3f6SJohn Wang 
73258e52bdbSCédric Le Goater static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
73358e52bdbSCédric Le Goater {
73458e52bdbSCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
735fa6d98c0SJoel Stanley     I2CSlave *i2c_mux;
736fa6d98c0SJoel Stanley 
7379077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB);
73858e52bdbSCédric Le Goater 
739f4aec252SCédric Le Goater     create_pca9552(soc, 3, 0x61);
740bcb122f8SJoel Stanley 
74158e52bdbSCédric Le Goater     /* The rainier expects a TMP275 but a TMP105 is compatible */
74258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
74358e52bdbSCédric Le Goater                      0x48);
74458e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
74558e52bdbSCédric Le Goater                      0x49);
74658e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
74758e52bdbSCédric Le Goater                      0x4a);
748fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4),
749fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
7509077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
7519077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
7529077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB);
753f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x60);
75458e52bdbSCédric Le Goater 
75558e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
75658e52bdbSCédric Le Goater                      0x48);
75758e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
75858e52bdbSCédric Le Goater                      0x49);
759f4aec252SCédric Le Goater     create_pca9552(soc, 5, 0x60);
760f4aec252SCédric Le Goater     create_pca9552(soc, 5, 0x61);
761fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5),
762fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
7639077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
7649077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
76558e52bdbSCédric Le Goater 
76658e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
76758e52bdbSCédric Le Goater                      0x48);
76858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
76958e52bdbSCédric Le Goater                      0x4a);
77058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
77158e52bdbSCédric Le Goater                      0x4b);
772fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6),
773fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
7749077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
7759077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
7769077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB);
7779077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB);
77858e52bdbSCédric Le Goater 
779f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x30);
780f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x31);
781f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x32);
782f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x33);
783f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x60);
784f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x61);
785b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76);
78658e52bdbSCédric Le Goater     /* Bus 7: TODO si7021-a20@20 */
78758e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105,
78858e52bdbSCédric Le Goater                      0x48);
7892a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "max31785", 0x52);
7909077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB);
7919077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB);
79258e52bdbSCédric Le Goater 
79358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
79458e52bdbSCédric Le Goater                      0x48);
79558e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
79658e52bdbSCédric Le Goater                      0x4a);
797be85508fSNinad Palsule     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50,
798be85508fSNinad Palsule                           64 * KiB, rainier_bb_fruid, rainier_bb_fruid_len);
799be85508fSNinad Palsule     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51,
800be85508fSNinad Palsule                           64 * KiB, rainier_bmc_fruid, rainier_bmc_fruid_len);
801f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x60);
802f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x61);
80358e52bdbSCédric Le Goater     /* Bus 8: ucd90320@11 */
80458e52bdbSCédric Le Goater     /* Bus 8: ucd90320@b */
80558e52bdbSCédric Le Goater     /* Bus 8: ucd90320@c */
80658e52bdbSCédric Le Goater 
80758e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c);
80858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d);
8099077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB);
81058e52bdbSCédric Le Goater 
81158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c);
81258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d);
8139077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB);
81458e52bdbSCédric Le Goater 
81558e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
81658e52bdbSCédric Le Goater                      0x48);
81758e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
81858e52bdbSCédric Le Goater                      0x49);
819fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11),
820fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
8219077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
8229077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
823f4aec252SCédric Le Goater     create_pca9552(soc, 11, 0x60);
824fa6d98c0SJoel Stanley 
825fa6d98c0SJoel Stanley 
8269077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB);
827f4aec252SCédric Le Goater     create_pca9552(soc, 13, 0x60);
828fa6d98c0SJoel Stanley 
8299077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB);
830f4aec252SCédric Le Goater     create_pca9552(soc, 14, 0x60);
831fa6d98c0SJoel Stanley 
8329077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB);
833f4aec252SCédric Le Goater     create_pca9552(soc, 15, 0x60);
83458e52bdbSCédric Le Goater }
83558e52bdbSCédric Le Goater 
836febbe308SPeter Delevoryas static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr,
837febbe308SPeter Delevoryas                                  I2CBus **channels)
838febbe308SPeter Delevoryas {
839febbe308SPeter Delevoryas     I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr);
840febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
841febbe308SPeter Delevoryas         channels[i] = pca954x_i2c_get_bus(mux, i);
842febbe308SPeter Delevoryas     }
843febbe308SPeter Delevoryas }
844febbe308SPeter Delevoryas 
845febbe308SPeter Delevoryas #define TYPE_LM75 TYPE_TMP105
846febbe308SPeter Delevoryas #define TYPE_TMP75 TYPE_TMP105
847febbe308SPeter Delevoryas #define TYPE_TMP422 "tmp422"
848febbe308SPeter Delevoryas 
849febbe308SPeter Delevoryas static void fuji_bmc_i2c_init(AspeedMachineState *bmc)
850febbe308SPeter Delevoryas {
851febbe308SPeter Delevoryas     AspeedSoCState *soc = &bmc->soc;
852febbe308SPeter Delevoryas     I2CBus *i2c[144] = {};
853febbe308SPeter Delevoryas 
854febbe308SPeter Delevoryas     for (int i = 0; i < 16; i++) {
855febbe308SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
856febbe308SPeter Delevoryas     }
857febbe308SPeter Delevoryas     I2CBus *i2c180 = i2c[2];
858febbe308SPeter Delevoryas     I2CBus *i2c480 = i2c[8];
859febbe308SPeter Delevoryas     I2CBus *i2c600 = i2c[11];
860febbe308SPeter Delevoryas 
861febbe308SPeter Delevoryas     get_pca9548_channels(i2c180, 0x70, &i2c[16]);
862febbe308SPeter Delevoryas     get_pca9548_channels(i2c480, 0x70, &i2c[24]);
863febbe308SPeter Delevoryas     /* NOTE: The device tree skips [32, 40) in the alias numbering */
864febbe308SPeter Delevoryas     get_pca9548_channels(i2c600, 0x77, &i2c[40]);
865febbe308SPeter Delevoryas     get_pca9548_channels(i2c[24], 0x71, &i2c[48]);
866febbe308SPeter Delevoryas     get_pca9548_channels(i2c[25], 0x72, &i2c[56]);
867febbe308SPeter Delevoryas     get_pca9548_channels(i2c[26], 0x76, &i2c[64]);
868febbe308SPeter Delevoryas     get_pca9548_channels(i2c[27], 0x76, &i2c[72]);
869febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
870febbe308SPeter Delevoryas         get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]);
871febbe308SPeter Delevoryas     }
872febbe308SPeter Delevoryas 
873febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c);
874febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d);
875febbe308SPeter Delevoryas 
876ef0eb67eSSittisak Sinprem     /*
877ef0eb67eSSittisak Sinprem      * EEPROM 24c64 size is 64Kbits or 8 Kbytes
878ef0eb67eSSittisak Sinprem      *        24c02 size is 2Kbits or 256 bytes
879ef0eb67eSSittisak Sinprem      */
880ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[19], 0x52, 8 * KiB);
881ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[20], 0x50, 256);
882ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[22], 0x52, 256);
883febbe308SPeter Delevoryas 
884febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x48);
885febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x49);
886febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x4a);
887febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_TMP422, 0x4c);
888febbe308SPeter Delevoryas 
889ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[8], 0x51, 8 * KiB);
890febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a);
891febbe308SPeter Delevoryas 
892febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[50], TYPE_LM75, 0x4c);
893ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[50], 0x52, 8 * KiB);
894febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[51], TYPE_TMP75, 0x48);
895febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[52], TYPE_TMP75, 0x49);
896febbe308SPeter Delevoryas 
897febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[59], TYPE_TMP75, 0x48);
898febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[60], TYPE_TMP75, 0x49);
899febbe308SPeter Delevoryas 
900ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[65], 0x53, 8 * KiB);
901febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x49);
902febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x48);
903ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[68], 0x52, 8 * KiB);
904ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[69], 0x52, 8 * KiB);
905ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[70], 0x52, 8 * KiB);
906ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[71], 0x52, 8 * KiB);
907febbe308SPeter Delevoryas 
908ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[73], 0x53, 8 * KiB);
909febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x49);
910febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x48);
911ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[76], 0x52, 8 * KiB);
912ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[77], 0x52, 8 * KiB);
913ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[78], 0x52, 8 * KiB);
914ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[79], 0x52, 8 * KiB);
915ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[28], 0x50, 256);
916febbe308SPeter Delevoryas 
917febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
9189077e09aSPeter Delevoryas         at24c_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB);
919febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[82 + i * 8], TYPE_TMP75, 0x48);
920febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[83 + i * 8], TYPE_TMP75, 0x4b);
921febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[84 + i * 8], TYPE_TMP75, 0x4a);
922febbe308SPeter Delevoryas     }
923febbe308SPeter Delevoryas }
924febbe308SPeter Delevoryas 
925a20c54b1SPatrick Williams #define TYPE_TMP421 "tmp421"
926a20c54b1SPatrick Williams 
927a20c54b1SPatrick Williams static void bletchley_bmc_i2c_init(AspeedMachineState *bmc)
928a20c54b1SPatrick Williams {
929a20c54b1SPatrick Williams     AspeedSoCState *soc = &bmc->soc;
930a20c54b1SPatrick Williams     I2CBus *i2c[13] = {};
931a20c54b1SPatrick Williams     for (int i = 0; i < 13; i++) {
932a20c54b1SPatrick Williams         if ((i == 8) || (i == 11)) {
933a20c54b1SPatrick Williams             continue;
934a20c54b1SPatrick Williams         }
935a20c54b1SPatrick Williams         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
936a20c54b1SPatrick Williams     }
937a20c54b1SPatrick Williams 
938a20c54b1SPatrick Williams     /* Bus 0 - 5 all have the same config. */
939a20c54b1SPatrick Williams     for (int i = 0; i < 6; i++) {
940a20c54b1SPatrick Williams         /* Missing model: ti,ina230 @ 0x45 */
941a20c54b1SPatrick Williams         /* Missing model: mps,mp5023 @ 0x40 */
942a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_TMP421, 0x4f);
943a20c54b1SPatrick Williams         /* Missing model: nxp,pca9539 @ 0x76, but PCA9552 works enough */
944a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x76);
945a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x67);
946a20c54b1SPatrick Williams         /* Missing model: fsc,fusb302 @ 0x22 */
947a20c54b1SPatrick Williams     }
948a20c54b1SPatrick Williams 
949a20c54b1SPatrick Williams     /* Bus 6 */
950a20c54b1SPatrick Williams     at24c_eeprom_init(i2c[6], 0x56, 65536);
951a20c54b1SPatrick Williams     /* Missing model: nxp,pcf85263 @ 0x51 , but ds1338 works enough */
952a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[6], "ds1338", 0x51);
953a20c54b1SPatrick Williams 
954a20c54b1SPatrick Williams 
955a20c54b1SPatrick Williams     /* Bus 7 */
956a20c54b1SPatrick Williams     at24c_eeprom_init(i2c[7], 0x54, 65536);
957a20c54b1SPatrick Williams 
958a20c54b1SPatrick Williams     /* Bus 9 */
959a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[9], TYPE_TMP421, 0x4f);
960a20c54b1SPatrick Williams 
961a20c54b1SPatrick Williams     /* Bus 10 */
962a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[10], TYPE_TMP421, 0x4f);
963a20c54b1SPatrick Williams     /* Missing model: ti,hdc1080 @ 0x40 */
964a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[10], TYPE_PCA9552, 0x67);
965a20c54b1SPatrick Williams 
966a20c54b1SPatrick Williams     /* Bus 12 */
967a20c54b1SPatrick Williams     /* Missing model: adi,adm1278 @ 0x11 */
968a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4c);
969a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4d);
970a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_PCA9552, 0x67);
971a20c54b1SPatrick Williams }
972a20c54b1SPatrick Williams 
973fa699e80SPeter Delevoryas static void fby35_i2c_init(AspeedMachineState *bmc)
974fa699e80SPeter Delevoryas {
975fa699e80SPeter Delevoryas     AspeedSoCState *soc = &bmc->soc;
976fa699e80SPeter Delevoryas     I2CBus *i2c[16];
977fa699e80SPeter Delevoryas 
978fa699e80SPeter Delevoryas     for (int i = 0; i < 16; i++) {
979fa699e80SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
980fa699e80SPeter Delevoryas     }
981fa699e80SPeter Delevoryas 
982fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[2], TYPE_LM75, 0x4f);
983fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_TMP421, 0x1f);
984fa699e80SPeter Delevoryas     /* Hotswap controller is actually supposed to be mp5920 or ltc4282. */
985fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[11], "adm1272", 0x44);
986fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4e);
987fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4f);
988fa699e80SPeter Delevoryas 
9899077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[4], 0x51, 128 * KiB);
9909077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[6], 0x51, 128 * KiB);
991c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[8], 0x50, 32 * KiB, fby35_nic_fruid,
992c0216b94SPeter Delevoryas                           fby35_nic_fruid_len);
993c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[11], 0x51, 128 * KiB, fby35_bb_fruid,
994c0216b94SPeter Delevoryas                           fby35_bb_fruid_len);
995c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[11], 0x54, 128 * KiB, fby35_bmc_fruid,
996c0216b94SPeter Delevoryas                           fby35_bmc_fruid_len);
997fa699e80SPeter Delevoryas 
998fa699e80SPeter Delevoryas     /*
999fa699e80SPeter Delevoryas      * TODO: There is a multi-master i2c connection to an AST1030 MiniBMC on
1000fa699e80SPeter Delevoryas      * buses 0, 1, 2, 3, and 9. Source address 0x10, target address 0x20 on
1001fa699e80SPeter Delevoryas      * each.
1002fa699e80SPeter Delevoryas      */
1003fa699e80SPeter Delevoryas }
1004fa699e80SPeter Delevoryas 
1005fb6b3c8dSJae Hyun Yoo static void qcom_dc_scm_bmc_i2c_init(AspeedMachineState *bmc)
1006fb6b3c8dSJae Hyun Yoo {
1007fb6b3c8dSJae Hyun Yoo     AspeedSoCState *soc = &bmc->soc;
1008fb6b3c8dSJae Hyun Yoo 
1009fb6b3c8dSJae Hyun Yoo     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 15), "tmp105", 0x4d);
1010fb6b3c8dSJae Hyun Yoo }
1011fb6b3c8dSJae Hyun Yoo 
1012ece4cccdSGraeme Gregory static void qcom_dc_scm_firework_i2c_init(AspeedMachineState *bmc)
1013ece4cccdSGraeme Gregory {
1014ece4cccdSGraeme Gregory     AspeedSoCState *soc = &bmc->soc;
10152a7a5d5cSJae Hyun Yoo     I2CSlave *therm_mux, *cpuvr_mux;
1016ece4cccdSGraeme Gregory 
1017ece4cccdSGraeme Gregory     /* Create the generic DC-SCM hardware */
1018ece4cccdSGraeme Gregory     qcom_dc_scm_bmc_i2c_init(bmc);
1019ece4cccdSGraeme Gregory 
1020ece4cccdSGraeme Gregory     /* Now create the Firework specific hardware */
10212a75e8c3SMaheswara Kurapati 
10222a7a5d5cSJae Hyun Yoo     /* I2C7 CPUVR MUX */
10232a7a5d5cSJae Hyun Yoo     cpuvr_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
10242a7a5d5cSJae Hyun Yoo                                         "pca9546", 0x70);
10252a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 0), "pca9548", 0x72);
10262a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 1), "pca9548", 0x72);
10272a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 2), "pca9548", 0x72);
10282a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 3), "pca9548", 0x72);
10292a7a5d5cSJae Hyun Yoo 
1030cfc68f16SMaheswara Kurapati     /* I2C8 Thermal Diodes*/
1031cfc68f16SMaheswara Kurapati     therm_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
1032cfc68f16SMaheswara Kurapati                                         "pca9548", 0x70);
1033cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 0), TYPE_LM75, 0x4C);
1034cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 1), TYPE_LM75, 0x4C);
1035cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 2), TYPE_LM75, 0x48);
1036cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 3), TYPE_LM75, 0x48);
1037cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 4), TYPE_LM75, 0x48);
1038cfc68f16SMaheswara Kurapati 
10392a75e8c3SMaheswara Kurapati     /* I2C9 Fan Controller (MAX31785) */
10402a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x52);
10412a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x54);
1042ece4cccdSGraeme Gregory }
1043ece4cccdSGraeme Gregory 
10441a15311aSCédric Le Goater static bool aspeed_get_mmio_exec(Object *obj, Error **errp)
10451a15311aSCédric Le Goater {
10461a15311aSCédric Le Goater     return ASPEED_MACHINE(obj)->mmio_exec;
10471a15311aSCédric Le Goater }
10481a15311aSCédric Le Goater 
10491a15311aSCédric Le Goater static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp)
10501a15311aSCédric Le Goater {
10511a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = value;
10521a15311aSCédric Le Goater }
10531a15311aSCédric Le Goater 
10541a15311aSCédric Le Goater static void aspeed_machine_instance_init(Object *obj)
10551a15311aSCédric Le Goater {
10561a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = false;
10571a15311aSCédric Le Goater }
10581a15311aSCédric Le Goater 
10599820e52fSCédric Le Goater static char *aspeed_get_fmc_model(Object *obj, Error **errp)
10609820e52fSCédric Le Goater {
10619820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10629820e52fSCédric Le Goater     return g_strdup(bmc->fmc_model);
10639820e52fSCédric Le Goater }
10649820e52fSCédric Le Goater 
10659820e52fSCédric Le Goater static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp)
10669820e52fSCédric Le Goater {
10679820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10689820e52fSCédric Le Goater 
10699820e52fSCédric Le Goater     g_free(bmc->fmc_model);
10709820e52fSCédric Le Goater     bmc->fmc_model = g_strdup(value);
10719820e52fSCédric Le Goater }
10729820e52fSCédric Le Goater 
10739820e52fSCédric Le Goater static char *aspeed_get_spi_model(Object *obj, Error **errp)
10749820e52fSCédric Le Goater {
10759820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10769820e52fSCédric Le Goater     return g_strdup(bmc->spi_model);
10779820e52fSCédric Le Goater }
10789820e52fSCédric Le Goater 
10799820e52fSCédric Le Goater static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp)
10809820e52fSCédric Le Goater {
10819820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10829820e52fSCédric Le Goater 
10839820e52fSCédric Le Goater     g_free(bmc->spi_model);
10849820e52fSCédric Le Goater     bmc->spi_model = g_strdup(value);
10859820e52fSCédric Le Goater }
10869820e52fSCédric Le Goater 
1087f65f6ad5SCédric Le Goater static char *aspeed_get_bmc_console(Object *obj, Error **errp)
1088f65f6ad5SCédric Le Goater {
1089f65f6ad5SCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1090f65f6ad5SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
1091f65f6ad5SCédric Le Goater     int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default;
1092f65f6ad5SCédric Le Goater 
1093f65f6ad5SCédric Le Goater     return g_strdup_printf("uart%d", uart_chosen - ASPEED_DEV_UART1 + 1);
1094f65f6ad5SCédric Le Goater }
1095f65f6ad5SCédric Le Goater 
1096f65f6ad5SCédric Le Goater static void aspeed_set_bmc_console(Object *obj, const char *value, Error **errp)
1097f65f6ad5SCédric Le Goater {
1098f65f6ad5SCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1099f65f6ad5SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
1100f65f6ad5SCédric Le Goater     AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(amc->soc_name));
1101f65f6ad5SCédric Le Goater     int val;
1102f65f6ad5SCédric Le Goater 
1103f65f6ad5SCédric Le Goater     if (sscanf(value, "uart%u", &val) != 1) {
1104f65f6ad5SCédric Le Goater         error_setg(errp, "Bad value for \"uart\" property");
1105f65f6ad5SCédric Le Goater         return;
1106f65f6ad5SCédric Le Goater     }
1107f65f6ad5SCédric Le Goater 
1108f65f6ad5SCédric Le Goater     /* The number of UART depends on the SoC */
1109f65f6ad5SCédric Le Goater     if (val < 1 || val > sc->uarts_num) {
1110f65f6ad5SCédric Le Goater         error_setg(errp, "\"uart\" should be in range [1 - %d]", sc->uarts_num);
1111f65f6ad5SCédric Le Goater         return;
1112f65f6ad5SCédric Le Goater     }
1113f65f6ad5SCédric Le Goater     bmc->uart_chosen = ASPEED_DEV_UART1 + val - 1;
1114f65f6ad5SCédric Le Goater }
1115f65f6ad5SCédric Le Goater 
11161a15311aSCédric Le Goater static void aspeed_machine_class_props_init(ObjectClass *oc)
11171a15311aSCédric Le Goater {
11181a15311aSCédric Le Goater     object_class_property_add_bool(oc, "execute-in-place",
11191a15311aSCédric Le Goater                                    aspeed_get_mmio_exec,
1120d2623129SMarkus Armbruster                                    aspeed_set_mmio_exec);
11211a15311aSCédric Le Goater     object_class_property_set_description(oc, "execute-in-place",
11227eecec7dSMarkus Armbruster                            "boot directly from CE0 flash device");
11239820e52fSCédric Le Goater 
1124f65f6ad5SCédric Le Goater     object_class_property_add_str(oc, "bmc-console", aspeed_get_bmc_console,
1125f65f6ad5SCédric Le Goater                                   aspeed_set_bmc_console);
1126f65f6ad5SCédric Le Goater     object_class_property_set_description(oc, "bmc-console",
1127f65f6ad5SCédric Le Goater                            "Change the default UART to \"uartX\"");
1128f65f6ad5SCédric Le Goater 
11299820e52fSCédric Le Goater     object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model,
11309820e52fSCédric Le Goater                                    aspeed_set_fmc_model);
11319820e52fSCédric Le Goater     object_class_property_set_description(oc, "fmc-model",
11329820e52fSCédric Le Goater                                           "Change the FMC Flash model");
11339820e52fSCédric Le Goater     object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model,
11349820e52fSCédric Le Goater                                    aspeed_set_spi_model);
11359820e52fSCédric Le Goater     object_class_property_set_description(oc, "spi-model",
11369820e52fSCédric Le Goater                                           "Change the SPI Flash model");
11371a15311aSCédric Le Goater }
11381a15311aSCédric Le Goater 
1139b7f1a0cbSCédric Le Goater static int aspeed_soc_num_cpus(const char *soc_name)
1140b7f1a0cbSCédric Le Goater {
1141b7f1a0cbSCédric Le Goater    AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(soc_name));
1142b7f1a0cbSCédric Le Goater    return sc->num_cpus;
1143b7f1a0cbSCédric Le Goater }
1144b7f1a0cbSCédric Le Goater 
1145fca9ca1bSCédric Le Goater static void aspeed_machine_class_init(ObjectClass *oc, void *data)
114662c2c2ebSCédric Le Goater {
114762c2c2ebSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1148d3bad7e7SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
114962c2c2ebSCédric Le Goater 
1150fca9ca1bSCédric Le Goater     mc->init = aspeed_machine_init;
115162c2c2ebSCédric Le Goater     mc->no_floppy = 1;
115262c2c2ebSCédric Le Goater     mc->no_cdrom = 1;
115362c2c2ebSCédric Le Goater     mc->no_parallel = 1;
1154afcbaed6SIgor Mammedov     mc->default_ram_id = "ram";
1155d3bad7e7SCédric Le Goater     amc->macs_mask = ASPEED_MAC0_ON;
11565d63d0c7SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART5;
11571a15311aSCédric Le Goater 
11581a15311aSCédric Le Goater     aspeed_machine_class_props_init(oc);
115962c2c2ebSCédric Le Goater }
116062c2c2ebSCédric Le Goater 
1161baa4732bSCédric Le Goater static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
1162baa4732bSCédric Le Goater {
1163baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1164baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1165baa4732bSCédric Le Goater 
1166baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Palmetto BMC (ARM926EJ-S)";
1167baa4732bSCédric Le Goater     amc->soc_name  = "ast2400-a1";
1168baa4732bSCédric Le Goater     amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1;
1169baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
117070322913SCédric Le Goater     amc->spi_model = "mx25l25635f";
1171baa4732bSCédric Le Goater     amc->num_cs    = 1;
1172baa4732bSCédric Le Goater     amc->i2c_init  = palmetto_bmc_i2c_init;
1173baa4732bSCédric Le Goater     mc->default_ram_size       = 256 * MiB;
1174b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1175b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1176baa4732bSCédric Le Goater };
1177baa4732bSCédric Le Goater 
11789cccb912SPatrick Venture static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data)
11799cccb912SPatrick Venture {
11809cccb912SPatrick Venture     MachineClass *mc = MACHINE_CLASS(oc);
11819cccb912SPatrick Venture     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
11829cccb912SPatrick Venture 
11839cccb912SPatrick Venture     mc->desc       = "Quanta-Q71l BMC (ARM926EJ-S)";
11849cccb912SPatrick Venture     amc->soc_name  = "ast2400-a1";
11859cccb912SPatrick Venture     amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1;
11869cccb912SPatrick Venture     amc->fmc_model = "n25q256a";
11879cccb912SPatrick Venture     amc->spi_model = "mx25l25635e";
11889cccb912SPatrick Venture     amc->num_cs    = 1;
11899cccb912SPatrick Venture     amc->i2c_init  = quanta_q71l_bmc_i2c_init;
11909cccb912SPatrick Venture     mc->default_ram_size       = 128 * MiB;
11919cccb912SPatrick Venture     mc->default_cpus = mc->min_cpus = mc->max_cpus =
11929cccb912SPatrick Venture         aspeed_soc_num_cpus(amc->soc_name);
11939cccb912SPatrick Venture }
11949cccb912SPatrick Venture 
119540a38df5SErik Smit static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc,
119640a38df5SErik Smit                                                         void *data)
119740a38df5SErik Smit {
119840a38df5SErik Smit     MachineClass *mc = MACHINE_CLASS(oc);
119940a38df5SErik Smit     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
120040a38df5SErik Smit 
120140a38df5SErik Smit     mc->desc       = "Supermicro X11 BMC (ARM926EJ-S)";
120240a38df5SErik Smit     amc->soc_name  = "ast2400-a1";
120340a38df5SErik Smit     amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1;
120440a38df5SErik Smit     amc->fmc_model = "mx25l25635e";
120540a38df5SErik Smit     amc->spi_model = "mx25l25635e";
120640a38df5SErik Smit     amc->num_cs    = 1;
120740a38df5SErik Smit     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
120840a38df5SErik Smit     amc->i2c_init  = palmetto_bmc_i2c_init;
120940a38df5SErik Smit     mc->default_ram_size = 256 * MiB;
121040a38df5SErik Smit }
121140a38df5SErik Smit 
121247936597SGuenter Roeck static void aspeed_machine_supermicro_x11spi_bmc_class_init(ObjectClass *oc,
121347936597SGuenter Roeck                                                             void *data)
121447936597SGuenter Roeck {
121547936597SGuenter Roeck     MachineClass *mc = MACHINE_CLASS(oc);
121647936597SGuenter Roeck     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
121747936597SGuenter Roeck 
121847936597SGuenter Roeck     mc->desc       = "Supermicro X11 SPI BMC (ARM1176)";
121947936597SGuenter Roeck     amc->soc_name  = "ast2500-a1";
122047936597SGuenter Roeck     amc->hw_strap1 = SUPERMICRO_X11SPI_BMC_HW_STRAP1;
122147936597SGuenter Roeck     amc->fmc_model = "mx25l25635e";
122247936597SGuenter Roeck     amc->spi_model = "mx25l25635e";
122347936597SGuenter Roeck     amc->num_cs    = 1;
122447936597SGuenter Roeck     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
122547936597SGuenter Roeck     amc->i2c_init  = palmetto_bmc_i2c_init;
122647936597SGuenter Roeck     mc->default_ram_size = 512 * MiB;
122747936597SGuenter Roeck     mc->default_cpus = mc->min_cpus = mc->max_cpus =
122847936597SGuenter Roeck         aspeed_soc_num_cpus(amc->soc_name);
122947936597SGuenter Roeck }
123047936597SGuenter Roeck 
1231baa4732bSCédric Le Goater static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data)
1232baa4732bSCédric Le Goater {
1233baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1234baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1235baa4732bSCédric Le Goater 
1236baa4732bSCédric Le Goater     mc->desc       = "Aspeed AST2500 EVB (ARM1176)";
1237baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1238baa4732bSCédric Le Goater     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
1239753abfc4SJae Hyun Yoo     amc->fmc_model = "mx25l25635e";
124070322913SCédric Le Goater     amc->spi_model = "mx25l25635f";
1241baa4732bSCédric Le Goater     amc->num_cs    = 1;
1242baa4732bSCédric Le Goater     amc->i2c_init  = ast2500_evb_i2c_init;
1243baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
1244b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1245b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1246baa4732bSCédric Le Goater };
1247baa4732bSCédric Le Goater 
124834f73a81SKarthikeyan Pasupathi static void aspeed_machine_yosemitev2_class_init(ObjectClass *oc, void *data)
124934f73a81SKarthikeyan Pasupathi {
125034f73a81SKarthikeyan Pasupathi     MachineClass *mc = MACHINE_CLASS(oc);
125134f73a81SKarthikeyan Pasupathi     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
125234f73a81SKarthikeyan Pasupathi 
125334f73a81SKarthikeyan Pasupathi     mc->desc       = "Facebook YosemiteV2 BMC (ARM1176)";
125434f73a81SKarthikeyan Pasupathi     amc->soc_name  = "ast2500-a1";
125534f73a81SKarthikeyan Pasupathi     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
125634f73a81SKarthikeyan Pasupathi     amc->hw_strap2 = 0;
125734f73a81SKarthikeyan Pasupathi     amc->fmc_model = "n25q256a";
125834f73a81SKarthikeyan Pasupathi     amc->spi_model = "mx25l25635e";
125934f73a81SKarthikeyan Pasupathi     amc->num_cs    = 2;
126034f73a81SKarthikeyan Pasupathi     amc->i2c_init  = yosemitev2_bmc_i2c_init;
126134f73a81SKarthikeyan Pasupathi     mc->default_ram_size       = 512 * MiB;
126234f73a81SKarthikeyan Pasupathi     mc->default_cpus = mc->min_cpus = mc->max_cpus =
126334f73a81SKarthikeyan Pasupathi         aspeed_soc_num_cpus(amc->soc_name);
126434f73a81SKarthikeyan Pasupathi };
126534f73a81SKarthikeyan Pasupathi 
1266baa4732bSCédric Le Goater static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data)
1267baa4732bSCédric Le Goater {
1268baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1269baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1270baa4732bSCédric Le Goater 
1271baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Romulus BMC (ARM1176)";
1272baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1273baa4732bSCédric Le Goater     amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1;
1274baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
1275baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1276baa4732bSCédric Le Goater     amc->num_cs    = 2;
1277baa4732bSCédric Le Goater     amc->i2c_init  = romulus_bmc_i2c_init;
1278baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
1279b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1280b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1281baa4732bSCédric Le Goater };
1282baa4732bSCédric Le Goater 
12836c323abaSKarthikeyan Pasupathi static void aspeed_machine_tiogapass_class_init(ObjectClass *oc, void *data)
12846c323abaSKarthikeyan Pasupathi {
12856c323abaSKarthikeyan Pasupathi     MachineClass *mc = MACHINE_CLASS(oc);
12866c323abaSKarthikeyan Pasupathi     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
12876c323abaSKarthikeyan Pasupathi 
12886c323abaSKarthikeyan Pasupathi     mc->desc       = "Facebook Tiogapass BMC (ARM1176)";
12896c323abaSKarthikeyan Pasupathi     amc->soc_name  = "ast2500-a1";
12906c323abaSKarthikeyan Pasupathi     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
12916c323abaSKarthikeyan Pasupathi     amc->hw_strap2 = 0;
12926c323abaSKarthikeyan Pasupathi     amc->fmc_model = "n25q256a";
12936c323abaSKarthikeyan Pasupathi     amc->spi_model = "mx25l25635e";
12946c323abaSKarthikeyan Pasupathi     amc->num_cs    = 2;
12956c323abaSKarthikeyan Pasupathi     amc->i2c_init  = tiogapass_bmc_i2c_init;
12966c323abaSKarthikeyan Pasupathi     mc->default_ram_size       = 1 * GiB;
12976c323abaSKarthikeyan Pasupathi     mc->default_cpus = mc->min_cpus = mc->max_cpus =
12986c323abaSKarthikeyan Pasupathi         aspeed_soc_num_cpus(amc->soc_name);
12996c323abaSKarthikeyan Pasupathi         aspeed_soc_num_cpus(amc->soc_name);
13006c323abaSKarthikeyan Pasupathi };
13016c323abaSKarthikeyan Pasupathi 
1302143b040fSPatrick Williams static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data)
1303143b040fSPatrick Williams {
1304143b040fSPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1305143b040fSPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1306143b040fSPatrick Williams 
1307143b040fSPatrick Williams     mc->desc       = "OCP SonoraPass BMC (ARM1176)";
1308143b040fSPatrick Williams     amc->soc_name  = "ast2500-a1";
1309143b040fSPatrick Williams     amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1;
1310143b040fSPatrick Williams     amc->fmc_model = "mx66l1g45g";
1311143b040fSPatrick Williams     amc->spi_model = "mx66l1g45g";
1312143b040fSPatrick Williams     amc->num_cs    = 2;
1313143b040fSPatrick Williams     amc->i2c_init  = sonorapass_bmc_i2c_init;
1314143b040fSPatrick Williams     mc->default_ram_size       = 512 * MiB;
1315b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1316b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1317143b040fSPatrick Williams };
1318143b040fSPatrick Williams 
1319baa4732bSCédric Le Goater static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data)
1320baa4732bSCédric Le Goater {
1321baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1322baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1323baa4732bSCédric Le Goater 
1324baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Witherspoon BMC (ARM1176)";
1325baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1326baa4732bSCédric Le Goater     amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1;
132770322913SCédric Le Goater     amc->fmc_model = "mx25l25635f";
1328baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1329baa4732bSCédric Le Goater     amc->num_cs    = 2;
1330baa4732bSCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init;
1331baa4732bSCédric Le Goater     mc->default_ram_size = 512 * MiB;
1332b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1333b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1334baa4732bSCédric Le Goater };
1335baa4732bSCédric Le Goater 
1336baa4732bSCédric Le Goater static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
1337baa4732bSCédric Le Goater {
1338baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1339baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1340baa4732bSCédric Le Goater 
1341f548f201SPeter Maydell     mc->desc       = "Aspeed AST2600 EVB (Cortex-A7)";
1342c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
1343baa4732bSCédric Le Goater     amc->hw_strap1 = AST2600_EVB_HW_STRAP1;
1344baa4732bSCédric Le Goater     amc->hw_strap2 = AST2600_EVB_HW_STRAP2;
1345753abfc4SJae Hyun Yoo     amc->fmc_model = "mx66u51235f";
1346baa4732bSCédric Le Goater     amc->spi_model = "mx66u51235f";
1347baa4732bSCédric Le Goater     amc->num_cs    = 1;
134829193286SGuenter Roeck     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON |
134929193286SGuenter Roeck                      ASPEED_MAC3_ON;
1350baa4732bSCédric Le Goater     amc->i2c_init  = ast2600_evb_i2c_init;
1351baa4732bSCédric Le Goater     mc->default_ram_size = 1 * GiB;
1352b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1353b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1354baa4732bSCédric Le Goater };
1355baa4732bSCédric Le Goater 
135663ceb818SCédric Le Goater static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data)
135763ceb818SCédric Le Goater {
135863ceb818SCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
135963ceb818SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
136063ceb818SCédric Le Goater 
1361f548f201SPeter Maydell     mc->desc       = "OpenPOWER Tacoma BMC (Cortex-A7)";
1362c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
136363ceb818SCédric Le Goater     amc->hw_strap1 = TACOMA_BMC_HW_STRAP1;
136463ceb818SCédric Le Goater     amc->hw_strap2 = TACOMA_BMC_HW_STRAP2;
136563ceb818SCédric Le Goater     amc->fmc_model = "mx66l1g45g";
136663ceb818SCédric Le Goater     amc->spi_model = "mx66l1g45g";
136763ceb818SCédric Le Goater     amc->num_cs    = 2;
1368d3bad7e7SCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON;
136963ceb818SCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init; /* Same board layout */
137063ceb818SCédric Le Goater     mc->default_ram_size = 1 * GiB;
1371b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1372b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
137363ceb818SCédric Le Goater };
137463ceb818SCédric Le Goater 
137595f068c8SJohn Wang static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data)
137695f068c8SJohn Wang {
137795f068c8SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
137895f068c8SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
137995f068c8SJohn Wang 
138095f068c8SJohn Wang     mc->desc       = "Bytedance G220A BMC (ARM1176)";
138195f068c8SJohn Wang     amc->soc_name  = "ast2500-a1";
138295f068c8SJohn Wang     amc->hw_strap1 = G220A_BMC_HW_STRAP1;
138395f068c8SJohn Wang     amc->fmc_model = "n25q512a";
138495f068c8SJohn Wang     amc->spi_model = "mx25l25635e";
138595f068c8SJohn Wang     amc->num_cs    = 2;
13865bb825c8SGuenter Roeck     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
138795f068c8SJohn Wang     amc->i2c_init  = g220a_bmc_i2c_init;
138895f068c8SJohn Wang     mc->default_ram_size = 1024 * MiB;
138995f068c8SJohn Wang     mc->default_cpus = mc->min_cpus = mc->max_cpus =
139095f068c8SJohn Wang         aspeed_soc_num_cpus(amc->soc_name);
139195f068c8SJohn Wang };
139295f068c8SJohn Wang 
139382b6a3f6SJohn Wang static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc, void *data)
139482b6a3f6SJohn Wang {
139582b6a3f6SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
139682b6a3f6SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
139782b6a3f6SJohn Wang 
139882b6a3f6SJohn Wang     mc->desc       = "Inspur FP5280G2 BMC (ARM1176)";
139982b6a3f6SJohn Wang     amc->soc_name  = "ast2500-a1";
140082b6a3f6SJohn Wang     amc->hw_strap1 = FP5280G2_BMC_HW_STRAP1;
140182b6a3f6SJohn Wang     amc->fmc_model = "n25q512a";
140282b6a3f6SJohn Wang     amc->spi_model = "mx25l25635e";
140382b6a3f6SJohn Wang     amc->num_cs    = 2;
140482b6a3f6SJohn Wang     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
140582b6a3f6SJohn Wang     amc->i2c_init  = fp5280g2_bmc_i2c_init;
140682b6a3f6SJohn Wang     mc->default_ram_size = 512 * MiB;
140782b6a3f6SJohn Wang     mc->default_cpus = mc->min_cpus = mc->max_cpus =
140882b6a3f6SJohn Wang         aspeed_soc_num_cpus(amc->soc_name);
140982b6a3f6SJohn Wang };
141082b6a3f6SJohn Wang 
141158e52bdbSCédric Le Goater static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data)
141258e52bdbSCédric Le Goater {
141358e52bdbSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
141458e52bdbSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
141558e52bdbSCédric Le Goater 
1416f548f201SPeter Maydell     mc->desc       = "IBM Rainier BMC (Cortex-A7)";
1417c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
141858e52bdbSCédric Le Goater     amc->hw_strap1 = RAINIER_BMC_HW_STRAP1;
141958e52bdbSCédric Le Goater     amc->hw_strap2 = RAINIER_BMC_HW_STRAP2;
142058e52bdbSCédric Le Goater     amc->fmc_model = "mx66l1g45g";
142158e52bdbSCédric Le Goater     amc->spi_model = "mx66l1g45g";
142258e52bdbSCédric Le Goater     amc->num_cs    = 2;
142358e52bdbSCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
142458e52bdbSCédric Le Goater     amc->i2c_init  = rainier_bmc_i2c_init;
142558e52bdbSCédric Le Goater     mc->default_ram_size = 1 * GiB;
142658e52bdbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
142758e52bdbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
142858e52bdbSCédric Le Goater };
142958e52bdbSCédric Le Goater 
14301e2c22c9SCédric Le Goater #define FUJI_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB)
1431febbe308SPeter Delevoryas 
1432febbe308SPeter Delevoryas static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data)
1433febbe308SPeter Delevoryas {
1434febbe308SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1435febbe308SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1436febbe308SPeter Delevoryas 
1437febbe308SPeter Delevoryas     mc->desc = "Facebook Fuji BMC (Cortex-A7)";
1438febbe308SPeter Delevoryas     amc->soc_name = "ast2600-a3";
1439febbe308SPeter Delevoryas     amc->hw_strap1 = FUJI_BMC_HW_STRAP1;
1440febbe308SPeter Delevoryas     amc->hw_strap2 = FUJI_BMC_HW_STRAP2;
1441febbe308SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1442febbe308SPeter Delevoryas     amc->spi_model = "mx66l1g45g";
1443febbe308SPeter Delevoryas     amc->num_cs = 2;
1444febbe308SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1445febbe308SPeter Delevoryas     amc->i2c_init = fuji_bmc_i2c_init;
1446febbe308SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART1;
1447febbe308SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
1448febbe308SPeter Delevoryas     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1449febbe308SPeter Delevoryas         aspeed_soc_num_cpus(amc->soc_name);
1450febbe308SPeter Delevoryas };
1451febbe308SPeter Delevoryas 
14521e2c22c9SCédric Le Goater #define BLETCHLEY_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB)
1453104bdaffSPatrick Williams 
1454a20c54b1SPatrick Williams static void aspeed_machine_bletchley_class_init(ObjectClass *oc, void *data)
1455a20c54b1SPatrick Williams {
1456a20c54b1SPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1457a20c54b1SPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1458a20c54b1SPatrick Williams 
1459a20c54b1SPatrick Williams     mc->desc       = "Facebook Bletchley BMC (Cortex-A7)";
1460a20c54b1SPatrick Williams     amc->soc_name  = "ast2600-a3";
1461a20c54b1SPatrick Williams     amc->hw_strap1 = BLETCHLEY_BMC_HW_STRAP1;
1462a20c54b1SPatrick Williams     amc->hw_strap2 = BLETCHLEY_BMC_HW_STRAP2;
1463a20c54b1SPatrick Williams     amc->fmc_model = "w25q01jvq";
1464a20c54b1SPatrick Williams     amc->spi_model = NULL;
1465a20c54b1SPatrick Williams     amc->num_cs    = 2;
1466a20c54b1SPatrick Williams     amc->macs_mask = ASPEED_MAC2_ON;
1467a20c54b1SPatrick Williams     amc->i2c_init  = bletchley_bmc_i2c_init;
1468104bdaffSPatrick Williams     mc->default_ram_size = BLETCHLEY_BMC_RAM_SIZE;
1469a20c54b1SPatrick Williams     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1470a20c54b1SPatrick Williams         aspeed_soc_num_cpus(amc->soc_name);
1471a20c54b1SPatrick Williams }
1472a20c54b1SPatrick Williams 
14737966d70fSJason A. Donenfeld static void fby35_reset(MachineState *state, ShutdownCause reason)
1474fa699e80SPeter Delevoryas {
1475fa699e80SPeter Delevoryas     AspeedMachineState *bmc = ASPEED_MACHINE(state);
1476fa699e80SPeter Delevoryas     AspeedGPIOState *gpio = &bmc->soc.gpio;
1477fa699e80SPeter Delevoryas 
14787966d70fSJason A. Donenfeld     qemu_devices_reset(reason);
1479fa699e80SPeter Delevoryas 
1480f0418558SPeter Delevoryas     /* Board ID: 7 (Class-1, 4 slots) */
1481fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV4", true, &error_fatal);
1482fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV5", true, &error_fatal);
1483fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV6", true, &error_fatal);
1484fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV7", false, &error_fatal);
1485f0418558SPeter Delevoryas 
1486f0418558SPeter Delevoryas     /* Slot presence pins, inverse polarity. (False means present) */
1487f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH4", false, &error_fatal);
1488f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH5", true, &error_fatal);
1489f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH6", true, &error_fatal);
1490f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH7", true, &error_fatal);
1491f0418558SPeter Delevoryas 
1492f0418558SPeter Delevoryas     /* Slot 12v power pins, normal polarity. (True means powered-on) */
1493f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB2", true, &error_fatal);
1494f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB3", false, &error_fatal);
1495f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB4", false, &error_fatal);
1496f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB5", false, &error_fatal);
1497fa699e80SPeter Delevoryas }
1498fa699e80SPeter Delevoryas 
1499fa699e80SPeter Delevoryas static void aspeed_machine_fby35_class_init(ObjectClass *oc, void *data)
1500fa699e80SPeter Delevoryas {
1501fa699e80SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1502fa699e80SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1503fa699e80SPeter Delevoryas 
1504fa699e80SPeter Delevoryas     mc->desc       = "Facebook fby35 BMC (Cortex-A7)";
1505fa699e80SPeter Delevoryas     mc->reset      = fby35_reset;
1506fa699e80SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1507fa699e80SPeter Delevoryas     amc->num_cs    = 2;
1508fa699e80SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1509fa699e80SPeter Delevoryas     amc->i2c_init  = fby35_i2c_init;
1510fa699e80SPeter Delevoryas     /* FIXME: Replace this macro with something more general */
1511fa699e80SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
1512fa699e80SPeter Delevoryas }
1513fa699e80SPeter Delevoryas 
151466c895b8SJamin Lin #define AST1030_INTERNAL_FLASH_SIZE (1024 * 1024)
151566c895b8SJamin Lin /* Main SYSCLK frequency in Hz (200MHz) */
151666c895b8SJamin Lin #define SYSCLK_FRQ 200000000ULL
151766c895b8SJamin Lin 
151866c895b8SJamin Lin static void aspeed_minibmc_machine_init(MachineState *machine)
151966c895b8SJamin Lin {
152066c895b8SJamin Lin     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
152166c895b8SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
152266c895b8SJamin Lin     Clock *sysclk;
152366c895b8SJamin Lin 
152466c895b8SJamin Lin     sysclk = clock_new(OBJECT(machine), "SYSCLK");
152566c895b8SJamin Lin     clock_set_hz(sysclk, SYSCLK_FRQ);
152666c895b8SJamin Lin 
152766c895b8SJamin Lin     object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
152866c895b8SJamin Lin     qdev_connect_clock_in(DEVICE(&bmc->soc), "sysclk", sysclk);
152966c895b8SJamin Lin 
15304dd9d554SPeter Delevoryas     object_property_set_link(OBJECT(&bmc->soc), "memory",
15314dd9d554SPeter Delevoryas                              OBJECT(get_system_memory()), &error_abort);
1532d2b3eaefSPeter Delevoryas     connect_serial_hds_to_uarts(bmc);
153366c895b8SJamin Lin     qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
153466c895b8SJamin Lin 
153566c895b8SJamin Lin     aspeed_board_init_flashes(&bmc->soc.fmc,
153666c895b8SJamin Lin                               bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
153766c895b8SJamin Lin                               amc->num_cs,
153866c895b8SJamin Lin                               0);
153966c895b8SJamin Lin 
154066c895b8SJamin Lin     aspeed_board_init_flashes(&bmc->soc.spi[0],
154166c895b8SJamin Lin                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
154266c895b8SJamin Lin                               amc->num_cs, amc->num_cs);
154366c895b8SJamin Lin 
154466c895b8SJamin Lin     aspeed_board_init_flashes(&bmc->soc.spi[1],
154566c895b8SJamin Lin                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
154666c895b8SJamin Lin                               amc->num_cs, (amc->num_cs * 2));
154766c895b8SJamin Lin 
154866c895b8SJamin Lin     if (amc->i2c_init) {
154966c895b8SJamin Lin         amc->i2c_init(bmc);
155066c895b8SJamin Lin     }
155166c895b8SJamin Lin 
155266c895b8SJamin Lin     armv7m_load_kernel(ARM_CPU(first_cpu),
155366c895b8SJamin Lin                        machine->kernel_filename,
1554761c532aSPeter Maydell                        0,
155566c895b8SJamin Lin                        AST1030_INTERNAL_FLASH_SIZE);
155666c895b8SJamin Lin }
155766c895b8SJamin Lin 
15584c70ab16STroy Lee static void ast1030_evb_i2c_init(AspeedMachineState *bmc)
15594c70ab16STroy Lee {
15604c70ab16STroy Lee     AspeedSoCState *soc = &bmc->soc;
15614c70ab16STroy Lee 
1562673d8215SMichael Tokarev     /* U10 24C08 connects to SDA/SCL Group 1 by default */
15634c70ab16STroy Lee     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
15644c70ab16STroy Lee     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, eeprom_buf);
15654c70ab16STroy Lee 
15664c70ab16STroy Lee     /* U11 LM75 connects to SDA/SCL Group 2 by default */
15674c70ab16STroy Lee     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d);
15684c70ab16STroy Lee }
15694c70ab16STroy Lee 
157066c895b8SJamin Lin static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc,
157166c895b8SJamin Lin                                                           void *data)
157266c895b8SJamin Lin {
157366c895b8SJamin Lin     MachineClass *mc = MACHINE_CLASS(oc);
157466c895b8SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
157566c895b8SJamin Lin 
157666c895b8SJamin Lin     mc->desc = "Aspeed AST1030 MiniBMC (Cortex-M4)";
157766c895b8SJamin Lin     amc->soc_name = "ast1030-a1";
157866c895b8SJamin Lin     amc->hw_strap1 = 0;
157966c895b8SJamin Lin     amc->hw_strap2 = 0;
158066c895b8SJamin Lin     mc->init = aspeed_minibmc_machine_init;
15814c70ab16STroy Lee     amc->i2c_init = ast1030_evb_i2c_init;
158266c895b8SJamin Lin     mc->default_ram_size = 0;
158366c895b8SJamin Lin     mc->default_cpus = mc->min_cpus = mc->max_cpus = 1;
158466c895b8SJamin Lin     amc->fmc_model = "sst25vf032b";
158566c895b8SJamin Lin     amc->spi_model = "sst25vf032b";
158666c895b8SJamin Lin     amc->num_cs = 2;
158766c895b8SJamin Lin     amc->macs_mask = 0;
158866c895b8SJamin Lin }
158966c895b8SJamin Lin 
1590fb6b3c8dSJae Hyun Yoo static void aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass *oc,
1591fb6b3c8dSJae Hyun Yoo                                                      void *data)
1592fb6b3c8dSJae Hyun Yoo {
1593fb6b3c8dSJae Hyun Yoo     MachineClass *mc = MACHINE_CLASS(oc);
1594fb6b3c8dSJae Hyun Yoo     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1595fb6b3c8dSJae Hyun Yoo 
1596fb6b3c8dSJae Hyun Yoo     mc->desc       = "Qualcomm DC-SCM V1 BMC (Cortex A7)";
1597fb6b3c8dSJae Hyun Yoo     amc->soc_name  = "ast2600-a3";
1598fb6b3c8dSJae Hyun Yoo     amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1599fb6b3c8dSJae Hyun Yoo     amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1600fb6b3c8dSJae Hyun Yoo     amc->fmc_model = "n25q512a";
1601fb6b3c8dSJae Hyun Yoo     amc->spi_model = "n25q512a";
1602fb6b3c8dSJae Hyun Yoo     amc->num_cs    = 2;
1603fb6b3c8dSJae Hyun Yoo     amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1604fb6b3c8dSJae Hyun Yoo     amc->i2c_init  = qcom_dc_scm_bmc_i2c_init;
1605fb6b3c8dSJae Hyun Yoo     mc->default_ram_size = 1 * GiB;
1606fb6b3c8dSJae Hyun Yoo     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1607fb6b3c8dSJae Hyun Yoo         aspeed_soc_num_cpus(amc->soc_name);
1608fb6b3c8dSJae Hyun Yoo };
1609fb6b3c8dSJae Hyun Yoo 
1610ece4cccdSGraeme Gregory static void aspeed_machine_qcom_firework_class_init(ObjectClass *oc,
1611ece4cccdSGraeme Gregory                                                     void *data)
1612ece4cccdSGraeme Gregory {
1613ece4cccdSGraeme Gregory     MachineClass *mc = MACHINE_CLASS(oc);
1614ece4cccdSGraeme Gregory     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1615ece4cccdSGraeme Gregory 
1616ece4cccdSGraeme Gregory     mc->desc       = "Qualcomm DC-SCM V1/Firework BMC (Cortex A7)";
1617ece4cccdSGraeme Gregory     amc->soc_name  = "ast2600-a3";
1618ece4cccdSGraeme Gregory     amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1619ece4cccdSGraeme Gregory     amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1620ece4cccdSGraeme Gregory     amc->fmc_model = "n25q512a";
1621ece4cccdSGraeme Gregory     amc->spi_model = "n25q512a";
1622ece4cccdSGraeme Gregory     amc->num_cs    = 2;
1623ece4cccdSGraeme Gregory     amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1624ece4cccdSGraeme Gregory     amc->i2c_init  = qcom_dc_scm_firework_i2c_init;
1625ece4cccdSGraeme Gregory     mc->default_ram_size = 1 * GiB;
1626ece4cccdSGraeme Gregory     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1627ece4cccdSGraeme Gregory         aspeed_soc_num_cpus(amc->soc_name);
1628ece4cccdSGraeme Gregory };
1629ece4cccdSGraeme Gregory 
1630baa4732bSCédric Le Goater static const TypeInfo aspeed_machine_types[] = {
1631baa4732bSCédric Le Goater     {
1632baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("palmetto-bmc"),
1633baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1634baa4732bSCédric Le Goater         .class_init    = aspeed_machine_palmetto_class_init,
1635baa4732bSCédric Le Goater     }, {
163640a38df5SErik Smit         .name          = MACHINE_TYPE_NAME("supermicrox11-bmc"),
163740a38df5SErik Smit         .parent        = TYPE_ASPEED_MACHINE,
163840a38df5SErik Smit         .class_init    = aspeed_machine_supermicrox11_bmc_class_init,
163940a38df5SErik Smit     }, {
164047936597SGuenter Roeck         .name          = MACHINE_TYPE_NAME("supermicro-x11spi-bmc"),
164147936597SGuenter Roeck         .parent        = TYPE_ASPEED_MACHINE,
164247936597SGuenter Roeck         .class_init    = aspeed_machine_supermicro_x11spi_bmc_class_init,
164347936597SGuenter Roeck     }, {
1644baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2500-evb"),
1645baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1646baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2500_evb_class_init,
1647baa4732bSCédric Le Goater     }, {
1648baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("romulus-bmc"),
1649baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1650baa4732bSCédric Le Goater         .class_init    = aspeed_machine_romulus_class_init,
1651baa4732bSCédric Le Goater     }, {
1652143b040fSPatrick Williams         .name          = MACHINE_TYPE_NAME("sonorapass-bmc"),
1653143b040fSPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1654143b040fSPatrick Williams         .class_init    = aspeed_machine_sonorapass_class_init,
1655143b040fSPatrick Williams     }, {
1656baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("witherspoon-bmc"),
1657baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1658baa4732bSCédric Le Goater         .class_init    = aspeed_machine_witherspoon_class_init,
1659baa4732bSCédric Le Goater     }, {
1660baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2600-evb"),
1661baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1662baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2600_evb_class_init,
1663baa4732bSCédric Le Goater     }, {
166434f73a81SKarthikeyan Pasupathi         .name          = MACHINE_TYPE_NAME("yosemitev2-bmc"),
166534f73a81SKarthikeyan Pasupathi         .parent        = TYPE_ASPEED_MACHINE,
166634f73a81SKarthikeyan Pasupathi         .class_init    = aspeed_machine_yosemitev2_class_init,
166734f73a81SKarthikeyan Pasupathi     }, {
166863ceb818SCédric Le Goater         .name          = MACHINE_TYPE_NAME("tacoma-bmc"),
166963ceb818SCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
167063ceb818SCédric Le Goater         .class_init    = aspeed_machine_tacoma_class_init,
167163ceb818SCédric Le Goater     }, {
16726c323abaSKarthikeyan Pasupathi         .name          = MACHINE_TYPE_NAME("tiogapass-bmc"),
16736c323abaSKarthikeyan Pasupathi         .parent        = TYPE_ASPEED_MACHINE,
16746c323abaSKarthikeyan Pasupathi         .class_init    = aspeed_machine_tiogapass_class_init,
16756c323abaSKarthikeyan Pasupathi     }, {
167695f068c8SJohn Wang         .name          = MACHINE_TYPE_NAME("g220a-bmc"),
167795f068c8SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
167895f068c8SJohn Wang         .class_init    = aspeed_machine_g220a_class_init,
167995f068c8SJohn Wang     }, {
1680fb6b3c8dSJae Hyun Yoo         .name          = MACHINE_TYPE_NAME("qcom-dc-scm-v1-bmc"),
1681fb6b3c8dSJae Hyun Yoo         .parent        = TYPE_ASPEED_MACHINE,
1682fb6b3c8dSJae Hyun Yoo         .class_init    = aspeed_machine_qcom_dc_scm_v1_class_init,
1683fb6b3c8dSJae Hyun Yoo     }, {
1684ece4cccdSGraeme Gregory         .name          = MACHINE_TYPE_NAME("qcom-firework-bmc"),
1685ece4cccdSGraeme Gregory         .parent        = TYPE_ASPEED_MACHINE,
1686ece4cccdSGraeme Gregory         .class_init    = aspeed_machine_qcom_firework_class_init,
1687ece4cccdSGraeme Gregory     }, {
168882b6a3f6SJohn Wang         .name          = MACHINE_TYPE_NAME("fp5280g2-bmc"),
168982b6a3f6SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
169082b6a3f6SJohn Wang         .class_init    = aspeed_machine_fp5280g2_class_init,
169182b6a3f6SJohn Wang     }, {
16929cccb912SPatrick Venture         .name          = MACHINE_TYPE_NAME("quanta-q71l-bmc"),
16939cccb912SPatrick Venture         .parent        = TYPE_ASPEED_MACHINE,
16949cccb912SPatrick Venture         .class_init    = aspeed_machine_quanta_q71l_class_init,
16959cccb912SPatrick Venture     }, {
169658e52bdbSCédric Le Goater         .name          = MACHINE_TYPE_NAME("rainier-bmc"),
169758e52bdbSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
169858e52bdbSCédric Le Goater         .class_init    = aspeed_machine_rainier_class_init,
169958e52bdbSCédric Le Goater     }, {
1700febbe308SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fuji-bmc"),
1701febbe308SPeter Delevoryas         .parent        = TYPE_ASPEED_MACHINE,
1702febbe308SPeter Delevoryas         .class_init    = aspeed_machine_fuji_class_init,
1703febbe308SPeter Delevoryas     }, {
1704a20c54b1SPatrick Williams         .name          = MACHINE_TYPE_NAME("bletchley-bmc"),
1705a20c54b1SPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1706a20c54b1SPatrick Williams         .class_init    = aspeed_machine_bletchley_class_init,
1707a20c54b1SPatrick Williams     }, {
1708fa699e80SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fby35-bmc"),
1709fa699e80SPeter Delevoryas         .parent        = MACHINE_TYPE_NAME("ast2600-evb"),
1710fa699e80SPeter Delevoryas         .class_init    = aspeed_machine_fby35_class_init,
1711fa699e80SPeter Delevoryas     }, {
171266c895b8SJamin Lin         .name           = MACHINE_TYPE_NAME("ast1030-evb"),
171366c895b8SJamin Lin         .parent         = TYPE_ASPEED_MACHINE,
171466c895b8SJamin Lin         .class_init     = aspeed_minibmc_machine_ast1030_evb_class_init,
171566c895b8SJamin Lin     }, {
1716fca9ca1bSCédric Le Goater         .name          = TYPE_ASPEED_MACHINE,
171762c2c2ebSCédric Le Goater         .parent        = TYPE_MACHINE,
1718888b2b03SPhilippe Mathieu-Daudé         .instance_size = sizeof(AspeedMachineState),
17191a15311aSCédric Le Goater         .instance_init = aspeed_machine_instance_init,
1720fca9ca1bSCédric Le Goater         .class_size    = sizeof(AspeedMachineClass),
1721fca9ca1bSCédric Le Goater         .class_init    = aspeed_machine_class_init,
1722baa4732bSCédric Le Goater         .abstract      = true,
1723baa4732bSCédric Le Goater     }
1724fca9ca1bSCédric Le Goater };
172574fb1f38SCédric Le Goater 
1726baa4732bSCédric Le Goater DEFINE_TYPES(aspeed_machine_types)
1727