xref: /qemu/hw/arm/aspeed.c (revision 056b779eaf10ab84e8ca9d02662a975f4de3d3b1)
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;
49621845a9SCédric Le Goater     uint32_t hw_strap1;
50ea066d39SThomas Huth };
51327d8e4eSAndrew Jeffery 
521e2c22c9SCédric Le Goater /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */
531e2c22c9SCédric Le Goater #if HOST_LONG_BITS == 32
541e2c22c9SCédric Le Goater #define ASPEED_RAM_SIZE(sz) MIN((sz), 1 * GiB)
551e2c22c9SCédric Le Goater #else
561e2c22c9SCédric Le Goater #define ASPEED_RAM_SIZE(sz) (sz)
571e2c22c9SCédric Le Goater #endif
581e2c22c9SCédric Le Goater 
59ef17f836SCédric Le Goater /* Palmetto hardware value: 0x120CE416 */
608da33ef7SCédric Le Goater #define PALMETTO_BMC_HW_STRAP1 (                                        \
618da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_256MB) |               \
628da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2 /* DDR3 with CL=6, CWL=5 */) | \
638da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
648da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) |       \
658da33ef7SCédric Le Goater         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
668da33ef7SCédric Le Goater         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
678da33ef7SCédric Le Goater         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) |                \
688da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
698da33ef7SCédric Le Goater         SCU_HW_STRAP_SPI_WIDTH |                                        \
708da33ef7SCédric Le Goater         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
718da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
728da33ef7SCédric Le Goater 
7340a38df5SErik Smit /* TODO: Find the actual hardware value */
7440a38df5SErik Smit #define SUPERMICROX11_BMC_HW_STRAP1 (                                   \
7540a38df5SErik Smit         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) |               \
7640a38df5SErik Smit         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2) |                           \
7740a38df5SErik Smit         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
7840a38df5SErik Smit         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) |       \
7940a38df5SErik Smit         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
8040a38df5SErik Smit         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
8140a38df5SErik Smit         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) |                \
8240a38df5SErik Smit         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
8340a38df5SErik Smit         SCU_HW_STRAP_SPI_WIDTH |                                        \
8440a38df5SErik Smit         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
8540a38df5SErik Smit         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
8640a38df5SErik Smit 
8747936597SGuenter Roeck /* TODO: Find the actual hardware value */
8847936597SGuenter Roeck #define SUPERMICRO_X11SPI_BMC_HW_STRAP1 (                               \
8947936597SGuenter Roeck         AST2500_HW_STRAP1_DEFAULTS |                                    \
9047936597SGuenter Roeck         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
9147936597SGuenter Roeck         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
9247936597SGuenter Roeck         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
9347936597SGuenter Roeck         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
9447936597SGuenter Roeck         SCU_HW_STRAP_SPI_WIDTH |                                        \
9547936597SGuenter Roeck         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN))
9647936597SGuenter Roeck 
97ef17f836SCédric Le Goater /* AST2500 evb hardware value: 0xF100C2E6 */
989a7c1750SCédric Le Goater #define AST2500_EVB_HW_STRAP1 ((                                        \
999a7c1750SCédric Le Goater         AST2500_HW_STRAP1_DEFAULTS |                                    \
1009a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
1019a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
1029a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
1039a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
1049a7c1750SCédric Le Goater         SCU_HW_STRAP_MAC1_RGMII |                                       \
1059a7c1750SCédric Le Goater         SCU_HW_STRAP_MAC0_RGMII) &                                      \
1069a7c1750SCédric Le Goater         ~SCU_HW_STRAP_2ND_BOOT_WDT)
1079a7c1750SCédric Le Goater 
108ef17f836SCédric Le Goater /* Romulus hardware value: 0xF10AD206 */
109ef17f836SCédric Le Goater #define ROMULUS_BMC_HW_STRAP1 (                                         \
110ef17f836SCédric Le Goater         AST2500_HW_STRAP1_DEFAULTS |                                    \
111ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
112ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
113ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
114ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
115ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_ACPI_ENABLE |                              \
116ef17f836SCédric Le Goater         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER))
117ef17f836SCédric Le Goater 
118143b040fSPatrick Williams /* Sonorapass hardware value: 0xF100D216 */
119143b040fSPatrick Williams #define SONORAPASS_BMC_HW_STRAP1 (                                      \
120143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
121143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
122143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
123143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
124143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
125143b040fSPatrick Williams         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
126143b040fSPatrick Williams         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
127143b040fSPatrick Williams         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
128143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
129143b040fSPatrick Williams         SCU_HW_STRAP_VGA_BIOS_ROM |                                     \
130143b040fSPatrick Williams         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
131143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_RESERVED1)
132143b040fSPatrick Williams 
13395f068c8SJohn Wang #define G220A_BMC_HW_STRAP1 (                                      \
13495f068c8SJohn Wang         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
13595f068c8SJohn Wang         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
13695f068c8SJohn Wang         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
13795f068c8SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
13895f068c8SJohn Wang         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
13995f068c8SJohn Wang         SCU_HW_STRAP_2ND_BOOT_WDT |                                     \
14095f068c8SJohn Wang         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
14195f068c8SJohn Wang         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
14295f068c8SJohn Wang         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
14395f068c8SJohn Wang         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
14495f068c8SJohn Wang         SCU_HW_STRAP_VGA_SIZE_SET(VGA_64M_DRAM) |                       \
14595f068c8SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED1)
14695f068c8SJohn Wang 
14782b6a3f6SJohn Wang /* FP5280G2 hardware value: 0XF100D286 */
14882b6a3f6SJohn Wang #define FP5280G2_BMC_HW_STRAP1 (                                      \
14982b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
15082b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
15182b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
15282b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
15382b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
15482b6a3f6SJohn Wang         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
15582b6a3f6SJohn Wang         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
15682b6a3f6SJohn Wang         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
15782b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
15882b6a3f6SJohn Wang         SCU_HW_STRAP_MAC1_RGMII |                                       \
15982b6a3f6SJohn Wang         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
16082b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED1)
16182b6a3f6SJohn Wang 
16262c2c2ebSCédric Le Goater /* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */
16362c2c2ebSCédric Le Goater #define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1
16462c2c2ebSCédric Le Goater 
1659cccb912SPatrick Venture /* Quanta-Q71l hardware value */
1669cccb912SPatrick Venture #define QUANTA_Q71L_BMC_HW_STRAP1 (                                     \
1679cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) |               \
1689cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2/* DDR3 with CL=6, CWL=5 */) | \
1699cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
1709cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_24M_IN) |       \
1719cccb912SPatrick Venture         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
1729cccb912SPatrick Venture         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_PASS_THROUGH) |          \
1739cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
1749cccb912SPatrick Venture         SCU_HW_STRAP_SPI_WIDTH |                                        \
1759cccb912SPatrick Venture         SCU_HW_STRAP_VGA_SIZE_SET(VGA_8M_DRAM) |                        \
1769cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
1779cccb912SPatrick Venture 
178ccc2c418SCédric Le Goater /* AST2600 evb hardware value */
179ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP1 0x000000C0
180ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP2 0x00000003
181ccc2c418SCédric Le Goater 
18292707992SJamin Lin #ifdef TARGET_AARCH64
18392707992SJamin Lin /* AST2700 evb hardware value */
18492707992SJamin Lin #define AST2700_EVB_HW_STRAP1 0x000000C0
18592707992SJamin Lin #define AST2700_EVB_HW_STRAP2 0x00000003
18692707992SJamin Lin #endif
18792707992SJamin Lin 
18863ceb818SCédric Le Goater /* Tacoma hardware value */
18963ceb818SCédric Le Goater #define TACOMA_BMC_HW_STRAP1  0x00000000
1907582591aSJoel Stanley #define TACOMA_BMC_HW_STRAP2  0x00000040
19163ceb818SCédric Le Goater 
19258e52bdbSCédric Le Goater /* Rainier hardware value: (QEMU prototype) */
19301ea09ebSCédric Le Goater #define RAINIER_BMC_HW_STRAP1 (0x00422016 | SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC)
194b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP2 0x80000848
19558e52bdbSCédric Le Goater 
196febbe308SPeter Delevoryas /* Fuji hardware value */
197febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP1    0x00000000
198febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP2    0x00000000
199febbe308SPeter Delevoryas 
200a20c54b1SPatrick Williams /* Bletchley hardware value */
201a20c54b1SPatrick Williams /* TODO: Leave same as EVB for now. */
202a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP1 AST2600_EVB_HW_STRAP1
203a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP2 AST2600_EVB_HW_STRAP2
204a20c54b1SPatrick Williams 
205fb6b3c8dSJae Hyun Yoo /* Qualcomm DC-SCM hardware value */
206fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP1  0x00000000
207fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP2  0x00000041
208fb6b3c8dSJae Hyun Yoo 
2099bb6d140SJoel Stanley #define AST_SMP_MAILBOX_BASE            0x1e6e2180
2109bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_ENTRY        (AST_SMP_MAILBOX_BASE + 0x0)
2119bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_GOSIGN       (AST_SMP_MAILBOX_BASE + 0x4)
2129bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_READY        (AST_SMP_MAILBOX_BASE + 0x8)
2139bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_POLLINSN     (AST_SMP_MAILBOX_BASE + 0xc)
2149bb6d140SJoel Stanley #define AST_SMP_MBOX_CODE               (AST_SMP_MAILBOX_BASE + 0x10)
2159bb6d140SJoel Stanley #define AST_SMP_MBOX_GOSIGN             0xabbaab00
2169bb6d140SJoel Stanley 
2179bb6d140SJoel Stanley static void aspeed_write_smpboot(ARMCPU *cpu,
2189bb6d140SJoel Stanley                                  const struct arm_boot_info *info)
2199bb6d140SJoel Stanley {
220902bba54SCédric Le Goater     AddressSpace *as = arm_boot_address_space(cpu, info);
221902bba54SCédric Le Goater     static const ARMInsnFixup poll_mailbox_ready[] = {
2229bb6d140SJoel Stanley         /*
2239bb6d140SJoel Stanley          * r2 = per-cpu go sign value
2249bb6d140SJoel Stanley          * r1 = AST_SMP_MBOX_FIELD_ENTRY
2259bb6d140SJoel Stanley          * r0 = AST_SMP_MBOX_FIELD_GOSIGN
2269bb6d140SJoel Stanley          */
227902bba54SCédric Le Goater         { 0xee100fb0 },  /* mrc     p15, 0, r0, c0, c0, 5 */
228902bba54SCédric Le Goater         { 0xe21000ff },  /* ands    r0, r0, #255          */
229902bba54SCédric Le Goater         { 0xe59f201c },  /* ldr     r2, [pc, #28]         */
230902bba54SCédric Le Goater         { 0xe1822000 },  /* orr     r2, r2, r0            */
2319bb6d140SJoel Stanley 
232902bba54SCédric Le Goater         { 0xe59f1018 },  /* ldr     r1, [pc, #24]         */
233902bba54SCédric Le Goater         { 0xe59f0018 },  /* ldr     r0, [pc, #24]         */
2349bb6d140SJoel Stanley 
235902bba54SCédric Le Goater         { 0xe320f002 },  /* wfe                           */
236902bba54SCédric Le Goater         { 0xe5904000 },  /* ldr     r4, [r0]              */
237902bba54SCédric Le Goater         { 0xe1520004 },  /* cmp     r2, r4                */
238902bba54SCédric Le Goater         { 0x1afffffb },  /* bne     <wfe>                 */
239902bba54SCédric Le Goater         { 0xe591f000 },  /* ldr     pc, [r1]              */
240902bba54SCédric Le Goater         { AST_SMP_MBOX_GOSIGN },
241902bba54SCédric Le Goater         { AST_SMP_MBOX_FIELD_ENTRY },
242902bba54SCédric Le Goater         { AST_SMP_MBOX_FIELD_GOSIGN },
243902bba54SCédric Le Goater         { 0, FIXUP_TERMINATOR }
2449bb6d140SJoel Stanley     };
245902bba54SCédric Le Goater     static const uint32_t fixupcontext[FIXUP_MAX] = { 0 };
2469bb6d140SJoel Stanley 
247902bba54SCédric Le Goater     arm_write_bootloader("aspeed.smpboot", as, info->smp_loader_start,
248902bba54SCédric Le Goater                          poll_mailbox_ready, fixupcontext);
2499bb6d140SJoel Stanley }
2509bb6d140SJoel Stanley 
2519bb6d140SJoel Stanley static void aspeed_reset_secondary(ARMCPU *cpu,
2529bb6d140SJoel Stanley                                    const struct arm_boot_info *info)
2539bb6d140SJoel Stanley {
2549bb6d140SJoel Stanley     AddressSpace *as = arm_boot_address_space(cpu, info);
2559bb6d140SJoel Stanley     CPUState *cs = CPU(cpu);
2569bb6d140SJoel Stanley 
2579bb6d140SJoel Stanley     /* info->smp_bootreg_addr */
2589bb6d140SJoel Stanley     address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0,
2599bb6d140SJoel Stanley                                MEMTXATTRS_UNSPECIFIED, NULL);
2609bb6d140SJoel Stanley     cpu_set_pc(cs, info->smp_loader_start);
2619bb6d140SJoel Stanley }
2629bb6d140SJoel Stanley 
2638b744a6aSCédric Le Goater static void write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size,
264d769a1daSCédric Le Goater                            Error **errp)
265d769a1daSCédric Le Goater {
26605e6e40aSWentao_Liang     g_autofree void *storage = NULL;
2670c7209beSCédric Le Goater     int64_t size;
268d769a1daSCédric Le Goater 
2690c7209beSCédric Le Goater     /* The block backend size should have already been 'validated' by
2700c7209beSCédric Le Goater      * the creation of the m25p80 object.
2710c7209beSCédric Le Goater      */
2720c7209beSCédric Le Goater     size = blk_getlength(blk);
2730c7209beSCédric Le Goater     if (size <= 0) {
2740c7209beSCédric Le Goater         error_setg(errp, "failed to get flash size");
2750c7209beSCédric Le Goater         return;
2760c7209beSCédric Le Goater     }
2770c7209beSCédric Le Goater 
2780c7209beSCédric Le Goater     if (rom_size > size) {
2790c7209beSCédric Le Goater         rom_size = size;
280d769a1daSCédric Le Goater     }
281d769a1daSCédric Le Goater 
28205e6e40aSWentao_Liang     storage = g_malloc0(rom_size);
283a9262f55SAlberto Faria     if (blk_pread(blk, 0, rom_size, storage, 0) < 0) {
284d769a1daSCédric Le Goater         error_setg(errp, "failed to read the initial flash content");
285d769a1daSCédric Le Goater         return;
286d769a1daSCédric Le Goater     }
287d769a1daSCédric Le Goater 
288d769a1daSCédric Le Goater     rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr);
289d769a1daSCédric Le Goater }
290d769a1daSCédric Le Goater 
2918b744a6aSCédric Le Goater /*
2928b744a6aSCédric Le Goater  * Create a ROM and copy the flash contents at the expected address
2938b744a6aSCédric Le Goater  * (0x0). Boots faster than execute-in-place.
2948b744a6aSCédric Le Goater  */
295262259eaSCédric Le Goater static void aspeed_install_boot_rom(AspeedMachineState *bmc, BlockBackend *blk,
2968b744a6aSCédric Le Goater                                     uint64_t rom_size)
2978b744a6aSCédric Le Goater {
2983c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
299db052d0eSJamin Lin     AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(soc);
3008b744a6aSCédric Le Goater 
301262259eaSCédric Le Goater     memory_region_init_rom(&bmc->boot_rom, NULL, "aspeed.boot_rom", rom_size,
3028b744a6aSCédric Le Goater                            &error_abort);
3038b744a6aSCédric Le Goater     memory_region_add_subregion_overlap(&soc->spi_boot_container, 0,
304262259eaSCédric Le Goater                                         &bmc->boot_rom, 1);
305db052d0eSJamin Lin     write_boot_rom(blk, sc->memmap[ASPEED_DEV_SPI_BOOT],
306db052d0eSJamin Lin                    rom_size, &error_abort);
3078b744a6aSCédric Le Goater }
3088b744a6aSCédric Le Goater 
3091099ad10SPeter Delevoryas void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
3109bd4ac61SCédric Le Goater                                       unsigned int count, int unit0)
311e1ad9bc4SCédric Le Goater {
312e1ad9bc4SCédric Le Goater     int i;
313179b2058SPatrick Williams 
314179b2058SPatrick Williams     if (!flashtype) {
315179b2058SPatrick Williams         return;
316179b2058SPatrick Williams     }
317e1ad9bc4SCédric Le Goater 
3189bd4ac61SCédric Le Goater     for (i = 0; i < count; ++i) {
3198ec239f2SMarkus Armbruster         DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i);
320a7d78befSCédric Le Goater         DeviceState *dev;
321e1ad9bc4SCédric Le Goater 
322a7d78befSCédric Le Goater         dev = qdev_new(flashtype);
323e1ad9bc4SCédric Le Goater         if (dinfo) {
324a7d78befSCédric Le Goater             qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo));
325e1ad9bc4SCédric Le Goater         }
32627a2c66cSCédric Le Goater         qdev_prop_set_uint8(dev, "cs", i);
327a7d78befSCédric Le Goater         qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal);
328e1ad9bc4SCédric Le Goater     }
329e1ad9bc4SCédric Le Goater }
330e1ad9bc4SCédric Le Goater 
331e554e45bSCédric Le Goater static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo, bool emmc,
332e554e45bSCédric Le Goater                                bool boot_emmc)
333a29e3e12SAndrew Jeffery {
334a29e3e12SAndrew Jeffery         DeviceState *card;
335a29e3e12SAndrew Jeffery 
336756f739bSPhilippe Mathieu-Daudé         if (!dinfo) {
337756f739bSPhilippe Mathieu-Daudé             return;
338756f739bSPhilippe Mathieu-Daudé         }
339dddfc771SCédric Le Goater         card = qdev_new(emmc ? TYPE_EMMC : TYPE_SD_CARD);
340e554e45bSCédric Le Goater         if (emmc) {
341e554e45bSCédric Le Goater             qdev_prop_set_uint64(card, "boot-partition-size", 1 * MiB);
342e554e45bSCédric Le Goater             qdev_prop_set_uint8(card, "boot-config",
343e554e45bSCédric Le Goater                                 boot_emmc ? 0x1 << 3 : 0x0);
344e554e45bSCédric Le Goater         }
345934df912SMarkus Armbruster         qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
346a29e3e12SAndrew Jeffery                                 &error_fatal);
3473e80f690SMarkus Armbruster         qdev_realize_and_unref(card,
3483e80f690SMarkus Armbruster                                qdev_get_child_bus(DEVICE(sdhci), "sd-bus"),
3493e80f690SMarkus Armbruster                                &error_fatal);
350a29e3e12SAndrew Jeffery }
351a29e3e12SAndrew Jeffery 
352d2b3eaefSPeter Delevoryas static void connect_serial_hds_to_uarts(AspeedMachineState *bmc)
353d2b3eaefSPeter Delevoryas {
354d2b3eaefSPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
3553c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *s = bmc->soc;
356d2b3eaefSPeter Delevoryas     AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
357f65f6ad5SCédric Le Goater     int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default;
358d2b3eaefSPeter Delevoryas 
359f65f6ad5SCédric Le Goater     aspeed_soc_uart_set_chr(s, uart_chosen, serial_hd(0));
360944128eeSJamin Lin     for (int i = 1, uart = sc->uarts_base; i < sc->uarts_num; i++, uart++) {
361f65f6ad5SCédric Le Goater         if (uart == uart_chosen) {
362d2b3eaefSPeter Delevoryas             continue;
363d2b3eaefSPeter Delevoryas         }
364d2b3eaefSPeter Delevoryas         aspeed_soc_uart_set_chr(s, uart, serial_hd(i));
365d2b3eaefSPeter Delevoryas     }
366d2b3eaefSPeter Delevoryas }
367d2b3eaefSPeter Delevoryas 
368baa4732bSCédric Le Goater static void aspeed_machine_init(MachineState *machine)
369327d8e4eSAndrew Jeffery {
370888b2b03SPhilippe Mathieu-Daudé     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
371baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
372b033271fSCédric Le Goater     AspeedSoCClass *sc;
3732bea128cSEddie James     int i;
374255aed81SCédric Le Goater     DriveInfo *emmc0 = NULL;
375e554e45bSCédric Le Goater     bool boot_emmc;
376327d8e4eSAndrew Jeffery 
3773c392e87SPhilippe Mathieu-Daudé     bmc->soc = ASPEED_SOC(object_new(amc->soc_name));
3783c392e87SPhilippe Mathieu-Daudé     object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc));
3793c392e87SPhilippe Mathieu-Daudé     object_unref(OBJECT(bmc->soc));
3803c392e87SPhilippe Mathieu-Daudé     sc = ASPEED_SOC_GET_CLASS(bmc->soc);
381b033271fSCédric Le Goater 
382533eb415SIgor Mammedov     /*
383346160cbSCédric Le Goater      * This will error out if the RAM size is not supported by the
384346160cbSCédric Le Goater      * memory controller of the SoC.
385533eb415SIgor Mammedov      */
3863c392e87SPhilippe Mathieu-Daudé     object_property_set_uint(OBJECT(bmc->soc), "ram-size", machine->ram_size,
387533eb415SIgor Mammedov                              &error_fatal);
388533eb415SIgor Mammedov 
389d3bad7e7SCédric Le Goater     for (i = 0; i < sc->macs_num; i++) {
390b3cfec5bSDavid Woodhouse         if ((amc->macs_mask & (1 << i)) &&
391b3cfec5bSDavid Woodhouse             !qemu_configure_nic_device(DEVICE(&bmc->soc->ftgmac100[i]),
392b3cfec5bSDavid Woodhouse                                        true, NULL)) {
393b3cfec5bSDavid Woodhouse             break; /* No configs left; stop asking */
394d3bad7e7SCédric Le Goater         }
395d3bad7e7SCédric Le Goater     }
396d3bad7e7SCédric Le Goater 
397621845a9SCédric Le Goater     object_property_set_int(OBJECT(bmc->soc), "hw-strap1", bmc->hw_strap1,
39887e79af0SAndrew Jeffery                             &error_abort);
3993c392e87SPhilippe Mathieu-Daudé     object_property_set_int(OBJECT(bmc->soc), "hw-strap2", amc->hw_strap2,
400ccc2c418SCédric Le Goater                             &error_abort);
4013c392e87SPhilippe Mathieu-Daudé     object_property_set_link(OBJECT(bmc->soc), "memory",
4024dd9d554SPeter Delevoryas                              OBJECT(get_system_memory()), &error_abort);
4033c392e87SPhilippe Mathieu-Daudé     object_property_set_link(OBJECT(bmc->soc), "dram",
4040df2d9a6SCédric Le Goater                              OBJECT(machine->ram), &error_abort);
405b6e70d1dSJoel Stanley     if (machine->kernel_filename) {
406b6e70d1dSJoel Stanley         /*
407b6e70d1dSJoel Stanley          * When booting with a -kernel command line there is no u-boot
408b6e70d1dSJoel Stanley          * that runs to unlock the SCU. In this case set the default to
409b6e70d1dSJoel Stanley          * be unlocked as the kernel expects
410b6e70d1dSJoel Stanley          */
4113c392e87SPhilippe Mathieu-Daudé         object_property_set_int(OBJECT(bmc->soc), "hw-prot-key",
4125325cc34SMarkus Armbruster                                 ASPEED_SCU_PROT_KEY, &error_abort);
413b6e70d1dSJoel Stanley     }
414d2b3eaefSPeter Delevoryas     connect_serial_hds_to_uarts(bmc);
4153c392e87SPhilippe Mathieu-Daudé     qdev_realize(DEVICE(bmc->soc), NULL, &error_abort);
416327d8e4eSAndrew Jeffery 
417c7e313aeSCédric Le Goater     if (defaults_enabled()) {
4183c392e87SPhilippe Mathieu-Daudé         aspeed_board_init_flashes(&bmc->soc->fmc,
4198ec239f2SMarkus Armbruster                               bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
4209bd4ac61SCédric Le Goater                               amc->num_cs, 0);
4213c392e87SPhilippe Mathieu-Daudé         aspeed_board_init_flashes(&bmc->soc->spi[0],
4228ec239f2SMarkus Armbruster                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
4239bd4ac61SCédric Le Goater                               1, amc->num_cs);
424c7e313aeSCédric Le Goater     }
425e1ad9bc4SCédric Le Goater 
426b7f1a0cbSCédric Le Goater     if (machine->kernel_filename && sc->num_cpus > 1) {
4279bb6d140SJoel Stanley         /* With no u-boot we must set up a boot stub for the secondary CPU */
4289bb6d140SJoel Stanley         MemoryRegion *smpboot = g_new(MemoryRegion, 1);
429f489960dSPhilippe Mathieu-Daudé         memory_region_init_ram(smpboot, NULL, "aspeed.smpboot",
4309bb6d140SJoel Stanley                                0x80, &error_abort);
4319bb6d140SJoel Stanley         memory_region_add_subregion(get_system_memory(),
4329bb6d140SJoel Stanley                                     AST_SMP_MAILBOX_BASE, smpboot);
4339bb6d140SJoel Stanley 
4349bb6d140SJoel Stanley         aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot;
4359bb6d140SJoel Stanley         aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary;
4369bb6d140SJoel Stanley         aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE;
4379bb6d140SJoel Stanley     }
4389bb6d140SJoel Stanley 
4396e504a98SPaolo Bonzini     aspeed_board_binfo.ram_size = machine->ram_size;
440347df6f8SEduardo Habkost     aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM];
441b033271fSCédric Le Goater 
442baa4732bSCédric Le Goater     if (amc->i2c_init) {
443baa4732bSCédric Le Goater         amc->i2c_init(bmc);
4442cf6cb50SCédric Le Goater     }
4452cf6cb50SCédric Le Goater 
4463c392e87SPhilippe Mathieu-Daudé     for (i = 0; i < bmc->soc->sdhci.num_slots; i++) {
4473c392e87SPhilippe Mathieu-Daudé         sdhci_attach_drive(&bmc->soc->sdhci.slots[i],
448e554e45bSCédric Le Goater                            drive_get(IF_SD, 0, i), false, false);
449a29e3e12SAndrew Jeffery     }
4502bea128cSEddie James 
451e554e45bSCédric Le Goater     boot_emmc = sc->boot_from_emmc(bmc->soc);
452e554e45bSCédric Le Goater 
4533c392e87SPhilippe Mathieu-Daudé     if (bmc->soc->emmc.num_slots) {
454255aed81SCédric Le Goater         emmc0 = drive_get(IF_SD, 0, bmc->soc->sdhci.num_slots);
455e554e45bSCédric Le Goater         sdhci_attach_drive(&bmc->soc->emmc.slots[0], emmc0, true, boot_emmc);
4562bea128cSEddie James     }
4572bea128cSEddie James 
4588b744a6aSCédric Le Goater     if (!bmc->mmio_exec) {
4593c392e87SPhilippe Mathieu-Daudé         DeviceState *dev = ssi_get_cs(bmc->soc->fmc.spi, 0);
4608285490bSCédric Le Goater         BlockBackend *fmc0 = dev ? m25p80_get_blk(dev) : NULL;
4618b744a6aSCédric Le Goater 
462e554e45bSCédric Le Goater         if (fmc0 && !boot_emmc) {
4633c392e87SPhilippe Mathieu-Daudé             uint64_t rom_size = memory_region_size(&bmc->soc->spi_boot);
4648285490bSCédric Le Goater             aspeed_install_boot_rom(bmc, fmc0, rom_size);
465255aed81SCédric Le Goater         } else if (emmc0) {
466255aed81SCédric Le Goater             aspeed_install_boot_rom(bmc, blk_by_legacy_dinfo(emmc0), 64 * KiB);
4678b744a6aSCédric Le Goater         }
4688b744a6aSCédric Le Goater     }
4698b744a6aSCédric Le Goater 
4702744ece8STao Xu     arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo);
471327d8e4eSAndrew Jeffery }
472327d8e4eSAndrew Jeffery 
473612b219aSPhilippe Mathieu-Daudé static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
4742cf6cb50SCédric Le Goater {
4753c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
476a87e81b9SCédric Le Goater     DeviceState *dev;
4773d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
4782cf6cb50SCédric Le Goater 
4792cf6cb50SCédric Le Goater     /* The palmetto platform expects a ds3231 RTC but a ds1338 is
4802cf6cb50SCédric Le Goater      * enough to provide basic RTC features. Alarms will be missing */
4811373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
482a87e81b9SCédric Le Goater 
4837a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
4843d165f12SCédric Le Goater                           eeprom_buf);
4853d165f12SCédric Le Goater 
486a87e81b9SCédric Le Goater     /* add a TMP423 temperature sensor */
4871373b15bSPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
4881373b15bSPhilippe Mathieu-Daudé                                          "tmp423", 0x4c));
4895325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
4905325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
4915325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
4925325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort);
4932cf6cb50SCédric Le Goater }
4942cf6cb50SCédric Le Goater 
4959cccb912SPatrick Venture static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc)
4969cccb912SPatrick Venture {
4973c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
4989cccb912SPatrick Venture 
4999cccb912SPatrick Venture     /*
5009cccb912SPatrick Venture      * The quanta-q71l platform expects tmp75s which are compatible with
5019cccb912SPatrick Venture      * tmp105s.
5029cccb912SPatrick Venture      */
5039cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c);
5049cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e);
5059cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f);
5069cccb912SPatrick Venture 
5079cccb912SPatrick Venture     /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */
5089cccb912SPatrick Venture     /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */
5099cccb912SPatrick Venture     /* TODO: Add Memory Riser i2c mux and eeproms. */
5109cccb912SPatrick Venture 
5113ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74);
5123ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77);
5133ec75e39SPatrick Venture 
5149cccb912SPatrick Venture     /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */
5153ec75e39SPatrick Venture 
5163ec75e39SPatrick Venture     /* i2c-7 */
5173ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70);
5189cccb912SPatrick Venture     /*        - i2c@0: pmbus@59 */
5199cccb912SPatrick Venture     /*        - i2c@1: pmbus@58 */
5209cccb912SPatrick Venture     /*        - i2c@2: pmbus@58 */
5219cccb912SPatrick Venture     /*        - i2c@3: pmbus@59 */
5223ec75e39SPatrick Venture 
5239cccb912SPatrick Venture     /* TODO: i2c-7: Add PDB FRU eeprom@52 */
5249cccb912SPatrick Venture     /* TODO: i2c-8: Add BMC FRU eeprom@50 */
5259cccb912SPatrick Venture }
5269cccb912SPatrick Venture 
527612b219aSPhilippe Mathieu-Daudé static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
5282cf6cb50SCédric Le Goater {
5293c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
5303d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
5313d165f12SCédric Le Goater 
5327a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50,
5333d165f12SCédric Le Goater                           eeprom_buf);
5342cf6cb50SCédric Le Goater 
5352cf6cb50SCédric Le Goater     /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
5361373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
537044475f3SPhilippe Mathieu-Daudé                      TYPE_TMP105, 0x4d);
5382cf6cb50SCédric Le Goater }
5392cf6cb50SCédric Le Goater 
540612b219aSPhilippe Mathieu-Daudé static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
541ccc2c418SCédric Le Goater {
5423c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
54352bcd997SHoward Chiu     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
54452bcd997SHoward Chiu 
54552bcd997SHoward Chiu     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50,
54652bcd997SHoward Chiu                           eeprom_buf);
54752bcd997SHoward Chiu 
54852bcd997SHoward Chiu     /* LM75 is compatible with TMP105 driver */
54952bcd997SHoward Chiu     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
55052bcd997SHoward Chiu                      TYPE_TMP105, 0x4d);
551ccc2c418SCédric Le Goater }
552ccc2c418SCédric Le Goater 
55334f73a81SKarthikeyan Pasupathi static void yosemitev2_bmc_i2c_init(AspeedMachineState *bmc)
55434f73a81SKarthikeyan Pasupathi {
5553c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
55634f73a81SKarthikeyan Pasupathi 
55734f73a81SKarthikeyan Pasupathi     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x51, 128 * KiB);
55834f73a81SKarthikeyan Pasupathi     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 128 * KiB,
55934f73a81SKarthikeyan Pasupathi                           yosemitev2_bmc_fruid, yosemitev2_bmc_fruid_len);
5600a1f86baSKarthikeyan Pasupathi     /* TMP421 */
5610a1f86baSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "tmp421", 0x1f);
5620a1f86baSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4e);
5630a1f86baSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4f);
5640a1f86baSKarthikeyan Pasupathi 
56534f73a81SKarthikeyan Pasupathi }
56634f73a81SKarthikeyan Pasupathi 
567612b219aSPhilippe Mathieu-Daudé static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
5686c4567c7SCédric Le Goater {
5693c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
5706c4567c7SCédric Le Goater 
5716c4567c7SCédric Le Goater     /* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
5726c4567c7SCédric Le Goater      * good enough */
5731373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
5746c4567c7SCédric Le Goater }
5756c4567c7SCédric Le Goater 
5766c323abaSKarthikeyan Pasupathi static void tiogapass_bmc_i2c_init(AspeedMachineState *bmc)
5776c323abaSKarthikeyan Pasupathi {
5783c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
5796c323abaSKarthikeyan Pasupathi 
5806c323abaSKarthikeyan Pasupathi     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 128 * KiB);
5816c323abaSKarthikeyan Pasupathi     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 6), 0x54, 128 * KiB,
5826c323abaSKarthikeyan Pasupathi                           tiogapass_bmc_fruid, tiogapass_bmc_fruid_len);
583a09d357dSKarthikeyan Pasupathi     /* TMP421 */
584a09d357dSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "tmp421", 0x1f);
585a09d357dSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4f);
586a09d357dSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4e);
5876c323abaSKarthikeyan Pasupathi }
5886c323abaSKarthikeyan Pasupathi 
589f4aec252SCédric Le Goater static void create_pca9552(AspeedSoCState *soc, int bus_id, int addr)
590f4aec252SCédric Le Goater {
591f4aec252SCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, bus_id),
592f4aec252SCédric Le Goater                             TYPE_PCA9552, addr);
593f4aec252SCédric Le Goater }
594f4aec252SCédric Le Goater 
595612b219aSPhilippe Mathieu-Daudé static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc)
596143b040fSPatrick Williams {
5973c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
598143b040fSPatrick Williams 
599143b040fSPatrick Williams     /* bus 2 : */
6001373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48);
6011373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49);
602143b040fSPatrick Williams     /* bus 2 : pca9546 @ 0x73 */
603143b040fSPatrick Williams 
604143b040fSPatrick Williams     /* bus 3 : pca9548 @ 0x70 */
605143b040fSPatrick Williams 
606143b040fSPatrick Williams     /* bus 4 : */
607143b040fSPatrick Williams     uint8_t *eeprom4_54 = g_malloc0(8 * 1024);
6087a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54,
609143b040fSPatrick Williams                           eeprom4_54);
610143b040fSPatrick Williams     /* PCA9539 @ 0x76, but PCA9552 is compatible */
611f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x76);
612143b040fSPatrick Williams     /* PCA9539 @ 0x77, but PCA9552 is compatible */
613f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x77);
614143b040fSPatrick Williams 
615143b040fSPatrick Williams     /* bus 6 : */
6161373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48);
6171373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49);
618143b040fSPatrick Williams     /* bus 6 : pca9546 @ 0x73 */
619143b040fSPatrick Williams 
620143b040fSPatrick Williams     /* bus 8 : */
621143b040fSPatrick Williams     uint8_t *eeprom8_56 = g_malloc0(8 * 1024);
6227a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56,
623143b040fSPatrick Williams                           eeprom8_56);
624f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x60);
625f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x61);
626143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1d */
627143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1f */
628143b040fSPatrick Williams 
629143b040fSPatrick Williams     /*
630143b040fSPatrick Williams      * bus 13 : pca9548 @ 0x71
631143b040fSPatrick Williams      *      - channel 3:
632143b040fSPatrick Williams      *          - tmm421 @ 0x4c
633143b040fSPatrick Williams      *          - tmp421 @ 0x4e
634143b040fSPatrick Williams      *          - tmp421 @ 0x4f
635143b040fSPatrick Williams      */
636143b040fSPatrick Williams 
637143b040fSPatrick Williams }
638143b040fSPatrick Williams 
639612b219aSPhilippe Mathieu-Daudé static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
64062c2c2ebSCédric Le Goater {
6417cfbde5eSPhilippe Mathieu-Daudé     static const struct {
6427cfbde5eSPhilippe Mathieu-Daudé         unsigned gpio_id;
6437cfbde5eSPhilippe Mathieu-Daudé         LEDColor color;
6447cfbde5eSPhilippe Mathieu-Daudé         const char *description;
6457cfbde5eSPhilippe Mathieu-Daudé         bool gpio_polarity;
6467cfbde5eSPhilippe Mathieu-Daudé     } pca1_leds[] = {
6477cfbde5eSPhilippe Mathieu-Daudé         {13, LED_COLOR_GREEN, "front-fault-4",  GPIO_POLARITY_ACTIVE_LOW},
6487cfbde5eSPhilippe Mathieu-Daudé         {14, LED_COLOR_GREEN, "front-power-3",  GPIO_POLARITY_ACTIVE_LOW},
6497cfbde5eSPhilippe Mathieu-Daudé         {15, LED_COLOR_GREEN, "front-id-5",     GPIO_POLARITY_ACTIVE_LOW},
6507cfbde5eSPhilippe Mathieu-Daudé     };
6513c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
6523d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
65315ce12cfSPhilippe Mathieu-Daudé     DeviceState *dev;
6547cfbde5eSPhilippe Mathieu-Daudé     LEDState *led;
65562c2c2ebSCédric Le Goater 
65663ceb818SCédric Le Goater     /* Bus 3: TODO bmp280@77 */
657db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
65815ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca1");
6592616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
6602616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 3),
66115ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
6628c9a61d7SCédric Le Goater 
6637cfbde5eSPhilippe Mathieu-Daudé     for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) {
6647cfbde5eSPhilippe Mathieu-Daudé         led = led_create_simple(OBJECT(bmc),
6657cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].gpio_polarity,
6667cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].color,
6677cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].description);
6687cfbde5eSPhilippe Mathieu-Daudé         qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id,
6697cfbde5eSPhilippe Mathieu-Daudé                               qdev_get_gpio_in(DEVICE(led), 0));
6707cfbde5eSPhilippe Mathieu-Daudé     }
671b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76);
6722a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "max31785", 0x52);
6731373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c);
6741373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c);
67562c2c2ebSCédric Le Goater 
67662c2c2ebSCédric Le Goater     /* The Witherspoon expects a TMP275 but a TMP105 is compatible */
6771373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105,
678044475f3SPhilippe Mathieu-Daudé                      0x4a);
6796c4567c7SCédric Le Goater 
6806c4567c7SCédric Le Goater     /* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
6816c4567c7SCédric Le Goater      * good enough */
6821373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
6833d165f12SCédric Le Goater 
6847a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51,
6853d165f12SCédric Le Goater                           eeprom_buf);
686db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
68715ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca0");
6882616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
6892616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 11),
69015ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
69163ceb818SCédric Le Goater     /* Bus 11: TODO ucd90160@64 */
69262c2c2ebSCédric Le Goater }
69362c2c2ebSCédric Le Goater 
69495f068c8SJohn Wang static void g220a_bmc_i2c_init(AspeedMachineState *bmc)
69595f068c8SJohn Wang {
6963c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
69795f068c8SJohn Wang     DeviceState *dev;
69895f068c8SJohn Wang 
69995f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3),
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);
70495f068c8SJohn Wang 
70595f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12),
70695f068c8SJohn Wang                                          "emc1413", 0x4c));
70795f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
70895f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
70995f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
71095f068c8SJohn Wang 
71195f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13),
71295f068c8SJohn Wang                                          "emc1413", 0x4c));
71395f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
71495f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
71595f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
7166f5f6507SJohn Wang 
7176f5f6507SJohn Wang     static uint8_t eeprom_buf[2 * 1024] = {
7186f5f6507SJohn Wang             0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe,
7196f5f6507SJohn Wang             0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65,
7206f5f6507SJohn Wang             0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32,
7216f5f6507SJohn Wang             0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42,
7226f5f6507SJohn Wang             0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45,
7236f5f6507SJohn Wang             0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1,
7246f5f6507SJohn Wang             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7,
7256f5f6507SJohn Wang     };
7266f5f6507SJohn Wang     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57,
7276f5f6507SJohn Wang                           eeprom_buf);
72895f068c8SJohn Wang }
72995f068c8SJohn Wang 
73082b6a3f6SJohn Wang static void fp5280g2_bmc_i2c_init(AspeedMachineState *bmc)
73182b6a3f6SJohn Wang {
7323c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
73382b6a3f6SJohn Wang     I2CSlave *i2c_mux;
73482b6a3f6SJohn Wang 
73582b6a3f6SJohn Wang     /* The at24c256 */
73682b6a3f6SJohn Wang     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 1), 0x50, 32768);
73782b6a3f6SJohn Wang 
73882b6a3f6SJohn Wang     /* The fp5280g2 expects a TMP112 but a TMP105 is compatible */
73982b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
74082b6a3f6SJohn Wang                      0x48);
74182b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
74282b6a3f6SJohn Wang                      0x49);
74382b6a3f6SJohn Wang 
74482b6a3f6SJohn Wang     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
74582b6a3f6SJohn Wang                      "pca9546", 0x70);
74682b6a3f6SJohn Wang     /* It expects a TMP112 but a TMP105 is compatible */
74782b6a3f6SJohn Wang     i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0), TYPE_TMP105,
74882b6a3f6SJohn Wang                      0x4a);
74982b6a3f6SJohn Wang 
75082b6a3f6SJohn Wang     /* It expects a ds3232 but a ds1338 is good enough */
75182b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "ds1338", 0x68);
75282b6a3f6SJohn Wang 
75382b6a3f6SJohn Wang     /* It expects a pca9555 but a pca9552 is compatible */
754f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x30);
75582b6a3f6SJohn Wang }
75682b6a3f6SJohn Wang 
75758e52bdbSCédric Le Goater static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
75858e52bdbSCédric Le Goater {
7593c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
760fa6d98c0SJoel Stanley     I2CSlave *i2c_mux;
761fa6d98c0SJoel Stanley 
7629077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB);
76358e52bdbSCédric Le Goater 
764f4aec252SCédric Le Goater     create_pca9552(soc, 3, 0x61);
765bcb122f8SJoel Stanley 
76658e52bdbSCédric Le Goater     /* The rainier expects a TMP275 but a TMP105 is compatible */
76758e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
76858e52bdbSCédric Le Goater                      0x48);
76958e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
77058e52bdbSCédric Le Goater                      0x49);
77158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
77258e52bdbSCédric Le Goater                      0x4a);
773fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4),
774fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
7759077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
7769077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
7779077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB);
778f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x60);
77958e52bdbSCédric Le Goater 
78058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
78158e52bdbSCédric Le Goater                      0x48);
78258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
78358e52bdbSCédric Le Goater                      0x49);
784f4aec252SCédric Le Goater     create_pca9552(soc, 5, 0x60);
785f4aec252SCédric Le Goater     create_pca9552(soc, 5, 0x61);
786fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5),
787fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
7889077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
7899077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
79058e52bdbSCédric Le Goater 
79158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
79258e52bdbSCédric Le Goater                      0x48);
79358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
79458e52bdbSCédric Le Goater                      0x4a);
79558e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
79658e52bdbSCédric Le Goater                      0x4b);
797fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6),
798fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
7999077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
8009077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
8019077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB);
8029077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB);
80358e52bdbSCédric Le Goater 
804f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x30);
805f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x31);
806f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x32);
807f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x33);
808f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x60);
809f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x61);
810b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76);
81158e52bdbSCédric Le Goater     /* Bus 7: TODO si7021-a20@20 */
81258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105,
81358e52bdbSCédric Le Goater                      0x48);
8142a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "max31785", 0x52);
8159077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB);
8169077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB);
81758e52bdbSCédric Le Goater 
81858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
81958e52bdbSCédric Le Goater                      0x48);
82058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
82158e52bdbSCédric Le Goater                      0x4a);
822be85508fSNinad Palsule     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50,
823be85508fSNinad Palsule                           64 * KiB, rainier_bb_fruid, rainier_bb_fruid_len);
824be85508fSNinad Palsule     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51,
825be85508fSNinad Palsule                           64 * KiB, rainier_bmc_fruid, rainier_bmc_fruid_len);
826f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x60);
827f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x61);
82858e52bdbSCédric Le Goater     /* Bus 8: ucd90320@11 */
82958e52bdbSCédric Le Goater     /* Bus 8: ucd90320@b */
83058e52bdbSCédric Le Goater     /* Bus 8: ucd90320@c */
83158e52bdbSCédric Le Goater 
83258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c);
83358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d);
8349077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB);
83558e52bdbSCédric Le Goater 
83658e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c);
83758e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d);
8389077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB);
83958e52bdbSCédric Le Goater 
84058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
84158e52bdbSCédric Le Goater                      0x48);
84258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
84358e52bdbSCédric Le Goater                      0x49);
844fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11),
845fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
8469077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
8479077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
848f4aec252SCédric Le Goater     create_pca9552(soc, 11, 0x60);
849fa6d98c0SJoel Stanley 
850fa6d98c0SJoel Stanley 
8519077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB);
852f4aec252SCédric Le Goater     create_pca9552(soc, 13, 0x60);
853fa6d98c0SJoel Stanley 
8549077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB);
855f4aec252SCédric Le Goater     create_pca9552(soc, 14, 0x60);
856fa6d98c0SJoel Stanley 
8579077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB);
858f4aec252SCédric Le Goater     create_pca9552(soc, 15, 0x60);
85958e52bdbSCédric Le Goater }
86058e52bdbSCédric Le Goater 
861febbe308SPeter Delevoryas static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr,
862febbe308SPeter Delevoryas                                  I2CBus **channels)
863febbe308SPeter Delevoryas {
864febbe308SPeter Delevoryas     I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr);
865febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
866febbe308SPeter Delevoryas         channels[i] = pca954x_i2c_get_bus(mux, i);
867febbe308SPeter Delevoryas     }
868febbe308SPeter Delevoryas }
869febbe308SPeter Delevoryas 
870febbe308SPeter Delevoryas #define TYPE_LM75 TYPE_TMP105
871febbe308SPeter Delevoryas #define TYPE_TMP75 TYPE_TMP105
872febbe308SPeter Delevoryas #define TYPE_TMP422 "tmp422"
873febbe308SPeter Delevoryas 
874febbe308SPeter Delevoryas static void fuji_bmc_i2c_init(AspeedMachineState *bmc)
875febbe308SPeter Delevoryas {
8763c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
877febbe308SPeter Delevoryas     I2CBus *i2c[144] = {};
878febbe308SPeter Delevoryas 
879febbe308SPeter Delevoryas     for (int i = 0; i < 16; i++) {
880febbe308SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
881febbe308SPeter Delevoryas     }
882febbe308SPeter Delevoryas     I2CBus *i2c180 = i2c[2];
883febbe308SPeter Delevoryas     I2CBus *i2c480 = i2c[8];
884febbe308SPeter Delevoryas     I2CBus *i2c600 = i2c[11];
885febbe308SPeter Delevoryas 
886febbe308SPeter Delevoryas     get_pca9548_channels(i2c180, 0x70, &i2c[16]);
887febbe308SPeter Delevoryas     get_pca9548_channels(i2c480, 0x70, &i2c[24]);
888febbe308SPeter Delevoryas     /* NOTE: The device tree skips [32, 40) in the alias numbering */
889febbe308SPeter Delevoryas     get_pca9548_channels(i2c600, 0x77, &i2c[40]);
890febbe308SPeter Delevoryas     get_pca9548_channels(i2c[24], 0x71, &i2c[48]);
891febbe308SPeter Delevoryas     get_pca9548_channels(i2c[25], 0x72, &i2c[56]);
892febbe308SPeter Delevoryas     get_pca9548_channels(i2c[26], 0x76, &i2c[64]);
893febbe308SPeter Delevoryas     get_pca9548_channels(i2c[27], 0x76, &i2c[72]);
894febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
895febbe308SPeter Delevoryas         get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]);
896febbe308SPeter Delevoryas     }
897febbe308SPeter Delevoryas 
898febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c);
899febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d);
900febbe308SPeter Delevoryas 
901ef0eb67eSSittisak Sinprem     /*
902ef0eb67eSSittisak Sinprem      * EEPROM 24c64 size is 64Kbits or 8 Kbytes
903ef0eb67eSSittisak Sinprem      *        24c02 size is 2Kbits or 256 bytes
904ef0eb67eSSittisak Sinprem      */
905ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[19], 0x52, 8 * KiB);
906ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[20], 0x50, 256);
907ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[22], 0x52, 256);
908febbe308SPeter Delevoryas 
909febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x48);
910febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x49);
911febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x4a);
912febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_TMP422, 0x4c);
913febbe308SPeter Delevoryas 
914ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[8], 0x51, 8 * KiB);
915febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a);
916febbe308SPeter Delevoryas 
917febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[50], TYPE_LM75, 0x4c);
918ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[50], 0x52, 8 * KiB);
919febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[51], TYPE_TMP75, 0x48);
920febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[52], TYPE_TMP75, 0x49);
921febbe308SPeter Delevoryas 
922febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[59], TYPE_TMP75, 0x48);
923febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[60], TYPE_TMP75, 0x49);
924febbe308SPeter Delevoryas 
925ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[65], 0x53, 8 * KiB);
926febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x49);
927febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x48);
928ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[68], 0x52, 8 * KiB);
929ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[69], 0x52, 8 * KiB);
930ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[70], 0x52, 8 * KiB);
931ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[71], 0x52, 8 * KiB);
932febbe308SPeter Delevoryas 
933ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[73], 0x53, 8 * KiB);
934febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x49);
935febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x48);
936ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[76], 0x52, 8 * KiB);
937ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[77], 0x52, 8 * KiB);
938ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[78], 0x52, 8 * KiB);
939ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[79], 0x52, 8 * KiB);
940ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[28], 0x50, 256);
941febbe308SPeter Delevoryas 
942febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
9439077e09aSPeter Delevoryas         at24c_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB);
944febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[82 + i * 8], TYPE_TMP75, 0x48);
945febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[83 + i * 8], TYPE_TMP75, 0x4b);
946febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[84 + i * 8], TYPE_TMP75, 0x4a);
947febbe308SPeter Delevoryas     }
948febbe308SPeter Delevoryas }
949febbe308SPeter Delevoryas 
950a20c54b1SPatrick Williams #define TYPE_TMP421 "tmp421"
951a20c54b1SPatrick Williams 
952a20c54b1SPatrick Williams static void bletchley_bmc_i2c_init(AspeedMachineState *bmc)
953a20c54b1SPatrick Williams {
9543c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
955a20c54b1SPatrick Williams     I2CBus *i2c[13] = {};
956a20c54b1SPatrick Williams     for (int i = 0; i < 13; i++) {
957a20c54b1SPatrick Williams         if ((i == 8) || (i == 11)) {
958a20c54b1SPatrick Williams             continue;
959a20c54b1SPatrick Williams         }
960a20c54b1SPatrick Williams         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
961a20c54b1SPatrick Williams     }
962a20c54b1SPatrick Williams 
963a20c54b1SPatrick Williams     /* Bus 0 - 5 all have the same config. */
964a20c54b1SPatrick Williams     for (int i = 0; i < 6; i++) {
965a20c54b1SPatrick Williams         /* Missing model: ti,ina230 @ 0x45 */
966a20c54b1SPatrick Williams         /* Missing model: mps,mp5023 @ 0x40 */
967a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_TMP421, 0x4f);
968a20c54b1SPatrick Williams         /* Missing model: nxp,pca9539 @ 0x76, but PCA9552 works enough */
969a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x76);
970a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x67);
971a20c54b1SPatrick Williams         /* Missing model: fsc,fusb302 @ 0x22 */
972a20c54b1SPatrick Williams     }
973a20c54b1SPatrick Williams 
974a20c54b1SPatrick Williams     /* Bus 6 */
975a20c54b1SPatrick Williams     at24c_eeprom_init(i2c[6], 0x56, 65536);
976a20c54b1SPatrick Williams     /* Missing model: nxp,pcf85263 @ 0x51 , but ds1338 works enough */
977a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[6], "ds1338", 0x51);
978a20c54b1SPatrick Williams 
979a20c54b1SPatrick Williams 
980a20c54b1SPatrick Williams     /* Bus 7 */
981a20c54b1SPatrick Williams     at24c_eeprom_init(i2c[7], 0x54, 65536);
982a20c54b1SPatrick Williams 
983a20c54b1SPatrick Williams     /* Bus 9 */
984a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[9], TYPE_TMP421, 0x4f);
985a20c54b1SPatrick Williams 
986a20c54b1SPatrick Williams     /* Bus 10 */
987a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[10], TYPE_TMP421, 0x4f);
988a20c54b1SPatrick Williams     /* Missing model: ti,hdc1080 @ 0x40 */
989a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[10], TYPE_PCA9552, 0x67);
990a20c54b1SPatrick Williams 
991a20c54b1SPatrick Williams     /* Bus 12 */
992a20c54b1SPatrick Williams     /* Missing model: adi,adm1278 @ 0x11 */
993a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4c);
994a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4d);
995a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_PCA9552, 0x67);
996a20c54b1SPatrick Williams }
997a20c54b1SPatrick Williams 
998fa699e80SPeter Delevoryas static void fby35_i2c_init(AspeedMachineState *bmc)
999fa699e80SPeter Delevoryas {
10003c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
1001fa699e80SPeter Delevoryas     I2CBus *i2c[16];
1002fa699e80SPeter Delevoryas 
1003fa699e80SPeter Delevoryas     for (int i = 0; i < 16; i++) {
1004fa699e80SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
1005fa699e80SPeter Delevoryas     }
1006fa699e80SPeter Delevoryas 
1007fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[2], TYPE_LM75, 0x4f);
1008fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_TMP421, 0x1f);
1009fa699e80SPeter Delevoryas     /* Hotswap controller is actually supposed to be mp5920 or ltc4282. */
1010fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[11], "adm1272", 0x44);
1011fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4e);
1012fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4f);
1013fa699e80SPeter Delevoryas 
10149077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[4], 0x51, 128 * KiB);
10159077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[6], 0x51, 128 * KiB);
1016c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[8], 0x50, 32 * KiB, fby35_nic_fruid,
1017c0216b94SPeter Delevoryas                           fby35_nic_fruid_len);
1018c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[11], 0x51, 128 * KiB, fby35_bb_fruid,
1019c0216b94SPeter Delevoryas                           fby35_bb_fruid_len);
1020c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[11], 0x54, 128 * KiB, fby35_bmc_fruid,
1021c0216b94SPeter Delevoryas                           fby35_bmc_fruid_len);
1022fa699e80SPeter Delevoryas 
1023fa699e80SPeter Delevoryas     /*
1024fa699e80SPeter Delevoryas      * TODO: There is a multi-master i2c connection to an AST1030 MiniBMC on
1025fa699e80SPeter Delevoryas      * buses 0, 1, 2, 3, and 9. Source address 0x10, target address 0x20 on
1026fa699e80SPeter Delevoryas      * each.
1027fa699e80SPeter Delevoryas      */
1028fa699e80SPeter Delevoryas }
1029fa699e80SPeter Delevoryas 
1030fb6b3c8dSJae Hyun Yoo static void qcom_dc_scm_bmc_i2c_init(AspeedMachineState *bmc)
1031fb6b3c8dSJae Hyun Yoo {
10323c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
1033fb6b3c8dSJae Hyun Yoo 
1034fb6b3c8dSJae Hyun Yoo     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 15), "tmp105", 0x4d);
1035fb6b3c8dSJae Hyun Yoo }
1036fb6b3c8dSJae Hyun Yoo 
1037ece4cccdSGraeme Gregory static void qcom_dc_scm_firework_i2c_init(AspeedMachineState *bmc)
1038ece4cccdSGraeme Gregory {
10393c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
10402a7a5d5cSJae Hyun Yoo     I2CSlave *therm_mux, *cpuvr_mux;
1041ece4cccdSGraeme Gregory 
1042ece4cccdSGraeme Gregory     /* Create the generic DC-SCM hardware */
1043ece4cccdSGraeme Gregory     qcom_dc_scm_bmc_i2c_init(bmc);
1044ece4cccdSGraeme Gregory 
1045ece4cccdSGraeme Gregory     /* Now create the Firework specific hardware */
10462a75e8c3SMaheswara Kurapati 
10472a7a5d5cSJae Hyun Yoo     /* I2C7 CPUVR MUX */
10482a7a5d5cSJae Hyun Yoo     cpuvr_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
10492a7a5d5cSJae Hyun Yoo                                         "pca9546", 0x70);
10502a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 0), "pca9548", 0x72);
10512a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 1), "pca9548", 0x72);
10522a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 2), "pca9548", 0x72);
10532a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 3), "pca9548", 0x72);
10542a7a5d5cSJae Hyun Yoo 
1055cfc68f16SMaheswara Kurapati     /* I2C8 Thermal Diodes*/
1056cfc68f16SMaheswara Kurapati     therm_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
1057cfc68f16SMaheswara Kurapati                                         "pca9548", 0x70);
1058cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 0), TYPE_LM75, 0x4C);
1059cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 1), TYPE_LM75, 0x4C);
1060cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 2), TYPE_LM75, 0x48);
1061cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 3), TYPE_LM75, 0x48);
1062cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 4), TYPE_LM75, 0x48);
1063cfc68f16SMaheswara Kurapati 
10642a75e8c3SMaheswara Kurapati     /* I2C9 Fan Controller (MAX31785) */
10652a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x52);
10662a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x54);
1067ece4cccdSGraeme Gregory }
1068ece4cccdSGraeme Gregory 
10691a15311aSCédric Le Goater static bool aspeed_get_mmio_exec(Object *obj, Error **errp)
10701a15311aSCédric Le Goater {
10711a15311aSCédric Le Goater     return ASPEED_MACHINE(obj)->mmio_exec;
10721a15311aSCédric Le Goater }
10731a15311aSCédric Le Goater 
10741a15311aSCédric Le Goater static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp)
10751a15311aSCédric Le Goater {
10761a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = value;
10771a15311aSCédric Le Goater }
10781a15311aSCédric Le Goater 
10791a15311aSCédric Le Goater static void aspeed_machine_instance_init(Object *obj)
10801a15311aSCédric Le Goater {
1081621845a9SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(obj);
1082621845a9SCédric Le Goater 
10831a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = false;
1084621845a9SCédric Le Goater     ASPEED_MACHINE(obj)->hw_strap1 = amc->hw_strap1;
10851a15311aSCédric Le Goater }
10861a15311aSCédric Le Goater 
10879820e52fSCédric Le Goater static char *aspeed_get_fmc_model(Object *obj, Error **errp)
10889820e52fSCédric Le Goater {
10899820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10909820e52fSCédric Le Goater     return g_strdup(bmc->fmc_model);
10919820e52fSCédric Le Goater }
10929820e52fSCédric Le Goater 
10939820e52fSCédric Le Goater static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp)
10949820e52fSCédric Le Goater {
10959820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10969820e52fSCédric Le Goater 
10979820e52fSCédric Le Goater     g_free(bmc->fmc_model);
10989820e52fSCédric Le Goater     bmc->fmc_model = g_strdup(value);
10999820e52fSCédric Le Goater }
11009820e52fSCédric Le Goater 
11019820e52fSCédric Le Goater static char *aspeed_get_spi_model(Object *obj, Error **errp)
11029820e52fSCédric Le Goater {
11039820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
11049820e52fSCédric Le Goater     return g_strdup(bmc->spi_model);
11059820e52fSCédric Le Goater }
11069820e52fSCédric Le Goater 
11079820e52fSCédric Le Goater static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp)
11089820e52fSCédric Le Goater {
11099820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
11109820e52fSCédric Le Goater 
11119820e52fSCédric Le Goater     g_free(bmc->spi_model);
11129820e52fSCédric Le Goater     bmc->spi_model = g_strdup(value);
11139820e52fSCédric Le Goater }
11149820e52fSCédric Le Goater 
1115f65f6ad5SCédric Le Goater static char *aspeed_get_bmc_console(Object *obj, Error **errp)
1116f65f6ad5SCédric Le Goater {
1117f65f6ad5SCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1118f65f6ad5SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
1119f65f6ad5SCédric Le Goater     int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default;
1120f65f6ad5SCédric Le Goater 
1121944128eeSJamin Lin     return g_strdup_printf("uart%d", aspeed_uart_index(uart_chosen));
1122f65f6ad5SCédric Le Goater }
1123f65f6ad5SCédric Le Goater 
1124f65f6ad5SCédric Le Goater static void aspeed_set_bmc_console(Object *obj, const char *value, Error **errp)
1125f65f6ad5SCédric Le Goater {
1126f65f6ad5SCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1127f65f6ad5SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
1128f65f6ad5SCédric Le Goater     AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(amc->soc_name));
1129f65f6ad5SCédric Le Goater     int val;
1130944128eeSJamin Lin     int uart_first = aspeed_uart_first(sc);
1131944128eeSJamin Lin     int uart_last = aspeed_uart_last(sc);
1132f65f6ad5SCédric Le Goater 
1133f65f6ad5SCédric Le Goater     if (sscanf(value, "uart%u", &val) != 1) {
1134f65f6ad5SCédric Le Goater         error_setg(errp, "Bad value for \"uart\" property");
1135f65f6ad5SCédric Le Goater         return;
1136f65f6ad5SCédric Le Goater     }
1137f65f6ad5SCédric Le Goater 
1138f65f6ad5SCédric Le Goater     /* The number of UART depends on the SoC */
1139944128eeSJamin Lin     if (val < uart_first || val > uart_last) {
1140944128eeSJamin Lin         error_setg(errp, "\"uart\" should be in range [%d - %d]",
1141944128eeSJamin Lin                    uart_first, uart_last);
1142f65f6ad5SCédric Le Goater         return;
1143f65f6ad5SCédric Le Goater     }
1144944128eeSJamin Lin     bmc->uart_chosen = val + ASPEED_DEV_UART0;
1145f65f6ad5SCédric Le Goater }
1146f65f6ad5SCédric Le Goater 
11471a15311aSCédric Le Goater static void aspeed_machine_class_props_init(ObjectClass *oc)
11481a15311aSCédric Le Goater {
11491a15311aSCédric Le Goater     object_class_property_add_bool(oc, "execute-in-place",
11501a15311aSCédric Le Goater                                    aspeed_get_mmio_exec,
1151d2623129SMarkus Armbruster                                    aspeed_set_mmio_exec);
11521a15311aSCédric Le Goater     object_class_property_set_description(oc, "execute-in-place",
11537eecec7dSMarkus Armbruster                            "boot directly from CE0 flash device");
11549820e52fSCédric Le Goater 
1155f65f6ad5SCédric Le Goater     object_class_property_add_str(oc, "bmc-console", aspeed_get_bmc_console,
1156f65f6ad5SCédric Le Goater                                   aspeed_set_bmc_console);
1157f65f6ad5SCédric Le Goater     object_class_property_set_description(oc, "bmc-console",
1158f65f6ad5SCédric Le Goater                            "Change the default UART to \"uartX\"");
1159f65f6ad5SCédric Le Goater 
11609820e52fSCédric Le Goater     object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model,
11619820e52fSCédric Le Goater                                    aspeed_set_fmc_model);
11629820e52fSCédric Le Goater     object_class_property_set_description(oc, "fmc-model",
11639820e52fSCédric Le Goater                                           "Change the FMC Flash model");
11649820e52fSCédric Le Goater     object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model,
11659820e52fSCédric Le Goater                                    aspeed_set_spi_model);
11669820e52fSCédric Le Goater     object_class_property_set_description(oc, "spi-model",
11679820e52fSCédric Le Goater                                           "Change the SPI Flash model");
11681a15311aSCédric Le Goater }
11691a15311aSCédric Le Goater 
117043a0a5c9SPhilippe Mathieu-Daudé static void aspeed_machine_class_init_cpus_defaults(MachineClass *mc)
1171b7f1a0cbSCédric Le Goater {
117243a0a5c9SPhilippe Mathieu-Daudé     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(mc);
117343a0a5c9SPhilippe Mathieu-Daudé     AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(amc->soc_name));
117443a0a5c9SPhilippe Mathieu-Daudé 
117543a0a5c9SPhilippe Mathieu-Daudé     mc->default_cpus = sc->num_cpus;
117643a0a5c9SPhilippe Mathieu-Daudé     mc->min_cpus = sc->num_cpus;
117743a0a5c9SPhilippe Mathieu-Daudé     mc->max_cpus = sc->num_cpus;
1178dc13909eSPhilippe Mathieu-Daudé     mc->valid_cpu_types = sc->valid_cpu_types;
1179b7f1a0cbSCédric Le Goater }
1180b7f1a0cbSCédric Le Goater 
1181*056b779eSCédric Le Goater static bool aspeed_machine_ast2600_get_boot_from_emmc(Object *obj, Error **errp)
1182*056b779eSCédric Le Goater {
1183*056b779eSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1184*056b779eSCédric Le Goater 
1185*056b779eSCédric Le Goater     return !!(bmc->hw_strap1 & SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC);
1186*056b779eSCédric Le Goater }
1187*056b779eSCédric Le Goater 
1188*056b779eSCédric Le Goater static void aspeed_machine_ast2600_set_boot_from_emmc(Object *obj, bool value,
1189*056b779eSCédric Le Goater                                                       Error **errp)
1190*056b779eSCédric Le Goater {
1191*056b779eSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1192*056b779eSCédric Le Goater 
1193*056b779eSCédric Le Goater     if (value) {
1194*056b779eSCédric Le Goater         bmc->hw_strap1 |= SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC;
1195*056b779eSCédric Le Goater     } else {
1196*056b779eSCédric Le Goater         bmc->hw_strap1 &= ~SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC;
1197*056b779eSCédric Le Goater     }
1198*056b779eSCédric Le Goater }
1199*056b779eSCédric Le Goater 
1200*056b779eSCédric Le Goater static void aspeed_machine_ast2600_class_emmc_init(ObjectClass *oc)
1201*056b779eSCédric Le Goater {
1202*056b779eSCédric Le Goater     object_class_property_add_bool(oc, "boot-emmc",
1203*056b779eSCédric Le Goater                                    aspeed_machine_ast2600_get_boot_from_emmc,
1204*056b779eSCédric Le Goater                                    aspeed_machine_ast2600_set_boot_from_emmc);
1205*056b779eSCédric Le Goater     object_class_property_set_description(oc, "boot-emmc",
1206*056b779eSCédric Le Goater                                           "Set or unset boot from EMMC");
1207*056b779eSCédric Le Goater }
1208*056b779eSCédric Le Goater 
1209fca9ca1bSCédric Le Goater static void aspeed_machine_class_init(ObjectClass *oc, void *data)
121062c2c2ebSCédric Le Goater {
121162c2c2ebSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1212d3bad7e7SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
121362c2c2ebSCédric Le Goater 
1214fca9ca1bSCédric Le Goater     mc->init = aspeed_machine_init;
121562c2c2ebSCédric Le Goater     mc->no_floppy = 1;
121662c2c2ebSCédric Le Goater     mc->no_cdrom = 1;
121762c2c2ebSCédric Le Goater     mc->no_parallel = 1;
1218afcbaed6SIgor Mammedov     mc->default_ram_id = "ram";
1219d3bad7e7SCédric Le Goater     amc->macs_mask = ASPEED_MAC0_ON;
12205d63d0c7SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART5;
12211a15311aSCédric Le Goater 
12221a15311aSCédric Le Goater     aspeed_machine_class_props_init(oc);
122362c2c2ebSCédric Le Goater }
122462c2c2ebSCédric Le Goater 
1225baa4732bSCédric Le Goater static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
1226baa4732bSCédric Le Goater {
1227baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1228baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1229baa4732bSCédric Le Goater 
1230baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Palmetto BMC (ARM926EJ-S)";
1231baa4732bSCédric Le Goater     amc->soc_name  = "ast2400-a1";
1232baa4732bSCédric Le Goater     amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1;
1233baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
123470322913SCédric Le Goater     amc->spi_model = "mx25l25635f";
1235baa4732bSCédric Le Goater     amc->num_cs    = 1;
1236baa4732bSCédric Le Goater     amc->i2c_init  = palmetto_bmc_i2c_init;
1237baa4732bSCédric Le Goater     mc->default_ram_size       = 256 * MiB;
123843a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1239baa4732bSCédric Le Goater };
1240baa4732bSCédric Le Goater 
12419cccb912SPatrick Venture static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data)
12429cccb912SPatrick Venture {
12439cccb912SPatrick Venture     MachineClass *mc = MACHINE_CLASS(oc);
12449cccb912SPatrick Venture     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
12459cccb912SPatrick Venture 
12469cccb912SPatrick Venture     mc->desc       = "Quanta-Q71l BMC (ARM926EJ-S)";
12479cccb912SPatrick Venture     amc->soc_name  = "ast2400-a1";
12489cccb912SPatrick Venture     amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1;
12499cccb912SPatrick Venture     amc->fmc_model = "n25q256a";
12509cccb912SPatrick Venture     amc->spi_model = "mx25l25635e";
12519cccb912SPatrick Venture     amc->num_cs    = 1;
12529cccb912SPatrick Venture     amc->i2c_init  = quanta_q71l_bmc_i2c_init;
12539cccb912SPatrick Venture     mc->default_ram_size       = 128 * MiB;
125443a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
12559cccb912SPatrick Venture }
12569cccb912SPatrick Venture 
125740a38df5SErik Smit static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc,
125840a38df5SErik Smit                                                         void *data)
125940a38df5SErik Smit {
126040a38df5SErik Smit     MachineClass *mc = MACHINE_CLASS(oc);
126140a38df5SErik Smit     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
126240a38df5SErik Smit 
126340a38df5SErik Smit     mc->desc       = "Supermicro X11 BMC (ARM926EJ-S)";
126440a38df5SErik Smit     amc->soc_name  = "ast2400-a1";
126540a38df5SErik Smit     amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1;
126640a38df5SErik Smit     amc->fmc_model = "mx25l25635e";
126740a38df5SErik Smit     amc->spi_model = "mx25l25635e";
126840a38df5SErik Smit     amc->num_cs    = 1;
126940a38df5SErik Smit     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
127040a38df5SErik Smit     amc->i2c_init  = palmetto_bmc_i2c_init;
127140a38df5SErik Smit     mc->default_ram_size = 256 * MiB;
127243a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
127340a38df5SErik Smit }
127440a38df5SErik Smit 
127547936597SGuenter Roeck static void aspeed_machine_supermicro_x11spi_bmc_class_init(ObjectClass *oc,
127647936597SGuenter Roeck                                                             void *data)
127747936597SGuenter Roeck {
127847936597SGuenter Roeck     MachineClass *mc = MACHINE_CLASS(oc);
127947936597SGuenter Roeck     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
128047936597SGuenter Roeck 
128147936597SGuenter Roeck     mc->desc       = "Supermicro X11 SPI BMC (ARM1176)";
128247936597SGuenter Roeck     amc->soc_name  = "ast2500-a1";
128347936597SGuenter Roeck     amc->hw_strap1 = SUPERMICRO_X11SPI_BMC_HW_STRAP1;
128447936597SGuenter Roeck     amc->fmc_model = "mx25l25635e";
128547936597SGuenter Roeck     amc->spi_model = "mx25l25635e";
128647936597SGuenter Roeck     amc->num_cs    = 1;
128747936597SGuenter Roeck     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
128847936597SGuenter Roeck     amc->i2c_init  = palmetto_bmc_i2c_init;
128947936597SGuenter Roeck     mc->default_ram_size = 512 * MiB;
129043a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
129147936597SGuenter Roeck }
129247936597SGuenter Roeck 
1293baa4732bSCédric Le Goater static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data)
1294baa4732bSCédric Le Goater {
1295baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1296baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1297baa4732bSCédric Le Goater 
1298baa4732bSCédric Le Goater     mc->desc       = "Aspeed AST2500 EVB (ARM1176)";
1299baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1300baa4732bSCédric Le Goater     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
1301753abfc4SJae Hyun Yoo     amc->fmc_model = "mx25l25635e";
130270322913SCédric Le Goater     amc->spi_model = "mx25l25635f";
1303baa4732bSCédric Le Goater     amc->num_cs    = 1;
1304baa4732bSCédric Le Goater     amc->i2c_init  = ast2500_evb_i2c_init;
1305baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
130643a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1307baa4732bSCédric Le Goater };
1308baa4732bSCédric Le Goater 
130934f73a81SKarthikeyan Pasupathi static void aspeed_machine_yosemitev2_class_init(ObjectClass *oc, void *data)
131034f73a81SKarthikeyan Pasupathi {
131134f73a81SKarthikeyan Pasupathi     MachineClass *mc = MACHINE_CLASS(oc);
131234f73a81SKarthikeyan Pasupathi     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
131334f73a81SKarthikeyan Pasupathi 
131434f73a81SKarthikeyan Pasupathi     mc->desc       = "Facebook YosemiteV2 BMC (ARM1176)";
131534f73a81SKarthikeyan Pasupathi     amc->soc_name  = "ast2500-a1";
131634f73a81SKarthikeyan Pasupathi     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
131734f73a81SKarthikeyan Pasupathi     amc->hw_strap2 = 0;
131834f73a81SKarthikeyan Pasupathi     amc->fmc_model = "n25q256a";
131934f73a81SKarthikeyan Pasupathi     amc->spi_model = "mx25l25635e";
132034f73a81SKarthikeyan Pasupathi     amc->num_cs    = 2;
132134f73a81SKarthikeyan Pasupathi     amc->i2c_init  = yosemitev2_bmc_i2c_init;
132234f73a81SKarthikeyan Pasupathi     mc->default_ram_size       = 512 * MiB;
132343a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
132434f73a81SKarthikeyan Pasupathi };
132534f73a81SKarthikeyan Pasupathi 
1326baa4732bSCédric Le Goater static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data)
1327baa4732bSCédric Le Goater {
1328baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1329baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1330baa4732bSCédric Le Goater 
1331baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Romulus BMC (ARM1176)";
1332baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1333baa4732bSCédric Le Goater     amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1;
1334baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
1335baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1336baa4732bSCédric Le Goater     amc->num_cs    = 2;
1337baa4732bSCédric Le Goater     amc->i2c_init  = romulus_bmc_i2c_init;
1338baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
133943a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1340baa4732bSCédric Le Goater };
1341baa4732bSCédric Le Goater 
13426c323abaSKarthikeyan Pasupathi static void aspeed_machine_tiogapass_class_init(ObjectClass *oc, void *data)
13436c323abaSKarthikeyan Pasupathi {
13446c323abaSKarthikeyan Pasupathi     MachineClass *mc = MACHINE_CLASS(oc);
13456c323abaSKarthikeyan Pasupathi     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
13466c323abaSKarthikeyan Pasupathi 
13476c323abaSKarthikeyan Pasupathi     mc->desc       = "Facebook Tiogapass BMC (ARM1176)";
13486c323abaSKarthikeyan Pasupathi     amc->soc_name  = "ast2500-a1";
13496c323abaSKarthikeyan Pasupathi     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
13506c323abaSKarthikeyan Pasupathi     amc->hw_strap2 = 0;
13516c323abaSKarthikeyan Pasupathi     amc->fmc_model = "n25q256a";
13526c323abaSKarthikeyan Pasupathi     amc->spi_model = "mx25l25635e";
13536c323abaSKarthikeyan Pasupathi     amc->num_cs    = 2;
13546c323abaSKarthikeyan Pasupathi     amc->i2c_init  = tiogapass_bmc_i2c_init;
13556c323abaSKarthikeyan Pasupathi     mc->default_ram_size       = 1 * GiB;
135643a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
13576c323abaSKarthikeyan Pasupathi };
13586c323abaSKarthikeyan Pasupathi 
1359143b040fSPatrick Williams static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data)
1360143b040fSPatrick Williams {
1361143b040fSPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1362143b040fSPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1363143b040fSPatrick Williams 
1364143b040fSPatrick Williams     mc->desc       = "OCP SonoraPass BMC (ARM1176)";
1365143b040fSPatrick Williams     amc->soc_name  = "ast2500-a1";
1366143b040fSPatrick Williams     amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1;
1367143b040fSPatrick Williams     amc->fmc_model = "mx66l1g45g";
1368143b040fSPatrick Williams     amc->spi_model = "mx66l1g45g";
1369143b040fSPatrick Williams     amc->num_cs    = 2;
1370143b040fSPatrick Williams     amc->i2c_init  = sonorapass_bmc_i2c_init;
1371143b040fSPatrick Williams     mc->default_ram_size       = 512 * MiB;
137243a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1373143b040fSPatrick Williams };
1374143b040fSPatrick Williams 
1375baa4732bSCédric Le Goater static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data)
1376baa4732bSCédric Le Goater {
1377baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1378baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1379baa4732bSCédric Le Goater 
1380baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Witherspoon BMC (ARM1176)";
1381baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1382baa4732bSCédric Le Goater     amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1;
138370322913SCédric Le Goater     amc->fmc_model = "mx25l25635f";
1384baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1385baa4732bSCédric Le Goater     amc->num_cs    = 2;
1386baa4732bSCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init;
1387baa4732bSCédric Le Goater     mc->default_ram_size = 512 * MiB;
138843a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1389baa4732bSCédric Le Goater };
1390baa4732bSCédric Le Goater 
1391baa4732bSCédric Le Goater static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
1392baa4732bSCédric Le Goater {
1393baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1394baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1395baa4732bSCédric Le Goater 
1396f548f201SPeter Maydell     mc->desc       = "Aspeed AST2600 EVB (Cortex-A7)";
1397c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
1398baa4732bSCédric Le Goater     amc->hw_strap1 = AST2600_EVB_HW_STRAP1;
1399baa4732bSCédric Le Goater     amc->hw_strap2 = AST2600_EVB_HW_STRAP2;
1400753abfc4SJae Hyun Yoo     amc->fmc_model = "mx66u51235f";
1401baa4732bSCédric Le Goater     amc->spi_model = "mx66u51235f";
1402baa4732bSCédric Le Goater     amc->num_cs    = 1;
140329193286SGuenter Roeck     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON |
140429193286SGuenter Roeck                      ASPEED_MAC3_ON;
1405baa4732bSCédric Le Goater     amc->i2c_init  = ast2600_evb_i2c_init;
1406baa4732bSCédric Le Goater     mc->default_ram_size = 1 * GiB;
140743a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1408*056b779eSCédric Le Goater     aspeed_machine_ast2600_class_emmc_init(oc);
1409baa4732bSCédric Le Goater };
1410baa4732bSCédric Le Goater 
141163ceb818SCédric Le Goater static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data)
141263ceb818SCédric Le Goater {
141363ceb818SCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
141463ceb818SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
141563ceb818SCédric Le Goater 
1416f548f201SPeter Maydell     mc->desc       = "OpenPOWER Tacoma BMC (Cortex-A7)";
1417c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
141863ceb818SCédric Le Goater     amc->hw_strap1 = TACOMA_BMC_HW_STRAP1;
141963ceb818SCédric Le Goater     amc->hw_strap2 = TACOMA_BMC_HW_STRAP2;
142063ceb818SCédric Le Goater     amc->fmc_model = "mx66l1g45g";
142163ceb818SCédric Le Goater     amc->spi_model = "mx66l1g45g";
142263ceb818SCédric Le Goater     amc->num_cs    = 2;
1423d3bad7e7SCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON;
142463ceb818SCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init; /* Same board layout */
142563ceb818SCédric Le Goater     mc->default_ram_size = 1 * GiB;
142643a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
142756a37edaSCédric Le Goater 
142856a37edaSCédric Le Goater     mc->deprecation_reason = "Please use the similar 'rainier-bmc' machine";
142963ceb818SCédric Le Goater };
143063ceb818SCédric Le Goater 
143195f068c8SJohn Wang static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data)
143295f068c8SJohn Wang {
143395f068c8SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
143495f068c8SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
143595f068c8SJohn Wang 
143695f068c8SJohn Wang     mc->desc       = "Bytedance G220A BMC (ARM1176)";
143795f068c8SJohn Wang     amc->soc_name  = "ast2500-a1";
143895f068c8SJohn Wang     amc->hw_strap1 = G220A_BMC_HW_STRAP1;
143995f068c8SJohn Wang     amc->fmc_model = "n25q512a";
144095f068c8SJohn Wang     amc->spi_model = "mx25l25635e";
144195f068c8SJohn Wang     amc->num_cs    = 2;
14425bb825c8SGuenter Roeck     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
144395f068c8SJohn Wang     amc->i2c_init  = g220a_bmc_i2c_init;
144495f068c8SJohn Wang     mc->default_ram_size = 1024 * MiB;
144543a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
144695f068c8SJohn Wang };
144795f068c8SJohn Wang 
144882b6a3f6SJohn Wang static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc, void *data)
144982b6a3f6SJohn Wang {
145082b6a3f6SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
145182b6a3f6SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
145282b6a3f6SJohn Wang 
145382b6a3f6SJohn Wang     mc->desc       = "Inspur FP5280G2 BMC (ARM1176)";
145482b6a3f6SJohn Wang     amc->soc_name  = "ast2500-a1";
145582b6a3f6SJohn Wang     amc->hw_strap1 = FP5280G2_BMC_HW_STRAP1;
145682b6a3f6SJohn Wang     amc->fmc_model = "n25q512a";
145782b6a3f6SJohn Wang     amc->spi_model = "mx25l25635e";
145882b6a3f6SJohn Wang     amc->num_cs    = 2;
145982b6a3f6SJohn Wang     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
146082b6a3f6SJohn Wang     amc->i2c_init  = fp5280g2_bmc_i2c_init;
146182b6a3f6SJohn Wang     mc->default_ram_size = 512 * MiB;
146243a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
146382b6a3f6SJohn Wang };
146482b6a3f6SJohn Wang 
146558e52bdbSCédric Le Goater static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data)
146658e52bdbSCédric Le Goater {
146758e52bdbSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
146858e52bdbSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
146958e52bdbSCédric Le Goater 
1470f548f201SPeter Maydell     mc->desc       = "IBM Rainier BMC (Cortex-A7)";
1471c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
147258e52bdbSCédric Le Goater     amc->hw_strap1 = RAINIER_BMC_HW_STRAP1;
147358e52bdbSCédric Le Goater     amc->hw_strap2 = RAINIER_BMC_HW_STRAP2;
147458e52bdbSCédric Le Goater     amc->fmc_model = "mx66l1g45g";
147558e52bdbSCédric Le Goater     amc->spi_model = "mx66l1g45g";
147658e52bdbSCédric Le Goater     amc->num_cs    = 2;
147758e52bdbSCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
147858e52bdbSCédric Le Goater     amc->i2c_init  = rainier_bmc_i2c_init;
147958e52bdbSCédric Le Goater     mc->default_ram_size = 1 * GiB;
148043a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1481*056b779eSCédric Le Goater     aspeed_machine_ast2600_class_emmc_init(oc);
148258e52bdbSCédric Le Goater };
148358e52bdbSCédric Le Goater 
14841e2c22c9SCédric Le Goater #define FUJI_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB)
1485febbe308SPeter Delevoryas 
1486febbe308SPeter Delevoryas static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data)
1487febbe308SPeter Delevoryas {
1488febbe308SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1489febbe308SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1490febbe308SPeter Delevoryas 
1491febbe308SPeter Delevoryas     mc->desc = "Facebook Fuji BMC (Cortex-A7)";
1492febbe308SPeter Delevoryas     amc->soc_name = "ast2600-a3";
1493febbe308SPeter Delevoryas     amc->hw_strap1 = FUJI_BMC_HW_STRAP1;
1494febbe308SPeter Delevoryas     amc->hw_strap2 = FUJI_BMC_HW_STRAP2;
1495febbe308SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1496febbe308SPeter Delevoryas     amc->spi_model = "mx66l1g45g";
1497febbe308SPeter Delevoryas     amc->num_cs = 2;
1498febbe308SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1499febbe308SPeter Delevoryas     amc->i2c_init = fuji_bmc_i2c_init;
1500febbe308SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART1;
1501febbe308SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
150243a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1503febbe308SPeter Delevoryas };
1504febbe308SPeter Delevoryas 
15051e2c22c9SCédric Le Goater #define BLETCHLEY_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB)
1506104bdaffSPatrick Williams 
1507a20c54b1SPatrick Williams static void aspeed_machine_bletchley_class_init(ObjectClass *oc, void *data)
1508a20c54b1SPatrick Williams {
1509a20c54b1SPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1510a20c54b1SPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1511a20c54b1SPatrick Williams 
1512a20c54b1SPatrick Williams     mc->desc       = "Facebook Bletchley BMC (Cortex-A7)";
1513a20c54b1SPatrick Williams     amc->soc_name  = "ast2600-a3";
1514a20c54b1SPatrick Williams     amc->hw_strap1 = BLETCHLEY_BMC_HW_STRAP1;
1515a20c54b1SPatrick Williams     amc->hw_strap2 = BLETCHLEY_BMC_HW_STRAP2;
1516a20c54b1SPatrick Williams     amc->fmc_model = "w25q01jvq";
1517a20c54b1SPatrick Williams     amc->spi_model = NULL;
1518a20c54b1SPatrick Williams     amc->num_cs    = 2;
1519a20c54b1SPatrick Williams     amc->macs_mask = ASPEED_MAC2_ON;
1520a20c54b1SPatrick Williams     amc->i2c_init  = bletchley_bmc_i2c_init;
1521104bdaffSPatrick Williams     mc->default_ram_size = BLETCHLEY_BMC_RAM_SIZE;
152243a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1523a20c54b1SPatrick Williams }
1524a20c54b1SPatrick Williams 
15257966d70fSJason A. Donenfeld static void fby35_reset(MachineState *state, ShutdownCause reason)
1526fa699e80SPeter Delevoryas {
1527fa699e80SPeter Delevoryas     AspeedMachineState *bmc = ASPEED_MACHINE(state);
15283c392e87SPhilippe Mathieu-Daudé     AspeedGPIOState *gpio = &bmc->soc->gpio;
1529fa699e80SPeter Delevoryas 
15307966d70fSJason A. Donenfeld     qemu_devices_reset(reason);
1531fa699e80SPeter Delevoryas 
1532f0418558SPeter Delevoryas     /* Board ID: 7 (Class-1, 4 slots) */
1533fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV4", true, &error_fatal);
1534fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV5", true, &error_fatal);
1535fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV6", true, &error_fatal);
1536fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV7", false, &error_fatal);
1537f0418558SPeter Delevoryas 
1538f0418558SPeter Delevoryas     /* Slot presence pins, inverse polarity. (False means present) */
1539f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH4", false, &error_fatal);
1540f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH5", true, &error_fatal);
1541f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH6", true, &error_fatal);
1542f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH7", true, &error_fatal);
1543f0418558SPeter Delevoryas 
1544f0418558SPeter Delevoryas     /* Slot 12v power pins, normal polarity. (True means powered-on) */
1545f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB2", true, &error_fatal);
1546f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB3", false, &error_fatal);
1547f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB4", false, &error_fatal);
1548f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB5", false, &error_fatal);
1549fa699e80SPeter Delevoryas }
1550fa699e80SPeter Delevoryas 
1551fa699e80SPeter Delevoryas static void aspeed_machine_fby35_class_init(ObjectClass *oc, void *data)
1552fa699e80SPeter Delevoryas {
1553fa699e80SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1554fa699e80SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1555fa699e80SPeter Delevoryas 
1556fa699e80SPeter Delevoryas     mc->desc       = "Facebook fby35 BMC (Cortex-A7)";
1557fa699e80SPeter Delevoryas     mc->reset      = fby35_reset;
1558fa699e80SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1559fa699e80SPeter Delevoryas     amc->num_cs    = 2;
1560fa699e80SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1561fa699e80SPeter Delevoryas     amc->i2c_init  = fby35_i2c_init;
1562fa699e80SPeter Delevoryas     /* FIXME: Replace this macro with something more general */
1563fa699e80SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
156443a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1565fa699e80SPeter Delevoryas }
1566fa699e80SPeter Delevoryas 
156766c895b8SJamin Lin #define AST1030_INTERNAL_FLASH_SIZE (1024 * 1024)
156866c895b8SJamin Lin /* Main SYSCLK frequency in Hz (200MHz) */
156966c895b8SJamin Lin #define SYSCLK_FRQ 200000000ULL
157066c895b8SJamin Lin 
157166c895b8SJamin Lin static void aspeed_minibmc_machine_init(MachineState *machine)
157266c895b8SJamin Lin {
157366c895b8SJamin Lin     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
157466c895b8SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
157566c895b8SJamin Lin     Clock *sysclk;
157666c895b8SJamin Lin 
157766c895b8SJamin Lin     sysclk = clock_new(OBJECT(machine), "SYSCLK");
157866c895b8SJamin Lin     clock_set_hz(sysclk, SYSCLK_FRQ);
157966c895b8SJamin Lin 
15803c392e87SPhilippe Mathieu-Daudé     bmc->soc = ASPEED_SOC(object_new(amc->soc_name));
15813c392e87SPhilippe Mathieu-Daudé     object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc));
15823c392e87SPhilippe Mathieu-Daudé     object_unref(OBJECT(bmc->soc));
15833c392e87SPhilippe Mathieu-Daudé     qdev_connect_clock_in(DEVICE(bmc->soc), "sysclk", sysclk);
158466c895b8SJamin Lin 
15853c392e87SPhilippe Mathieu-Daudé     object_property_set_link(OBJECT(bmc->soc), "memory",
15864dd9d554SPeter Delevoryas                              OBJECT(get_system_memory()), &error_abort);
1587d2b3eaefSPeter Delevoryas     connect_serial_hds_to_uarts(bmc);
15883c392e87SPhilippe Mathieu-Daudé     qdev_realize(DEVICE(bmc->soc), NULL, &error_abort);
158966c895b8SJamin Lin 
15903c392e87SPhilippe Mathieu-Daudé     aspeed_board_init_flashes(&bmc->soc->fmc,
159166c895b8SJamin Lin                               bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
159266c895b8SJamin Lin                               amc->num_cs,
159366c895b8SJamin Lin                               0);
159466c895b8SJamin Lin 
15953c392e87SPhilippe Mathieu-Daudé     aspeed_board_init_flashes(&bmc->soc->spi[0],
159666c895b8SJamin Lin                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
159766c895b8SJamin Lin                               amc->num_cs, amc->num_cs);
159866c895b8SJamin Lin 
15993c392e87SPhilippe Mathieu-Daudé     aspeed_board_init_flashes(&bmc->soc->spi[1],
160066c895b8SJamin Lin                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
160166c895b8SJamin Lin                               amc->num_cs, (amc->num_cs * 2));
160266c895b8SJamin Lin 
160366c895b8SJamin Lin     if (amc->i2c_init) {
160466c895b8SJamin Lin         amc->i2c_init(bmc);
160566c895b8SJamin Lin     }
160666c895b8SJamin Lin 
160766c895b8SJamin Lin     armv7m_load_kernel(ARM_CPU(first_cpu),
160866c895b8SJamin Lin                        machine->kernel_filename,
1609761c532aSPeter Maydell                        0,
161066c895b8SJamin Lin                        AST1030_INTERNAL_FLASH_SIZE);
161166c895b8SJamin Lin }
161266c895b8SJamin Lin 
16134c70ab16STroy Lee static void ast1030_evb_i2c_init(AspeedMachineState *bmc)
16144c70ab16STroy Lee {
16153c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
16164c70ab16STroy Lee 
1617673d8215SMichael Tokarev     /* U10 24C08 connects to SDA/SCL Group 1 by default */
16184c70ab16STroy Lee     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
16194c70ab16STroy Lee     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, eeprom_buf);
16204c70ab16STroy Lee 
16214c70ab16STroy Lee     /* U11 LM75 connects to SDA/SCL Group 2 by default */
16224c70ab16STroy Lee     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d);
16234c70ab16STroy Lee }
16244c70ab16STroy Lee 
162566c895b8SJamin Lin static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc,
162666c895b8SJamin Lin                                                           void *data)
162766c895b8SJamin Lin {
162866c895b8SJamin Lin     MachineClass *mc = MACHINE_CLASS(oc);
162966c895b8SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
163066c895b8SJamin Lin 
163166c895b8SJamin Lin     mc->desc = "Aspeed AST1030 MiniBMC (Cortex-M4)";
163266c895b8SJamin Lin     amc->soc_name = "ast1030-a1";
163366c895b8SJamin Lin     amc->hw_strap1 = 0;
163466c895b8SJamin Lin     amc->hw_strap2 = 0;
163566c895b8SJamin Lin     mc->init = aspeed_minibmc_machine_init;
16364c70ab16STroy Lee     amc->i2c_init = ast1030_evb_i2c_init;
163766c895b8SJamin Lin     mc->default_ram_size = 0;
163866c895b8SJamin Lin     amc->fmc_model = "sst25vf032b";
163966c895b8SJamin Lin     amc->spi_model = "sst25vf032b";
164066c895b8SJamin Lin     amc->num_cs = 2;
164166c895b8SJamin Lin     amc->macs_mask = 0;
164243a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
164366c895b8SJamin Lin }
164466c895b8SJamin Lin 
164592707992SJamin Lin #ifdef TARGET_AARCH64
164692707992SJamin Lin static void aspeed_machine_ast2700_evb_class_init(ObjectClass *oc, void *data)
164792707992SJamin Lin {
164892707992SJamin Lin     MachineClass *mc = MACHINE_CLASS(oc);
164992707992SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
165092707992SJamin Lin 
165192707992SJamin Lin     mc->desc = "Aspeed AST2700 EVB (Cortex-A35)";
165292707992SJamin Lin     amc->soc_name  = "ast2700-a0";
165392707992SJamin Lin     amc->hw_strap1 = AST2700_EVB_HW_STRAP1;
165492707992SJamin Lin     amc->hw_strap2 = AST2700_EVB_HW_STRAP2;
165592707992SJamin Lin     amc->fmc_model = "w25q01jvq";
165692707992SJamin Lin     amc->spi_model = "w25q512jv";
165792707992SJamin Lin     amc->num_cs    = 2;
165892707992SJamin Lin     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON;
165992707992SJamin Lin     amc->uart_default = ASPEED_DEV_UART12;
166092707992SJamin Lin     mc->default_ram_size = 1 * GiB;
166192707992SJamin Lin     aspeed_machine_class_init_cpus_defaults(mc);
166292707992SJamin Lin }
166392707992SJamin Lin #endif
166492707992SJamin Lin 
1665fb6b3c8dSJae Hyun Yoo static void aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass *oc,
1666fb6b3c8dSJae Hyun Yoo                                                      void *data)
1667fb6b3c8dSJae Hyun Yoo {
1668fb6b3c8dSJae Hyun Yoo     MachineClass *mc = MACHINE_CLASS(oc);
1669fb6b3c8dSJae Hyun Yoo     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1670fb6b3c8dSJae Hyun Yoo 
1671fb6b3c8dSJae Hyun Yoo     mc->desc       = "Qualcomm DC-SCM V1 BMC (Cortex A7)";
1672fb6b3c8dSJae Hyun Yoo     amc->soc_name  = "ast2600-a3";
1673fb6b3c8dSJae Hyun Yoo     amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1674fb6b3c8dSJae Hyun Yoo     amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1675fb6b3c8dSJae Hyun Yoo     amc->fmc_model = "n25q512a";
1676fb6b3c8dSJae Hyun Yoo     amc->spi_model = "n25q512a";
1677fb6b3c8dSJae Hyun Yoo     amc->num_cs    = 2;
1678fb6b3c8dSJae Hyun Yoo     amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1679fb6b3c8dSJae Hyun Yoo     amc->i2c_init  = qcom_dc_scm_bmc_i2c_init;
1680fb6b3c8dSJae Hyun Yoo     mc->default_ram_size = 1 * GiB;
168143a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1682fb6b3c8dSJae Hyun Yoo };
1683fb6b3c8dSJae Hyun Yoo 
1684ece4cccdSGraeme Gregory static void aspeed_machine_qcom_firework_class_init(ObjectClass *oc,
1685ece4cccdSGraeme Gregory                                                     void *data)
1686ece4cccdSGraeme Gregory {
1687ece4cccdSGraeme Gregory     MachineClass *mc = MACHINE_CLASS(oc);
1688ece4cccdSGraeme Gregory     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1689ece4cccdSGraeme Gregory 
1690ece4cccdSGraeme Gregory     mc->desc       = "Qualcomm DC-SCM V1/Firework BMC (Cortex A7)";
1691ece4cccdSGraeme Gregory     amc->soc_name  = "ast2600-a3";
1692ece4cccdSGraeme Gregory     amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1693ece4cccdSGraeme Gregory     amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1694ece4cccdSGraeme Gregory     amc->fmc_model = "n25q512a";
1695ece4cccdSGraeme Gregory     amc->spi_model = "n25q512a";
1696ece4cccdSGraeme Gregory     amc->num_cs    = 2;
1697ece4cccdSGraeme Gregory     amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1698ece4cccdSGraeme Gregory     amc->i2c_init  = qcom_dc_scm_firework_i2c_init;
1699ece4cccdSGraeme Gregory     mc->default_ram_size = 1 * GiB;
170043a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1701ece4cccdSGraeme Gregory };
1702ece4cccdSGraeme Gregory 
1703baa4732bSCédric Le Goater static const TypeInfo aspeed_machine_types[] = {
1704baa4732bSCédric Le Goater     {
1705baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("palmetto-bmc"),
1706baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1707baa4732bSCédric Le Goater         .class_init    = aspeed_machine_palmetto_class_init,
1708baa4732bSCédric Le Goater     }, {
170940a38df5SErik Smit         .name          = MACHINE_TYPE_NAME("supermicrox11-bmc"),
171040a38df5SErik Smit         .parent        = TYPE_ASPEED_MACHINE,
171140a38df5SErik Smit         .class_init    = aspeed_machine_supermicrox11_bmc_class_init,
171240a38df5SErik Smit     }, {
171347936597SGuenter Roeck         .name          = MACHINE_TYPE_NAME("supermicro-x11spi-bmc"),
171447936597SGuenter Roeck         .parent        = TYPE_ASPEED_MACHINE,
171547936597SGuenter Roeck         .class_init    = aspeed_machine_supermicro_x11spi_bmc_class_init,
171647936597SGuenter Roeck     }, {
1717baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2500-evb"),
1718baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1719baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2500_evb_class_init,
1720baa4732bSCédric Le Goater     }, {
1721baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("romulus-bmc"),
1722baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1723baa4732bSCédric Le Goater         .class_init    = aspeed_machine_romulus_class_init,
1724baa4732bSCédric Le Goater     }, {
1725143b040fSPatrick Williams         .name          = MACHINE_TYPE_NAME("sonorapass-bmc"),
1726143b040fSPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1727143b040fSPatrick Williams         .class_init    = aspeed_machine_sonorapass_class_init,
1728143b040fSPatrick Williams     }, {
1729baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("witherspoon-bmc"),
1730baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1731baa4732bSCédric Le Goater         .class_init    = aspeed_machine_witherspoon_class_init,
1732baa4732bSCédric Le Goater     }, {
1733baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2600-evb"),
1734baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1735baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2600_evb_class_init,
1736baa4732bSCédric Le Goater     }, {
173734f73a81SKarthikeyan Pasupathi         .name          = MACHINE_TYPE_NAME("yosemitev2-bmc"),
173834f73a81SKarthikeyan Pasupathi         .parent        = TYPE_ASPEED_MACHINE,
173934f73a81SKarthikeyan Pasupathi         .class_init    = aspeed_machine_yosemitev2_class_init,
174034f73a81SKarthikeyan Pasupathi     }, {
174163ceb818SCédric Le Goater         .name          = MACHINE_TYPE_NAME("tacoma-bmc"),
174263ceb818SCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
174363ceb818SCédric Le Goater         .class_init    = aspeed_machine_tacoma_class_init,
174463ceb818SCédric Le Goater     }, {
17456c323abaSKarthikeyan Pasupathi         .name          = MACHINE_TYPE_NAME("tiogapass-bmc"),
17466c323abaSKarthikeyan Pasupathi         .parent        = TYPE_ASPEED_MACHINE,
17476c323abaSKarthikeyan Pasupathi         .class_init    = aspeed_machine_tiogapass_class_init,
17486c323abaSKarthikeyan Pasupathi     }, {
174995f068c8SJohn Wang         .name          = MACHINE_TYPE_NAME("g220a-bmc"),
175095f068c8SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
175195f068c8SJohn Wang         .class_init    = aspeed_machine_g220a_class_init,
175295f068c8SJohn Wang     }, {
1753fb6b3c8dSJae Hyun Yoo         .name          = MACHINE_TYPE_NAME("qcom-dc-scm-v1-bmc"),
1754fb6b3c8dSJae Hyun Yoo         .parent        = TYPE_ASPEED_MACHINE,
1755fb6b3c8dSJae Hyun Yoo         .class_init    = aspeed_machine_qcom_dc_scm_v1_class_init,
1756fb6b3c8dSJae Hyun Yoo     }, {
1757ece4cccdSGraeme Gregory         .name          = MACHINE_TYPE_NAME("qcom-firework-bmc"),
1758ece4cccdSGraeme Gregory         .parent        = TYPE_ASPEED_MACHINE,
1759ece4cccdSGraeme Gregory         .class_init    = aspeed_machine_qcom_firework_class_init,
1760ece4cccdSGraeme Gregory     }, {
176182b6a3f6SJohn Wang         .name          = MACHINE_TYPE_NAME("fp5280g2-bmc"),
176282b6a3f6SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
176382b6a3f6SJohn Wang         .class_init    = aspeed_machine_fp5280g2_class_init,
176482b6a3f6SJohn Wang     }, {
17659cccb912SPatrick Venture         .name          = MACHINE_TYPE_NAME("quanta-q71l-bmc"),
17669cccb912SPatrick Venture         .parent        = TYPE_ASPEED_MACHINE,
17679cccb912SPatrick Venture         .class_init    = aspeed_machine_quanta_q71l_class_init,
17689cccb912SPatrick Venture     }, {
176958e52bdbSCédric Le Goater         .name          = MACHINE_TYPE_NAME("rainier-bmc"),
177058e52bdbSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
177158e52bdbSCédric Le Goater         .class_init    = aspeed_machine_rainier_class_init,
177258e52bdbSCédric Le Goater     }, {
1773febbe308SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fuji-bmc"),
1774febbe308SPeter Delevoryas         .parent        = TYPE_ASPEED_MACHINE,
1775febbe308SPeter Delevoryas         .class_init    = aspeed_machine_fuji_class_init,
1776febbe308SPeter Delevoryas     }, {
1777a20c54b1SPatrick Williams         .name          = MACHINE_TYPE_NAME("bletchley-bmc"),
1778a20c54b1SPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1779a20c54b1SPatrick Williams         .class_init    = aspeed_machine_bletchley_class_init,
1780a20c54b1SPatrick Williams     }, {
1781fa699e80SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fby35-bmc"),
1782fa699e80SPeter Delevoryas         .parent        = MACHINE_TYPE_NAME("ast2600-evb"),
1783fa699e80SPeter Delevoryas         .class_init    = aspeed_machine_fby35_class_init,
1784fa699e80SPeter Delevoryas     }, {
178566c895b8SJamin Lin         .name           = MACHINE_TYPE_NAME("ast1030-evb"),
178666c895b8SJamin Lin         .parent         = TYPE_ASPEED_MACHINE,
178766c895b8SJamin Lin         .class_init     = aspeed_minibmc_machine_ast1030_evb_class_init,
178892707992SJamin Lin #ifdef TARGET_AARCH64
178992707992SJamin Lin     }, {
179092707992SJamin Lin         .name          = MACHINE_TYPE_NAME("ast2700-evb"),
179192707992SJamin Lin         .parent        = TYPE_ASPEED_MACHINE,
179292707992SJamin Lin         .class_init    = aspeed_machine_ast2700_evb_class_init,
179392707992SJamin Lin #endif
179466c895b8SJamin Lin     }, {
1795fca9ca1bSCédric Le Goater         .name          = TYPE_ASPEED_MACHINE,
179662c2c2ebSCédric Le Goater         .parent        = TYPE_MACHINE,
1797888b2b03SPhilippe Mathieu-Daudé         .instance_size = sizeof(AspeedMachineState),
17981a15311aSCédric Le Goater         .instance_init = aspeed_machine_instance_init,
1799fca9ca1bSCédric Le Goater         .class_size    = sizeof(AspeedMachineClass),
1800fca9ca1bSCédric Le Goater         .class_init    = aspeed_machine_class_init,
1801baa4732bSCédric Le Goater         .abstract      = true,
1802baa4732bSCédric Le Goater     }
1803fca9ca1bSCédric Le Goater };
180474fb1f38SCédric Le Goater 
1805baa4732bSCédric Le Goater DEFINE_TYPES(aspeed_machine_types)
1806