xref: /qemu/hw/arm/aspeed.c (revision dddfc771e034887560c30fd2720b7798c04f5642)
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) */
192b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP1 0x00422016
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 
330*dddfc771SCédric Le Goater static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo, bool emmc)
331a29e3e12SAndrew Jeffery {
332a29e3e12SAndrew Jeffery         DeviceState *card;
333a29e3e12SAndrew Jeffery 
334756f739bSPhilippe Mathieu-Daudé         if (!dinfo) {
335756f739bSPhilippe Mathieu-Daudé             return;
336756f739bSPhilippe Mathieu-Daudé         }
337*dddfc771SCédric Le Goater         card = qdev_new(emmc ? TYPE_EMMC : TYPE_SD_CARD);
338934df912SMarkus Armbruster         qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
339a29e3e12SAndrew Jeffery                                 &error_fatal);
3403e80f690SMarkus Armbruster         qdev_realize_and_unref(card,
3413e80f690SMarkus Armbruster                                qdev_get_child_bus(DEVICE(sdhci), "sd-bus"),
3423e80f690SMarkus Armbruster                                &error_fatal);
343a29e3e12SAndrew Jeffery }
344a29e3e12SAndrew Jeffery 
345d2b3eaefSPeter Delevoryas static void connect_serial_hds_to_uarts(AspeedMachineState *bmc)
346d2b3eaefSPeter Delevoryas {
347d2b3eaefSPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
3483c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *s = bmc->soc;
349d2b3eaefSPeter Delevoryas     AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
350f65f6ad5SCédric Le Goater     int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default;
351d2b3eaefSPeter Delevoryas 
352f65f6ad5SCédric Le Goater     aspeed_soc_uart_set_chr(s, uart_chosen, serial_hd(0));
353944128eeSJamin Lin     for (int i = 1, uart = sc->uarts_base; i < sc->uarts_num; i++, uart++) {
354f65f6ad5SCédric Le Goater         if (uart == uart_chosen) {
355d2b3eaefSPeter Delevoryas             continue;
356d2b3eaefSPeter Delevoryas         }
357d2b3eaefSPeter Delevoryas         aspeed_soc_uart_set_chr(s, uart, serial_hd(i));
358d2b3eaefSPeter Delevoryas     }
359d2b3eaefSPeter Delevoryas }
360d2b3eaefSPeter Delevoryas 
361baa4732bSCédric Le Goater static void aspeed_machine_init(MachineState *machine)
362327d8e4eSAndrew Jeffery {
363888b2b03SPhilippe Mathieu-Daudé     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
364baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
365b033271fSCédric Le Goater     AspeedSoCClass *sc;
3662bea128cSEddie James     int i;
367327d8e4eSAndrew Jeffery 
3683c392e87SPhilippe Mathieu-Daudé     bmc->soc = ASPEED_SOC(object_new(amc->soc_name));
3693c392e87SPhilippe Mathieu-Daudé     object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc));
3703c392e87SPhilippe Mathieu-Daudé     object_unref(OBJECT(bmc->soc));
3713c392e87SPhilippe Mathieu-Daudé     sc = ASPEED_SOC_GET_CLASS(bmc->soc);
372b033271fSCédric Le Goater 
373533eb415SIgor Mammedov     /*
374346160cbSCédric Le Goater      * This will error out if the RAM size is not supported by the
375346160cbSCédric Le Goater      * memory controller of the SoC.
376533eb415SIgor Mammedov      */
3773c392e87SPhilippe Mathieu-Daudé     object_property_set_uint(OBJECT(bmc->soc), "ram-size", machine->ram_size,
378533eb415SIgor Mammedov                              &error_fatal);
379533eb415SIgor Mammedov 
380d3bad7e7SCédric Le Goater     for (i = 0; i < sc->macs_num; i++) {
381b3cfec5bSDavid Woodhouse         if ((amc->macs_mask & (1 << i)) &&
382b3cfec5bSDavid Woodhouse             !qemu_configure_nic_device(DEVICE(&bmc->soc->ftgmac100[i]),
383b3cfec5bSDavid Woodhouse                                        true, NULL)) {
384b3cfec5bSDavid Woodhouse             break; /* No configs left; stop asking */
385d3bad7e7SCédric Le Goater         }
386d3bad7e7SCédric Le Goater     }
387d3bad7e7SCédric Le Goater 
3883c392e87SPhilippe Mathieu-Daudé     object_property_set_int(OBJECT(bmc->soc), "hw-strap1", amc->hw_strap1,
38987e79af0SAndrew Jeffery                             &error_abort);
3903c392e87SPhilippe Mathieu-Daudé     object_property_set_int(OBJECT(bmc->soc), "hw-strap2", amc->hw_strap2,
391ccc2c418SCédric Le Goater                             &error_abort);
3923c392e87SPhilippe Mathieu-Daudé     object_property_set_link(OBJECT(bmc->soc), "memory",
3934dd9d554SPeter Delevoryas                              OBJECT(get_system_memory()), &error_abort);
3943c392e87SPhilippe Mathieu-Daudé     object_property_set_link(OBJECT(bmc->soc), "dram",
3950df2d9a6SCédric Le Goater                              OBJECT(machine->ram), &error_abort);
396b6e70d1dSJoel Stanley     if (machine->kernel_filename) {
397b6e70d1dSJoel Stanley         /*
398b6e70d1dSJoel Stanley          * When booting with a -kernel command line there is no u-boot
399b6e70d1dSJoel Stanley          * that runs to unlock the SCU. In this case set the default to
400b6e70d1dSJoel Stanley          * be unlocked as the kernel expects
401b6e70d1dSJoel Stanley          */
4023c392e87SPhilippe Mathieu-Daudé         object_property_set_int(OBJECT(bmc->soc), "hw-prot-key",
4035325cc34SMarkus Armbruster                                 ASPEED_SCU_PROT_KEY, &error_abort);
404b6e70d1dSJoel Stanley     }
405d2b3eaefSPeter Delevoryas     connect_serial_hds_to_uarts(bmc);
4063c392e87SPhilippe Mathieu-Daudé     qdev_realize(DEVICE(bmc->soc), NULL, &error_abort);
407327d8e4eSAndrew Jeffery 
408c7e313aeSCédric Le Goater     if (defaults_enabled()) {
4093c392e87SPhilippe Mathieu-Daudé         aspeed_board_init_flashes(&bmc->soc->fmc,
4108ec239f2SMarkus Armbruster                               bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
4119bd4ac61SCédric Le Goater                               amc->num_cs, 0);
4123c392e87SPhilippe Mathieu-Daudé         aspeed_board_init_flashes(&bmc->soc->spi[0],
4138ec239f2SMarkus Armbruster                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
4149bd4ac61SCédric Le Goater                               1, amc->num_cs);
415c7e313aeSCédric Le Goater     }
416e1ad9bc4SCédric Le Goater 
417b7f1a0cbSCédric Le Goater     if (machine->kernel_filename && sc->num_cpus > 1) {
4189bb6d140SJoel Stanley         /* With no u-boot we must set up a boot stub for the secondary CPU */
4199bb6d140SJoel Stanley         MemoryRegion *smpboot = g_new(MemoryRegion, 1);
420f489960dSPhilippe Mathieu-Daudé         memory_region_init_ram(smpboot, NULL, "aspeed.smpboot",
4219bb6d140SJoel Stanley                                0x80, &error_abort);
4229bb6d140SJoel Stanley         memory_region_add_subregion(get_system_memory(),
4239bb6d140SJoel Stanley                                     AST_SMP_MAILBOX_BASE, smpboot);
4249bb6d140SJoel Stanley 
4259bb6d140SJoel Stanley         aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot;
4269bb6d140SJoel Stanley         aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary;
4279bb6d140SJoel Stanley         aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE;
4289bb6d140SJoel Stanley     }
4299bb6d140SJoel Stanley 
4306e504a98SPaolo Bonzini     aspeed_board_binfo.ram_size = machine->ram_size;
431347df6f8SEduardo Habkost     aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM];
432b033271fSCédric Le Goater 
433baa4732bSCédric Le Goater     if (amc->i2c_init) {
434baa4732bSCédric Le Goater         amc->i2c_init(bmc);
4352cf6cb50SCédric Le Goater     }
4362cf6cb50SCédric Le Goater 
4373c392e87SPhilippe Mathieu-Daudé     for (i = 0; i < bmc->soc->sdhci.num_slots; i++) {
4383c392e87SPhilippe Mathieu-Daudé         sdhci_attach_drive(&bmc->soc->sdhci.slots[i],
439*dddfc771SCédric Le Goater                            drive_get(IF_SD, 0, i), false);
440a29e3e12SAndrew Jeffery     }
4412bea128cSEddie James 
4423c392e87SPhilippe Mathieu-Daudé     if (bmc->soc->emmc.num_slots) {
4433c392e87SPhilippe Mathieu-Daudé         sdhci_attach_drive(&bmc->soc->emmc.slots[0],
444*dddfc771SCédric Le Goater                            drive_get(IF_SD, 0, bmc->soc->sdhci.num_slots),
445*dddfc771SCédric Le Goater                            true);
4462bea128cSEddie James     }
4472bea128cSEddie James 
4488b744a6aSCédric Le Goater     if (!bmc->mmio_exec) {
4493c392e87SPhilippe Mathieu-Daudé         DeviceState *dev = ssi_get_cs(bmc->soc->fmc.spi, 0);
4508285490bSCédric Le Goater         BlockBackend *fmc0 = dev ? m25p80_get_blk(dev) : NULL;
4518b744a6aSCédric Le Goater 
4528285490bSCédric Le Goater         if (fmc0) {
4533c392e87SPhilippe Mathieu-Daudé             uint64_t rom_size = memory_region_size(&bmc->soc->spi_boot);
4548285490bSCédric Le Goater             aspeed_install_boot_rom(bmc, fmc0, rom_size);
4558b744a6aSCédric Le Goater         }
4568b744a6aSCédric Le Goater     }
4578b744a6aSCédric Le Goater 
4582744ece8STao Xu     arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo);
459327d8e4eSAndrew Jeffery }
460327d8e4eSAndrew Jeffery 
461612b219aSPhilippe Mathieu-Daudé static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
4622cf6cb50SCédric Le Goater {
4633c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
464a87e81b9SCédric Le Goater     DeviceState *dev;
4653d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
4662cf6cb50SCédric Le Goater 
4672cf6cb50SCédric Le Goater     /* The palmetto platform expects a ds3231 RTC but a ds1338 is
4682cf6cb50SCédric Le Goater      * enough to provide basic RTC features. Alarms will be missing */
4691373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
470a87e81b9SCédric Le Goater 
4717a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
4723d165f12SCédric Le Goater                           eeprom_buf);
4733d165f12SCédric Le Goater 
474a87e81b9SCédric Le Goater     /* add a TMP423 temperature sensor */
4751373b15bSPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
4761373b15bSPhilippe Mathieu-Daudé                                          "tmp423", 0x4c));
4775325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
4785325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
4795325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
4805325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort);
4812cf6cb50SCédric Le Goater }
4822cf6cb50SCédric Le Goater 
4839cccb912SPatrick Venture static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc)
4849cccb912SPatrick Venture {
4853c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
4869cccb912SPatrick Venture 
4879cccb912SPatrick Venture     /*
4889cccb912SPatrick Venture      * The quanta-q71l platform expects tmp75s which are compatible with
4899cccb912SPatrick Venture      * tmp105s.
4909cccb912SPatrick Venture      */
4919cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c);
4929cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e);
4939cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f);
4949cccb912SPatrick Venture 
4959cccb912SPatrick Venture     /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */
4969cccb912SPatrick Venture     /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */
4979cccb912SPatrick Venture     /* TODO: Add Memory Riser i2c mux and eeproms. */
4989cccb912SPatrick Venture 
4993ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74);
5003ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77);
5013ec75e39SPatrick Venture 
5029cccb912SPatrick Venture     /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */
5033ec75e39SPatrick Venture 
5043ec75e39SPatrick Venture     /* i2c-7 */
5053ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70);
5069cccb912SPatrick Venture     /*        - i2c@0: pmbus@59 */
5079cccb912SPatrick Venture     /*        - i2c@1: pmbus@58 */
5089cccb912SPatrick Venture     /*        - i2c@2: pmbus@58 */
5099cccb912SPatrick Venture     /*        - i2c@3: pmbus@59 */
5103ec75e39SPatrick Venture 
5119cccb912SPatrick Venture     /* TODO: i2c-7: Add PDB FRU eeprom@52 */
5129cccb912SPatrick Venture     /* TODO: i2c-8: Add BMC FRU eeprom@50 */
5139cccb912SPatrick Venture }
5149cccb912SPatrick Venture 
515612b219aSPhilippe Mathieu-Daudé static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
5162cf6cb50SCédric Le Goater {
5173c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
5183d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
5193d165f12SCédric Le Goater 
5207a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50,
5213d165f12SCédric Le Goater                           eeprom_buf);
5222cf6cb50SCédric Le Goater 
5232cf6cb50SCédric Le Goater     /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
5241373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
525044475f3SPhilippe Mathieu-Daudé                      TYPE_TMP105, 0x4d);
5262cf6cb50SCédric Le Goater }
5272cf6cb50SCédric Le Goater 
528612b219aSPhilippe Mathieu-Daudé static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
529ccc2c418SCédric Le Goater {
5303c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
53152bcd997SHoward Chiu     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
53252bcd997SHoward Chiu 
53352bcd997SHoward Chiu     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50,
53452bcd997SHoward Chiu                           eeprom_buf);
53552bcd997SHoward Chiu 
53652bcd997SHoward Chiu     /* LM75 is compatible with TMP105 driver */
53752bcd997SHoward Chiu     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
53852bcd997SHoward Chiu                      TYPE_TMP105, 0x4d);
539ccc2c418SCédric Le Goater }
540ccc2c418SCédric Le Goater 
54134f73a81SKarthikeyan Pasupathi static void yosemitev2_bmc_i2c_init(AspeedMachineState *bmc)
54234f73a81SKarthikeyan Pasupathi {
5433c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
54434f73a81SKarthikeyan Pasupathi 
54534f73a81SKarthikeyan Pasupathi     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x51, 128 * KiB);
54634f73a81SKarthikeyan Pasupathi     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 128 * KiB,
54734f73a81SKarthikeyan Pasupathi                           yosemitev2_bmc_fruid, yosemitev2_bmc_fruid_len);
5480a1f86baSKarthikeyan Pasupathi     /* TMP421 */
5490a1f86baSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "tmp421", 0x1f);
5500a1f86baSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4e);
5510a1f86baSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4f);
5520a1f86baSKarthikeyan Pasupathi 
55334f73a81SKarthikeyan Pasupathi }
55434f73a81SKarthikeyan Pasupathi 
555612b219aSPhilippe Mathieu-Daudé static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
5566c4567c7SCédric Le Goater {
5573c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
5586c4567c7SCédric Le Goater 
5596c4567c7SCédric Le Goater     /* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
5606c4567c7SCédric Le Goater      * good enough */
5611373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
5626c4567c7SCédric Le Goater }
5636c4567c7SCédric Le Goater 
5646c323abaSKarthikeyan Pasupathi static void tiogapass_bmc_i2c_init(AspeedMachineState *bmc)
5656c323abaSKarthikeyan Pasupathi {
5663c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
5676c323abaSKarthikeyan Pasupathi 
5686c323abaSKarthikeyan Pasupathi     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 128 * KiB);
5696c323abaSKarthikeyan Pasupathi     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 6), 0x54, 128 * KiB,
5706c323abaSKarthikeyan Pasupathi                           tiogapass_bmc_fruid, tiogapass_bmc_fruid_len);
571a09d357dSKarthikeyan Pasupathi     /* TMP421 */
572a09d357dSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "tmp421", 0x1f);
573a09d357dSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4f);
574a09d357dSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4e);
5756c323abaSKarthikeyan Pasupathi }
5766c323abaSKarthikeyan Pasupathi 
577f4aec252SCédric Le Goater static void create_pca9552(AspeedSoCState *soc, int bus_id, int addr)
578f4aec252SCédric Le Goater {
579f4aec252SCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, bus_id),
580f4aec252SCédric Le Goater                             TYPE_PCA9552, addr);
581f4aec252SCédric Le Goater }
582f4aec252SCédric Le Goater 
583612b219aSPhilippe Mathieu-Daudé static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc)
584143b040fSPatrick Williams {
5853c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
586143b040fSPatrick Williams 
587143b040fSPatrick Williams     /* bus 2 : */
5881373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48);
5891373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49);
590143b040fSPatrick Williams     /* bus 2 : pca9546 @ 0x73 */
591143b040fSPatrick Williams 
592143b040fSPatrick Williams     /* bus 3 : pca9548 @ 0x70 */
593143b040fSPatrick Williams 
594143b040fSPatrick Williams     /* bus 4 : */
595143b040fSPatrick Williams     uint8_t *eeprom4_54 = g_malloc0(8 * 1024);
5967a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54,
597143b040fSPatrick Williams                           eeprom4_54);
598143b040fSPatrick Williams     /* PCA9539 @ 0x76, but PCA9552 is compatible */
599f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x76);
600143b040fSPatrick Williams     /* PCA9539 @ 0x77, but PCA9552 is compatible */
601f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x77);
602143b040fSPatrick Williams 
603143b040fSPatrick Williams     /* bus 6 : */
6041373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48);
6051373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49);
606143b040fSPatrick Williams     /* bus 6 : pca9546 @ 0x73 */
607143b040fSPatrick Williams 
608143b040fSPatrick Williams     /* bus 8 : */
609143b040fSPatrick Williams     uint8_t *eeprom8_56 = g_malloc0(8 * 1024);
6107a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56,
611143b040fSPatrick Williams                           eeprom8_56);
612f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x60);
613f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x61);
614143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1d */
615143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1f */
616143b040fSPatrick Williams 
617143b040fSPatrick Williams     /*
618143b040fSPatrick Williams      * bus 13 : pca9548 @ 0x71
619143b040fSPatrick Williams      *      - channel 3:
620143b040fSPatrick Williams      *          - tmm421 @ 0x4c
621143b040fSPatrick Williams      *          - tmp421 @ 0x4e
622143b040fSPatrick Williams      *          - tmp421 @ 0x4f
623143b040fSPatrick Williams      */
624143b040fSPatrick Williams 
625143b040fSPatrick Williams }
626143b040fSPatrick Williams 
627612b219aSPhilippe Mathieu-Daudé static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
62862c2c2ebSCédric Le Goater {
6297cfbde5eSPhilippe Mathieu-Daudé     static const struct {
6307cfbde5eSPhilippe Mathieu-Daudé         unsigned gpio_id;
6317cfbde5eSPhilippe Mathieu-Daudé         LEDColor color;
6327cfbde5eSPhilippe Mathieu-Daudé         const char *description;
6337cfbde5eSPhilippe Mathieu-Daudé         bool gpio_polarity;
6347cfbde5eSPhilippe Mathieu-Daudé     } pca1_leds[] = {
6357cfbde5eSPhilippe Mathieu-Daudé         {13, LED_COLOR_GREEN, "front-fault-4",  GPIO_POLARITY_ACTIVE_LOW},
6367cfbde5eSPhilippe Mathieu-Daudé         {14, LED_COLOR_GREEN, "front-power-3",  GPIO_POLARITY_ACTIVE_LOW},
6377cfbde5eSPhilippe Mathieu-Daudé         {15, LED_COLOR_GREEN, "front-id-5",     GPIO_POLARITY_ACTIVE_LOW},
6387cfbde5eSPhilippe Mathieu-Daudé     };
6393c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
6403d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
64115ce12cfSPhilippe Mathieu-Daudé     DeviceState *dev;
6427cfbde5eSPhilippe Mathieu-Daudé     LEDState *led;
64362c2c2ebSCédric Le Goater 
64463ceb818SCédric Le Goater     /* Bus 3: TODO bmp280@77 */
645db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
64615ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca1");
6472616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
6482616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 3),
64915ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
6508c9a61d7SCédric Le Goater 
6517cfbde5eSPhilippe Mathieu-Daudé     for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) {
6527cfbde5eSPhilippe Mathieu-Daudé         led = led_create_simple(OBJECT(bmc),
6537cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].gpio_polarity,
6547cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].color,
6557cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].description);
6567cfbde5eSPhilippe Mathieu-Daudé         qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id,
6577cfbde5eSPhilippe Mathieu-Daudé                               qdev_get_gpio_in(DEVICE(led), 0));
6587cfbde5eSPhilippe Mathieu-Daudé     }
659b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76);
6602a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "max31785", 0x52);
6611373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c);
6621373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c);
66362c2c2ebSCédric Le Goater 
66462c2c2ebSCédric Le Goater     /* The Witherspoon expects a TMP275 but a TMP105 is compatible */
6651373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105,
666044475f3SPhilippe Mathieu-Daudé                      0x4a);
6676c4567c7SCédric Le Goater 
6686c4567c7SCédric Le Goater     /* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
6696c4567c7SCédric Le Goater      * good enough */
6701373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
6713d165f12SCédric Le Goater 
6727a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51,
6733d165f12SCédric Le Goater                           eeprom_buf);
674db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
67515ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca0");
6762616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
6772616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 11),
67815ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
67963ceb818SCédric Le Goater     /* Bus 11: TODO ucd90160@64 */
68062c2c2ebSCédric Le Goater }
68162c2c2ebSCédric Le Goater 
68295f068c8SJohn Wang static void g220a_bmc_i2c_init(AspeedMachineState *bmc)
68395f068c8SJohn Wang {
6843c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
68595f068c8SJohn Wang     DeviceState *dev;
68695f068c8SJohn Wang 
68795f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3),
68895f068c8SJohn Wang                                          "emc1413", 0x4c));
68995f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
69095f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
69195f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
69295f068c8SJohn Wang 
69395f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12),
69495f068c8SJohn Wang                                          "emc1413", 0x4c));
69595f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
69695f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
69795f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
69895f068c8SJohn Wang 
69995f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13),
70095f068c8SJohn Wang                                          "emc1413", 0x4c));
70195f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
70295f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
70395f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
7046f5f6507SJohn Wang 
7056f5f6507SJohn Wang     static uint8_t eeprom_buf[2 * 1024] = {
7066f5f6507SJohn Wang             0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe,
7076f5f6507SJohn Wang             0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65,
7086f5f6507SJohn Wang             0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32,
7096f5f6507SJohn Wang             0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42,
7106f5f6507SJohn Wang             0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45,
7116f5f6507SJohn Wang             0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1,
7126f5f6507SJohn Wang             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7,
7136f5f6507SJohn Wang     };
7146f5f6507SJohn Wang     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57,
7156f5f6507SJohn Wang                           eeprom_buf);
71695f068c8SJohn Wang }
71795f068c8SJohn Wang 
71882b6a3f6SJohn Wang static void fp5280g2_bmc_i2c_init(AspeedMachineState *bmc)
71982b6a3f6SJohn Wang {
7203c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
72182b6a3f6SJohn Wang     I2CSlave *i2c_mux;
72282b6a3f6SJohn Wang 
72382b6a3f6SJohn Wang     /* The at24c256 */
72482b6a3f6SJohn Wang     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 1), 0x50, 32768);
72582b6a3f6SJohn Wang 
72682b6a3f6SJohn Wang     /* The fp5280g2 expects a TMP112 but a TMP105 is compatible */
72782b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
72882b6a3f6SJohn Wang                      0x48);
72982b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
73082b6a3f6SJohn Wang                      0x49);
73182b6a3f6SJohn Wang 
73282b6a3f6SJohn Wang     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
73382b6a3f6SJohn Wang                      "pca9546", 0x70);
73482b6a3f6SJohn Wang     /* It expects a TMP112 but a TMP105 is compatible */
73582b6a3f6SJohn Wang     i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0), TYPE_TMP105,
73682b6a3f6SJohn Wang                      0x4a);
73782b6a3f6SJohn Wang 
73882b6a3f6SJohn Wang     /* It expects a ds3232 but a ds1338 is good enough */
73982b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "ds1338", 0x68);
74082b6a3f6SJohn Wang 
74182b6a3f6SJohn Wang     /* It expects a pca9555 but a pca9552 is compatible */
742f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x30);
74382b6a3f6SJohn Wang }
74482b6a3f6SJohn Wang 
74558e52bdbSCédric Le Goater static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
74658e52bdbSCédric Le Goater {
7473c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
748fa6d98c0SJoel Stanley     I2CSlave *i2c_mux;
749fa6d98c0SJoel Stanley 
7509077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB);
75158e52bdbSCédric Le Goater 
752f4aec252SCédric Le Goater     create_pca9552(soc, 3, 0x61);
753bcb122f8SJoel Stanley 
75458e52bdbSCédric Le Goater     /* The rainier expects a TMP275 but a TMP105 is compatible */
75558e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
75658e52bdbSCédric Le Goater                      0x48);
75758e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
75858e52bdbSCédric Le Goater                      0x49);
75958e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
76058e52bdbSCédric Le Goater                      0x4a);
761fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4),
762fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
7639077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
7649077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
7659077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB);
766f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x60);
76758e52bdbSCédric Le Goater 
76858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
76958e52bdbSCédric Le Goater                      0x48);
77058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
77158e52bdbSCédric Le Goater                      0x49);
772f4aec252SCédric Le Goater     create_pca9552(soc, 5, 0x60);
773f4aec252SCédric Le Goater     create_pca9552(soc, 5, 0x61);
774fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5),
775fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
7769077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
7779077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
77858e52bdbSCédric Le Goater 
77958e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
78058e52bdbSCédric Le Goater                      0x48);
78158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
78258e52bdbSCédric Le Goater                      0x4a);
78358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
78458e52bdbSCédric Le Goater                      0x4b);
785fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6),
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);
7899077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB);
7909077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB);
79158e52bdbSCédric Le Goater 
792f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x30);
793f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x31);
794f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x32);
795f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x33);
796f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x60);
797f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x61);
798b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76);
79958e52bdbSCédric Le Goater     /* Bus 7: TODO si7021-a20@20 */
80058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105,
80158e52bdbSCédric Le Goater                      0x48);
8022a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "max31785", 0x52);
8039077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB);
8049077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB);
80558e52bdbSCédric Le Goater 
80658e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
80758e52bdbSCédric Le Goater                      0x48);
80858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
80958e52bdbSCédric Le Goater                      0x4a);
810be85508fSNinad Palsule     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50,
811be85508fSNinad Palsule                           64 * KiB, rainier_bb_fruid, rainier_bb_fruid_len);
812be85508fSNinad Palsule     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51,
813be85508fSNinad Palsule                           64 * KiB, rainier_bmc_fruid, rainier_bmc_fruid_len);
814f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x60);
815f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x61);
81658e52bdbSCédric Le Goater     /* Bus 8: ucd90320@11 */
81758e52bdbSCédric Le Goater     /* Bus 8: ucd90320@b */
81858e52bdbSCédric Le Goater     /* Bus 8: ucd90320@c */
81958e52bdbSCédric Le Goater 
82058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c);
82158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d);
8229077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB);
82358e52bdbSCédric Le Goater 
82458e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c);
82558e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d);
8269077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB);
82758e52bdbSCédric Le Goater 
82858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
82958e52bdbSCédric Le Goater                      0x48);
83058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
83158e52bdbSCédric Le Goater                      0x49);
832fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11),
833fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
8349077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
8359077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
836f4aec252SCédric Le Goater     create_pca9552(soc, 11, 0x60);
837fa6d98c0SJoel Stanley 
838fa6d98c0SJoel Stanley 
8399077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB);
840f4aec252SCédric Le Goater     create_pca9552(soc, 13, 0x60);
841fa6d98c0SJoel Stanley 
8429077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB);
843f4aec252SCédric Le Goater     create_pca9552(soc, 14, 0x60);
844fa6d98c0SJoel Stanley 
8459077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB);
846f4aec252SCédric Le Goater     create_pca9552(soc, 15, 0x60);
84758e52bdbSCédric Le Goater }
84858e52bdbSCédric Le Goater 
849febbe308SPeter Delevoryas static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr,
850febbe308SPeter Delevoryas                                  I2CBus **channels)
851febbe308SPeter Delevoryas {
852febbe308SPeter Delevoryas     I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr);
853febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
854febbe308SPeter Delevoryas         channels[i] = pca954x_i2c_get_bus(mux, i);
855febbe308SPeter Delevoryas     }
856febbe308SPeter Delevoryas }
857febbe308SPeter Delevoryas 
858febbe308SPeter Delevoryas #define TYPE_LM75 TYPE_TMP105
859febbe308SPeter Delevoryas #define TYPE_TMP75 TYPE_TMP105
860febbe308SPeter Delevoryas #define TYPE_TMP422 "tmp422"
861febbe308SPeter Delevoryas 
862febbe308SPeter Delevoryas static void fuji_bmc_i2c_init(AspeedMachineState *bmc)
863febbe308SPeter Delevoryas {
8643c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
865febbe308SPeter Delevoryas     I2CBus *i2c[144] = {};
866febbe308SPeter Delevoryas 
867febbe308SPeter Delevoryas     for (int i = 0; i < 16; i++) {
868febbe308SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
869febbe308SPeter Delevoryas     }
870febbe308SPeter Delevoryas     I2CBus *i2c180 = i2c[2];
871febbe308SPeter Delevoryas     I2CBus *i2c480 = i2c[8];
872febbe308SPeter Delevoryas     I2CBus *i2c600 = i2c[11];
873febbe308SPeter Delevoryas 
874febbe308SPeter Delevoryas     get_pca9548_channels(i2c180, 0x70, &i2c[16]);
875febbe308SPeter Delevoryas     get_pca9548_channels(i2c480, 0x70, &i2c[24]);
876febbe308SPeter Delevoryas     /* NOTE: The device tree skips [32, 40) in the alias numbering */
877febbe308SPeter Delevoryas     get_pca9548_channels(i2c600, 0x77, &i2c[40]);
878febbe308SPeter Delevoryas     get_pca9548_channels(i2c[24], 0x71, &i2c[48]);
879febbe308SPeter Delevoryas     get_pca9548_channels(i2c[25], 0x72, &i2c[56]);
880febbe308SPeter Delevoryas     get_pca9548_channels(i2c[26], 0x76, &i2c[64]);
881febbe308SPeter Delevoryas     get_pca9548_channels(i2c[27], 0x76, &i2c[72]);
882febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
883febbe308SPeter Delevoryas         get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]);
884febbe308SPeter Delevoryas     }
885febbe308SPeter Delevoryas 
886febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c);
887febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d);
888febbe308SPeter Delevoryas 
889ef0eb67eSSittisak Sinprem     /*
890ef0eb67eSSittisak Sinprem      * EEPROM 24c64 size is 64Kbits or 8 Kbytes
891ef0eb67eSSittisak Sinprem      *        24c02 size is 2Kbits or 256 bytes
892ef0eb67eSSittisak Sinprem      */
893ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[19], 0x52, 8 * KiB);
894ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[20], 0x50, 256);
895ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[22], 0x52, 256);
896febbe308SPeter Delevoryas 
897febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x48);
898febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x49);
899febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x4a);
900febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_TMP422, 0x4c);
901febbe308SPeter Delevoryas 
902ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[8], 0x51, 8 * KiB);
903febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a);
904febbe308SPeter Delevoryas 
905febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[50], TYPE_LM75, 0x4c);
906ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[50], 0x52, 8 * KiB);
907febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[51], TYPE_TMP75, 0x48);
908febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[52], TYPE_TMP75, 0x49);
909febbe308SPeter Delevoryas 
910febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[59], TYPE_TMP75, 0x48);
911febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[60], TYPE_TMP75, 0x49);
912febbe308SPeter Delevoryas 
913ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[65], 0x53, 8 * KiB);
914febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x49);
915febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x48);
916ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[68], 0x52, 8 * KiB);
917ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[69], 0x52, 8 * KiB);
918ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[70], 0x52, 8 * KiB);
919ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[71], 0x52, 8 * KiB);
920febbe308SPeter Delevoryas 
921ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[73], 0x53, 8 * KiB);
922febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x49);
923febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x48);
924ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[76], 0x52, 8 * KiB);
925ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[77], 0x52, 8 * KiB);
926ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[78], 0x52, 8 * KiB);
927ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[79], 0x52, 8 * KiB);
928ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[28], 0x50, 256);
929febbe308SPeter Delevoryas 
930febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
9319077e09aSPeter Delevoryas         at24c_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB);
932febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[82 + i * 8], TYPE_TMP75, 0x48);
933febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[83 + i * 8], TYPE_TMP75, 0x4b);
934febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[84 + i * 8], TYPE_TMP75, 0x4a);
935febbe308SPeter Delevoryas     }
936febbe308SPeter Delevoryas }
937febbe308SPeter Delevoryas 
938a20c54b1SPatrick Williams #define TYPE_TMP421 "tmp421"
939a20c54b1SPatrick Williams 
940a20c54b1SPatrick Williams static void bletchley_bmc_i2c_init(AspeedMachineState *bmc)
941a20c54b1SPatrick Williams {
9423c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
943a20c54b1SPatrick Williams     I2CBus *i2c[13] = {};
944a20c54b1SPatrick Williams     for (int i = 0; i < 13; i++) {
945a20c54b1SPatrick Williams         if ((i == 8) || (i == 11)) {
946a20c54b1SPatrick Williams             continue;
947a20c54b1SPatrick Williams         }
948a20c54b1SPatrick Williams         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
949a20c54b1SPatrick Williams     }
950a20c54b1SPatrick Williams 
951a20c54b1SPatrick Williams     /* Bus 0 - 5 all have the same config. */
952a20c54b1SPatrick Williams     for (int i = 0; i < 6; i++) {
953a20c54b1SPatrick Williams         /* Missing model: ti,ina230 @ 0x45 */
954a20c54b1SPatrick Williams         /* Missing model: mps,mp5023 @ 0x40 */
955a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_TMP421, 0x4f);
956a20c54b1SPatrick Williams         /* Missing model: nxp,pca9539 @ 0x76, but PCA9552 works enough */
957a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x76);
958a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x67);
959a20c54b1SPatrick Williams         /* Missing model: fsc,fusb302 @ 0x22 */
960a20c54b1SPatrick Williams     }
961a20c54b1SPatrick Williams 
962a20c54b1SPatrick Williams     /* Bus 6 */
963a20c54b1SPatrick Williams     at24c_eeprom_init(i2c[6], 0x56, 65536);
964a20c54b1SPatrick Williams     /* Missing model: nxp,pcf85263 @ 0x51 , but ds1338 works enough */
965a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[6], "ds1338", 0x51);
966a20c54b1SPatrick Williams 
967a20c54b1SPatrick Williams 
968a20c54b1SPatrick Williams     /* Bus 7 */
969a20c54b1SPatrick Williams     at24c_eeprom_init(i2c[7], 0x54, 65536);
970a20c54b1SPatrick Williams 
971a20c54b1SPatrick Williams     /* Bus 9 */
972a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[9], TYPE_TMP421, 0x4f);
973a20c54b1SPatrick Williams 
974a20c54b1SPatrick Williams     /* Bus 10 */
975a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[10], TYPE_TMP421, 0x4f);
976a20c54b1SPatrick Williams     /* Missing model: ti,hdc1080 @ 0x40 */
977a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[10], TYPE_PCA9552, 0x67);
978a20c54b1SPatrick Williams 
979a20c54b1SPatrick Williams     /* Bus 12 */
980a20c54b1SPatrick Williams     /* Missing model: adi,adm1278 @ 0x11 */
981a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4c);
982a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4d);
983a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_PCA9552, 0x67);
984a20c54b1SPatrick Williams }
985a20c54b1SPatrick Williams 
986fa699e80SPeter Delevoryas static void fby35_i2c_init(AspeedMachineState *bmc)
987fa699e80SPeter Delevoryas {
9883c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
989fa699e80SPeter Delevoryas     I2CBus *i2c[16];
990fa699e80SPeter Delevoryas 
991fa699e80SPeter Delevoryas     for (int i = 0; i < 16; i++) {
992fa699e80SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
993fa699e80SPeter Delevoryas     }
994fa699e80SPeter Delevoryas 
995fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[2], TYPE_LM75, 0x4f);
996fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_TMP421, 0x1f);
997fa699e80SPeter Delevoryas     /* Hotswap controller is actually supposed to be mp5920 or ltc4282. */
998fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[11], "adm1272", 0x44);
999fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4e);
1000fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4f);
1001fa699e80SPeter Delevoryas 
10029077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[4], 0x51, 128 * KiB);
10039077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[6], 0x51, 128 * KiB);
1004c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[8], 0x50, 32 * KiB, fby35_nic_fruid,
1005c0216b94SPeter Delevoryas                           fby35_nic_fruid_len);
1006c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[11], 0x51, 128 * KiB, fby35_bb_fruid,
1007c0216b94SPeter Delevoryas                           fby35_bb_fruid_len);
1008c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[11], 0x54, 128 * KiB, fby35_bmc_fruid,
1009c0216b94SPeter Delevoryas                           fby35_bmc_fruid_len);
1010fa699e80SPeter Delevoryas 
1011fa699e80SPeter Delevoryas     /*
1012fa699e80SPeter Delevoryas      * TODO: There is a multi-master i2c connection to an AST1030 MiniBMC on
1013fa699e80SPeter Delevoryas      * buses 0, 1, 2, 3, and 9. Source address 0x10, target address 0x20 on
1014fa699e80SPeter Delevoryas      * each.
1015fa699e80SPeter Delevoryas      */
1016fa699e80SPeter Delevoryas }
1017fa699e80SPeter Delevoryas 
1018fb6b3c8dSJae Hyun Yoo static void qcom_dc_scm_bmc_i2c_init(AspeedMachineState *bmc)
1019fb6b3c8dSJae Hyun Yoo {
10203c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
1021fb6b3c8dSJae Hyun Yoo 
1022fb6b3c8dSJae Hyun Yoo     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 15), "tmp105", 0x4d);
1023fb6b3c8dSJae Hyun Yoo }
1024fb6b3c8dSJae Hyun Yoo 
1025ece4cccdSGraeme Gregory static void qcom_dc_scm_firework_i2c_init(AspeedMachineState *bmc)
1026ece4cccdSGraeme Gregory {
10273c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
10282a7a5d5cSJae Hyun Yoo     I2CSlave *therm_mux, *cpuvr_mux;
1029ece4cccdSGraeme Gregory 
1030ece4cccdSGraeme Gregory     /* Create the generic DC-SCM hardware */
1031ece4cccdSGraeme Gregory     qcom_dc_scm_bmc_i2c_init(bmc);
1032ece4cccdSGraeme Gregory 
1033ece4cccdSGraeme Gregory     /* Now create the Firework specific hardware */
10342a75e8c3SMaheswara Kurapati 
10352a7a5d5cSJae Hyun Yoo     /* I2C7 CPUVR MUX */
10362a7a5d5cSJae Hyun Yoo     cpuvr_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
10372a7a5d5cSJae Hyun Yoo                                         "pca9546", 0x70);
10382a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 0), "pca9548", 0x72);
10392a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 1), "pca9548", 0x72);
10402a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 2), "pca9548", 0x72);
10412a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 3), "pca9548", 0x72);
10422a7a5d5cSJae Hyun Yoo 
1043cfc68f16SMaheswara Kurapati     /* I2C8 Thermal Diodes*/
1044cfc68f16SMaheswara Kurapati     therm_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
1045cfc68f16SMaheswara Kurapati                                         "pca9548", 0x70);
1046cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 0), TYPE_LM75, 0x4C);
1047cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 1), TYPE_LM75, 0x4C);
1048cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 2), TYPE_LM75, 0x48);
1049cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 3), TYPE_LM75, 0x48);
1050cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 4), TYPE_LM75, 0x48);
1051cfc68f16SMaheswara Kurapati 
10522a75e8c3SMaheswara Kurapati     /* I2C9 Fan Controller (MAX31785) */
10532a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x52);
10542a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x54);
1055ece4cccdSGraeme Gregory }
1056ece4cccdSGraeme Gregory 
10571a15311aSCédric Le Goater static bool aspeed_get_mmio_exec(Object *obj, Error **errp)
10581a15311aSCédric Le Goater {
10591a15311aSCédric Le Goater     return ASPEED_MACHINE(obj)->mmio_exec;
10601a15311aSCédric Le Goater }
10611a15311aSCédric Le Goater 
10621a15311aSCédric Le Goater static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp)
10631a15311aSCédric Le Goater {
10641a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = value;
10651a15311aSCédric Le Goater }
10661a15311aSCédric Le Goater 
10671a15311aSCédric Le Goater static void aspeed_machine_instance_init(Object *obj)
10681a15311aSCédric Le Goater {
10691a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = false;
10701a15311aSCédric Le Goater }
10711a15311aSCédric Le Goater 
10729820e52fSCédric Le Goater static char *aspeed_get_fmc_model(Object *obj, Error **errp)
10739820e52fSCédric Le Goater {
10749820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10759820e52fSCédric Le Goater     return g_strdup(bmc->fmc_model);
10769820e52fSCédric Le Goater }
10779820e52fSCédric Le Goater 
10789820e52fSCédric Le Goater static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp)
10799820e52fSCédric Le Goater {
10809820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10819820e52fSCédric Le Goater 
10829820e52fSCédric Le Goater     g_free(bmc->fmc_model);
10839820e52fSCédric Le Goater     bmc->fmc_model = g_strdup(value);
10849820e52fSCédric Le Goater }
10859820e52fSCédric Le Goater 
10869820e52fSCédric Le Goater static char *aspeed_get_spi_model(Object *obj, Error **errp)
10879820e52fSCédric Le Goater {
10889820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10899820e52fSCédric Le Goater     return g_strdup(bmc->spi_model);
10909820e52fSCédric Le Goater }
10919820e52fSCédric Le Goater 
10929820e52fSCédric Le Goater static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp)
10939820e52fSCédric Le Goater {
10949820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10959820e52fSCédric Le Goater 
10969820e52fSCédric Le Goater     g_free(bmc->spi_model);
10979820e52fSCédric Le Goater     bmc->spi_model = g_strdup(value);
10989820e52fSCédric Le Goater }
10999820e52fSCédric Le Goater 
1100f65f6ad5SCédric Le Goater static char *aspeed_get_bmc_console(Object *obj, Error **errp)
1101f65f6ad5SCédric Le Goater {
1102f65f6ad5SCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1103f65f6ad5SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
1104f65f6ad5SCédric Le Goater     int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default;
1105f65f6ad5SCédric Le Goater 
1106944128eeSJamin Lin     return g_strdup_printf("uart%d", aspeed_uart_index(uart_chosen));
1107f65f6ad5SCédric Le Goater }
1108f65f6ad5SCédric Le Goater 
1109f65f6ad5SCédric Le Goater static void aspeed_set_bmc_console(Object *obj, const char *value, Error **errp)
1110f65f6ad5SCédric Le Goater {
1111f65f6ad5SCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1112f65f6ad5SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
1113f65f6ad5SCédric Le Goater     AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(amc->soc_name));
1114f65f6ad5SCédric Le Goater     int val;
1115944128eeSJamin Lin     int uart_first = aspeed_uart_first(sc);
1116944128eeSJamin Lin     int uart_last = aspeed_uart_last(sc);
1117f65f6ad5SCédric Le Goater 
1118f65f6ad5SCédric Le Goater     if (sscanf(value, "uart%u", &val) != 1) {
1119f65f6ad5SCédric Le Goater         error_setg(errp, "Bad value for \"uart\" property");
1120f65f6ad5SCédric Le Goater         return;
1121f65f6ad5SCédric Le Goater     }
1122f65f6ad5SCédric Le Goater 
1123f65f6ad5SCédric Le Goater     /* The number of UART depends on the SoC */
1124944128eeSJamin Lin     if (val < uart_first || val > uart_last) {
1125944128eeSJamin Lin         error_setg(errp, "\"uart\" should be in range [%d - %d]",
1126944128eeSJamin Lin                    uart_first, uart_last);
1127f65f6ad5SCédric Le Goater         return;
1128f65f6ad5SCédric Le Goater     }
1129944128eeSJamin Lin     bmc->uart_chosen = val + ASPEED_DEV_UART0;
1130f65f6ad5SCédric Le Goater }
1131f65f6ad5SCédric Le Goater 
11321a15311aSCédric Le Goater static void aspeed_machine_class_props_init(ObjectClass *oc)
11331a15311aSCédric Le Goater {
11341a15311aSCédric Le Goater     object_class_property_add_bool(oc, "execute-in-place",
11351a15311aSCédric Le Goater                                    aspeed_get_mmio_exec,
1136d2623129SMarkus Armbruster                                    aspeed_set_mmio_exec);
11371a15311aSCédric Le Goater     object_class_property_set_description(oc, "execute-in-place",
11387eecec7dSMarkus Armbruster                            "boot directly from CE0 flash device");
11399820e52fSCédric Le Goater 
1140f65f6ad5SCédric Le Goater     object_class_property_add_str(oc, "bmc-console", aspeed_get_bmc_console,
1141f65f6ad5SCédric Le Goater                                   aspeed_set_bmc_console);
1142f65f6ad5SCédric Le Goater     object_class_property_set_description(oc, "bmc-console",
1143f65f6ad5SCédric Le Goater                            "Change the default UART to \"uartX\"");
1144f65f6ad5SCédric Le Goater 
11459820e52fSCédric Le Goater     object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model,
11469820e52fSCédric Le Goater                                    aspeed_set_fmc_model);
11479820e52fSCédric Le Goater     object_class_property_set_description(oc, "fmc-model",
11489820e52fSCédric Le Goater                                           "Change the FMC Flash model");
11499820e52fSCédric Le Goater     object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model,
11509820e52fSCédric Le Goater                                    aspeed_set_spi_model);
11519820e52fSCédric Le Goater     object_class_property_set_description(oc, "spi-model",
11529820e52fSCédric Le Goater                                           "Change the SPI Flash model");
11531a15311aSCédric Le Goater }
11541a15311aSCédric Le Goater 
115543a0a5c9SPhilippe Mathieu-Daudé static void aspeed_machine_class_init_cpus_defaults(MachineClass *mc)
1156b7f1a0cbSCédric Le Goater {
115743a0a5c9SPhilippe Mathieu-Daudé     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(mc);
115843a0a5c9SPhilippe Mathieu-Daudé     AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(amc->soc_name));
115943a0a5c9SPhilippe Mathieu-Daudé 
116043a0a5c9SPhilippe Mathieu-Daudé     mc->default_cpus = sc->num_cpus;
116143a0a5c9SPhilippe Mathieu-Daudé     mc->min_cpus = sc->num_cpus;
116243a0a5c9SPhilippe Mathieu-Daudé     mc->max_cpus = sc->num_cpus;
1163dc13909eSPhilippe Mathieu-Daudé     mc->valid_cpu_types = sc->valid_cpu_types;
1164b7f1a0cbSCédric Le Goater }
1165b7f1a0cbSCédric Le Goater 
1166fca9ca1bSCédric Le Goater static void aspeed_machine_class_init(ObjectClass *oc, void *data)
116762c2c2ebSCédric Le Goater {
116862c2c2ebSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1169d3bad7e7SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
117062c2c2ebSCédric Le Goater 
1171fca9ca1bSCédric Le Goater     mc->init = aspeed_machine_init;
117262c2c2ebSCédric Le Goater     mc->no_floppy = 1;
117362c2c2ebSCédric Le Goater     mc->no_cdrom = 1;
117462c2c2ebSCédric Le Goater     mc->no_parallel = 1;
1175afcbaed6SIgor Mammedov     mc->default_ram_id = "ram";
1176d3bad7e7SCédric Le Goater     amc->macs_mask = ASPEED_MAC0_ON;
11775d63d0c7SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART5;
11781a15311aSCédric Le Goater 
11791a15311aSCédric Le Goater     aspeed_machine_class_props_init(oc);
118062c2c2ebSCédric Le Goater }
118162c2c2ebSCédric Le Goater 
1182baa4732bSCédric Le Goater static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
1183baa4732bSCédric Le Goater {
1184baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1185baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1186baa4732bSCédric Le Goater 
1187baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Palmetto BMC (ARM926EJ-S)";
1188baa4732bSCédric Le Goater     amc->soc_name  = "ast2400-a1";
1189baa4732bSCédric Le Goater     amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1;
1190baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
119170322913SCédric Le Goater     amc->spi_model = "mx25l25635f";
1192baa4732bSCédric Le Goater     amc->num_cs    = 1;
1193baa4732bSCédric Le Goater     amc->i2c_init  = palmetto_bmc_i2c_init;
1194baa4732bSCédric Le Goater     mc->default_ram_size       = 256 * MiB;
119543a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1196baa4732bSCédric Le Goater };
1197baa4732bSCédric Le Goater 
11989cccb912SPatrick Venture static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data)
11999cccb912SPatrick Venture {
12009cccb912SPatrick Venture     MachineClass *mc = MACHINE_CLASS(oc);
12019cccb912SPatrick Venture     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
12029cccb912SPatrick Venture 
12039cccb912SPatrick Venture     mc->desc       = "Quanta-Q71l BMC (ARM926EJ-S)";
12049cccb912SPatrick Venture     amc->soc_name  = "ast2400-a1";
12059cccb912SPatrick Venture     amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1;
12069cccb912SPatrick Venture     amc->fmc_model = "n25q256a";
12079cccb912SPatrick Venture     amc->spi_model = "mx25l25635e";
12089cccb912SPatrick Venture     amc->num_cs    = 1;
12099cccb912SPatrick Venture     amc->i2c_init  = quanta_q71l_bmc_i2c_init;
12109cccb912SPatrick Venture     mc->default_ram_size       = 128 * MiB;
121143a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
12129cccb912SPatrick Venture }
12139cccb912SPatrick Venture 
121440a38df5SErik Smit static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc,
121540a38df5SErik Smit                                                         void *data)
121640a38df5SErik Smit {
121740a38df5SErik Smit     MachineClass *mc = MACHINE_CLASS(oc);
121840a38df5SErik Smit     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
121940a38df5SErik Smit 
122040a38df5SErik Smit     mc->desc       = "Supermicro X11 BMC (ARM926EJ-S)";
122140a38df5SErik Smit     amc->soc_name  = "ast2400-a1";
122240a38df5SErik Smit     amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1;
122340a38df5SErik Smit     amc->fmc_model = "mx25l25635e";
122440a38df5SErik Smit     amc->spi_model = "mx25l25635e";
122540a38df5SErik Smit     amc->num_cs    = 1;
122640a38df5SErik Smit     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
122740a38df5SErik Smit     amc->i2c_init  = palmetto_bmc_i2c_init;
122840a38df5SErik Smit     mc->default_ram_size = 256 * MiB;
122943a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
123040a38df5SErik Smit }
123140a38df5SErik Smit 
123247936597SGuenter Roeck static void aspeed_machine_supermicro_x11spi_bmc_class_init(ObjectClass *oc,
123347936597SGuenter Roeck                                                             void *data)
123447936597SGuenter Roeck {
123547936597SGuenter Roeck     MachineClass *mc = MACHINE_CLASS(oc);
123647936597SGuenter Roeck     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
123747936597SGuenter Roeck 
123847936597SGuenter Roeck     mc->desc       = "Supermicro X11 SPI BMC (ARM1176)";
123947936597SGuenter Roeck     amc->soc_name  = "ast2500-a1";
124047936597SGuenter Roeck     amc->hw_strap1 = SUPERMICRO_X11SPI_BMC_HW_STRAP1;
124147936597SGuenter Roeck     amc->fmc_model = "mx25l25635e";
124247936597SGuenter Roeck     amc->spi_model = "mx25l25635e";
124347936597SGuenter Roeck     amc->num_cs    = 1;
124447936597SGuenter Roeck     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
124547936597SGuenter Roeck     amc->i2c_init  = palmetto_bmc_i2c_init;
124647936597SGuenter Roeck     mc->default_ram_size = 512 * MiB;
124743a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
124847936597SGuenter Roeck }
124947936597SGuenter Roeck 
1250baa4732bSCédric Le Goater static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data)
1251baa4732bSCédric Le Goater {
1252baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1253baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1254baa4732bSCédric Le Goater 
1255baa4732bSCédric Le Goater     mc->desc       = "Aspeed AST2500 EVB (ARM1176)";
1256baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1257baa4732bSCédric Le Goater     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
1258753abfc4SJae Hyun Yoo     amc->fmc_model = "mx25l25635e";
125970322913SCédric Le Goater     amc->spi_model = "mx25l25635f";
1260baa4732bSCédric Le Goater     amc->num_cs    = 1;
1261baa4732bSCédric Le Goater     amc->i2c_init  = ast2500_evb_i2c_init;
1262baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
126343a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1264baa4732bSCédric Le Goater };
1265baa4732bSCédric Le Goater 
126634f73a81SKarthikeyan Pasupathi static void aspeed_machine_yosemitev2_class_init(ObjectClass *oc, void *data)
126734f73a81SKarthikeyan Pasupathi {
126834f73a81SKarthikeyan Pasupathi     MachineClass *mc = MACHINE_CLASS(oc);
126934f73a81SKarthikeyan Pasupathi     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
127034f73a81SKarthikeyan Pasupathi 
127134f73a81SKarthikeyan Pasupathi     mc->desc       = "Facebook YosemiteV2 BMC (ARM1176)";
127234f73a81SKarthikeyan Pasupathi     amc->soc_name  = "ast2500-a1";
127334f73a81SKarthikeyan Pasupathi     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
127434f73a81SKarthikeyan Pasupathi     amc->hw_strap2 = 0;
127534f73a81SKarthikeyan Pasupathi     amc->fmc_model = "n25q256a";
127634f73a81SKarthikeyan Pasupathi     amc->spi_model = "mx25l25635e";
127734f73a81SKarthikeyan Pasupathi     amc->num_cs    = 2;
127834f73a81SKarthikeyan Pasupathi     amc->i2c_init  = yosemitev2_bmc_i2c_init;
127934f73a81SKarthikeyan Pasupathi     mc->default_ram_size       = 512 * MiB;
128043a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
128134f73a81SKarthikeyan Pasupathi };
128234f73a81SKarthikeyan Pasupathi 
1283baa4732bSCédric Le Goater static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data)
1284baa4732bSCédric Le Goater {
1285baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1286baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1287baa4732bSCédric Le Goater 
1288baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Romulus BMC (ARM1176)";
1289baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1290baa4732bSCédric Le Goater     amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1;
1291baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
1292baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1293baa4732bSCédric Le Goater     amc->num_cs    = 2;
1294baa4732bSCédric Le Goater     amc->i2c_init  = romulus_bmc_i2c_init;
1295baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
129643a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1297baa4732bSCédric Le Goater };
1298baa4732bSCédric Le Goater 
12996c323abaSKarthikeyan Pasupathi static void aspeed_machine_tiogapass_class_init(ObjectClass *oc, void *data)
13006c323abaSKarthikeyan Pasupathi {
13016c323abaSKarthikeyan Pasupathi     MachineClass *mc = MACHINE_CLASS(oc);
13026c323abaSKarthikeyan Pasupathi     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
13036c323abaSKarthikeyan Pasupathi 
13046c323abaSKarthikeyan Pasupathi     mc->desc       = "Facebook Tiogapass BMC (ARM1176)";
13056c323abaSKarthikeyan Pasupathi     amc->soc_name  = "ast2500-a1";
13066c323abaSKarthikeyan Pasupathi     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
13076c323abaSKarthikeyan Pasupathi     amc->hw_strap2 = 0;
13086c323abaSKarthikeyan Pasupathi     amc->fmc_model = "n25q256a";
13096c323abaSKarthikeyan Pasupathi     amc->spi_model = "mx25l25635e";
13106c323abaSKarthikeyan Pasupathi     amc->num_cs    = 2;
13116c323abaSKarthikeyan Pasupathi     amc->i2c_init  = tiogapass_bmc_i2c_init;
13126c323abaSKarthikeyan Pasupathi     mc->default_ram_size       = 1 * GiB;
131343a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
13146c323abaSKarthikeyan Pasupathi };
13156c323abaSKarthikeyan Pasupathi 
1316143b040fSPatrick Williams static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data)
1317143b040fSPatrick Williams {
1318143b040fSPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1319143b040fSPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1320143b040fSPatrick Williams 
1321143b040fSPatrick Williams     mc->desc       = "OCP SonoraPass BMC (ARM1176)";
1322143b040fSPatrick Williams     amc->soc_name  = "ast2500-a1";
1323143b040fSPatrick Williams     amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1;
1324143b040fSPatrick Williams     amc->fmc_model = "mx66l1g45g";
1325143b040fSPatrick Williams     amc->spi_model = "mx66l1g45g";
1326143b040fSPatrick Williams     amc->num_cs    = 2;
1327143b040fSPatrick Williams     amc->i2c_init  = sonorapass_bmc_i2c_init;
1328143b040fSPatrick Williams     mc->default_ram_size       = 512 * MiB;
132943a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1330143b040fSPatrick Williams };
1331143b040fSPatrick Williams 
1332baa4732bSCédric Le Goater static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data)
1333baa4732bSCédric Le Goater {
1334baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1335baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1336baa4732bSCédric Le Goater 
1337baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Witherspoon BMC (ARM1176)";
1338baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1339baa4732bSCédric Le Goater     amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1;
134070322913SCédric Le Goater     amc->fmc_model = "mx25l25635f";
1341baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1342baa4732bSCédric Le Goater     amc->num_cs    = 2;
1343baa4732bSCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init;
1344baa4732bSCédric Le Goater     mc->default_ram_size = 512 * MiB;
134543a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1346baa4732bSCédric Le Goater };
1347baa4732bSCédric Le Goater 
1348baa4732bSCédric Le Goater static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
1349baa4732bSCédric Le Goater {
1350baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1351baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1352baa4732bSCédric Le Goater 
1353f548f201SPeter Maydell     mc->desc       = "Aspeed AST2600 EVB (Cortex-A7)";
1354c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
1355baa4732bSCédric Le Goater     amc->hw_strap1 = AST2600_EVB_HW_STRAP1;
1356baa4732bSCédric Le Goater     amc->hw_strap2 = AST2600_EVB_HW_STRAP2;
1357753abfc4SJae Hyun Yoo     amc->fmc_model = "mx66u51235f";
1358baa4732bSCédric Le Goater     amc->spi_model = "mx66u51235f";
1359baa4732bSCédric Le Goater     amc->num_cs    = 1;
136029193286SGuenter Roeck     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON |
136129193286SGuenter Roeck                      ASPEED_MAC3_ON;
1362baa4732bSCédric Le Goater     amc->i2c_init  = ast2600_evb_i2c_init;
1363baa4732bSCédric Le Goater     mc->default_ram_size = 1 * GiB;
136443a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1365baa4732bSCédric Le Goater };
1366baa4732bSCédric Le Goater 
136763ceb818SCédric Le Goater static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data)
136863ceb818SCédric Le Goater {
136963ceb818SCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
137063ceb818SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
137163ceb818SCédric Le Goater 
1372f548f201SPeter Maydell     mc->desc       = "OpenPOWER Tacoma BMC (Cortex-A7)";
1373c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
137463ceb818SCédric Le Goater     amc->hw_strap1 = TACOMA_BMC_HW_STRAP1;
137563ceb818SCédric Le Goater     amc->hw_strap2 = TACOMA_BMC_HW_STRAP2;
137663ceb818SCédric Le Goater     amc->fmc_model = "mx66l1g45g";
137763ceb818SCédric Le Goater     amc->spi_model = "mx66l1g45g";
137863ceb818SCédric Le Goater     amc->num_cs    = 2;
1379d3bad7e7SCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON;
138063ceb818SCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init; /* Same board layout */
138163ceb818SCédric Le Goater     mc->default_ram_size = 1 * GiB;
138243a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
138356a37edaSCédric Le Goater 
138456a37edaSCédric Le Goater     mc->deprecation_reason = "Please use the similar 'rainier-bmc' machine";
138563ceb818SCédric Le Goater };
138663ceb818SCédric Le Goater 
138795f068c8SJohn Wang static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data)
138895f068c8SJohn Wang {
138995f068c8SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
139095f068c8SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
139195f068c8SJohn Wang 
139295f068c8SJohn Wang     mc->desc       = "Bytedance G220A BMC (ARM1176)";
139395f068c8SJohn Wang     amc->soc_name  = "ast2500-a1";
139495f068c8SJohn Wang     amc->hw_strap1 = G220A_BMC_HW_STRAP1;
139595f068c8SJohn Wang     amc->fmc_model = "n25q512a";
139695f068c8SJohn Wang     amc->spi_model = "mx25l25635e";
139795f068c8SJohn Wang     amc->num_cs    = 2;
13985bb825c8SGuenter Roeck     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
139995f068c8SJohn Wang     amc->i2c_init  = g220a_bmc_i2c_init;
140095f068c8SJohn Wang     mc->default_ram_size = 1024 * MiB;
140143a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
140295f068c8SJohn Wang };
140395f068c8SJohn Wang 
140482b6a3f6SJohn Wang static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc, void *data)
140582b6a3f6SJohn Wang {
140682b6a3f6SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
140782b6a3f6SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
140882b6a3f6SJohn Wang 
140982b6a3f6SJohn Wang     mc->desc       = "Inspur FP5280G2 BMC (ARM1176)";
141082b6a3f6SJohn Wang     amc->soc_name  = "ast2500-a1";
141182b6a3f6SJohn Wang     amc->hw_strap1 = FP5280G2_BMC_HW_STRAP1;
141282b6a3f6SJohn Wang     amc->fmc_model = "n25q512a";
141382b6a3f6SJohn Wang     amc->spi_model = "mx25l25635e";
141482b6a3f6SJohn Wang     amc->num_cs    = 2;
141582b6a3f6SJohn Wang     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
141682b6a3f6SJohn Wang     amc->i2c_init  = fp5280g2_bmc_i2c_init;
141782b6a3f6SJohn Wang     mc->default_ram_size = 512 * MiB;
141843a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
141982b6a3f6SJohn Wang };
142082b6a3f6SJohn Wang 
142158e52bdbSCédric Le Goater static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data)
142258e52bdbSCédric Le Goater {
142358e52bdbSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
142458e52bdbSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
142558e52bdbSCédric Le Goater 
1426f548f201SPeter Maydell     mc->desc       = "IBM Rainier BMC (Cortex-A7)";
1427c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
142858e52bdbSCédric Le Goater     amc->hw_strap1 = RAINIER_BMC_HW_STRAP1;
142958e52bdbSCédric Le Goater     amc->hw_strap2 = RAINIER_BMC_HW_STRAP2;
143058e52bdbSCédric Le Goater     amc->fmc_model = "mx66l1g45g";
143158e52bdbSCédric Le Goater     amc->spi_model = "mx66l1g45g";
143258e52bdbSCédric Le Goater     amc->num_cs    = 2;
143358e52bdbSCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
143458e52bdbSCédric Le Goater     amc->i2c_init  = rainier_bmc_i2c_init;
143558e52bdbSCédric Le Goater     mc->default_ram_size = 1 * GiB;
143643a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
143758e52bdbSCédric Le Goater };
143858e52bdbSCédric Le Goater 
14391e2c22c9SCédric Le Goater #define FUJI_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB)
1440febbe308SPeter Delevoryas 
1441febbe308SPeter Delevoryas static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data)
1442febbe308SPeter Delevoryas {
1443febbe308SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1444febbe308SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1445febbe308SPeter Delevoryas 
1446febbe308SPeter Delevoryas     mc->desc = "Facebook Fuji BMC (Cortex-A7)";
1447febbe308SPeter Delevoryas     amc->soc_name = "ast2600-a3";
1448febbe308SPeter Delevoryas     amc->hw_strap1 = FUJI_BMC_HW_STRAP1;
1449febbe308SPeter Delevoryas     amc->hw_strap2 = FUJI_BMC_HW_STRAP2;
1450febbe308SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1451febbe308SPeter Delevoryas     amc->spi_model = "mx66l1g45g";
1452febbe308SPeter Delevoryas     amc->num_cs = 2;
1453febbe308SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1454febbe308SPeter Delevoryas     amc->i2c_init = fuji_bmc_i2c_init;
1455febbe308SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART1;
1456febbe308SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
145743a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1458febbe308SPeter Delevoryas };
1459febbe308SPeter Delevoryas 
14601e2c22c9SCédric Le Goater #define BLETCHLEY_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB)
1461104bdaffSPatrick Williams 
1462a20c54b1SPatrick Williams static void aspeed_machine_bletchley_class_init(ObjectClass *oc, void *data)
1463a20c54b1SPatrick Williams {
1464a20c54b1SPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1465a20c54b1SPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1466a20c54b1SPatrick Williams 
1467a20c54b1SPatrick Williams     mc->desc       = "Facebook Bletchley BMC (Cortex-A7)";
1468a20c54b1SPatrick Williams     amc->soc_name  = "ast2600-a3";
1469a20c54b1SPatrick Williams     amc->hw_strap1 = BLETCHLEY_BMC_HW_STRAP1;
1470a20c54b1SPatrick Williams     amc->hw_strap2 = BLETCHLEY_BMC_HW_STRAP2;
1471a20c54b1SPatrick Williams     amc->fmc_model = "w25q01jvq";
1472a20c54b1SPatrick Williams     amc->spi_model = NULL;
1473a20c54b1SPatrick Williams     amc->num_cs    = 2;
1474a20c54b1SPatrick Williams     amc->macs_mask = ASPEED_MAC2_ON;
1475a20c54b1SPatrick Williams     amc->i2c_init  = bletchley_bmc_i2c_init;
1476104bdaffSPatrick Williams     mc->default_ram_size = BLETCHLEY_BMC_RAM_SIZE;
147743a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1478a20c54b1SPatrick Williams }
1479a20c54b1SPatrick Williams 
14807966d70fSJason A. Donenfeld static void fby35_reset(MachineState *state, ShutdownCause reason)
1481fa699e80SPeter Delevoryas {
1482fa699e80SPeter Delevoryas     AspeedMachineState *bmc = ASPEED_MACHINE(state);
14833c392e87SPhilippe Mathieu-Daudé     AspeedGPIOState *gpio = &bmc->soc->gpio;
1484fa699e80SPeter Delevoryas 
14857966d70fSJason A. Donenfeld     qemu_devices_reset(reason);
1486fa699e80SPeter Delevoryas 
1487f0418558SPeter Delevoryas     /* Board ID: 7 (Class-1, 4 slots) */
1488fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV4", true, &error_fatal);
1489fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV5", true, &error_fatal);
1490fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV6", true, &error_fatal);
1491fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV7", false, &error_fatal);
1492f0418558SPeter Delevoryas 
1493f0418558SPeter Delevoryas     /* Slot presence pins, inverse polarity. (False means present) */
1494f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH4", false, &error_fatal);
1495f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH5", true, &error_fatal);
1496f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH6", true, &error_fatal);
1497f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH7", true, &error_fatal);
1498f0418558SPeter Delevoryas 
1499f0418558SPeter Delevoryas     /* Slot 12v power pins, normal polarity. (True means powered-on) */
1500f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB2", true, &error_fatal);
1501f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB3", false, &error_fatal);
1502f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB4", false, &error_fatal);
1503f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB5", false, &error_fatal);
1504fa699e80SPeter Delevoryas }
1505fa699e80SPeter Delevoryas 
1506fa699e80SPeter Delevoryas static void aspeed_machine_fby35_class_init(ObjectClass *oc, void *data)
1507fa699e80SPeter Delevoryas {
1508fa699e80SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1509fa699e80SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1510fa699e80SPeter Delevoryas 
1511fa699e80SPeter Delevoryas     mc->desc       = "Facebook fby35 BMC (Cortex-A7)";
1512fa699e80SPeter Delevoryas     mc->reset      = fby35_reset;
1513fa699e80SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1514fa699e80SPeter Delevoryas     amc->num_cs    = 2;
1515fa699e80SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1516fa699e80SPeter Delevoryas     amc->i2c_init  = fby35_i2c_init;
1517fa699e80SPeter Delevoryas     /* FIXME: Replace this macro with something more general */
1518fa699e80SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
151943a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1520fa699e80SPeter Delevoryas }
1521fa699e80SPeter Delevoryas 
152266c895b8SJamin Lin #define AST1030_INTERNAL_FLASH_SIZE (1024 * 1024)
152366c895b8SJamin Lin /* Main SYSCLK frequency in Hz (200MHz) */
152466c895b8SJamin Lin #define SYSCLK_FRQ 200000000ULL
152566c895b8SJamin Lin 
152666c895b8SJamin Lin static void aspeed_minibmc_machine_init(MachineState *machine)
152766c895b8SJamin Lin {
152866c895b8SJamin Lin     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
152966c895b8SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
153066c895b8SJamin Lin     Clock *sysclk;
153166c895b8SJamin Lin 
153266c895b8SJamin Lin     sysclk = clock_new(OBJECT(machine), "SYSCLK");
153366c895b8SJamin Lin     clock_set_hz(sysclk, SYSCLK_FRQ);
153466c895b8SJamin Lin 
15353c392e87SPhilippe Mathieu-Daudé     bmc->soc = ASPEED_SOC(object_new(amc->soc_name));
15363c392e87SPhilippe Mathieu-Daudé     object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc));
15373c392e87SPhilippe Mathieu-Daudé     object_unref(OBJECT(bmc->soc));
15383c392e87SPhilippe Mathieu-Daudé     qdev_connect_clock_in(DEVICE(bmc->soc), "sysclk", sysclk);
153966c895b8SJamin Lin 
15403c392e87SPhilippe Mathieu-Daudé     object_property_set_link(OBJECT(bmc->soc), "memory",
15414dd9d554SPeter Delevoryas                              OBJECT(get_system_memory()), &error_abort);
1542d2b3eaefSPeter Delevoryas     connect_serial_hds_to_uarts(bmc);
15433c392e87SPhilippe Mathieu-Daudé     qdev_realize(DEVICE(bmc->soc), NULL, &error_abort);
154466c895b8SJamin Lin 
15453c392e87SPhilippe Mathieu-Daudé     aspeed_board_init_flashes(&bmc->soc->fmc,
154666c895b8SJamin Lin                               bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
154766c895b8SJamin Lin                               amc->num_cs,
154866c895b8SJamin Lin                               0);
154966c895b8SJamin Lin 
15503c392e87SPhilippe Mathieu-Daudé     aspeed_board_init_flashes(&bmc->soc->spi[0],
155166c895b8SJamin Lin                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
155266c895b8SJamin Lin                               amc->num_cs, amc->num_cs);
155366c895b8SJamin Lin 
15543c392e87SPhilippe Mathieu-Daudé     aspeed_board_init_flashes(&bmc->soc->spi[1],
155566c895b8SJamin Lin                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
155666c895b8SJamin Lin                               amc->num_cs, (amc->num_cs * 2));
155766c895b8SJamin Lin 
155866c895b8SJamin Lin     if (amc->i2c_init) {
155966c895b8SJamin Lin         amc->i2c_init(bmc);
156066c895b8SJamin Lin     }
156166c895b8SJamin Lin 
156266c895b8SJamin Lin     armv7m_load_kernel(ARM_CPU(first_cpu),
156366c895b8SJamin Lin                        machine->kernel_filename,
1564761c532aSPeter Maydell                        0,
156566c895b8SJamin Lin                        AST1030_INTERNAL_FLASH_SIZE);
156666c895b8SJamin Lin }
156766c895b8SJamin Lin 
15684c70ab16STroy Lee static void ast1030_evb_i2c_init(AspeedMachineState *bmc)
15694c70ab16STroy Lee {
15703c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
15714c70ab16STroy Lee 
1572673d8215SMichael Tokarev     /* U10 24C08 connects to SDA/SCL Group 1 by default */
15734c70ab16STroy Lee     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
15744c70ab16STroy Lee     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, eeprom_buf);
15754c70ab16STroy Lee 
15764c70ab16STroy Lee     /* U11 LM75 connects to SDA/SCL Group 2 by default */
15774c70ab16STroy Lee     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d);
15784c70ab16STroy Lee }
15794c70ab16STroy Lee 
158066c895b8SJamin Lin static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc,
158166c895b8SJamin Lin                                                           void *data)
158266c895b8SJamin Lin {
158366c895b8SJamin Lin     MachineClass *mc = MACHINE_CLASS(oc);
158466c895b8SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
158566c895b8SJamin Lin 
158666c895b8SJamin Lin     mc->desc = "Aspeed AST1030 MiniBMC (Cortex-M4)";
158766c895b8SJamin Lin     amc->soc_name = "ast1030-a1";
158866c895b8SJamin Lin     amc->hw_strap1 = 0;
158966c895b8SJamin Lin     amc->hw_strap2 = 0;
159066c895b8SJamin Lin     mc->init = aspeed_minibmc_machine_init;
15914c70ab16STroy Lee     amc->i2c_init = ast1030_evb_i2c_init;
159266c895b8SJamin Lin     mc->default_ram_size = 0;
159366c895b8SJamin Lin     amc->fmc_model = "sst25vf032b";
159466c895b8SJamin Lin     amc->spi_model = "sst25vf032b";
159566c895b8SJamin Lin     amc->num_cs = 2;
159666c895b8SJamin Lin     amc->macs_mask = 0;
159743a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
159866c895b8SJamin Lin }
159966c895b8SJamin Lin 
160092707992SJamin Lin #ifdef TARGET_AARCH64
160192707992SJamin Lin static void aspeed_machine_ast2700_evb_class_init(ObjectClass *oc, void *data)
160292707992SJamin Lin {
160392707992SJamin Lin     MachineClass *mc = MACHINE_CLASS(oc);
160492707992SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
160592707992SJamin Lin 
160692707992SJamin Lin     mc->desc = "Aspeed AST2700 EVB (Cortex-A35)";
160792707992SJamin Lin     amc->soc_name  = "ast2700-a0";
160892707992SJamin Lin     amc->hw_strap1 = AST2700_EVB_HW_STRAP1;
160992707992SJamin Lin     amc->hw_strap2 = AST2700_EVB_HW_STRAP2;
161092707992SJamin Lin     amc->fmc_model = "w25q01jvq";
161192707992SJamin Lin     amc->spi_model = "w25q512jv";
161292707992SJamin Lin     amc->num_cs    = 2;
161392707992SJamin Lin     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON;
161492707992SJamin Lin     amc->uart_default = ASPEED_DEV_UART12;
161592707992SJamin Lin     mc->default_ram_size = 1 * GiB;
161692707992SJamin Lin     aspeed_machine_class_init_cpus_defaults(mc);
161792707992SJamin Lin }
161892707992SJamin Lin #endif
161992707992SJamin Lin 
1620fb6b3c8dSJae Hyun Yoo static void aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass *oc,
1621fb6b3c8dSJae Hyun Yoo                                                      void *data)
1622fb6b3c8dSJae Hyun Yoo {
1623fb6b3c8dSJae Hyun Yoo     MachineClass *mc = MACHINE_CLASS(oc);
1624fb6b3c8dSJae Hyun Yoo     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1625fb6b3c8dSJae Hyun Yoo 
1626fb6b3c8dSJae Hyun Yoo     mc->desc       = "Qualcomm DC-SCM V1 BMC (Cortex A7)";
1627fb6b3c8dSJae Hyun Yoo     amc->soc_name  = "ast2600-a3";
1628fb6b3c8dSJae Hyun Yoo     amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1629fb6b3c8dSJae Hyun Yoo     amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1630fb6b3c8dSJae Hyun Yoo     amc->fmc_model = "n25q512a";
1631fb6b3c8dSJae Hyun Yoo     amc->spi_model = "n25q512a";
1632fb6b3c8dSJae Hyun Yoo     amc->num_cs    = 2;
1633fb6b3c8dSJae Hyun Yoo     amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1634fb6b3c8dSJae Hyun Yoo     amc->i2c_init  = qcom_dc_scm_bmc_i2c_init;
1635fb6b3c8dSJae Hyun Yoo     mc->default_ram_size = 1 * GiB;
163643a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1637fb6b3c8dSJae Hyun Yoo };
1638fb6b3c8dSJae Hyun Yoo 
1639ece4cccdSGraeme Gregory static void aspeed_machine_qcom_firework_class_init(ObjectClass *oc,
1640ece4cccdSGraeme Gregory                                                     void *data)
1641ece4cccdSGraeme Gregory {
1642ece4cccdSGraeme Gregory     MachineClass *mc = MACHINE_CLASS(oc);
1643ece4cccdSGraeme Gregory     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1644ece4cccdSGraeme Gregory 
1645ece4cccdSGraeme Gregory     mc->desc       = "Qualcomm DC-SCM V1/Firework BMC (Cortex A7)";
1646ece4cccdSGraeme Gregory     amc->soc_name  = "ast2600-a3";
1647ece4cccdSGraeme Gregory     amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1648ece4cccdSGraeme Gregory     amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1649ece4cccdSGraeme Gregory     amc->fmc_model = "n25q512a";
1650ece4cccdSGraeme Gregory     amc->spi_model = "n25q512a";
1651ece4cccdSGraeme Gregory     amc->num_cs    = 2;
1652ece4cccdSGraeme Gregory     amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1653ece4cccdSGraeme Gregory     amc->i2c_init  = qcom_dc_scm_firework_i2c_init;
1654ece4cccdSGraeme Gregory     mc->default_ram_size = 1 * GiB;
165543a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1656ece4cccdSGraeme Gregory };
1657ece4cccdSGraeme Gregory 
1658baa4732bSCédric Le Goater static const TypeInfo aspeed_machine_types[] = {
1659baa4732bSCédric Le Goater     {
1660baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("palmetto-bmc"),
1661baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1662baa4732bSCédric Le Goater         .class_init    = aspeed_machine_palmetto_class_init,
1663baa4732bSCédric Le Goater     }, {
166440a38df5SErik Smit         .name          = MACHINE_TYPE_NAME("supermicrox11-bmc"),
166540a38df5SErik Smit         .parent        = TYPE_ASPEED_MACHINE,
166640a38df5SErik Smit         .class_init    = aspeed_machine_supermicrox11_bmc_class_init,
166740a38df5SErik Smit     }, {
166847936597SGuenter Roeck         .name          = MACHINE_TYPE_NAME("supermicro-x11spi-bmc"),
166947936597SGuenter Roeck         .parent        = TYPE_ASPEED_MACHINE,
167047936597SGuenter Roeck         .class_init    = aspeed_machine_supermicro_x11spi_bmc_class_init,
167147936597SGuenter Roeck     }, {
1672baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2500-evb"),
1673baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1674baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2500_evb_class_init,
1675baa4732bSCédric Le Goater     }, {
1676baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("romulus-bmc"),
1677baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1678baa4732bSCédric Le Goater         .class_init    = aspeed_machine_romulus_class_init,
1679baa4732bSCédric Le Goater     }, {
1680143b040fSPatrick Williams         .name          = MACHINE_TYPE_NAME("sonorapass-bmc"),
1681143b040fSPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1682143b040fSPatrick Williams         .class_init    = aspeed_machine_sonorapass_class_init,
1683143b040fSPatrick Williams     }, {
1684baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("witherspoon-bmc"),
1685baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1686baa4732bSCédric Le Goater         .class_init    = aspeed_machine_witherspoon_class_init,
1687baa4732bSCédric Le Goater     }, {
1688baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2600-evb"),
1689baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1690baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2600_evb_class_init,
1691baa4732bSCédric Le Goater     }, {
169234f73a81SKarthikeyan Pasupathi         .name          = MACHINE_TYPE_NAME("yosemitev2-bmc"),
169334f73a81SKarthikeyan Pasupathi         .parent        = TYPE_ASPEED_MACHINE,
169434f73a81SKarthikeyan Pasupathi         .class_init    = aspeed_machine_yosemitev2_class_init,
169534f73a81SKarthikeyan Pasupathi     }, {
169663ceb818SCédric Le Goater         .name          = MACHINE_TYPE_NAME("tacoma-bmc"),
169763ceb818SCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
169863ceb818SCédric Le Goater         .class_init    = aspeed_machine_tacoma_class_init,
169963ceb818SCédric Le Goater     }, {
17006c323abaSKarthikeyan Pasupathi         .name          = MACHINE_TYPE_NAME("tiogapass-bmc"),
17016c323abaSKarthikeyan Pasupathi         .parent        = TYPE_ASPEED_MACHINE,
17026c323abaSKarthikeyan Pasupathi         .class_init    = aspeed_machine_tiogapass_class_init,
17036c323abaSKarthikeyan Pasupathi     }, {
170495f068c8SJohn Wang         .name          = MACHINE_TYPE_NAME("g220a-bmc"),
170595f068c8SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
170695f068c8SJohn Wang         .class_init    = aspeed_machine_g220a_class_init,
170795f068c8SJohn Wang     }, {
1708fb6b3c8dSJae Hyun Yoo         .name          = MACHINE_TYPE_NAME("qcom-dc-scm-v1-bmc"),
1709fb6b3c8dSJae Hyun Yoo         .parent        = TYPE_ASPEED_MACHINE,
1710fb6b3c8dSJae Hyun Yoo         .class_init    = aspeed_machine_qcom_dc_scm_v1_class_init,
1711fb6b3c8dSJae Hyun Yoo     }, {
1712ece4cccdSGraeme Gregory         .name          = MACHINE_TYPE_NAME("qcom-firework-bmc"),
1713ece4cccdSGraeme Gregory         .parent        = TYPE_ASPEED_MACHINE,
1714ece4cccdSGraeme Gregory         .class_init    = aspeed_machine_qcom_firework_class_init,
1715ece4cccdSGraeme Gregory     }, {
171682b6a3f6SJohn Wang         .name          = MACHINE_TYPE_NAME("fp5280g2-bmc"),
171782b6a3f6SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
171882b6a3f6SJohn Wang         .class_init    = aspeed_machine_fp5280g2_class_init,
171982b6a3f6SJohn Wang     }, {
17209cccb912SPatrick Venture         .name          = MACHINE_TYPE_NAME("quanta-q71l-bmc"),
17219cccb912SPatrick Venture         .parent        = TYPE_ASPEED_MACHINE,
17229cccb912SPatrick Venture         .class_init    = aspeed_machine_quanta_q71l_class_init,
17239cccb912SPatrick Venture     }, {
172458e52bdbSCédric Le Goater         .name          = MACHINE_TYPE_NAME("rainier-bmc"),
172558e52bdbSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
172658e52bdbSCédric Le Goater         .class_init    = aspeed_machine_rainier_class_init,
172758e52bdbSCédric Le Goater     }, {
1728febbe308SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fuji-bmc"),
1729febbe308SPeter Delevoryas         .parent        = TYPE_ASPEED_MACHINE,
1730febbe308SPeter Delevoryas         .class_init    = aspeed_machine_fuji_class_init,
1731febbe308SPeter Delevoryas     }, {
1732a20c54b1SPatrick Williams         .name          = MACHINE_TYPE_NAME("bletchley-bmc"),
1733a20c54b1SPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1734a20c54b1SPatrick Williams         .class_init    = aspeed_machine_bletchley_class_init,
1735a20c54b1SPatrick Williams     }, {
1736fa699e80SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fby35-bmc"),
1737fa699e80SPeter Delevoryas         .parent        = MACHINE_TYPE_NAME("ast2600-evb"),
1738fa699e80SPeter Delevoryas         .class_init    = aspeed_machine_fby35_class_init,
1739fa699e80SPeter Delevoryas     }, {
174066c895b8SJamin Lin         .name           = MACHINE_TYPE_NAME("ast1030-evb"),
174166c895b8SJamin Lin         .parent         = TYPE_ASPEED_MACHINE,
174266c895b8SJamin Lin         .class_init     = aspeed_minibmc_machine_ast1030_evb_class_init,
174392707992SJamin Lin #ifdef TARGET_AARCH64
174492707992SJamin Lin     }, {
174592707992SJamin Lin         .name          = MACHINE_TYPE_NAME("ast2700-evb"),
174692707992SJamin Lin         .parent        = TYPE_ASPEED_MACHINE,
174792707992SJamin Lin         .class_init    = aspeed_machine_ast2700_evb_class_init,
174892707992SJamin Lin #endif
174966c895b8SJamin Lin     }, {
1750fca9ca1bSCédric Le Goater         .name          = TYPE_ASPEED_MACHINE,
175162c2c2ebSCédric Le Goater         .parent        = TYPE_MACHINE,
1752888b2b03SPhilippe Mathieu-Daudé         .instance_size = sizeof(AspeedMachineState),
17531a15311aSCédric Le Goater         .instance_init = aspeed_machine_instance_init,
1754fca9ca1bSCédric Le Goater         .class_size    = sizeof(AspeedMachineClass),
1755fca9ca1bSCédric Le Goater         .class_init    = aspeed_machine_class_init,
1756baa4732bSCédric Le Goater         .abstract      = true,
1757baa4732bSCédric Le Goater     }
1758fca9ca1bSCédric Le Goater };
175974fb1f38SCédric Le Goater 
1760baa4732bSCédric Le Goater DEFINE_TYPES(aspeed_machine_types)
1761