xref: /qemu/hw/arm/aspeed.c (revision 01ea09eb7a6e8369a98fb360d2ed3bf1ecfc1753)
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"
188285490bSCédric Le Goater #include "hw/block/flash.h"
193ec75e39SPatrick Venture #include "hw/i2c/i2c_mux_pca954x.h"
2093198b6cSCorey Minyard #include "hw/i2c/smbus_eeprom.h"
216328d8ffSCédric Le Goater #include "hw/gpio/pca9552.h"
229618ebaeSPeter Delevoryas #include "hw/nvram/eeprom_at24c.h"
235e9ae4b1SCorey Minyard #include "hw/sensor/tmp105.h"
247cfbde5eSPhilippe Mathieu-Daudé #include "hw/misc/led.h"
25a27bd6c7SMarkus Armbruster #include "hw/qdev-properties.h"
26e1ad9bc4SCédric Le Goater #include "sysemu/block-backend.h"
27fa699e80SPeter Delevoryas #include "sysemu/reset.h"
28d769a1daSCédric Le Goater #include "hw/loader.h"
29d769a1daSCédric Le Goater #include "qemu/error-report.h"
30a9df9622SJoel Stanley #include "qemu/units.h"
3166c895b8SJamin Lin #include "hw/qdev-clock.h"
32d2b3eaefSPeter Delevoryas #include "sysemu/sysemu.h"
33327d8e4eSAndrew Jeffery 
3474fb1f38SCédric Le Goater static struct arm_boot_info aspeed_board_binfo = {
35b033271fSCédric Le Goater     .board_id = -1, /* device-tree-only board */
36327d8e4eSAndrew Jeffery };
37327d8e4eSAndrew Jeffery 
38612b219aSPhilippe Mathieu-Daudé struct AspeedMachineState {
39888b2b03SPhilippe Mathieu-Daudé     /* Private */
40888b2b03SPhilippe Mathieu-Daudé     MachineState parent_obj;
41888b2b03SPhilippe Mathieu-Daudé     /* Public */
42888b2b03SPhilippe Mathieu-Daudé 
433c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc;
44262259eaSCédric Le Goater     MemoryRegion boot_rom;
45888b2b03SPhilippe Mathieu-Daudé     bool mmio_exec;
46f65f6ad5SCédric Le Goater     uint32_t uart_chosen;
479820e52fSCédric Le Goater     char *fmc_model;
489820e52fSCédric Le Goater     char *spi_model;
49ea066d39SThomas Huth };
50327d8e4eSAndrew Jeffery 
511e2c22c9SCédric Le Goater /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */
521e2c22c9SCédric Le Goater #if HOST_LONG_BITS == 32
531e2c22c9SCédric Le Goater #define ASPEED_RAM_SIZE(sz) MIN((sz), 1 * GiB)
541e2c22c9SCédric Le Goater #else
551e2c22c9SCédric Le Goater #define ASPEED_RAM_SIZE(sz) (sz)
561e2c22c9SCédric Le Goater #endif
571e2c22c9SCédric Le Goater 
58ef17f836SCédric Le Goater /* Palmetto hardware value: 0x120CE416 */
598da33ef7SCédric Le Goater #define PALMETTO_BMC_HW_STRAP1 (                                        \
608da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_256MB) |               \
618da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2 /* DDR3 with CL=6, CWL=5 */) | \
628da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
638da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) |       \
648da33ef7SCédric Le Goater         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
658da33ef7SCédric Le Goater         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
668da33ef7SCédric Le Goater         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) |                \
678da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
688da33ef7SCédric Le Goater         SCU_HW_STRAP_SPI_WIDTH |                                        \
698da33ef7SCédric Le Goater         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
708da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
718da33ef7SCédric Le Goater 
7240a38df5SErik Smit /* TODO: Find the actual hardware value */
7340a38df5SErik Smit #define SUPERMICROX11_BMC_HW_STRAP1 (                                   \
7440a38df5SErik Smit         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) |               \
7540a38df5SErik Smit         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2) |                           \
7640a38df5SErik Smit         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
7740a38df5SErik Smit         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) |       \
7840a38df5SErik Smit         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
7940a38df5SErik Smit         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
8040a38df5SErik Smit         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) |                \
8140a38df5SErik Smit         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
8240a38df5SErik Smit         SCU_HW_STRAP_SPI_WIDTH |                                        \
8340a38df5SErik Smit         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
8440a38df5SErik Smit         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
8540a38df5SErik Smit 
8647936597SGuenter Roeck /* TODO: Find the actual hardware value */
8747936597SGuenter Roeck #define SUPERMICRO_X11SPI_BMC_HW_STRAP1 (                               \
8847936597SGuenter Roeck         AST2500_HW_STRAP1_DEFAULTS |                                    \
8947936597SGuenter Roeck         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
9047936597SGuenter Roeck         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
9147936597SGuenter Roeck         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
9247936597SGuenter Roeck         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
9347936597SGuenter Roeck         SCU_HW_STRAP_SPI_WIDTH |                                        \
9447936597SGuenter Roeck         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN))
9547936597SGuenter Roeck 
96ef17f836SCédric Le Goater /* AST2500 evb hardware value: 0xF100C2E6 */
979a7c1750SCédric Le Goater #define AST2500_EVB_HW_STRAP1 ((                                        \
989a7c1750SCédric Le Goater         AST2500_HW_STRAP1_DEFAULTS |                                    \
999a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
1009a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
1019a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
1029a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
1039a7c1750SCédric Le Goater         SCU_HW_STRAP_MAC1_RGMII |                                       \
1049a7c1750SCédric Le Goater         SCU_HW_STRAP_MAC0_RGMII) &                                      \
1059a7c1750SCédric Le Goater         ~SCU_HW_STRAP_2ND_BOOT_WDT)
1069a7c1750SCédric Le Goater 
107ef17f836SCédric Le Goater /* Romulus hardware value: 0xF10AD206 */
108ef17f836SCédric Le Goater #define ROMULUS_BMC_HW_STRAP1 (                                         \
109ef17f836SCédric Le Goater         AST2500_HW_STRAP1_DEFAULTS |                                    \
110ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
111ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
112ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
113ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
114ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_ACPI_ENABLE |                              \
115ef17f836SCédric Le Goater         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER))
116ef17f836SCédric Le Goater 
117143b040fSPatrick Williams /* Sonorapass hardware value: 0xF100D216 */
118143b040fSPatrick Williams #define SONORAPASS_BMC_HW_STRAP1 (                                      \
119143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
120143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
121143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
122143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
123143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
124143b040fSPatrick Williams         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
125143b040fSPatrick Williams         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
126143b040fSPatrick Williams         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
127143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
128143b040fSPatrick Williams         SCU_HW_STRAP_VGA_BIOS_ROM |                                     \
129143b040fSPatrick Williams         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
130143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_RESERVED1)
131143b040fSPatrick Williams 
13295f068c8SJohn Wang #define G220A_BMC_HW_STRAP1 (                                      \
13395f068c8SJohn Wang         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
13495f068c8SJohn Wang         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
13595f068c8SJohn Wang         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
13695f068c8SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
13795f068c8SJohn Wang         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
13895f068c8SJohn Wang         SCU_HW_STRAP_2ND_BOOT_WDT |                                     \
13995f068c8SJohn Wang         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
14095f068c8SJohn Wang         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
14195f068c8SJohn Wang         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
14295f068c8SJohn Wang         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
14395f068c8SJohn Wang         SCU_HW_STRAP_VGA_SIZE_SET(VGA_64M_DRAM) |                       \
14495f068c8SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED1)
14595f068c8SJohn Wang 
14682b6a3f6SJohn Wang /* FP5280G2 hardware value: 0XF100D286 */
14782b6a3f6SJohn Wang #define FP5280G2_BMC_HW_STRAP1 (                                      \
14882b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
14982b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
15082b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
15182b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
15282b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
15382b6a3f6SJohn Wang         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
15482b6a3f6SJohn Wang         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
15582b6a3f6SJohn Wang         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
15682b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
15782b6a3f6SJohn Wang         SCU_HW_STRAP_MAC1_RGMII |                                       \
15882b6a3f6SJohn Wang         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
15982b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED1)
16082b6a3f6SJohn Wang 
16162c2c2ebSCédric Le Goater /* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */
16262c2c2ebSCédric Le Goater #define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1
16362c2c2ebSCédric Le Goater 
1649cccb912SPatrick Venture /* Quanta-Q71l hardware value */
1659cccb912SPatrick Venture #define QUANTA_Q71L_BMC_HW_STRAP1 (                                     \
1669cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) |               \
1679cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2/* DDR3 with CL=6, CWL=5 */) | \
1689cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
1699cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_24M_IN) |       \
1709cccb912SPatrick Venture         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
1719cccb912SPatrick Venture         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_PASS_THROUGH) |          \
1729cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
1739cccb912SPatrick Venture         SCU_HW_STRAP_SPI_WIDTH |                                        \
1749cccb912SPatrick Venture         SCU_HW_STRAP_VGA_SIZE_SET(VGA_8M_DRAM) |                        \
1759cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
1769cccb912SPatrick Venture 
177ccc2c418SCédric Le Goater /* AST2600 evb hardware value */
178ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP1 0x000000C0
179ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP2 0x00000003
180ccc2c418SCédric Le Goater 
18192707992SJamin Lin #ifdef TARGET_AARCH64
18292707992SJamin Lin /* AST2700 evb hardware value */
18392707992SJamin Lin #define AST2700_EVB_HW_STRAP1 0x000000C0
18492707992SJamin Lin #define AST2700_EVB_HW_STRAP2 0x00000003
18592707992SJamin Lin #endif
18692707992SJamin Lin 
18763ceb818SCédric Le Goater /* Tacoma hardware value */
18863ceb818SCédric Le Goater #define TACOMA_BMC_HW_STRAP1  0x00000000
1897582591aSJoel Stanley #define TACOMA_BMC_HW_STRAP2  0x00000040
19063ceb818SCédric Le Goater 
19158e52bdbSCédric Le Goater /* Rainier hardware value: (QEMU prototype) */
192*01ea09ebSCédric Le Goater #define RAINIER_BMC_HW_STRAP1 (0x00422016 | SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC)
193b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP2 0x80000848
19458e52bdbSCédric Le Goater 
195febbe308SPeter Delevoryas /* Fuji hardware value */
196febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP1    0x00000000
197febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP2    0x00000000
198febbe308SPeter Delevoryas 
199a20c54b1SPatrick Williams /* Bletchley hardware value */
200a20c54b1SPatrick Williams /* TODO: Leave same as EVB for now. */
201a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP1 AST2600_EVB_HW_STRAP1
202a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP2 AST2600_EVB_HW_STRAP2
203a20c54b1SPatrick Williams 
204fb6b3c8dSJae Hyun Yoo /* Qualcomm DC-SCM hardware value */
205fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP1  0x00000000
206fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP2  0x00000041
207fb6b3c8dSJae Hyun Yoo 
2089bb6d140SJoel Stanley #define AST_SMP_MAILBOX_BASE            0x1e6e2180
2099bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_ENTRY        (AST_SMP_MAILBOX_BASE + 0x0)
2109bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_GOSIGN       (AST_SMP_MAILBOX_BASE + 0x4)
2119bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_READY        (AST_SMP_MAILBOX_BASE + 0x8)
2129bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_POLLINSN     (AST_SMP_MAILBOX_BASE + 0xc)
2139bb6d140SJoel Stanley #define AST_SMP_MBOX_CODE               (AST_SMP_MAILBOX_BASE + 0x10)
2149bb6d140SJoel Stanley #define AST_SMP_MBOX_GOSIGN             0xabbaab00
2159bb6d140SJoel Stanley 
2169bb6d140SJoel Stanley static void aspeed_write_smpboot(ARMCPU *cpu,
2179bb6d140SJoel Stanley                                  const struct arm_boot_info *info)
2189bb6d140SJoel Stanley {
219902bba54SCédric Le Goater     AddressSpace *as = arm_boot_address_space(cpu, info);
220902bba54SCédric Le Goater     static const ARMInsnFixup poll_mailbox_ready[] = {
2219bb6d140SJoel Stanley         /*
2229bb6d140SJoel Stanley          * r2 = per-cpu go sign value
2239bb6d140SJoel Stanley          * r1 = AST_SMP_MBOX_FIELD_ENTRY
2249bb6d140SJoel Stanley          * r0 = AST_SMP_MBOX_FIELD_GOSIGN
2259bb6d140SJoel Stanley          */
226902bba54SCédric Le Goater         { 0xee100fb0 },  /* mrc     p15, 0, r0, c0, c0, 5 */
227902bba54SCédric Le Goater         { 0xe21000ff },  /* ands    r0, r0, #255          */
228902bba54SCédric Le Goater         { 0xe59f201c },  /* ldr     r2, [pc, #28]         */
229902bba54SCédric Le Goater         { 0xe1822000 },  /* orr     r2, r2, r0            */
2309bb6d140SJoel Stanley 
231902bba54SCédric Le Goater         { 0xe59f1018 },  /* ldr     r1, [pc, #24]         */
232902bba54SCédric Le Goater         { 0xe59f0018 },  /* ldr     r0, [pc, #24]         */
2339bb6d140SJoel Stanley 
234902bba54SCédric Le Goater         { 0xe320f002 },  /* wfe                           */
235902bba54SCédric Le Goater         { 0xe5904000 },  /* ldr     r4, [r0]              */
236902bba54SCédric Le Goater         { 0xe1520004 },  /* cmp     r2, r4                */
237902bba54SCédric Le Goater         { 0x1afffffb },  /* bne     <wfe>                 */
238902bba54SCédric Le Goater         { 0xe591f000 },  /* ldr     pc, [r1]              */
239902bba54SCédric Le Goater         { AST_SMP_MBOX_GOSIGN },
240902bba54SCédric Le Goater         { AST_SMP_MBOX_FIELD_ENTRY },
241902bba54SCédric Le Goater         { AST_SMP_MBOX_FIELD_GOSIGN },
242902bba54SCédric Le Goater         { 0, FIXUP_TERMINATOR }
2439bb6d140SJoel Stanley     };
244902bba54SCédric Le Goater     static const uint32_t fixupcontext[FIXUP_MAX] = { 0 };
2459bb6d140SJoel Stanley 
246902bba54SCédric Le Goater     arm_write_bootloader("aspeed.smpboot", as, info->smp_loader_start,
247902bba54SCédric Le Goater                          poll_mailbox_ready, fixupcontext);
2489bb6d140SJoel Stanley }
2499bb6d140SJoel Stanley 
2509bb6d140SJoel Stanley static void aspeed_reset_secondary(ARMCPU *cpu,
2519bb6d140SJoel Stanley                                    const struct arm_boot_info *info)
2529bb6d140SJoel Stanley {
2539bb6d140SJoel Stanley     AddressSpace *as = arm_boot_address_space(cpu, info);
2549bb6d140SJoel Stanley     CPUState *cs = CPU(cpu);
2559bb6d140SJoel Stanley 
2569bb6d140SJoel Stanley     /* info->smp_bootreg_addr */
2579bb6d140SJoel Stanley     address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0,
2589bb6d140SJoel Stanley                                MEMTXATTRS_UNSPECIFIED, NULL);
2599bb6d140SJoel Stanley     cpu_set_pc(cs, info->smp_loader_start);
2609bb6d140SJoel Stanley }
2619bb6d140SJoel Stanley 
2628b744a6aSCédric Le Goater static void write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size,
263d769a1daSCédric Le Goater                            Error **errp)
264d769a1daSCédric Le Goater {
26505e6e40aSWentao_Liang     g_autofree void *storage = NULL;
2660c7209beSCédric Le Goater     int64_t size;
267d769a1daSCédric Le Goater 
2680c7209beSCédric Le Goater     /* The block backend size should have already been 'validated' by
2690c7209beSCédric Le Goater      * the creation of the m25p80 object.
2700c7209beSCédric Le Goater      */
2710c7209beSCédric Le Goater     size = blk_getlength(blk);
2720c7209beSCédric Le Goater     if (size <= 0) {
2730c7209beSCédric Le Goater         error_setg(errp, "failed to get flash size");
2740c7209beSCédric Le Goater         return;
2750c7209beSCédric Le Goater     }
2760c7209beSCédric Le Goater 
2770c7209beSCédric Le Goater     if (rom_size > size) {
2780c7209beSCédric Le Goater         rom_size = size;
279d769a1daSCédric Le Goater     }
280d769a1daSCédric Le Goater 
28105e6e40aSWentao_Liang     storage = g_malloc0(rom_size);
282a9262f55SAlberto Faria     if (blk_pread(blk, 0, rom_size, storage, 0) < 0) {
283d769a1daSCédric Le Goater         error_setg(errp, "failed to read the initial flash content");
284d769a1daSCédric Le Goater         return;
285d769a1daSCédric Le Goater     }
286d769a1daSCédric Le Goater 
287d769a1daSCédric Le Goater     rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr);
288d769a1daSCédric Le Goater }
289d769a1daSCédric Le Goater 
2908b744a6aSCédric Le Goater /*
2918b744a6aSCédric Le Goater  * Create a ROM and copy the flash contents at the expected address
2928b744a6aSCédric Le Goater  * (0x0). Boots faster than execute-in-place.
2938b744a6aSCédric Le Goater  */
294262259eaSCédric Le Goater static void aspeed_install_boot_rom(AspeedMachineState *bmc, BlockBackend *blk,
2958b744a6aSCédric Le Goater                                     uint64_t rom_size)
2968b744a6aSCédric Le Goater {
2973c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
298db052d0eSJamin Lin     AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(soc);
2998b744a6aSCédric Le Goater 
300262259eaSCédric Le Goater     memory_region_init_rom(&bmc->boot_rom, NULL, "aspeed.boot_rom", rom_size,
3018b744a6aSCédric Le Goater                            &error_abort);
3028b744a6aSCédric Le Goater     memory_region_add_subregion_overlap(&soc->spi_boot_container, 0,
303262259eaSCédric Le Goater                                         &bmc->boot_rom, 1);
304db052d0eSJamin Lin     write_boot_rom(blk, sc->memmap[ASPEED_DEV_SPI_BOOT],
305db052d0eSJamin Lin                    rom_size, &error_abort);
3068b744a6aSCédric Le Goater }
3078b744a6aSCédric Le Goater 
3081099ad10SPeter Delevoryas void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
3099bd4ac61SCédric Le Goater                                       unsigned int count, int unit0)
310e1ad9bc4SCédric Le Goater {
311e1ad9bc4SCédric Le Goater     int i;
312179b2058SPatrick Williams 
313179b2058SPatrick Williams     if (!flashtype) {
314179b2058SPatrick Williams         return;
315179b2058SPatrick Williams     }
316e1ad9bc4SCédric Le Goater 
3179bd4ac61SCédric Le Goater     for (i = 0; i < count; ++i) {
3188ec239f2SMarkus Armbruster         DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i);
319a7d78befSCédric Le Goater         DeviceState *dev;
320e1ad9bc4SCédric Le Goater 
321a7d78befSCédric Le Goater         dev = qdev_new(flashtype);
322e1ad9bc4SCédric Le Goater         if (dinfo) {
323a7d78befSCédric Le Goater             qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo));
324e1ad9bc4SCédric Le Goater         }
32527a2c66cSCédric Le Goater         qdev_prop_set_uint8(dev, "cs", i);
326a7d78befSCédric Le Goater         qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal);
327e1ad9bc4SCédric Le Goater     }
328e1ad9bc4SCédric Le Goater }
329e1ad9bc4SCédric Le Goater 
330e554e45bSCédric Le Goater static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo, bool emmc,
331e554e45bSCédric Le Goater                                bool boot_emmc)
332a29e3e12SAndrew Jeffery {
333a29e3e12SAndrew Jeffery         DeviceState *card;
334a29e3e12SAndrew Jeffery 
335756f739bSPhilippe Mathieu-Daudé         if (!dinfo) {
336756f739bSPhilippe Mathieu-Daudé             return;
337756f739bSPhilippe Mathieu-Daudé         }
338dddfc771SCédric Le Goater         card = qdev_new(emmc ? TYPE_EMMC : TYPE_SD_CARD);
339e554e45bSCédric Le Goater         if (emmc) {
340e554e45bSCédric Le Goater             qdev_prop_set_uint64(card, "boot-partition-size", 1 * MiB);
341e554e45bSCédric Le Goater             qdev_prop_set_uint8(card, "boot-config",
342e554e45bSCédric Le Goater                                 boot_emmc ? 0x1 << 3 : 0x0);
343e554e45bSCédric Le Goater         }
344934df912SMarkus Armbruster         qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
345a29e3e12SAndrew Jeffery                                 &error_fatal);
3463e80f690SMarkus Armbruster         qdev_realize_and_unref(card,
3473e80f690SMarkus Armbruster                                qdev_get_child_bus(DEVICE(sdhci), "sd-bus"),
3483e80f690SMarkus Armbruster                                &error_fatal);
349a29e3e12SAndrew Jeffery }
350a29e3e12SAndrew Jeffery 
351d2b3eaefSPeter Delevoryas static void connect_serial_hds_to_uarts(AspeedMachineState *bmc)
352d2b3eaefSPeter Delevoryas {
353d2b3eaefSPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
3543c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *s = bmc->soc;
355d2b3eaefSPeter Delevoryas     AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
356f65f6ad5SCédric Le Goater     int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default;
357d2b3eaefSPeter Delevoryas 
358f65f6ad5SCédric Le Goater     aspeed_soc_uart_set_chr(s, uart_chosen, serial_hd(0));
359944128eeSJamin Lin     for (int i = 1, uart = sc->uarts_base; i < sc->uarts_num; i++, uart++) {
360f65f6ad5SCédric Le Goater         if (uart == uart_chosen) {
361d2b3eaefSPeter Delevoryas             continue;
362d2b3eaefSPeter Delevoryas         }
363d2b3eaefSPeter Delevoryas         aspeed_soc_uart_set_chr(s, uart, serial_hd(i));
364d2b3eaefSPeter Delevoryas     }
365d2b3eaefSPeter Delevoryas }
366d2b3eaefSPeter Delevoryas 
367baa4732bSCédric Le Goater static void aspeed_machine_init(MachineState *machine)
368327d8e4eSAndrew Jeffery {
369888b2b03SPhilippe Mathieu-Daudé     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
370baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
371b033271fSCédric Le Goater     AspeedSoCClass *sc;
3722bea128cSEddie James     int i;
373255aed81SCédric Le Goater     DriveInfo *emmc0 = NULL;
374e554e45bSCédric Le Goater     bool boot_emmc;
375327d8e4eSAndrew Jeffery 
3763c392e87SPhilippe Mathieu-Daudé     bmc->soc = ASPEED_SOC(object_new(amc->soc_name));
3773c392e87SPhilippe Mathieu-Daudé     object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc));
3783c392e87SPhilippe Mathieu-Daudé     object_unref(OBJECT(bmc->soc));
3793c392e87SPhilippe Mathieu-Daudé     sc = ASPEED_SOC_GET_CLASS(bmc->soc);
380b033271fSCédric Le Goater 
381533eb415SIgor Mammedov     /*
382346160cbSCédric Le Goater      * This will error out if the RAM size is not supported by the
383346160cbSCédric Le Goater      * memory controller of the SoC.
384533eb415SIgor Mammedov      */
3853c392e87SPhilippe Mathieu-Daudé     object_property_set_uint(OBJECT(bmc->soc), "ram-size", machine->ram_size,
386533eb415SIgor Mammedov                              &error_fatal);
387533eb415SIgor Mammedov 
388d3bad7e7SCédric Le Goater     for (i = 0; i < sc->macs_num; i++) {
389b3cfec5bSDavid Woodhouse         if ((amc->macs_mask & (1 << i)) &&
390b3cfec5bSDavid Woodhouse             !qemu_configure_nic_device(DEVICE(&bmc->soc->ftgmac100[i]),
391b3cfec5bSDavid Woodhouse                                        true, NULL)) {
392b3cfec5bSDavid Woodhouse             break; /* No configs left; stop asking */
393d3bad7e7SCédric Le Goater         }
394d3bad7e7SCédric Le Goater     }
395d3bad7e7SCédric Le Goater 
3963c392e87SPhilippe Mathieu-Daudé     object_property_set_int(OBJECT(bmc->soc), "hw-strap1", amc->hw_strap1,
39787e79af0SAndrew Jeffery                             &error_abort);
3983c392e87SPhilippe Mathieu-Daudé     object_property_set_int(OBJECT(bmc->soc), "hw-strap2", amc->hw_strap2,
399ccc2c418SCédric Le Goater                             &error_abort);
4003c392e87SPhilippe Mathieu-Daudé     object_property_set_link(OBJECT(bmc->soc), "memory",
4014dd9d554SPeter Delevoryas                              OBJECT(get_system_memory()), &error_abort);
4023c392e87SPhilippe Mathieu-Daudé     object_property_set_link(OBJECT(bmc->soc), "dram",
4030df2d9a6SCédric Le Goater                              OBJECT(machine->ram), &error_abort);
404b6e70d1dSJoel Stanley     if (machine->kernel_filename) {
405b6e70d1dSJoel Stanley         /*
406b6e70d1dSJoel Stanley          * When booting with a -kernel command line there is no u-boot
407b6e70d1dSJoel Stanley          * that runs to unlock the SCU. In this case set the default to
408b6e70d1dSJoel Stanley          * be unlocked as the kernel expects
409b6e70d1dSJoel Stanley          */
4103c392e87SPhilippe Mathieu-Daudé         object_property_set_int(OBJECT(bmc->soc), "hw-prot-key",
4115325cc34SMarkus Armbruster                                 ASPEED_SCU_PROT_KEY, &error_abort);
412b6e70d1dSJoel Stanley     }
413d2b3eaefSPeter Delevoryas     connect_serial_hds_to_uarts(bmc);
4143c392e87SPhilippe Mathieu-Daudé     qdev_realize(DEVICE(bmc->soc), NULL, &error_abort);
415327d8e4eSAndrew Jeffery 
416c7e313aeSCédric Le Goater     if (defaults_enabled()) {
4173c392e87SPhilippe Mathieu-Daudé         aspeed_board_init_flashes(&bmc->soc->fmc,
4188ec239f2SMarkus Armbruster                               bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
4199bd4ac61SCédric Le Goater                               amc->num_cs, 0);
4203c392e87SPhilippe Mathieu-Daudé         aspeed_board_init_flashes(&bmc->soc->spi[0],
4218ec239f2SMarkus Armbruster                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
4229bd4ac61SCédric Le Goater                               1, amc->num_cs);
423c7e313aeSCédric Le Goater     }
424e1ad9bc4SCédric Le Goater 
425b7f1a0cbSCédric Le Goater     if (machine->kernel_filename && sc->num_cpus > 1) {
4269bb6d140SJoel Stanley         /* With no u-boot we must set up a boot stub for the secondary CPU */
4279bb6d140SJoel Stanley         MemoryRegion *smpboot = g_new(MemoryRegion, 1);
428f489960dSPhilippe Mathieu-Daudé         memory_region_init_ram(smpboot, NULL, "aspeed.smpboot",
4299bb6d140SJoel Stanley                                0x80, &error_abort);
4309bb6d140SJoel Stanley         memory_region_add_subregion(get_system_memory(),
4319bb6d140SJoel Stanley                                     AST_SMP_MAILBOX_BASE, smpboot);
4329bb6d140SJoel Stanley 
4339bb6d140SJoel Stanley         aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot;
4349bb6d140SJoel Stanley         aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary;
4359bb6d140SJoel Stanley         aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE;
4369bb6d140SJoel Stanley     }
4379bb6d140SJoel Stanley 
4386e504a98SPaolo Bonzini     aspeed_board_binfo.ram_size = machine->ram_size;
439347df6f8SEduardo Habkost     aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM];
440b033271fSCédric Le Goater 
441baa4732bSCédric Le Goater     if (amc->i2c_init) {
442baa4732bSCédric Le Goater         amc->i2c_init(bmc);
4432cf6cb50SCédric Le Goater     }
4442cf6cb50SCédric Le Goater 
4453c392e87SPhilippe Mathieu-Daudé     for (i = 0; i < bmc->soc->sdhci.num_slots; i++) {
4463c392e87SPhilippe Mathieu-Daudé         sdhci_attach_drive(&bmc->soc->sdhci.slots[i],
447e554e45bSCédric Le Goater                            drive_get(IF_SD, 0, i), false, false);
448a29e3e12SAndrew Jeffery     }
4492bea128cSEddie James 
450e554e45bSCédric Le Goater     boot_emmc = sc->boot_from_emmc(bmc->soc);
451e554e45bSCédric Le Goater 
4523c392e87SPhilippe Mathieu-Daudé     if (bmc->soc->emmc.num_slots) {
453255aed81SCédric Le Goater         emmc0 = drive_get(IF_SD, 0, bmc->soc->sdhci.num_slots);
454e554e45bSCédric Le Goater         sdhci_attach_drive(&bmc->soc->emmc.slots[0], emmc0, true, boot_emmc);
4552bea128cSEddie James     }
4562bea128cSEddie James 
4578b744a6aSCédric Le Goater     if (!bmc->mmio_exec) {
4583c392e87SPhilippe Mathieu-Daudé         DeviceState *dev = ssi_get_cs(bmc->soc->fmc.spi, 0);
4598285490bSCédric Le Goater         BlockBackend *fmc0 = dev ? m25p80_get_blk(dev) : NULL;
4608b744a6aSCédric Le Goater 
461e554e45bSCédric Le Goater         if (fmc0 && !boot_emmc) {
4623c392e87SPhilippe Mathieu-Daudé             uint64_t rom_size = memory_region_size(&bmc->soc->spi_boot);
4638285490bSCédric Le Goater             aspeed_install_boot_rom(bmc, fmc0, rom_size);
464255aed81SCédric Le Goater         } else if (emmc0) {
465255aed81SCédric Le Goater             aspeed_install_boot_rom(bmc, blk_by_legacy_dinfo(emmc0), 64 * KiB);
4668b744a6aSCédric Le Goater         }
4678b744a6aSCédric Le Goater     }
4688b744a6aSCédric Le Goater 
4692744ece8STao Xu     arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo);
470327d8e4eSAndrew Jeffery }
471327d8e4eSAndrew Jeffery 
472612b219aSPhilippe Mathieu-Daudé static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
4732cf6cb50SCédric Le Goater {
4743c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
475a87e81b9SCédric Le Goater     DeviceState *dev;
4763d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
4772cf6cb50SCédric Le Goater 
4782cf6cb50SCédric Le Goater     /* The palmetto platform expects a ds3231 RTC but a ds1338 is
4792cf6cb50SCédric Le Goater      * enough to provide basic RTC features. Alarms will be missing */
4801373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
481a87e81b9SCédric Le Goater 
4827a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
4833d165f12SCédric Le Goater                           eeprom_buf);
4843d165f12SCédric Le Goater 
485a87e81b9SCédric Le Goater     /* add a TMP423 temperature sensor */
4861373b15bSPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
4871373b15bSPhilippe Mathieu-Daudé                                          "tmp423", 0x4c));
4885325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
4895325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
4905325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
4915325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort);
4922cf6cb50SCédric Le Goater }
4932cf6cb50SCédric Le Goater 
4949cccb912SPatrick Venture static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc)
4959cccb912SPatrick Venture {
4963c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
4979cccb912SPatrick Venture 
4989cccb912SPatrick Venture     /*
4999cccb912SPatrick Venture      * The quanta-q71l platform expects tmp75s which are compatible with
5009cccb912SPatrick Venture      * tmp105s.
5019cccb912SPatrick Venture      */
5029cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c);
5039cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e);
5049cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f);
5059cccb912SPatrick Venture 
5069cccb912SPatrick Venture     /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */
5079cccb912SPatrick Venture     /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */
5089cccb912SPatrick Venture     /* TODO: Add Memory Riser i2c mux and eeproms. */
5099cccb912SPatrick Venture 
5103ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74);
5113ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77);
5123ec75e39SPatrick Venture 
5139cccb912SPatrick Venture     /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */
5143ec75e39SPatrick Venture 
5153ec75e39SPatrick Venture     /* i2c-7 */
5163ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70);
5179cccb912SPatrick Venture     /*        - i2c@0: pmbus@59 */
5189cccb912SPatrick Venture     /*        - i2c@1: pmbus@58 */
5199cccb912SPatrick Venture     /*        - i2c@2: pmbus@58 */
5209cccb912SPatrick Venture     /*        - i2c@3: pmbus@59 */
5213ec75e39SPatrick Venture 
5229cccb912SPatrick Venture     /* TODO: i2c-7: Add PDB FRU eeprom@52 */
5239cccb912SPatrick Venture     /* TODO: i2c-8: Add BMC FRU eeprom@50 */
5249cccb912SPatrick Venture }
5259cccb912SPatrick Venture 
526612b219aSPhilippe Mathieu-Daudé static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
5272cf6cb50SCédric Le Goater {
5283c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
5293d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
5303d165f12SCédric Le Goater 
5317a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50,
5323d165f12SCédric Le Goater                           eeprom_buf);
5332cf6cb50SCédric Le Goater 
5342cf6cb50SCédric Le Goater     /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
5351373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
536044475f3SPhilippe Mathieu-Daudé                      TYPE_TMP105, 0x4d);
5372cf6cb50SCédric Le Goater }
5382cf6cb50SCédric Le Goater 
539612b219aSPhilippe Mathieu-Daudé static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
540ccc2c418SCédric Le Goater {
5413c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
54252bcd997SHoward Chiu     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
54352bcd997SHoward Chiu 
54452bcd997SHoward Chiu     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50,
54552bcd997SHoward Chiu                           eeprom_buf);
54652bcd997SHoward Chiu 
54752bcd997SHoward Chiu     /* LM75 is compatible with TMP105 driver */
54852bcd997SHoward Chiu     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
54952bcd997SHoward Chiu                      TYPE_TMP105, 0x4d);
550ccc2c418SCédric Le Goater }
551ccc2c418SCédric Le Goater 
55234f73a81SKarthikeyan Pasupathi static void yosemitev2_bmc_i2c_init(AspeedMachineState *bmc)
55334f73a81SKarthikeyan Pasupathi {
5543c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
55534f73a81SKarthikeyan Pasupathi 
55634f73a81SKarthikeyan Pasupathi     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x51, 128 * KiB);
55734f73a81SKarthikeyan Pasupathi     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 128 * KiB,
55834f73a81SKarthikeyan Pasupathi                           yosemitev2_bmc_fruid, yosemitev2_bmc_fruid_len);
5590a1f86baSKarthikeyan Pasupathi     /* TMP421 */
5600a1f86baSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "tmp421", 0x1f);
5610a1f86baSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4e);
5620a1f86baSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4f);
5630a1f86baSKarthikeyan Pasupathi 
56434f73a81SKarthikeyan Pasupathi }
56534f73a81SKarthikeyan Pasupathi 
566612b219aSPhilippe Mathieu-Daudé static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
5676c4567c7SCédric Le Goater {
5683c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
5696c4567c7SCédric Le Goater 
5706c4567c7SCédric Le Goater     /* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
5716c4567c7SCédric Le Goater      * good enough */
5721373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
5736c4567c7SCédric Le Goater }
5746c4567c7SCédric Le Goater 
5756c323abaSKarthikeyan Pasupathi static void tiogapass_bmc_i2c_init(AspeedMachineState *bmc)
5766c323abaSKarthikeyan Pasupathi {
5773c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
5786c323abaSKarthikeyan Pasupathi 
5796c323abaSKarthikeyan Pasupathi     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 128 * KiB);
5806c323abaSKarthikeyan Pasupathi     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 6), 0x54, 128 * KiB,
5816c323abaSKarthikeyan Pasupathi                           tiogapass_bmc_fruid, tiogapass_bmc_fruid_len);
582a09d357dSKarthikeyan Pasupathi     /* TMP421 */
583a09d357dSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "tmp421", 0x1f);
584a09d357dSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4f);
585a09d357dSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4e);
5866c323abaSKarthikeyan Pasupathi }
5876c323abaSKarthikeyan Pasupathi 
588f4aec252SCédric Le Goater static void create_pca9552(AspeedSoCState *soc, int bus_id, int addr)
589f4aec252SCédric Le Goater {
590f4aec252SCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, bus_id),
591f4aec252SCédric Le Goater                             TYPE_PCA9552, addr);
592f4aec252SCédric Le Goater }
593f4aec252SCédric Le Goater 
594612b219aSPhilippe Mathieu-Daudé static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc)
595143b040fSPatrick Williams {
5963c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
597143b040fSPatrick Williams 
598143b040fSPatrick Williams     /* bus 2 : */
5991373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48);
6001373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49);
601143b040fSPatrick Williams     /* bus 2 : pca9546 @ 0x73 */
602143b040fSPatrick Williams 
603143b040fSPatrick Williams     /* bus 3 : pca9548 @ 0x70 */
604143b040fSPatrick Williams 
605143b040fSPatrick Williams     /* bus 4 : */
606143b040fSPatrick Williams     uint8_t *eeprom4_54 = g_malloc0(8 * 1024);
6077a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54,
608143b040fSPatrick Williams                           eeprom4_54);
609143b040fSPatrick Williams     /* PCA9539 @ 0x76, but PCA9552 is compatible */
610f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x76);
611143b040fSPatrick Williams     /* PCA9539 @ 0x77, but PCA9552 is compatible */
612f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x77);
613143b040fSPatrick Williams 
614143b040fSPatrick Williams     /* bus 6 : */
6151373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48);
6161373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49);
617143b040fSPatrick Williams     /* bus 6 : pca9546 @ 0x73 */
618143b040fSPatrick Williams 
619143b040fSPatrick Williams     /* bus 8 : */
620143b040fSPatrick Williams     uint8_t *eeprom8_56 = g_malloc0(8 * 1024);
6217a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56,
622143b040fSPatrick Williams                           eeprom8_56);
623f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x60);
624f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x61);
625143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1d */
626143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1f */
627143b040fSPatrick Williams 
628143b040fSPatrick Williams     /*
629143b040fSPatrick Williams      * bus 13 : pca9548 @ 0x71
630143b040fSPatrick Williams      *      - channel 3:
631143b040fSPatrick Williams      *          - tmm421 @ 0x4c
632143b040fSPatrick Williams      *          - tmp421 @ 0x4e
633143b040fSPatrick Williams      *          - tmp421 @ 0x4f
634143b040fSPatrick Williams      */
635143b040fSPatrick Williams 
636143b040fSPatrick Williams }
637143b040fSPatrick Williams 
638612b219aSPhilippe Mathieu-Daudé static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
63962c2c2ebSCédric Le Goater {
6407cfbde5eSPhilippe Mathieu-Daudé     static const struct {
6417cfbde5eSPhilippe Mathieu-Daudé         unsigned gpio_id;
6427cfbde5eSPhilippe Mathieu-Daudé         LEDColor color;
6437cfbde5eSPhilippe Mathieu-Daudé         const char *description;
6447cfbde5eSPhilippe Mathieu-Daudé         bool gpio_polarity;
6457cfbde5eSPhilippe Mathieu-Daudé     } pca1_leds[] = {
6467cfbde5eSPhilippe Mathieu-Daudé         {13, LED_COLOR_GREEN, "front-fault-4",  GPIO_POLARITY_ACTIVE_LOW},
6477cfbde5eSPhilippe Mathieu-Daudé         {14, LED_COLOR_GREEN, "front-power-3",  GPIO_POLARITY_ACTIVE_LOW},
6487cfbde5eSPhilippe Mathieu-Daudé         {15, LED_COLOR_GREEN, "front-id-5",     GPIO_POLARITY_ACTIVE_LOW},
6497cfbde5eSPhilippe Mathieu-Daudé     };
6503c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
6513d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
65215ce12cfSPhilippe Mathieu-Daudé     DeviceState *dev;
6537cfbde5eSPhilippe Mathieu-Daudé     LEDState *led;
65462c2c2ebSCédric Le Goater 
65563ceb818SCédric Le Goater     /* Bus 3: TODO bmp280@77 */
656db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
65715ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca1");
6582616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
6592616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 3),
66015ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
6618c9a61d7SCédric Le Goater 
6627cfbde5eSPhilippe Mathieu-Daudé     for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) {
6637cfbde5eSPhilippe Mathieu-Daudé         led = led_create_simple(OBJECT(bmc),
6647cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].gpio_polarity,
6657cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].color,
6667cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].description);
6677cfbde5eSPhilippe Mathieu-Daudé         qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id,
6687cfbde5eSPhilippe Mathieu-Daudé                               qdev_get_gpio_in(DEVICE(led), 0));
6697cfbde5eSPhilippe Mathieu-Daudé     }
670b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76);
6712a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "max31785", 0x52);
6721373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c);
6731373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c);
67462c2c2ebSCédric Le Goater 
67562c2c2ebSCédric Le Goater     /* The Witherspoon expects a TMP275 but a TMP105 is compatible */
6761373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105,
677044475f3SPhilippe Mathieu-Daudé                      0x4a);
6786c4567c7SCédric Le Goater 
6796c4567c7SCédric Le Goater     /* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
6806c4567c7SCédric Le Goater      * good enough */
6811373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
6823d165f12SCédric Le Goater 
6837a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51,
6843d165f12SCédric Le Goater                           eeprom_buf);
685db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
68615ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca0");
6872616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
6882616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 11),
68915ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
69063ceb818SCédric Le Goater     /* Bus 11: TODO ucd90160@64 */
69162c2c2ebSCédric Le Goater }
69262c2c2ebSCédric Le Goater 
69395f068c8SJohn Wang static void g220a_bmc_i2c_init(AspeedMachineState *bmc)
69495f068c8SJohn Wang {
6953c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
69695f068c8SJohn Wang     DeviceState *dev;
69795f068c8SJohn Wang 
69895f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3),
69995f068c8SJohn Wang                                          "emc1413", 0x4c));
70095f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
70195f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
70295f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
70395f068c8SJohn Wang 
70495f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12),
70595f068c8SJohn Wang                                          "emc1413", 0x4c));
70695f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
70795f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
70895f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
70995f068c8SJohn Wang 
71095f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13),
71195f068c8SJohn Wang                                          "emc1413", 0x4c));
71295f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
71395f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
71495f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
7156f5f6507SJohn Wang 
7166f5f6507SJohn Wang     static uint8_t eeprom_buf[2 * 1024] = {
7176f5f6507SJohn Wang             0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe,
7186f5f6507SJohn Wang             0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65,
7196f5f6507SJohn Wang             0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32,
7206f5f6507SJohn Wang             0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42,
7216f5f6507SJohn Wang             0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45,
7226f5f6507SJohn Wang             0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1,
7236f5f6507SJohn Wang             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7,
7246f5f6507SJohn Wang     };
7256f5f6507SJohn Wang     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57,
7266f5f6507SJohn Wang                           eeprom_buf);
72795f068c8SJohn Wang }
72895f068c8SJohn Wang 
72982b6a3f6SJohn Wang static void fp5280g2_bmc_i2c_init(AspeedMachineState *bmc)
73082b6a3f6SJohn Wang {
7313c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
73282b6a3f6SJohn Wang     I2CSlave *i2c_mux;
73382b6a3f6SJohn Wang 
73482b6a3f6SJohn Wang     /* The at24c256 */
73582b6a3f6SJohn Wang     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 1), 0x50, 32768);
73682b6a3f6SJohn Wang 
73782b6a3f6SJohn Wang     /* The fp5280g2 expects a TMP112 but a TMP105 is compatible */
73882b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
73982b6a3f6SJohn Wang                      0x48);
74082b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
74182b6a3f6SJohn Wang                      0x49);
74282b6a3f6SJohn Wang 
74382b6a3f6SJohn Wang     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
74482b6a3f6SJohn Wang                      "pca9546", 0x70);
74582b6a3f6SJohn Wang     /* It expects a TMP112 but a TMP105 is compatible */
74682b6a3f6SJohn Wang     i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0), TYPE_TMP105,
74782b6a3f6SJohn Wang                      0x4a);
74882b6a3f6SJohn Wang 
74982b6a3f6SJohn Wang     /* It expects a ds3232 but a ds1338 is good enough */
75082b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "ds1338", 0x68);
75182b6a3f6SJohn Wang 
75282b6a3f6SJohn Wang     /* It expects a pca9555 but a pca9552 is compatible */
753f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x30);
75482b6a3f6SJohn Wang }
75582b6a3f6SJohn Wang 
75658e52bdbSCédric Le Goater static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
75758e52bdbSCédric Le Goater {
7583c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
759fa6d98c0SJoel Stanley     I2CSlave *i2c_mux;
760fa6d98c0SJoel Stanley 
7619077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB);
76258e52bdbSCédric Le Goater 
763f4aec252SCédric Le Goater     create_pca9552(soc, 3, 0x61);
764bcb122f8SJoel Stanley 
76558e52bdbSCédric Le Goater     /* The rainier expects a TMP275 but a TMP105 is compatible */
76658e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
76758e52bdbSCédric Le Goater                      0x48);
76858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
76958e52bdbSCédric Le Goater                      0x49);
77058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
77158e52bdbSCédric Le Goater                      0x4a);
772fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4),
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), 0x52, 64 * KiB);
777f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x60);
77858e52bdbSCédric Le Goater 
77958e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
78058e52bdbSCédric Le Goater                      0x48);
78158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
78258e52bdbSCédric Le Goater                      0x49);
783f4aec252SCédric Le Goater     create_pca9552(soc, 5, 0x60);
784f4aec252SCédric Le Goater     create_pca9552(soc, 5, 0x61);
785fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5),
786fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
7879077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
7889077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
78958e52bdbSCédric Le Goater 
79058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
79158e52bdbSCédric Le Goater                      0x48);
79258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
79358e52bdbSCédric Le Goater                      0x4a);
79458e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
79558e52bdbSCédric Le Goater                      0x4b);
796fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6),
797fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
7989077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
7999077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
8009077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB);
8019077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB);
80258e52bdbSCédric Le Goater 
803f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x30);
804f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x31);
805f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x32);
806f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x33);
807f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x60);
808f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x61);
809b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76);
81058e52bdbSCédric Le Goater     /* Bus 7: TODO si7021-a20@20 */
81158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105,
81258e52bdbSCédric Le Goater                      0x48);
8132a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "max31785", 0x52);
8149077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB);
8159077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB);
81658e52bdbSCédric Le Goater 
81758e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
81858e52bdbSCédric Le Goater                      0x48);
81958e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
82058e52bdbSCédric Le Goater                      0x4a);
821be85508fSNinad Palsule     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50,
822be85508fSNinad Palsule                           64 * KiB, rainier_bb_fruid, rainier_bb_fruid_len);
823be85508fSNinad Palsule     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51,
824be85508fSNinad Palsule                           64 * KiB, rainier_bmc_fruid, rainier_bmc_fruid_len);
825f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x60);
826f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x61);
82758e52bdbSCédric Le Goater     /* Bus 8: ucd90320@11 */
82858e52bdbSCédric Le Goater     /* Bus 8: ucd90320@b */
82958e52bdbSCédric Le Goater     /* Bus 8: ucd90320@c */
83058e52bdbSCédric Le Goater 
83158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c);
83258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d);
8339077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB);
83458e52bdbSCédric Le Goater 
83558e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c);
83658e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d);
8379077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB);
83858e52bdbSCédric Le Goater 
83958e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
84058e52bdbSCédric Le Goater                      0x48);
84158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
84258e52bdbSCédric Le Goater                      0x49);
843fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11),
844fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
8459077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
8469077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
847f4aec252SCédric Le Goater     create_pca9552(soc, 11, 0x60);
848fa6d98c0SJoel Stanley 
849fa6d98c0SJoel Stanley 
8509077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB);
851f4aec252SCédric Le Goater     create_pca9552(soc, 13, 0x60);
852fa6d98c0SJoel Stanley 
8539077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB);
854f4aec252SCédric Le Goater     create_pca9552(soc, 14, 0x60);
855fa6d98c0SJoel Stanley 
8569077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB);
857f4aec252SCédric Le Goater     create_pca9552(soc, 15, 0x60);
85858e52bdbSCédric Le Goater }
85958e52bdbSCédric Le Goater 
860febbe308SPeter Delevoryas static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr,
861febbe308SPeter Delevoryas                                  I2CBus **channels)
862febbe308SPeter Delevoryas {
863febbe308SPeter Delevoryas     I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr);
864febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
865febbe308SPeter Delevoryas         channels[i] = pca954x_i2c_get_bus(mux, i);
866febbe308SPeter Delevoryas     }
867febbe308SPeter Delevoryas }
868febbe308SPeter Delevoryas 
869febbe308SPeter Delevoryas #define TYPE_LM75 TYPE_TMP105
870febbe308SPeter Delevoryas #define TYPE_TMP75 TYPE_TMP105
871febbe308SPeter Delevoryas #define TYPE_TMP422 "tmp422"
872febbe308SPeter Delevoryas 
873febbe308SPeter Delevoryas static void fuji_bmc_i2c_init(AspeedMachineState *bmc)
874febbe308SPeter Delevoryas {
8753c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
876febbe308SPeter Delevoryas     I2CBus *i2c[144] = {};
877febbe308SPeter Delevoryas 
878febbe308SPeter Delevoryas     for (int i = 0; i < 16; i++) {
879febbe308SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
880febbe308SPeter Delevoryas     }
881febbe308SPeter Delevoryas     I2CBus *i2c180 = i2c[2];
882febbe308SPeter Delevoryas     I2CBus *i2c480 = i2c[8];
883febbe308SPeter Delevoryas     I2CBus *i2c600 = i2c[11];
884febbe308SPeter Delevoryas 
885febbe308SPeter Delevoryas     get_pca9548_channels(i2c180, 0x70, &i2c[16]);
886febbe308SPeter Delevoryas     get_pca9548_channels(i2c480, 0x70, &i2c[24]);
887febbe308SPeter Delevoryas     /* NOTE: The device tree skips [32, 40) in the alias numbering */
888febbe308SPeter Delevoryas     get_pca9548_channels(i2c600, 0x77, &i2c[40]);
889febbe308SPeter Delevoryas     get_pca9548_channels(i2c[24], 0x71, &i2c[48]);
890febbe308SPeter Delevoryas     get_pca9548_channels(i2c[25], 0x72, &i2c[56]);
891febbe308SPeter Delevoryas     get_pca9548_channels(i2c[26], 0x76, &i2c[64]);
892febbe308SPeter Delevoryas     get_pca9548_channels(i2c[27], 0x76, &i2c[72]);
893febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
894febbe308SPeter Delevoryas         get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]);
895febbe308SPeter Delevoryas     }
896febbe308SPeter Delevoryas 
897febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c);
898febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d);
899febbe308SPeter Delevoryas 
900ef0eb67eSSittisak Sinprem     /*
901ef0eb67eSSittisak Sinprem      * EEPROM 24c64 size is 64Kbits or 8 Kbytes
902ef0eb67eSSittisak Sinprem      *        24c02 size is 2Kbits or 256 bytes
903ef0eb67eSSittisak Sinprem      */
904ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[19], 0x52, 8 * KiB);
905ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[20], 0x50, 256);
906ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[22], 0x52, 256);
907febbe308SPeter Delevoryas 
908febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x48);
909febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x49);
910febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x4a);
911febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_TMP422, 0x4c);
912febbe308SPeter Delevoryas 
913ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[8], 0x51, 8 * KiB);
914febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a);
915febbe308SPeter Delevoryas 
916febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[50], TYPE_LM75, 0x4c);
917ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[50], 0x52, 8 * KiB);
918febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[51], TYPE_TMP75, 0x48);
919febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[52], TYPE_TMP75, 0x49);
920febbe308SPeter Delevoryas 
921febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[59], TYPE_TMP75, 0x48);
922febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[60], TYPE_TMP75, 0x49);
923febbe308SPeter Delevoryas 
924ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[65], 0x53, 8 * KiB);
925febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x49);
926febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x48);
927ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[68], 0x52, 8 * KiB);
928ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[69], 0x52, 8 * KiB);
929ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[70], 0x52, 8 * KiB);
930ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[71], 0x52, 8 * KiB);
931febbe308SPeter Delevoryas 
932ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[73], 0x53, 8 * KiB);
933febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x49);
934febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x48);
935ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[76], 0x52, 8 * KiB);
936ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[77], 0x52, 8 * KiB);
937ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[78], 0x52, 8 * KiB);
938ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[79], 0x52, 8 * KiB);
939ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[28], 0x50, 256);
940febbe308SPeter Delevoryas 
941febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
9429077e09aSPeter Delevoryas         at24c_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB);
943febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[82 + i * 8], TYPE_TMP75, 0x48);
944febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[83 + i * 8], TYPE_TMP75, 0x4b);
945febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[84 + i * 8], TYPE_TMP75, 0x4a);
946febbe308SPeter Delevoryas     }
947febbe308SPeter Delevoryas }
948febbe308SPeter Delevoryas 
949a20c54b1SPatrick Williams #define TYPE_TMP421 "tmp421"
950a20c54b1SPatrick Williams 
951a20c54b1SPatrick Williams static void bletchley_bmc_i2c_init(AspeedMachineState *bmc)
952a20c54b1SPatrick Williams {
9533c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
954a20c54b1SPatrick Williams     I2CBus *i2c[13] = {};
955a20c54b1SPatrick Williams     for (int i = 0; i < 13; i++) {
956a20c54b1SPatrick Williams         if ((i == 8) || (i == 11)) {
957a20c54b1SPatrick Williams             continue;
958a20c54b1SPatrick Williams         }
959a20c54b1SPatrick Williams         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
960a20c54b1SPatrick Williams     }
961a20c54b1SPatrick Williams 
962a20c54b1SPatrick Williams     /* Bus 0 - 5 all have the same config. */
963a20c54b1SPatrick Williams     for (int i = 0; i < 6; i++) {
964a20c54b1SPatrick Williams         /* Missing model: ti,ina230 @ 0x45 */
965a20c54b1SPatrick Williams         /* Missing model: mps,mp5023 @ 0x40 */
966a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_TMP421, 0x4f);
967a20c54b1SPatrick Williams         /* Missing model: nxp,pca9539 @ 0x76, but PCA9552 works enough */
968a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x76);
969a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x67);
970a20c54b1SPatrick Williams         /* Missing model: fsc,fusb302 @ 0x22 */
971a20c54b1SPatrick Williams     }
972a20c54b1SPatrick Williams 
973a20c54b1SPatrick Williams     /* Bus 6 */
974a20c54b1SPatrick Williams     at24c_eeprom_init(i2c[6], 0x56, 65536);
975a20c54b1SPatrick Williams     /* Missing model: nxp,pcf85263 @ 0x51 , but ds1338 works enough */
976a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[6], "ds1338", 0x51);
977a20c54b1SPatrick Williams 
978a20c54b1SPatrick Williams 
979a20c54b1SPatrick Williams     /* Bus 7 */
980a20c54b1SPatrick Williams     at24c_eeprom_init(i2c[7], 0x54, 65536);
981a20c54b1SPatrick Williams 
982a20c54b1SPatrick Williams     /* Bus 9 */
983a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[9], TYPE_TMP421, 0x4f);
984a20c54b1SPatrick Williams 
985a20c54b1SPatrick Williams     /* Bus 10 */
986a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[10], TYPE_TMP421, 0x4f);
987a20c54b1SPatrick Williams     /* Missing model: ti,hdc1080 @ 0x40 */
988a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[10], TYPE_PCA9552, 0x67);
989a20c54b1SPatrick Williams 
990a20c54b1SPatrick Williams     /* Bus 12 */
991a20c54b1SPatrick Williams     /* Missing model: adi,adm1278 @ 0x11 */
992a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4c);
993a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4d);
994a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_PCA9552, 0x67);
995a20c54b1SPatrick Williams }
996a20c54b1SPatrick Williams 
997fa699e80SPeter Delevoryas static void fby35_i2c_init(AspeedMachineState *bmc)
998fa699e80SPeter Delevoryas {
9993c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
1000fa699e80SPeter Delevoryas     I2CBus *i2c[16];
1001fa699e80SPeter Delevoryas 
1002fa699e80SPeter Delevoryas     for (int i = 0; i < 16; i++) {
1003fa699e80SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
1004fa699e80SPeter Delevoryas     }
1005fa699e80SPeter Delevoryas 
1006fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[2], TYPE_LM75, 0x4f);
1007fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_TMP421, 0x1f);
1008fa699e80SPeter Delevoryas     /* Hotswap controller is actually supposed to be mp5920 or ltc4282. */
1009fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[11], "adm1272", 0x44);
1010fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4e);
1011fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4f);
1012fa699e80SPeter Delevoryas 
10139077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[4], 0x51, 128 * KiB);
10149077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[6], 0x51, 128 * KiB);
1015c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[8], 0x50, 32 * KiB, fby35_nic_fruid,
1016c0216b94SPeter Delevoryas                           fby35_nic_fruid_len);
1017c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[11], 0x51, 128 * KiB, fby35_bb_fruid,
1018c0216b94SPeter Delevoryas                           fby35_bb_fruid_len);
1019c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[11], 0x54, 128 * KiB, fby35_bmc_fruid,
1020c0216b94SPeter Delevoryas                           fby35_bmc_fruid_len);
1021fa699e80SPeter Delevoryas 
1022fa699e80SPeter Delevoryas     /*
1023fa699e80SPeter Delevoryas      * TODO: There is a multi-master i2c connection to an AST1030 MiniBMC on
1024fa699e80SPeter Delevoryas      * buses 0, 1, 2, 3, and 9. Source address 0x10, target address 0x20 on
1025fa699e80SPeter Delevoryas      * each.
1026fa699e80SPeter Delevoryas      */
1027fa699e80SPeter Delevoryas }
1028fa699e80SPeter Delevoryas 
1029fb6b3c8dSJae Hyun Yoo static void qcom_dc_scm_bmc_i2c_init(AspeedMachineState *bmc)
1030fb6b3c8dSJae Hyun Yoo {
10313c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
1032fb6b3c8dSJae Hyun Yoo 
1033fb6b3c8dSJae Hyun Yoo     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 15), "tmp105", 0x4d);
1034fb6b3c8dSJae Hyun Yoo }
1035fb6b3c8dSJae Hyun Yoo 
1036ece4cccdSGraeme Gregory static void qcom_dc_scm_firework_i2c_init(AspeedMachineState *bmc)
1037ece4cccdSGraeme Gregory {
10383c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
10392a7a5d5cSJae Hyun Yoo     I2CSlave *therm_mux, *cpuvr_mux;
1040ece4cccdSGraeme Gregory 
1041ece4cccdSGraeme Gregory     /* Create the generic DC-SCM hardware */
1042ece4cccdSGraeme Gregory     qcom_dc_scm_bmc_i2c_init(bmc);
1043ece4cccdSGraeme Gregory 
1044ece4cccdSGraeme Gregory     /* Now create the Firework specific hardware */
10452a75e8c3SMaheswara Kurapati 
10462a7a5d5cSJae Hyun Yoo     /* I2C7 CPUVR MUX */
10472a7a5d5cSJae Hyun Yoo     cpuvr_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
10482a7a5d5cSJae Hyun Yoo                                         "pca9546", 0x70);
10492a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 0), "pca9548", 0x72);
10502a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 1), "pca9548", 0x72);
10512a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 2), "pca9548", 0x72);
10522a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 3), "pca9548", 0x72);
10532a7a5d5cSJae Hyun Yoo 
1054cfc68f16SMaheswara Kurapati     /* I2C8 Thermal Diodes*/
1055cfc68f16SMaheswara Kurapati     therm_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
1056cfc68f16SMaheswara Kurapati                                         "pca9548", 0x70);
1057cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 0), TYPE_LM75, 0x4C);
1058cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 1), TYPE_LM75, 0x4C);
1059cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 2), TYPE_LM75, 0x48);
1060cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 3), TYPE_LM75, 0x48);
1061cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 4), TYPE_LM75, 0x48);
1062cfc68f16SMaheswara Kurapati 
10632a75e8c3SMaheswara Kurapati     /* I2C9 Fan Controller (MAX31785) */
10642a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x52);
10652a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x54);
1066ece4cccdSGraeme Gregory }
1067ece4cccdSGraeme Gregory 
10681a15311aSCédric Le Goater static bool aspeed_get_mmio_exec(Object *obj, Error **errp)
10691a15311aSCédric Le Goater {
10701a15311aSCédric Le Goater     return ASPEED_MACHINE(obj)->mmio_exec;
10711a15311aSCédric Le Goater }
10721a15311aSCédric Le Goater 
10731a15311aSCédric Le Goater static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp)
10741a15311aSCédric Le Goater {
10751a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = value;
10761a15311aSCédric Le Goater }
10771a15311aSCédric Le Goater 
10781a15311aSCédric Le Goater static void aspeed_machine_instance_init(Object *obj)
10791a15311aSCédric Le Goater {
10801a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = false;
10811a15311aSCédric Le Goater }
10821a15311aSCédric Le Goater 
10839820e52fSCédric Le Goater static char *aspeed_get_fmc_model(Object *obj, Error **errp)
10849820e52fSCédric Le Goater {
10859820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10869820e52fSCédric Le Goater     return g_strdup(bmc->fmc_model);
10879820e52fSCédric Le Goater }
10889820e52fSCédric Le Goater 
10899820e52fSCédric Le Goater static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp)
10909820e52fSCédric Le Goater {
10919820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10929820e52fSCédric Le Goater 
10939820e52fSCédric Le Goater     g_free(bmc->fmc_model);
10949820e52fSCédric Le Goater     bmc->fmc_model = g_strdup(value);
10959820e52fSCédric Le Goater }
10969820e52fSCédric Le Goater 
10979820e52fSCédric Le Goater static char *aspeed_get_spi_model(Object *obj, Error **errp)
10989820e52fSCédric Le Goater {
10999820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
11009820e52fSCédric Le Goater     return g_strdup(bmc->spi_model);
11019820e52fSCédric Le Goater }
11029820e52fSCédric Le Goater 
11039820e52fSCédric Le Goater static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp)
11049820e52fSCédric Le Goater {
11059820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
11069820e52fSCédric Le Goater 
11079820e52fSCédric Le Goater     g_free(bmc->spi_model);
11089820e52fSCédric Le Goater     bmc->spi_model = g_strdup(value);
11099820e52fSCédric Le Goater }
11109820e52fSCédric Le Goater 
1111f65f6ad5SCédric Le Goater static char *aspeed_get_bmc_console(Object *obj, Error **errp)
1112f65f6ad5SCédric Le Goater {
1113f65f6ad5SCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1114f65f6ad5SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
1115f65f6ad5SCédric Le Goater     int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default;
1116f65f6ad5SCédric Le Goater 
1117944128eeSJamin Lin     return g_strdup_printf("uart%d", aspeed_uart_index(uart_chosen));
1118f65f6ad5SCédric Le Goater }
1119f65f6ad5SCédric Le Goater 
1120f65f6ad5SCédric Le Goater static void aspeed_set_bmc_console(Object *obj, const char *value, Error **errp)
1121f65f6ad5SCédric Le Goater {
1122f65f6ad5SCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1123f65f6ad5SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
1124f65f6ad5SCédric Le Goater     AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(amc->soc_name));
1125f65f6ad5SCédric Le Goater     int val;
1126944128eeSJamin Lin     int uart_first = aspeed_uart_first(sc);
1127944128eeSJamin Lin     int uart_last = aspeed_uart_last(sc);
1128f65f6ad5SCédric Le Goater 
1129f65f6ad5SCédric Le Goater     if (sscanf(value, "uart%u", &val) != 1) {
1130f65f6ad5SCédric Le Goater         error_setg(errp, "Bad value for \"uart\" property");
1131f65f6ad5SCédric Le Goater         return;
1132f65f6ad5SCédric Le Goater     }
1133f65f6ad5SCédric Le Goater 
1134f65f6ad5SCédric Le Goater     /* The number of UART depends on the SoC */
1135944128eeSJamin Lin     if (val < uart_first || val > uart_last) {
1136944128eeSJamin Lin         error_setg(errp, "\"uart\" should be in range [%d - %d]",
1137944128eeSJamin Lin                    uart_first, uart_last);
1138f65f6ad5SCédric Le Goater         return;
1139f65f6ad5SCédric Le Goater     }
1140944128eeSJamin Lin     bmc->uart_chosen = val + ASPEED_DEV_UART0;
1141f65f6ad5SCédric Le Goater }
1142f65f6ad5SCédric Le Goater 
11431a15311aSCédric Le Goater static void aspeed_machine_class_props_init(ObjectClass *oc)
11441a15311aSCédric Le Goater {
11451a15311aSCédric Le Goater     object_class_property_add_bool(oc, "execute-in-place",
11461a15311aSCédric Le Goater                                    aspeed_get_mmio_exec,
1147d2623129SMarkus Armbruster                                    aspeed_set_mmio_exec);
11481a15311aSCédric Le Goater     object_class_property_set_description(oc, "execute-in-place",
11497eecec7dSMarkus Armbruster                            "boot directly from CE0 flash device");
11509820e52fSCédric Le Goater 
1151f65f6ad5SCédric Le Goater     object_class_property_add_str(oc, "bmc-console", aspeed_get_bmc_console,
1152f65f6ad5SCédric Le Goater                                   aspeed_set_bmc_console);
1153f65f6ad5SCédric Le Goater     object_class_property_set_description(oc, "bmc-console",
1154f65f6ad5SCédric Le Goater                            "Change the default UART to \"uartX\"");
1155f65f6ad5SCédric Le Goater 
11569820e52fSCédric Le Goater     object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model,
11579820e52fSCédric Le Goater                                    aspeed_set_fmc_model);
11589820e52fSCédric Le Goater     object_class_property_set_description(oc, "fmc-model",
11599820e52fSCédric Le Goater                                           "Change the FMC Flash model");
11609820e52fSCédric Le Goater     object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model,
11619820e52fSCédric Le Goater                                    aspeed_set_spi_model);
11629820e52fSCédric Le Goater     object_class_property_set_description(oc, "spi-model",
11639820e52fSCédric Le Goater                                           "Change the SPI Flash model");
11641a15311aSCédric Le Goater }
11651a15311aSCédric Le Goater 
116643a0a5c9SPhilippe Mathieu-Daudé static void aspeed_machine_class_init_cpus_defaults(MachineClass *mc)
1167b7f1a0cbSCédric Le Goater {
116843a0a5c9SPhilippe Mathieu-Daudé     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(mc);
116943a0a5c9SPhilippe Mathieu-Daudé     AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(amc->soc_name));
117043a0a5c9SPhilippe Mathieu-Daudé 
117143a0a5c9SPhilippe Mathieu-Daudé     mc->default_cpus = sc->num_cpus;
117243a0a5c9SPhilippe Mathieu-Daudé     mc->min_cpus = sc->num_cpus;
117343a0a5c9SPhilippe Mathieu-Daudé     mc->max_cpus = sc->num_cpus;
1174dc13909eSPhilippe Mathieu-Daudé     mc->valid_cpu_types = sc->valid_cpu_types;
1175b7f1a0cbSCédric Le Goater }
1176b7f1a0cbSCédric Le Goater 
1177fca9ca1bSCédric Le Goater static void aspeed_machine_class_init(ObjectClass *oc, void *data)
117862c2c2ebSCédric Le Goater {
117962c2c2ebSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1180d3bad7e7SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
118162c2c2ebSCédric Le Goater 
1182fca9ca1bSCédric Le Goater     mc->init = aspeed_machine_init;
118362c2c2ebSCédric Le Goater     mc->no_floppy = 1;
118462c2c2ebSCédric Le Goater     mc->no_cdrom = 1;
118562c2c2ebSCédric Le Goater     mc->no_parallel = 1;
1186afcbaed6SIgor Mammedov     mc->default_ram_id = "ram";
1187d3bad7e7SCédric Le Goater     amc->macs_mask = ASPEED_MAC0_ON;
11885d63d0c7SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART5;
11891a15311aSCédric Le Goater 
11901a15311aSCédric Le Goater     aspeed_machine_class_props_init(oc);
119162c2c2ebSCédric Le Goater }
119262c2c2ebSCédric Le Goater 
1193baa4732bSCédric Le Goater static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
1194baa4732bSCédric Le Goater {
1195baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1196baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1197baa4732bSCédric Le Goater 
1198baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Palmetto BMC (ARM926EJ-S)";
1199baa4732bSCédric Le Goater     amc->soc_name  = "ast2400-a1";
1200baa4732bSCédric Le Goater     amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1;
1201baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
120270322913SCédric Le Goater     amc->spi_model = "mx25l25635f";
1203baa4732bSCédric Le Goater     amc->num_cs    = 1;
1204baa4732bSCédric Le Goater     amc->i2c_init  = palmetto_bmc_i2c_init;
1205baa4732bSCédric Le Goater     mc->default_ram_size       = 256 * MiB;
120643a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1207baa4732bSCédric Le Goater };
1208baa4732bSCédric Le Goater 
12099cccb912SPatrick Venture static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data)
12109cccb912SPatrick Venture {
12119cccb912SPatrick Venture     MachineClass *mc = MACHINE_CLASS(oc);
12129cccb912SPatrick Venture     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
12139cccb912SPatrick Venture 
12149cccb912SPatrick Venture     mc->desc       = "Quanta-Q71l BMC (ARM926EJ-S)";
12159cccb912SPatrick Venture     amc->soc_name  = "ast2400-a1";
12169cccb912SPatrick Venture     amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1;
12179cccb912SPatrick Venture     amc->fmc_model = "n25q256a";
12189cccb912SPatrick Venture     amc->spi_model = "mx25l25635e";
12199cccb912SPatrick Venture     amc->num_cs    = 1;
12209cccb912SPatrick Venture     amc->i2c_init  = quanta_q71l_bmc_i2c_init;
12219cccb912SPatrick Venture     mc->default_ram_size       = 128 * MiB;
122243a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
12239cccb912SPatrick Venture }
12249cccb912SPatrick Venture 
122540a38df5SErik Smit static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc,
122640a38df5SErik Smit                                                         void *data)
122740a38df5SErik Smit {
122840a38df5SErik Smit     MachineClass *mc = MACHINE_CLASS(oc);
122940a38df5SErik Smit     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
123040a38df5SErik Smit 
123140a38df5SErik Smit     mc->desc       = "Supermicro X11 BMC (ARM926EJ-S)";
123240a38df5SErik Smit     amc->soc_name  = "ast2400-a1";
123340a38df5SErik Smit     amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1;
123440a38df5SErik Smit     amc->fmc_model = "mx25l25635e";
123540a38df5SErik Smit     amc->spi_model = "mx25l25635e";
123640a38df5SErik Smit     amc->num_cs    = 1;
123740a38df5SErik Smit     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
123840a38df5SErik Smit     amc->i2c_init  = palmetto_bmc_i2c_init;
123940a38df5SErik Smit     mc->default_ram_size = 256 * MiB;
124043a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
124140a38df5SErik Smit }
124240a38df5SErik Smit 
124347936597SGuenter Roeck static void aspeed_machine_supermicro_x11spi_bmc_class_init(ObjectClass *oc,
124447936597SGuenter Roeck                                                             void *data)
124547936597SGuenter Roeck {
124647936597SGuenter Roeck     MachineClass *mc = MACHINE_CLASS(oc);
124747936597SGuenter Roeck     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
124847936597SGuenter Roeck 
124947936597SGuenter Roeck     mc->desc       = "Supermicro X11 SPI BMC (ARM1176)";
125047936597SGuenter Roeck     amc->soc_name  = "ast2500-a1";
125147936597SGuenter Roeck     amc->hw_strap1 = SUPERMICRO_X11SPI_BMC_HW_STRAP1;
125247936597SGuenter Roeck     amc->fmc_model = "mx25l25635e";
125347936597SGuenter Roeck     amc->spi_model = "mx25l25635e";
125447936597SGuenter Roeck     amc->num_cs    = 1;
125547936597SGuenter Roeck     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
125647936597SGuenter Roeck     amc->i2c_init  = palmetto_bmc_i2c_init;
125747936597SGuenter Roeck     mc->default_ram_size = 512 * MiB;
125843a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
125947936597SGuenter Roeck }
126047936597SGuenter Roeck 
1261baa4732bSCédric Le Goater static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data)
1262baa4732bSCédric Le Goater {
1263baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1264baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1265baa4732bSCédric Le Goater 
1266baa4732bSCédric Le Goater     mc->desc       = "Aspeed AST2500 EVB (ARM1176)";
1267baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1268baa4732bSCédric Le Goater     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
1269753abfc4SJae Hyun Yoo     amc->fmc_model = "mx25l25635e";
127070322913SCédric Le Goater     amc->spi_model = "mx25l25635f";
1271baa4732bSCédric Le Goater     amc->num_cs    = 1;
1272baa4732bSCédric Le Goater     amc->i2c_init  = ast2500_evb_i2c_init;
1273baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
127443a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1275baa4732bSCédric Le Goater };
1276baa4732bSCédric Le Goater 
127734f73a81SKarthikeyan Pasupathi static void aspeed_machine_yosemitev2_class_init(ObjectClass *oc, void *data)
127834f73a81SKarthikeyan Pasupathi {
127934f73a81SKarthikeyan Pasupathi     MachineClass *mc = MACHINE_CLASS(oc);
128034f73a81SKarthikeyan Pasupathi     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
128134f73a81SKarthikeyan Pasupathi 
128234f73a81SKarthikeyan Pasupathi     mc->desc       = "Facebook YosemiteV2 BMC (ARM1176)";
128334f73a81SKarthikeyan Pasupathi     amc->soc_name  = "ast2500-a1";
128434f73a81SKarthikeyan Pasupathi     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
128534f73a81SKarthikeyan Pasupathi     amc->hw_strap2 = 0;
128634f73a81SKarthikeyan Pasupathi     amc->fmc_model = "n25q256a";
128734f73a81SKarthikeyan Pasupathi     amc->spi_model = "mx25l25635e";
128834f73a81SKarthikeyan Pasupathi     amc->num_cs    = 2;
128934f73a81SKarthikeyan Pasupathi     amc->i2c_init  = yosemitev2_bmc_i2c_init;
129034f73a81SKarthikeyan Pasupathi     mc->default_ram_size       = 512 * MiB;
129143a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
129234f73a81SKarthikeyan Pasupathi };
129334f73a81SKarthikeyan Pasupathi 
1294baa4732bSCédric Le Goater static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data)
1295baa4732bSCédric Le Goater {
1296baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1297baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1298baa4732bSCédric Le Goater 
1299baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Romulus BMC (ARM1176)";
1300baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1301baa4732bSCédric Le Goater     amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1;
1302baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
1303baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1304baa4732bSCédric Le Goater     amc->num_cs    = 2;
1305baa4732bSCédric Le Goater     amc->i2c_init  = romulus_bmc_i2c_init;
1306baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
130743a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1308baa4732bSCédric Le Goater };
1309baa4732bSCédric Le Goater 
13106c323abaSKarthikeyan Pasupathi static void aspeed_machine_tiogapass_class_init(ObjectClass *oc, void *data)
13116c323abaSKarthikeyan Pasupathi {
13126c323abaSKarthikeyan Pasupathi     MachineClass *mc = MACHINE_CLASS(oc);
13136c323abaSKarthikeyan Pasupathi     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
13146c323abaSKarthikeyan Pasupathi 
13156c323abaSKarthikeyan Pasupathi     mc->desc       = "Facebook Tiogapass BMC (ARM1176)";
13166c323abaSKarthikeyan Pasupathi     amc->soc_name  = "ast2500-a1";
13176c323abaSKarthikeyan Pasupathi     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
13186c323abaSKarthikeyan Pasupathi     amc->hw_strap2 = 0;
13196c323abaSKarthikeyan Pasupathi     amc->fmc_model = "n25q256a";
13206c323abaSKarthikeyan Pasupathi     amc->spi_model = "mx25l25635e";
13216c323abaSKarthikeyan Pasupathi     amc->num_cs    = 2;
13226c323abaSKarthikeyan Pasupathi     amc->i2c_init  = tiogapass_bmc_i2c_init;
13236c323abaSKarthikeyan Pasupathi     mc->default_ram_size       = 1 * GiB;
132443a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
13256c323abaSKarthikeyan Pasupathi };
13266c323abaSKarthikeyan Pasupathi 
1327143b040fSPatrick Williams static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data)
1328143b040fSPatrick Williams {
1329143b040fSPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1330143b040fSPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1331143b040fSPatrick Williams 
1332143b040fSPatrick Williams     mc->desc       = "OCP SonoraPass BMC (ARM1176)";
1333143b040fSPatrick Williams     amc->soc_name  = "ast2500-a1";
1334143b040fSPatrick Williams     amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1;
1335143b040fSPatrick Williams     amc->fmc_model = "mx66l1g45g";
1336143b040fSPatrick Williams     amc->spi_model = "mx66l1g45g";
1337143b040fSPatrick Williams     amc->num_cs    = 2;
1338143b040fSPatrick Williams     amc->i2c_init  = sonorapass_bmc_i2c_init;
1339143b040fSPatrick Williams     mc->default_ram_size       = 512 * MiB;
134043a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1341143b040fSPatrick Williams };
1342143b040fSPatrick Williams 
1343baa4732bSCédric Le Goater static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data)
1344baa4732bSCédric Le Goater {
1345baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1346baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1347baa4732bSCédric Le Goater 
1348baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Witherspoon BMC (ARM1176)";
1349baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1350baa4732bSCédric Le Goater     amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1;
135170322913SCédric Le Goater     amc->fmc_model = "mx25l25635f";
1352baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1353baa4732bSCédric Le Goater     amc->num_cs    = 2;
1354baa4732bSCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init;
1355baa4732bSCédric Le Goater     mc->default_ram_size = 512 * MiB;
135643a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1357baa4732bSCédric Le Goater };
1358baa4732bSCédric Le Goater 
1359baa4732bSCédric Le Goater static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
1360baa4732bSCédric Le Goater {
1361baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1362baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1363baa4732bSCédric Le Goater 
1364f548f201SPeter Maydell     mc->desc       = "Aspeed AST2600 EVB (Cortex-A7)";
1365c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
1366baa4732bSCédric Le Goater     amc->hw_strap1 = AST2600_EVB_HW_STRAP1;
1367baa4732bSCédric Le Goater     amc->hw_strap2 = AST2600_EVB_HW_STRAP2;
1368753abfc4SJae Hyun Yoo     amc->fmc_model = "mx66u51235f";
1369baa4732bSCédric Le Goater     amc->spi_model = "mx66u51235f";
1370baa4732bSCédric Le Goater     amc->num_cs    = 1;
137129193286SGuenter Roeck     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON |
137229193286SGuenter Roeck                      ASPEED_MAC3_ON;
1373baa4732bSCédric Le Goater     amc->i2c_init  = ast2600_evb_i2c_init;
1374baa4732bSCédric Le Goater     mc->default_ram_size = 1 * GiB;
137543a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1376baa4732bSCédric Le Goater };
1377baa4732bSCédric Le Goater 
137863ceb818SCédric Le Goater static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data)
137963ceb818SCédric Le Goater {
138063ceb818SCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
138163ceb818SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
138263ceb818SCédric Le Goater 
1383f548f201SPeter Maydell     mc->desc       = "OpenPOWER Tacoma BMC (Cortex-A7)";
1384c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
138563ceb818SCédric Le Goater     amc->hw_strap1 = TACOMA_BMC_HW_STRAP1;
138663ceb818SCédric Le Goater     amc->hw_strap2 = TACOMA_BMC_HW_STRAP2;
138763ceb818SCédric Le Goater     amc->fmc_model = "mx66l1g45g";
138863ceb818SCédric Le Goater     amc->spi_model = "mx66l1g45g";
138963ceb818SCédric Le Goater     amc->num_cs    = 2;
1390d3bad7e7SCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON;
139163ceb818SCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init; /* Same board layout */
139263ceb818SCédric Le Goater     mc->default_ram_size = 1 * GiB;
139343a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
139456a37edaSCédric Le Goater 
139556a37edaSCédric Le Goater     mc->deprecation_reason = "Please use the similar 'rainier-bmc' machine";
139663ceb818SCédric Le Goater };
139763ceb818SCédric Le Goater 
139895f068c8SJohn Wang static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data)
139995f068c8SJohn Wang {
140095f068c8SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
140195f068c8SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
140295f068c8SJohn Wang 
140395f068c8SJohn Wang     mc->desc       = "Bytedance G220A BMC (ARM1176)";
140495f068c8SJohn Wang     amc->soc_name  = "ast2500-a1";
140595f068c8SJohn Wang     amc->hw_strap1 = G220A_BMC_HW_STRAP1;
140695f068c8SJohn Wang     amc->fmc_model = "n25q512a";
140795f068c8SJohn Wang     amc->spi_model = "mx25l25635e";
140895f068c8SJohn Wang     amc->num_cs    = 2;
14095bb825c8SGuenter Roeck     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
141095f068c8SJohn Wang     amc->i2c_init  = g220a_bmc_i2c_init;
141195f068c8SJohn Wang     mc->default_ram_size = 1024 * MiB;
141243a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
141395f068c8SJohn Wang };
141495f068c8SJohn Wang 
141582b6a3f6SJohn Wang static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc, void *data)
141682b6a3f6SJohn Wang {
141782b6a3f6SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
141882b6a3f6SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
141982b6a3f6SJohn Wang 
142082b6a3f6SJohn Wang     mc->desc       = "Inspur FP5280G2 BMC (ARM1176)";
142182b6a3f6SJohn Wang     amc->soc_name  = "ast2500-a1";
142282b6a3f6SJohn Wang     amc->hw_strap1 = FP5280G2_BMC_HW_STRAP1;
142382b6a3f6SJohn Wang     amc->fmc_model = "n25q512a";
142482b6a3f6SJohn Wang     amc->spi_model = "mx25l25635e";
142582b6a3f6SJohn Wang     amc->num_cs    = 2;
142682b6a3f6SJohn Wang     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
142782b6a3f6SJohn Wang     amc->i2c_init  = fp5280g2_bmc_i2c_init;
142882b6a3f6SJohn Wang     mc->default_ram_size = 512 * MiB;
142943a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
143082b6a3f6SJohn Wang };
143182b6a3f6SJohn Wang 
143258e52bdbSCédric Le Goater static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data)
143358e52bdbSCédric Le Goater {
143458e52bdbSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
143558e52bdbSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
143658e52bdbSCédric Le Goater 
1437f548f201SPeter Maydell     mc->desc       = "IBM Rainier BMC (Cortex-A7)";
1438c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
143958e52bdbSCédric Le Goater     amc->hw_strap1 = RAINIER_BMC_HW_STRAP1;
144058e52bdbSCédric Le Goater     amc->hw_strap2 = RAINIER_BMC_HW_STRAP2;
144158e52bdbSCédric Le Goater     amc->fmc_model = "mx66l1g45g";
144258e52bdbSCédric Le Goater     amc->spi_model = "mx66l1g45g";
144358e52bdbSCédric Le Goater     amc->num_cs    = 2;
144458e52bdbSCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
144558e52bdbSCédric Le Goater     amc->i2c_init  = rainier_bmc_i2c_init;
144658e52bdbSCédric Le Goater     mc->default_ram_size = 1 * GiB;
144743a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
144858e52bdbSCédric Le Goater };
144958e52bdbSCédric Le Goater 
14501e2c22c9SCédric Le Goater #define FUJI_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB)
1451febbe308SPeter Delevoryas 
1452febbe308SPeter Delevoryas static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data)
1453febbe308SPeter Delevoryas {
1454febbe308SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1455febbe308SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1456febbe308SPeter Delevoryas 
1457febbe308SPeter Delevoryas     mc->desc = "Facebook Fuji BMC (Cortex-A7)";
1458febbe308SPeter Delevoryas     amc->soc_name = "ast2600-a3";
1459febbe308SPeter Delevoryas     amc->hw_strap1 = FUJI_BMC_HW_STRAP1;
1460febbe308SPeter Delevoryas     amc->hw_strap2 = FUJI_BMC_HW_STRAP2;
1461febbe308SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1462febbe308SPeter Delevoryas     amc->spi_model = "mx66l1g45g";
1463febbe308SPeter Delevoryas     amc->num_cs = 2;
1464febbe308SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1465febbe308SPeter Delevoryas     amc->i2c_init = fuji_bmc_i2c_init;
1466febbe308SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART1;
1467febbe308SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
146843a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1469febbe308SPeter Delevoryas };
1470febbe308SPeter Delevoryas 
14711e2c22c9SCédric Le Goater #define BLETCHLEY_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB)
1472104bdaffSPatrick Williams 
1473a20c54b1SPatrick Williams static void aspeed_machine_bletchley_class_init(ObjectClass *oc, void *data)
1474a20c54b1SPatrick Williams {
1475a20c54b1SPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1476a20c54b1SPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1477a20c54b1SPatrick Williams 
1478a20c54b1SPatrick Williams     mc->desc       = "Facebook Bletchley BMC (Cortex-A7)";
1479a20c54b1SPatrick Williams     amc->soc_name  = "ast2600-a3";
1480a20c54b1SPatrick Williams     amc->hw_strap1 = BLETCHLEY_BMC_HW_STRAP1;
1481a20c54b1SPatrick Williams     amc->hw_strap2 = BLETCHLEY_BMC_HW_STRAP2;
1482a20c54b1SPatrick Williams     amc->fmc_model = "w25q01jvq";
1483a20c54b1SPatrick Williams     amc->spi_model = NULL;
1484a20c54b1SPatrick Williams     amc->num_cs    = 2;
1485a20c54b1SPatrick Williams     amc->macs_mask = ASPEED_MAC2_ON;
1486a20c54b1SPatrick Williams     amc->i2c_init  = bletchley_bmc_i2c_init;
1487104bdaffSPatrick Williams     mc->default_ram_size = BLETCHLEY_BMC_RAM_SIZE;
148843a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1489a20c54b1SPatrick Williams }
1490a20c54b1SPatrick Williams 
14917966d70fSJason A. Donenfeld static void fby35_reset(MachineState *state, ShutdownCause reason)
1492fa699e80SPeter Delevoryas {
1493fa699e80SPeter Delevoryas     AspeedMachineState *bmc = ASPEED_MACHINE(state);
14943c392e87SPhilippe Mathieu-Daudé     AspeedGPIOState *gpio = &bmc->soc->gpio;
1495fa699e80SPeter Delevoryas 
14967966d70fSJason A. Donenfeld     qemu_devices_reset(reason);
1497fa699e80SPeter Delevoryas 
1498f0418558SPeter Delevoryas     /* Board ID: 7 (Class-1, 4 slots) */
1499fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV4", true, &error_fatal);
1500fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV5", true, &error_fatal);
1501fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV6", true, &error_fatal);
1502fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV7", false, &error_fatal);
1503f0418558SPeter Delevoryas 
1504f0418558SPeter Delevoryas     /* Slot presence pins, inverse polarity. (False means present) */
1505f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH4", false, &error_fatal);
1506f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH5", true, &error_fatal);
1507f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH6", true, &error_fatal);
1508f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH7", true, &error_fatal);
1509f0418558SPeter Delevoryas 
1510f0418558SPeter Delevoryas     /* Slot 12v power pins, normal polarity. (True means powered-on) */
1511f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB2", true, &error_fatal);
1512f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB3", false, &error_fatal);
1513f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB4", false, &error_fatal);
1514f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB5", false, &error_fatal);
1515fa699e80SPeter Delevoryas }
1516fa699e80SPeter Delevoryas 
1517fa699e80SPeter Delevoryas static void aspeed_machine_fby35_class_init(ObjectClass *oc, void *data)
1518fa699e80SPeter Delevoryas {
1519fa699e80SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1520fa699e80SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1521fa699e80SPeter Delevoryas 
1522fa699e80SPeter Delevoryas     mc->desc       = "Facebook fby35 BMC (Cortex-A7)";
1523fa699e80SPeter Delevoryas     mc->reset      = fby35_reset;
1524fa699e80SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1525fa699e80SPeter Delevoryas     amc->num_cs    = 2;
1526fa699e80SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1527fa699e80SPeter Delevoryas     amc->i2c_init  = fby35_i2c_init;
1528fa699e80SPeter Delevoryas     /* FIXME: Replace this macro with something more general */
1529fa699e80SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
153043a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1531fa699e80SPeter Delevoryas }
1532fa699e80SPeter Delevoryas 
153366c895b8SJamin Lin #define AST1030_INTERNAL_FLASH_SIZE (1024 * 1024)
153466c895b8SJamin Lin /* Main SYSCLK frequency in Hz (200MHz) */
153566c895b8SJamin Lin #define SYSCLK_FRQ 200000000ULL
153666c895b8SJamin Lin 
153766c895b8SJamin Lin static void aspeed_minibmc_machine_init(MachineState *machine)
153866c895b8SJamin Lin {
153966c895b8SJamin Lin     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
154066c895b8SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
154166c895b8SJamin Lin     Clock *sysclk;
154266c895b8SJamin Lin 
154366c895b8SJamin Lin     sysclk = clock_new(OBJECT(machine), "SYSCLK");
154466c895b8SJamin Lin     clock_set_hz(sysclk, SYSCLK_FRQ);
154566c895b8SJamin Lin 
15463c392e87SPhilippe Mathieu-Daudé     bmc->soc = ASPEED_SOC(object_new(amc->soc_name));
15473c392e87SPhilippe Mathieu-Daudé     object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc));
15483c392e87SPhilippe Mathieu-Daudé     object_unref(OBJECT(bmc->soc));
15493c392e87SPhilippe Mathieu-Daudé     qdev_connect_clock_in(DEVICE(bmc->soc), "sysclk", sysclk);
155066c895b8SJamin Lin 
15513c392e87SPhilippe Mathieu-Daudé     object_property_set_link(OBJECT(bmc->soc), "memory",
15524dd9d554SPeter Delevoryas                              OBJECT(get_system_memory()), &error_abort);
1553d2b3eaefSPeter Delevoryas     connect_serial_hds_to_uarts(bmc);
15543c392e87SPhilippe Mathieu-Daudé     qdev_realize(DEVICE(bmc->soc), NULL, &error_abort);
155566c895b8SJamin Lin 
15563c392e87SPhilippe Mathieu-Daudé     aspeed_board_init_flashes(&bmc->soc->fmc,
155766c895b8SJamin Lin                               bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
155866c895b8SJamin Lin                               amc->num_cs,
155966c895b8SJamin Lin                               0);
156066c895b8SJamin Lin 
15613c392e87SPhilippe Mathieu-Daudé     aspeed_board_init_flashes(&bmc->soc->spi[0],
156266c895b8SJamin Lin                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
156366c895b8SJamin Lin                               amc->num_cs, amc->num_cs);
156466c895b8SJamin Lin 
15653c392e87SPhilippe Mathieu-Daudé     aspeed_board_init_flashes(&bmc->soc->spi[1],
156666c895b8SJamin Lin                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
156766c895b8SJamin Lin                               amc->num_cs, (amc->num_cs * 2));
156866c895b8SJamin Lin 
156966c895b8SJamin Lin     if (amc->i2c_init) {
157066c895b8SJamin Lin         amc->i2c_init(bmc);
157166c895b8SJamin Lin     }
157266c895b8SJamin Lin 
157366c895b8SJamin Lin     armv7m_load_kernel(ARM_CPU(first_cpu),
157466c895b8SJamin Lin                        machine->kernel_filename,
1575761c532aSPeter Maydell                        0,
157666c895b8SJamin Lin                        AST1030_INTERNAL_FLASH_SIZE);
157766c895b8SJamin Lin }
157866c895b8SJamin Lin 
15794c70ab16STroy Lee static void ast1030_evb_i2c_init(AspeedMachineState *bmc)
15804c70ab16STroy Lee {
15813c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
15824c70ab16STroy Lee 
1583673d8215SMichael Tokarev     /* U10 24C08 connects to SDA/SCL Group 1 by default */
15844c70ab16STroy Lee     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
15854c70ab16STroy Lee     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, eeprom_buf);
15864c70ab16STroy Lee 
15874c70ab16STroy Lee     /* U11 LM75 connects to SDA/SCL Group 2 by default */
15884c70ab16STroy Lee     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d);
15894c70ab16STroy Lee }
15904c70ab16STroy Lee 
159166c895b8SJamin Lin static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc,
159266c895b8SJamin Lin                                                           void *data)
159366c895b8SJamin Lin {
159466c895b8SJamin Lin     MachineClass *mc = MACHINE_CLASS(oc);
159566c895b8SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
159666c895b8SJamin Lin 
159766c895b8SJamin Lin     mc->desc = "Aspeed AST1030 MiniBMC (Cortex-M4)";
159866c895b8SJamin Lin     amc->soc_name = "ast1030-a1";
159966c895b8SJamin Lin     amc->hw_strap1 = 0;
160066c895b8SJamin Lin     amc->hw_strap2 = 0;
160166c895b8SJamin Lin     mc->init = aspeed_minibmc_machine_init;
16024c70ab16STroy Lee     amc->i2c_init = ast1030_evb_i2c_init;
160366c895b8SJamin Lin     mc->default_ram_size = 0;
160466c895b8SJamin Lin     amc->fmc_model = "sst25vf032b";
160566c895b8SJamin Lin     amc->spi_model = "sst25vf032b";
160666c895b8SJamin Lin     amc->num_cs = 2;
160766c895b8SJamin Lin     amc->macs_mask = 0;
160843a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
160966c895b8SJamin Lin }
161066c895b8SJamin Lin 
161192707992SJamin Lin #ifdef TARGET_AARCH64
161292707992SJamin Lin static void aspeed_machine_ast2700_evb_class_init(ObjectClass *oc, void *data)
161392707992SJamin Lin {
161492707992SJamin Lin     MachineClass *mc = MACHINE_CLASS(oc);
161592707992SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
161692707992SJamin Lin 
161792707992SJamin Lin     mc->desc = "Aspeed AST2700 EVB (Cortex-A35)";
161892707992SJamin Lin     amc->soc_name  = "ast2700-a0";
161992707992SJamin Lin     amc->hw_strap1 = AST2700_EVB_HW_STRAP1;
162092707992SJamin Lin     amc->hw_strap2 = AST2700_EVB_HW_STRAP2;
162192707992SJamin Lin     amc->fmc_model = "w25q01jvq";
162292707992SJamin Lin     amc->spi_model = "w25q512jv";
162392707992SJamin Lin     amc->num_cs    = 2;
162492707992SJamin Lin     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON;
162592707992SJamin Lin     amc->uart_default = ASPEED_DEV_UART12;
162692707992SJamin Lin     mc->default_ram_size = 1 * GiB;
162792707992SJamin Lin     aspeed_machine_class_init_cpus_defaults(mc);
162892707992SJamin Lin }
162992707992SJamin Lin #endif
163092707992SJamin Lin 
1631fb6b3c8dSJae Hyun Yoo static void aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass *oc,
1632fb6b3c8dSJae Hyun Yoo                                                      void *data)
1633fb6b3c8dSJae Hyun Yoo {
1634fb6b3c8dSJae Hyun Yoo     MachineClass *mc = MACHINE_CLASS(oc);
1635fb6b3c8dSJae Hyun Yoo     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1636fb6b3c8dSJae Hyun Yoo 
1637fb6b3c8dSJae Hyun Yoo     mc->desc       = "Qualcomm DC-SCM V1 BMC (Cortex A7)";
1638fb6b3c8dSJae Hyun Yoo     amc->soc_name  = "ast2600-a3";
1639fb6b3c8dSJae Hyun Yoo     amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1640fb6b3c8dSJae Hyun Yoo     amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1641fb6b3c8dSJae Hyun Yoo     amc->fmc_model = "n25q512a";
1642fb6b3c8dSJae Hyun Yoo     amc->spi_model = "n25q512a";
1643fb6b3c8dSJae Hyun Yoo     amc->num_cs    = 2;
1644fb6b3c8dSJae Hyun Yoo     amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1645fb6b3c8dSJae Hyun Yoo     amc->i2c_init  = qcom_dc_scm_bmc_i2c_init;
1646fb6b3c8dSJae Hyun Yoo     mc->default_ram_size = 1 * GiB;
164743a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1648fb6b3c8dSJae Hyun Yoo };
1649fb6b3c8dSJae Hyun Yoo 
1650ece4cccdSGraeme Gregory static void aspeed_machine_qcom_firework_class_init(ObjectClass *oc,
1651ece4cccdSGraeme Gregory                                                     void *data)
1652ece4cccdSGraeme Gregory {
1653ece4cccdSGraeme Gregory     MachineClass *mc = MACHINE_CLASS(oc);
1654ece4cccdSGraeme Gregory     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1655ece4cccdSGraeme Gregory 
1656ece4cccdSGraeme Gregory     mc->desc       = "Qualcomm DC-SCM V1/Firework BMC (Cortex A7)";
1657ece4cccdSGraeme Gregory     amc->soc_name  = "ast2600-a3";
1658ece4cccdSGraeme Gregory     amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1659ece4cccdSGraeme Gregory     amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1660ece4cccdSGraeme Gregory     amc->fmc_model = "n25q512a";
1661ece4cccdSGraeme Gregory     amc->spi_model = "n25q512a";
1662ece4cccdSGraeme Gregory     amc->num_cs    = 2;
1663ece4cccdSGraeme Gregory     amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1664ece4cccdSGraeme Gregory     amc->i2c_init  = qcom_dc_scm_firework_i2c_init;
1665ece4cccdSGraeme Gregory     mc->default_ram_size = 1 * GiB;
166643a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1667ece4cccdSGraeme Gregory };
1668ece4cccdSGraeme Gregory 
1669baa4732bSCédric Le Goater static const TypeInfo aspeed_machine_types[] = {
1670baa4732bSCédric Le Goater     {
1671baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("palmetto-bmc"),
1672baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1673baa4732bSCédric Le Goater         .class_init    = aspeed_machine_palmetto_class_init,
1674baa4732bSCédric Le Goater     }, {
167540a38df5SErik Smit         .name          = MACHINE_TYPE_NAME("supermicrox11-bmc"),
167640a38df5SErik Smit         .parent        = TYPE_ASPEED_MACHINE,
167740a38df5SErik Smit         .class_init    = aspeed_machine_supermicrox11_bmc_class_init,
167840a38df5SErik Smit     }, {
167947936597SGuenter Roeck         .name          = MACHINE_TYPE_NAME("supermicro-x11spi-bmc"),
168047936597SGuenter Roeck         .parent        = TYPE_ASPEED_MACHINE,
168147936597SGuenter Roeck         .class_init    = aspeed_machine_supermicro_x11spi_bmc_class_init,
168247936597SGuenter Roeck     }, {
1683baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2500-evb"),
1684baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1685baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2500_evb_class_init,
1686baa4732bSCédric Le Goater     }, {
1687baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("romulus-bmc"),
1688baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1689baa4732bSCédric Le Goater         .class_init    = aspeed_machine_romulus_class_init,
1690baa4732bSCédric Le Goater     }, {
1691143b040fSPatrick Williams         .name          = MACHINE_TYPE_NAME("sonorapass-bmc"),
1692143b040fSPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1693143b040fSPatrick Williams         .class_init    = aspeed_machine_sonorapass_class_init,
1694143b040fSPatrick Williams     }, {
1695baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("witherspoon-bmc"),
1696baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1697baa4732bSCédric Le Goater         .class_init    = aspeed_machine_witherspoon_class_init,
1698baa4732bSCédric Le Goater     }, {
1699baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2600-evb"),
1700baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1701baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2600_evb_class_init,
1702baa4732bSCédric Le Goater     }, {
170334f73a81SKarthikeyan Pasupathi         .name          = MACHINE_TYPE_NAME("yosemitev2-bmc"),
170434f73a81SKarthikeyan Pasupathi         .parent        = TYPE_ASPEED_MACHINE,
170534f73a81SKarthikeyan Pasupathi         .class_init    = aspeed_machine_yosemitev2_class_init,
170634f73a81SKarthikeyan Pasupathi     }, {
170763ceb818SCédric Le Goater         .name          = MACHINE_TYPE_NAME("tacoma-bmc"),
170863ceb818SCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
170963ceb818SCédric Le Goater         .class_init    = aspeed_machine_tacoma_class_init,
171063ceb818SCédric Le Goater     }, {
17116c323abaSKarthikeyan Pasupathi         .name          = MACHINE_TYPE_NAME("tiogapass-bmc"),
17126c323abaSKarthikeyan Pasupathi         .parent        = TYPE_ASPEED_MACHINE,
17136c323abaSKarthikeyan Pasupathi         .class_init    = aspeed_machine_tiogapass_class_init,
17146c323abaSKarthikeyan Pasupathi     }, {
171595f068c8SJohn Wang         .name          = MACHINE_TYPE_NAME("g220a-bmc"),
171695f068c8SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
171795f068c8SJohn Wang         .class_init    = aspeed_machine_g220a_class_init,
171895f068c8SJohn Wang     }, {
1719fb6b3c8dSJae Hyun Yoo         .name          = MACHINE_TYPE_NAME("qcom-dc-scm-v1-bmc"),
1720fb6b3c8dSJae Hyun Yoo         .parent        = TYPE_ASPEED_MACHINE,
1721fb6b3c8dSJae Hyun Yoo         .class_init    = aspeed_machine_qcom_dc_scm_v1_class_init,
1722fb6b3c8dSJae Hyun Yoo     }, {
1723ece4cccdSGraeme Gregory         .name          = MACHINE_TYPE_NAME("qcom-firework-bmc"),
1724ece4cccdSGraeme Gregory         .parent        = TYPE_ASPEED_MACHINE,
1725ece4cccdSGraeme Gregory         .class_init    = aspeed_machine_qcom_firework_class_init,
1726ece4cccdSGraeme Gregory     }, {
172782b6a3f6SJohn Wang         .name          = MACHINE_TYPE_NAME("fp5280g2-bmc"),
172882b6a3f6SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
172982b6a3f6SJohn Wang         .class_init    = aspeed_machine_fp5280g2_class_init,
173082b6a3f6SJohn Wang     }, {
17319cccb912SPatrick Venture         .name          = MACHINE_TYPE_NAME("quanta-q71l-bmc"),
17329cccb912SPatrick Venture         .parent        = TYPE_ASPEED_MACHINE,
17339cccb912SPatrick Venture         .class_init    = aspeed_machine_quanta_q71l_class_init,
17349cccb912SPatrick Venture     }, {
173558e52bdbSCédric Le Goater         .name          = MACHINE_TYPE_NAME("rainier-bmc"),
173658e52bdbSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
173758e52bdbSCédric Le Goater         .class_init    = aspeed_machine_rainier_class_init,
173858e52bdbSCédric Le Goater     }, {
1739febbe308SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fuji-bmc"),
1740febbe308SPeter Delevoryas         .parent        = TYPE_ASPEED_MACHINE,
1741febbe308SPeter Delevoryas         .class_init    = aspeed_machine_fuji_class_init,
1742febbe308SPeter Delevoryas     }, {
1743a20c54b1SPatrick Williams         .name          = MACHINE_TYPE_NAME("bletchley-bmc"),
1744a20c54b1SPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1745a20c54b1SPatrick Williams         .class_init    = aspeed_machine_bletchley_class_init,
1746a20c54b1SPatrick Williams     }, {
1747fa699e80SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fby35-bmc"),
1748fa699e80SPeter Delevoryas         .parent        = MACHINE_TYPE_NAME("ast2600-evb"),
1749fa699e80SPeter Delevoryas         .class_init    = aspeed_machine_fby35_class_init,
1750fa699e80SPeter Delevoryas     }, {
175166c895b8SJamin Lin         .name           = MACHINE_TYPE_NAME("ast1030-evb"),
175266c895b8SJamin Lin         .parent         = TYPE_ASPEED_MACHINE,
175366c895b8SJamin Lin         .class_init     = aspeed_minibmc_machine_ast1030_evb_class_init,
175492707992SJamin Lin #ifdef TARGET_AARCH64
175592707992SJamin Lin     }, {
175692707992SJamin Lin         .name          = MACHINE_TYPE_NAME("ast2700-evb"),
175792707992SJamin Lin         .parent        = TYPE_ASPEED_MACHINE,
175892707992SJamin Lin         .class_init    = aspeed_machine_ast2700_evb_class_init,
175992707992SJamin Lin #endif
176066c895b8SJamin Lin     }, {
1761fca9ca1bSCédric Le Goater         .name          = TYPE_ASPEED_MACHINE,
176262c2c2ebSCédric Le Goater         .parent        = TYPE_MACHINE,
1763888b2b03SPhilippe Mathieu-Daudé         .instance_size = sizeof(AspeedMachineState),
17641a15311aSCédric Le Goater         .instance_init = aspeed_machine_instance_init,
1765fca9ca1bSCédric Le Goater         .class_size    = sizeof(AspeedMachineClass),
1766fca9ca1bSCédric Le Goater         .class_init    = aspeed_machine_class_init,
1767baa4732bSCédric Le Goater         .abstract      = true,
1768baa4732bSCédric Le Goater     }
1769fca9ca1bSCédric Le Goater };
177074fb1f38SCédric Le Goater 
1771baa4732bSCédric Le Goater DEFINE_TYPES(aspeed_machine_types)
1772