xref: /qemu/hw/arm/aspeed.c (revision 2c075ff3ceb3b18f632c0edbd2c914329dd14e50)
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 
2694db1c164SJamin Lin     /*
2704db1c164SJamin Lin      * The block backend size should have already been 'validated' by
2710c7209beSCédric Le Goater      * the creation of the m25p80 object.
2720c7209beSCédric Le Goater      */
2730c7209beSCédric Le Goater     size = blk_getlength(blk);
2740c7209beSCédric Le Goater     if (size <= 0) {
2750c7209beSCédric Le Goater         error_setg(errp, "failed to get flash size");
2760c7209beSCédric Le Goater         return;
2770c7209beSCédric Le Goater     }
2780c7209beSCédric Le Goater 
2790c7209beSCédric Le Goater     if (rom_size > size) {
2800c7209beSCédric Le Goater         rom_size = size;
281d769a1daSCédric Le Goater     }
282d769a1daSCédric Le Goater 
28305e6e40aSWentao_Liang     storage = g_malloc0(rom_size);
284a9262f55SAlberto Faria     if (blk_pread(blk, 0, rom_size, storage, 0) < 0) {
285d769a1daSCédric Le Goater         error_setg(errp, "failed to read the initial flash content");
286d769a1daSCédric Le Goater         return;
287d769a1daSCédric Le Goater     }
288d769a1daSCédric Le Goater 
289d769a1daSCédric Le Goater     rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr);
290d769a1daSCédric Le Goater }
291d769a1daSCédric Le Goater 
2928b744a6aSCédric Le Goater /*
2938b744a6aSCédric Le Goater  * Create a ROM and copy the flash contents at the expected address
2948b744a6aSCédric Le Goater  * (0x0). Boots faster than execute-in-place.
2958b744a6aSCédric Le Goater  */
296262259eaSCédric Le Goater static void aspeed_install_boot_rom(AspeedMachineState *bmc, BlockBackend *blk,
2978b744a6aSCédric Le Goater                                     uint64_t rom_size)
2988b744a6aSCédric Le Goater {
2993c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
300db052d0eSJamin Lin     AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(soc);
3018b744a6aSCédric Le Goater 
302262259eaSCédric Le Goater     memory_region_init_rom(&bmc->boot_rom, NULL, "aspeed.boot_rom", rom_size,
3038b744a6aSCédric Le Goater                            &error_abort);
3048b744a6aSCédric Le Goater     memory_region_add_subregion_overlap(&soc->spi_boot_container, 0,
305262259eaSCédric Le Goater                                         &bmc->boot_rom, 1);
306db052d0eSJamin Lin     write_boot_rom(blk, sc->memmap[ASPEED_DEV_SPI_BOOT],
307db052d0eSJamin Lin                    rom_size, &error_abort);
3088b744a6aSCédric Le Goater }
3098b744a6aSCédric Le Goater 
3101099ad10SPeter Delevoryas void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
3119bd4ac61SCédric Le Goater                                       unsigned int count, int unit0)
312e1ad9bc4SCédric Le Goater {
313e1ad9bc4SCédric Le Goater     int i;
314179b2058SPatrick Williams 
315179b2058SPatrick Williams     if (!flashtype) {
316179b2058SPatrick Williams         return;
317179b2058SPatrick Williams     }
318e1ad9bc4SCédric Le Goater 
3199bd4ac61SCédric Le Goater     for (i = 0; i < count; ++i) {
3208ec239f2SMarkus Armbruster         DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i);
321a7d78befSCédric Le Goater         DeviceState *dev;
322e1ad9bc4SCédric Le Goater 
323a7d78befSCédric Le Goater         dev = qdev_new(flashtype);
324e1ad9bc4SCédric Le Goater         if (dinfo) {
325a7d78befSCédric Le Goater             qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo));
326e1ad9bc4SCédric Le Goater         }
32727a2c66cSCédric Le Goater         qdev_prop_set_uint8(dev, "cs", i);
328a7d78befSCédric Le Goater         qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal);
329e1ad9bc4SCédric Le Goater     }
330e1ad9bc4SCédric Le Goater }
331e1ad9bc4SCédric Le Goater 
332e554e45bSCédric Le Goater static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo, bool emmc,
333e554e45bSCédric Le Goater                                bool boot_emmc)
334a29e3e12SAndrew Jeffery {
335a29e3e12SAndrew Jeffery         DeviceState *card;
336a29e3e12SAndrew Jeffery 
337756f739bSPhilippe Mathieu-Daudé         if (!dinfo) {
338756f739bSPhilippe Mathieu-Daudé             return;
339756f739bSPhilippe Mathieu-Daudé         }
340dddfc771SCédric Le Goater         card = qdev_new(emmc ? TYPE_EMMC : TYPE_SD_CARD);
341e554e45bSCédric Le Goater         if (emmc) {
342e554e45bSCédric Le Goater             qdev_prop_set_uint64(card, "boot-partition-size", 1 * MiB);
343e554e45bSCédric Le Goater             qdev_prop_set_uint8(card, "boot-config",
344e554e45bSCédric Le Goater                                 boot_emmc ? 0x1 << 3 : 0x0);
345e554e45bSCédric Le Goater         }
346934df912SMarkus Armbruster         qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
347a29e3e12SAndrew Jeffery                                 &error_fatal);
3483e80f690SMarkus Armbruster         qdev_realize_and_unref(card,
3493e80f690SMarkus Armbruster                                qdev_get_child_bus(DEVICE(sdhci), "sd-bus"),
3503e80f690SMarkus Armbruster                                &error_fatal);
351a29e3e12SAndrew Jeffery }
352a29e3e12SAndrew Jeffery 
353d2b3eaefSPeter Delevoryas static void connect_serial_hds_to_uarts(AspeedMachineState *bmc)
354d2b3eaefSPeter Delevoryas {
355d2b3eaefSPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
3563c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *s = bmc->soc;
357d2b3eaefSPeter Delevoryas     AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
358f65f6ad5SCédric Le Goater     int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default;
359d2b3eaefSPeter Delevoryas 
360f65f6ad5SCédric Le Goater     aspeed_soc_uart_set_chr(s, uart_chosen, serial_hd(0));
361944128eeSJamin Lin     for (int i = 1, uart = sc->uarts_base; i < sc->uarts_num; i++, uart++) {
362f65f6ad5SCédric Le Goater         if (uart == uart_chosen) {
363d2b3eaefSPeter Delevoryas             continue;
364d2b3eaefSPeter Delevoryas         }
365d2b3eaefSPeter Delevoryas         aspeed_soc_uart_set_chr(s, uart, serial_hd(i));
366d2b3eaefSPeter Delevoryas     }
367d2b3eaefSPeter Delevoryas }
368d2b3eaefSPeter Delevoryas 
369baa4732bSCédric Le Goater static void aspeed_machine_init(MachineState *machine)
370327d8e4eSAndrew Jeffery {
371888b2b03SPhilippe Mathieu-Daudé     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
372baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
373b033271fSCédric Le Goater     AspeedSoCClass *sc;
3742bea128cSEddie James     int i;
375255aed81SCédric Le Goater     DriveInfo *emmc0 = NULL;
376e554e45bSCédric Le Goater     bool boot_emmc;
377327d8e4eSAndrew Jeffery 
3783c392e87SPhilippe Mathieu-Daudé     bmc->soc = ASPEED_SOC(object_new(amc->soc_name));
3793c392e87SPhilippe Mathieu-Daudé     object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc));
3803c392e87SPhilippe Mathieu-Daudé     object_unref(OBJECT(bmc->soc));
3813c392e87SPhilippe Mathieu-Daudé     sc = ASPEED_SOC_GET_CLASS(bmc->soc);
382b033271fSCédric Le Goater 
383533eb415SIgor Mammedov     /*
384346160cbSCédric Le Goater      * This will error out if the RAM size is not supported by the
385346160cbSCédric Le Goater      * memory controller of the SoC.
386533eb415SIgor Mammedov      */
3873c392e87SPhilippe Mathieu-Daudé     object_property_set_uint(OBJECT(bmc->soc), "ram-size", machine->ram_size,
388533eb415SIgor Mammedov                              &error_fatal);
389533eb415SIgor Mammedov 
390d3bad7e7SCédric Le Goater     for (i = 0; i < sc->macs_num; i++) {
391b3cfec5bSDavid Woodhouse         if ((amc->macs_mask & (1 << i)) &&
392b3cfec5bSDavid Woodhouse             !qemu_configure_nic_device(DEVICE(&bmc->soc->ftgmac100[i]),
393b3cfec5bSDavid Woodhouse                                        true, NULL)) {
394b3cfec5bSDavid Woodhouse             break; /* No configs left; stop asking */
395d3bad7e7SCédric Le Goater         }
396d3bad7e7SCédric Le Goater     }
397d3bad7e7SCédric Le Goater 
398621845a9SCédric Le Goater     object_property_set_int(OBJECT(bmc->soc), "hw-strap1", bmc->hw_strap1,
39987e79af0SAndrew Jeffery                             &error_abort);
4003c392e87SPhilippe Mathieu-Daudé     object_property_set_int(OBJECT(bmc->soc), "hw-strap2", amc->hw_strap2,
401ccc2c418SCédric Le Goater                             &error_abort);
4023c392e87SPhilippe Mathieu-Daudé     object_property_set_link(OBJECT(bmc->soc), "memory",
4034dd9d554SPeter Delevoryas                              OBJECT(get_system_memory()), &error_abort);
4043c392e87SPhilippe Mathieu-Daudé     object_property_set_link(OBJECT(bmc->soc), "dram",
4050df2d9a6SCédric Le Goater                              OBJECT(machine->ram), &error_abort);
406b6e70d1dSJoel Stanley     if (machine->kernel_filename) {
407b6e70d1dSJoel Stanley         /*
408b6e70d1dSJoel Stanley          * When booting with a -kernel command line there is no u-boot
409b6e70d1dSJoel Stanley          * that runs to unlock the SCU. In this case set the default to
410b6e70d1dSJoel Stanley          * be unlocked as the kernel expects
411b6e70d1dSJoel Stanley          */
4123c392e87SPhilippe Mathieu-Daudé         object_property_set_int(OBJECT(bmc->soc), "hw-prot-key",
4135325cc34SMarkus Armbruster                                 ASPEED_SCU_PROT_KEY, &error_abort);
414b6e70d1dSJoel Stanley     }
415d2b3eaefSPeter Delevoryas     connect_serial_hds_to_uarts(bmc);
4163c392e87SPhilippe Mathieu-Daudé     qdev_realize(DEVICE(bmc->soc), NULL, &error_abort);
417327d8e4eSAndrew Jeffery 
418c7e313aeSCédric Le Goater     if (defaults_enabled()) {
4193c392e87SPhilippe Mathieu-Daudé         aspeed_board_init_flashes(&bmc->soc->fmc,
4208ec239f2SMarkus Armbruster                               bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
4219bd4ac61SCédric Le Goater                               amc->num_cs, 0);
4223c392e87SPhilippe Mathieu-Daudé         aspeed_board_init_flashes(&bmc->soc->spi[0],
4238ec239f2SMarkus Armbruster                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
4249bd4ac61SCédric Le Goater                               1, amc->num_cs);
425c7e313aeSCédric Le Goater     }
426e1ad9bc4SCédric Le Goater 
427b7f1a0cbSCédric Le Goater     if (machine->kernel_filename && sc->num_cpus > 1) {
4289bb6d140SJoel Stanley         /* With no u-boot we must set up a boot stub for the secondary CPU */
4299bb6d140SJoel Stanley         MemoryRegion *smpboot = g_new(MemoryRegion, 1);
430f489960dSPhilippe Mathieu-Daudé         memory_region_init_ram(smpboot, NULL, "aspeed.smpboot",
4319bb6d140SJoel Stanley                                0x80, &error_abort);
4329bb6d140SJoel Stanley         memory_region_add_subregion(get_system_memory(),
4339bb6d140SJoel Stanley                                     AST_SMP_MAILBOX_BASE, smpboot);
4349bb6d140SJoel Stanley 
4359bb6d140SJoel Stanley         aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot;
4369bb6d140SJoel Stanley         aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary;
4379bb6d140SJoel Stanley         aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE;
4389bb6d140SJoel Stanley     }
4399bb6d140SJoel Stanley 
4406e504a98SPaolo Bonzini     aspeed_board_binfo.ram_size = machine->ram_size;
441347df6f8SEduardo Habkost     aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM];
442b033271fSCédric Le Goater 
443baa4732bSCédric Le Goater     if (amc->i2c_init) {
444baa4732bSCédric Le Goater         amc->i2c_init(bmc);
4452cf6cb50SCédric Le Goater     }
4462cf6cb50SCédric Le Goater 
4473c392e87SPhilippe Mathieu-Daudé     for (i = 0; i < bmc->soc->sdhci.num_slots; i++) {
4483c392e87SPhilippe Mathieu-Daudé         sdhci_attach_drive(&bmc->soc->sdhci.slots[i],
449e554e45bSCédric Le Goater                            drive_get(IF_SD, 0, i), false, false);
450a29e3e12SAndrew Jeffery     }
4512bea128cSEddie James 
452e554e45bSCédric Le Goater     boot_emmc = sc->boot_from_emmc(bmc->soc);
453e554e45bSCédric Le Goater 
4543c392e87SPhilippe Mathieu-Daudé     if (bmc->soc->emmc.num_slots) {
455255aed81SCédric Le Goater         emmc0 = drive_get(IF_SD, 0, bmc->soc->sdhci.num_slots);
456e554e45bSCédric Le Goater         sdhci_attach_drive(&bmc->soc->emmc.slots[0], emmc0, true, boot_emmc);
4572bea128cSEddie James     }
4582bea128cSEddie James 
4598b744a6aSCédric Le Goater     if (!bmc->mmio_exec) {
4603c392e87SPhilippe Mathieu-Daudé         DeviceState *dev = ssi_get_cs(bmc->soc->fmc.spi, 0);
4618285490bSCédric Le Goater         BlockBackend *fmc0 = dev ? m25p80_get_blk(dev) : NULL;
4628b744a6aSCédric Le Goater 
463e554e45bSCédric Le Goater         if (fmc0 && !boot_emmc) {
4643c392e87SPhilippe Mathieu-Daudé             uint64_t rom_size = memory_region_size(&bmc->soc->spi_boot);
4658285490bSCédric Le Goater             aspeed_install_boot_rom(bmc, fmc0, rom_size);
466255aed81SCédric Le Goater         } else if (emmc0) {
467255aed81SCédric Le Goater             aspeed_install_boot_rom(bmc, blk_by_legacy_dinfo(emmc0), 64 * KiB);
4688b744a6aSCédric Le Goater         }
4698b744a6aSCédric Le Goater     }
4708b744a6aSCédric Le Goater 
4712744ece8STao Xu     arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo);
472327d8e4eSAndrew Jeffery }
473327d8e4eSAndrew Jeffery 
474612b219aSPhilippe Mathieu-Daudé static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
4752cf6cb50SCédric Le Goater {
4763c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
477a87e81b9SCédric Le Goater     DeviceState *dev;
4783d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
4792cf6cb50SCédric Le Goater 
4804db1c164SJamin Lin     /*
4814db1c164SJamin Lin      * The palmetto platform expects a ds3231 RTC but a ds1338 is
4824db1c164SJamin Lin      * enough to provide basic RTC features. Alarms will be missing
4834db1c164SJamin Lin      */
4841373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
485a87e81b9SCédric Le Goater 
4867a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
4873d165f12SCédric Le Goater                           eeprom_buf);
4883d165f12SCédric Le Goater 
489a87e81b9SCédric Le Goater     /* add a TMP423 temperature sensor */
4901373b15bSPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
4911373b15bSPhilippe Mathieu-Daudé                                          "tmp423", 0x4c));
4925325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
4935325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
4945325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
4955325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort);
4962cf6cb50SCédric Le Goater }
4972cf6cb50SCédric Le Goater 
4989cccb912SPatrick Venture static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc)
4999cccb912SPatrick Venture {
5003c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
5019cccb912SPatrick Venture 
5029cccb912SPatrick Venture     /*
5039cccb912SPatrick Venture      * The quanta-q71l platform expects tmp75s which are compatible with
5049cccb912SPatrick Venture      * tmp105s.
5059cccb912SPatrick Venture      */
5069cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c);
5079cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e);
5089cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f);
5099cccb912SPatrick Venture 
5109cccb912SPatrick Venture     /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */
5119cccb912SPatrick Venture     /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */
5129cccb912SPatrick Venture     /* TODO: Add Memory Riser i2c mux and eeproms. */
5139cccb912SPatrick Venture 
5143ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74);
5153ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77);
5163ec75e39SPatrick Venture 
5179cccb912SPatrick Venture     /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */
5183ec75e39SPatrick Venture 
5193ec75e39SPatrick Venture     /* i2c-7 */
5203ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70);
5219cccb912SPatrick Venture     /*        - i2c@0: pmbus@59 */
5229cccb912SPatrick Venture     /*        - i2c@1: pmbus@58 */
5239cccb912SPatrick Venture     /*        - i2c@2: pmbus@58 */
5249cccb912SPatrick Venture     /*        - i2c@3: pmbus@59 */
5253ec75e39SPatrick Venture 
5269cccb912SPatrick Venture     /* TODO: i2c-7: Add PDB FRU eeprom@52 */
5279cccb912SPatrick Venture     /* TODO: i2c-8: Add BMC FRU eeprom@50 */
5289cccb912SPatrick Venture }
5299cccb912SPatrick Venture 
530612b219aSPhilippe Mathieu-Daudé static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
5312cf6cb50SCédric Le Goater {
5323c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
5333d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
5343d165f12SCédric Le Goater 
5357a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50,
5363d165f12SCédric Le Goater                           eeprom_buf);
5372cf6cb50SCédric Le Goater 
5382cf6cb50SCédric Le Goater     /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
5391373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
540044475f3SPhilippe Mathieu-Daudé                      TYPE_TMP105, 0x4d);
5412cf6cb50SCédric Le Goater }
5422cf6cb50SCédric Le Goater 
543612b219aSPhilippe Mathieu-Daudé static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
544ccc2c418SCédric Le Goater {
5453c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
54652bcd997SHoward Chiu     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
54752bcd997SHoward Chiu 
54852bcd997SHoward Chiu     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50,
54952bcd997SHoward Chiu                           eeprom_buf);
55052bcd997SHoward Chiu 
55152bcd997SHoward Chiu     /* LM75 is compatible with TMP105 driver */
55252bcd997SHoward Chiu     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
55352bcd997SHoward Chiu                      TYPE_TMP105, 0x4d);
554ccc2c418SCédric Le Goater }
555ccc2c418SCédric Le Goater 
55634f73a81SKarthikeyan Pasupathi static void yosemitev2_bmc_i2c_init(AspeedMachineState *bmc)
55734f73a81SKarthikeyan Pasupathi {
5583c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
55934f73a81SKarthikeyan Pasupathi 
56034f73a81SKarthikeyan Pasupathi     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x51, 128 * KiB);
56134f73a81SKarthikeyan Pasupathi     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 128 * KiB,
56234f73a81SKarthikeyan Pasupathi                           yosemitev2_bmc_fruid, yosemitev2_bmc_fruid_len);
5630a1f86baSKarthikeyan Pasupathi     /* TMP421 */
5640a1f86baSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "tmp421", 0x1f);
5650a1f86baSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4e);
5660a1f86baSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4f);
5670a1f86baSKarthikeyan Pasupathi 
56834f73a81SKarthikeyan Pasupathi }
56934f73a81SKarthikeyan Pasupathi 
570612b219aSPhilippe Mathieu-Daudé static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
5716c4567c7SCédric Le Goater {
5723c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
5736c4567c7SCédric Le Goater 
5744db1c164SJamin Lin     /*
5754db1c164SJamin Lin      * The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
5764db1c164SJamin Lin      * good enough
5774db1c164SJamin Lin      */
5781373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
5796c4567c7SCédric Le Goater }
5806c4567c7SCédric Le Goater 
5816c323abaSKarthikeyan Pasupathi static void tiogapass_bmc_i2c_init(AspeedMachineState *bmc)
5826c323abaSKarthikeyan Pasupathi {
5833c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
5846c323abaSKarthikeyan Pasupathi 
5856c323abaSKarthikeyan Pasupathi     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 128 * KiB);
5866c323abaSKarthikeyan Pasupathi     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 6), 0x54, 128 * KiB,
5876c323abaSKarthikeyan Pasupathi                           tiogapass_bmc_fruid, tiogapass_bmc_fruid_len);
588a09d357dSKarthikeyan Pasupathi     /* TMP421 */
589a09d357dSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "tmp421", 0x1f);
590a09d357dSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4f);
591a09d357dSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4e);
5926c323abaSKarthikeyan Pasupathi }
5936c323abaSKarthikeyan Pasupathi 
594f4aec252SCédric Le Goater static void create_pca9552(AspeedSoCState *soc, int bus_id, int addr)
595f4aec252SCédric Le Goater {
596f4aec252SCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, bus_id),
597f4aec252SCédric Le Goater                             TYPE_PCA9552, addr);
598f4aec252SCédric Le Goater }
599f4aec252SCédric Le Goater 
600612b219aSPhilippe Mathieu-Daudé static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc)
601143b040fSPatrick Williams {
6023c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
603143b040fSPatrick Williams 
604143b040fSPatrick Williams     /* bus 2 : */
6051373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48);
6061373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49);
607143b040fSPatrick Williams     /* bus 2 : pca9546 @ 0x73 */
608143b040fSPatrick Williams 
609143b040fSPatrick Williams     /* bus 3 : pca9548 @ 0x70 */
610143b040fSPatrick Williams 
611143b040fSPatrick Williams     /* bus 4 : */
612143b040fSPatrick Williams     uint8_t *eeprom4_54 = g_malloc0(8 * 1024);
6137a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54,
614143b040fSPatrick Williams                           eeprom4_54);
615143b040fSPatrick Williams     /* PCA9539 @ 0x76, but PCA9552 is compatible */
616f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x76);
617143b040fSPatrick Williams     /* PCA9539 @ 0x77, but PCA9552 is compatible */
618f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x77);
619143b040fSPatrick Williams 
620143b040fSPatrick Williams     /* bus 6 : */
6211373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48);
6221373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49);
623143b040fSPatrick Williams     /* bus 6 : pca9546 @ 0x73 */
624143b040fSPatrick Williams 
625143b040fSPatrick Williams     /* bus 8 : */
626143b040fSPatrick Williams     uint8_t *eeprom8_56 = g_malloc0(8 * 1024);
6277a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56,
628143b040fSPatrick Williams                           eeprom8_56);
629f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x60);
630f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x61);
631143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1d */
632143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1f */
633143b040fSPatrick Williams 
634143b040fSPatrick Williams     /*
635143b040fSPatrick Williams      * bus 13 : pca9548 @ 0x71
636143b040fSPatrick Williams      *      - channel 3:
637143b040fSPatrick Williams      *          - tmm421 @ 0x4c
638143b040fSPatrick Williams      *          - tmp421 @ 0x4e
639143b040fSPatrick Williams      *          - tmp421 @ 0x4f
640143b040fSPatrick Williams      */
641143b040fSPatrick Williams 
642143b040fSPatrick Williams }
643143b040fSPatrick Williams 
644612b219aSPhilippe Mathieu-Daudé static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
64562c2c2ebSCédric Le Goater {
6467cfbde5eSPhilippe Mathieu-Daudé     static const struct {
6477cfbde5eSPhilippe Mathieu-Daudé         unsigned gpio_id;
6487cfbde5eSPhilippe Mathieu-Daudé         LEDColor color;
6497cfbde5eSPhilippe Mathieu-Daudé         const char *description;
6507cfbde5eSPhilippe Mathieu-Daudé         bool gpio_polarity;
6517cfbde5eSPhilippe Mathieu-Daudé     } pca1_leds[] = {
6527cfbde5eSPhilippe Mathieu-Daudé         {13, LED_COLOR_GREEN, "front-fault-4",  GPIO_POLARITY_ACTIVE_LOW},
6537cfbde5eSPhilippe Mathieu-Daudé         {14, LED_COLOR_GREEN, "front-power-3",  GPIO_POLARITY_ACTIVE_LOW},
6547cfbde5eSPhilippe Mathieu-Daudé         {15, LED_COLOR_GREEN, "front-id-5",     GPIO_POLARITY_ACTIVE_LOW},
6557cfbde5eSPhilippe Mathieu-Daudé     };
6563c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
6573d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
65815ce12cfSPhilippe Mathieu-Daudé     DeviceState *dev;
6597cfbde5eSPhilippe Mathieu-Daudé     LEDState *led;
66062c2c2ebSCédric Le Goater 
66163ceb818SCédric Le Goater     /* Bus 3: TODO bmp280@77 */
662db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
66315ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca1");
6642616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
6652616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 3),
66615ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
6678c9a61d7SCédric Le Goater 
6687cfbde5eSPhilippe Mathieu-Daudé     for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) {
6697cfbde5eSPhilippe Mathieu-Daudé         led = led_create_simple(OBJECT(bmc),
6707cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].gpio_polarity,
6717cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].color,
6727cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].description);
6737cfbde5eSPhilippe Mathieu-Daudé         qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id,
6747cfbde5eSPhilippe Mathieu-Daudé                               qdev_get_gpio_in(DEVICE(led), 0));
6757cfbde5eSPhilippe Mathieu-Daudé     }
676b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76);
6772a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "max31785", 0x52);
6781373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c);
6791373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c);
68062c2c2ebSCédric Le Goater 
68162c2c2ebSCédric Le Goater     /* The Witherspoon expects a TMP275 but a TMP105 is compatible */
6821373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105,
683044475f3SPhilippe Mathieu-Daudé                      0x4a);
6846c4567c7SCédric Le Goater 
6854db1c164SJamin Lin     /*
6864db1c164SJamin Lin      * The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
6874db1c164SJamin Lin      * good enough
6884db1c164SJamin Lin      */
6891373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
6903d165f12SCédric Le Goater 
6917a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51,
6923d165f12SCédric Le Goater                           eeprom_buf);
693db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
69415ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca0");
6952616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
6962616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 11),
69715ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
69863ceb818SCédric Le Goater     /* Bus 11: TODO ucd90160@64 */
69962c2c2ebSCédric Le Goater }
70062c2c2ebSCédric Le Goater 
70195f068c8SJohn Wang static void g220a_bmc_i2c_init(AspeedMachineState *bmc)
70295f068c8SJohn Wang {
7033c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
70495f068c8SJohn Wang     DeviceState *dev;
70595f068c8SJohn Wang 
70695f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3),
70795f068c8SJohn Wang                                          "emc1413", 0x4c));
70895f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
70995f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
71095f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
71195f068c8SJohn Wang 
71295f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12),
71395f068c8SJohn Wang                                          "emc1413", 0x4c));
71495f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
71595f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
71695f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
71795f068c8SJohn Wang 
71895f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13),
71995f068c8SJohn Wang                                          "emc1413", 0x4c));
72095f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
72195f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
72295f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
7236f5f6507SJohn Wang 
7246f5f6507SJohn Wang     static uint8_t eeprom_buf[2 * 1024] = {
7256f5f6507SJohn Wang             0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe,
7266f5f6507SJohn Wang             0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65,
7276f5f6507SJohn Wang             0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32,
7286f5f6507SJohn Wang             0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42,
7296f5f6507SJohn Wang             0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45,
7306f5f6507SJohn Wang             0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1,
7316f5f6507SJohn Wang             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7,
7326f5f6507SJohn Wang     };
7336f5f6507SJohn Wang     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57,
7346f5f6507SJohn Wang                           eeprom_buf);
73595f068c8SJohn Wang }
73695f068c8SJohn Wang 
73782b6a3f6SJohn Wang static void fp5280g2_bmc_i2c_init(AspeedMachineState *bmc)
73882b6a3f6SJohn Wang {
7393c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
74082b6a3f6SJohn Wang     I2CSlave *i2c_mux;
74182b6a3f6SJohn Wang 
74282b6a3f6SJohn Wang     /* The at24c256 */
74382b6a3f6SJohn Wang     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 1), 0x50, 32768);
74482b6a3f6SJohn Wang 
74582b6a3f6SJohn Wang     /* The fp5280g2 expects a TMP112 but a TMP105 is compatible */
74682b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
74782b6a3f6SJohn Wang                      0x48);
74882b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
74982b6a3f6SJohn Wang                      0x49);
75082b6a3f6SJohn Wang 
75182b6a3f6SJohn Wang     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
75282b6a3f6SJohn Wang                      "pca9546", 0x70);
75382b6a3f6SJohn Wang     /* It expects a TMP112 but a TMP105 is compatible */
75482b6a3f6SJohn Wang     i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0), TYPE_TMP105,
75582b6a3f6SJohn Wang                      0x4a);
75682b6a3f6SJohn Wang 
75782b6a3f6SJohn Wang     /* It expects a ds3232 but a ds1338 is good enough */
75882b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "ds1338", 0x68);
75982b6a3f6SJohn Wang 
76082b6a3f6SJohn Wang     /* It expects a pca9555 but a pca9552 is compatible */
761f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x30);
76282b6a3f6SJohn Wang }
76382b6a3f6SJohn Wang 
76458e52bdbSCédric Le Goater static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
76558e52bdbSCédric Le Goater {
7663c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
767fa6d98c0SJoel Stanley     I2CSlave *i2c_mux;
768fa6d98c0SJoel Stanley 
7699077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB);
77058e52bdbSCédric Le Goater 
771f4aec252SCédric Le Goater     create_pca9552(soc, 3, 0x61);
772bcb122f8SJoel Stanley 
77358e52bdbSCédric Le Goater     /* The rainier expects a TMP275 but a TMP105 is compatible */
77458e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
77558e52bdbSCédric Le Goater                      0x48);
77658e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
77758e52bdbSCédric Le Goater                      0x49);
77858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
77958e52bdbSCédric Le Goater                      0x4a);
780fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4),
781fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
7829077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
7839077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
7849077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB);
785f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x60);
78658e52bdbSCédric Le Goater 
78758e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
78858e52bdbSCédric Le Goater                      0x48);
78958e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
79058e52bdbSCédric Le Goater                      0x49);
791f4aec252SCédric Le Goater     create_pca9552(soc, 5, 0x60);
792f4aec252SCédric Le Goater     create_pca9552(soc, 5, 0x61);
793fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5),
794fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
7959077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
7969077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
79758e52bdbSCédric Le Goater 
79858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
79958e52bdbSCédric Le Goater                      0x48);
80058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
80158e52bdbSCédric Le Goater                      0x4a);
80258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
80358e52bdbSCédric Le Goater                      0x4b);
804fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6),
805fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
8069077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
8079077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
8089077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB);
8099077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB);
81058e52bdbSCédric Le Goater 
811f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x30);
812f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x31);
813f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x32);
814f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x33);
815f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x60);
816f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x61);
817b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76);
81858e52bdbSCédric Le Goater     /* Bus 7: TODO si7021-a20@20 */
81958e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105,
82058e52bdbSCédric Le Goater                      0x48);
8212a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "max31785", 0x52);
8229077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB);
8239077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB);
82458e52bdbSCédric Le Goater 
82558e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
82658e52bdbSCédric Le Goater                      0x48);
82758e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
82858e52bdbSCédric Le Goater                      0x4a);
829be85508fSNinad Palsule     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50,
830be85508fSNinad Palsule                           64 * KiB, rainier_bb_fruid, rainier_bb_fruid_len);
831be85508fSNinad Palsule     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51,
832be85508fSNinad Palsule                           64 * KiB, rainier_bmc_fruid, rainier_bmc_fruid_len);
833f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x60);
834f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x61);
83558e52bdbSCédric Le Goater     /* Bus 8: ucd90320@11 */
83658e52bdbSCédric Le Goater     /* Bus 8: ucd90320@b */
83758e52bdbSCédric Le Goater     /* Bus 8: ucd90320@c */
83858e52bdbSCédric Le Goater 
83958e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c);
84058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d);
8419077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB);
84258e52bdbSCédric Le Goater 
84358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c);
84458e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d);
8459077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB);
84658e52bdbSCédric Le Goater 
84758e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
84858e52bdbSCédric Le Goater                      0x48);
84958e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
85058e52bdbSCédric Le Goater                      0x49);
851fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11),
852fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
8539077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
8549077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
855f4aec252SCédric Le Goater     create_pca9552(soc, 11, 0x60);
856fa6d98c0SJoel Stanley 
857fa6d98c0SJoel Stanley 
8589077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB);
859f4aec252SCédric Le Goater     create_pca9552(soc, 13, 0x60);
860fa6d98c0SJoel Stanley 
8619077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB);
862f4aec252SCédric Le Goater     create_pca9552(soc, 14, 0x60);
863fa6d98c0SJoel Stanley 
8649077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB);
865f4aec252SCédric Le Goater     create_pca9552(soc, 15, 0x60);
86658e52bdbSCédric Le Goater }
86758e52bdbSCédric Le Goater 
868febbe308SPeter Delevoryas static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr,
869febbe308SPeter Delevoryas                                  I2CBus **channels)
870febbe308SPeter Delevoryas {
871febbe308SPeter Delevoryas     I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr);
872febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
873febbe308SPeter Delevoryas         channels[i] = pca954x_i2c_get_bus(mux, i);
874febbe308SPeter Delevoryas     }
875febbe308SPeter Delevoryas }
876febbe308SPeter Delevoryas 
877febbe308SPeter Delevoryas #define TYPE_LM75 TYPE_TMP105
878febbe308SPeter Delevoryas #define TYPE_TMP75 TYPE_TMP105
879febbe308SPeter Delevoryas #define TYPE_TMP422 "tmp422"
880febbe308SPeter Delevoryas 
881febbe308SPeter Delevoryas static void fuji_bmc_i2c_init(AspeedMachineState *bmc)
882febbe308SPeter Delevoryas {
8833c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
884febbe308SPeter Delevoryas     I2CBus *i2c[144] = {};
885febbe308SPeter Delevoryas 
886febbe308SPeter Delevoryas     for (int i = 0; i < 16; i++) {
887febbe308SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
888febbe308SPeter Delevoryas     }
889febbe308SPeter Delevoryas     I2CBus *i2c180 = i2c[2];
890febbe308SPeter Delevoryas     I2CBus *i2c480 = i2c[8];
891febbe308SPeter Delevoryas     I2CBus *i2c600 = i2c[11];
892febbe308SPeter Delevoryas 
893febbe308SPeter Delevoryas     get_pca9548_channels(i2c180, 0x70, &i2c[16]);
894febbe308SPeter Delevoryas     get_pca9548_channels(i2c480, 0x70, &i2c[24]);
895febbe308SPeter Delevoryas     /* NOTE: The device tree skips [32, 40) in the alias numbering */
896febbe308SPeter Delevoryas     get_pca9548_channels(i2c600, 0x77, &i2c[40]);
897febbe308SPeter Delevoryas     get_pca9548_channels(i2c[24], 0x71, &i2c[48]);
898febbe308SPeter Delevoryas     get_pca9548_channels(i2c[25], 0x72, &i2c[56]);
899febbe308SPeter Delevoryas     get_pca9548_channels(i2c[26], 0x76, &i2c[64]);
900febbe308SPeter Delevoryas     get_pca9548_channels(i2c[27], 0x76, &i2c[72]);
901febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
902febbe308SPeter Delevoryas         get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]);
903febbe308SPeter Delevoryas     }
904febbe308SPeter Delevoryas 
905febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c);
906febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d);
907febbe308SPeter Delevoryas 
908ef0eb67eSSittisak Sinprem     /*
909ef0eb67eSSittisak Sinprem      * EEPROM 24c64 size is 64Kbits or 8 Kbytes
910ef0eb67eSSittisak Sinprem      *        24c02 size is 2Kbits or 256 bytes
911ef0eb67eSSittisak Sinprem      */
912ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[19], 0x52, 8 * KiB);
913ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[20], 0x50, 256);
914ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[22], 0x52, 256);
915febbe308SPeter Delevoryas 
916febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x48);
917febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x49);
918febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x4a);
919febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_TMP422, 0x4c);
920febbe308SPeter Delevoryas 
921ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[8], 0x51, 8 * KiB);
922febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a);
923febbe308SPeter Delevoryas 
924febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[50], TYPE_LM75, 0x4c);
925ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[50], 0x52, 8 * KiB);
926febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[51], TYPE_TMP75, 0x48);
927febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[52], TYPE_TMP75, 0x49);
928febbe308SPeter Delevoryas 
929febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[59], TYPE_TMP75, 0x48);
930febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[60], TYPE_TMP75, 0x49);
931febbe308SPeter Delevoryas 
932ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[65], 0x53, 8 * KiB);
933febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x49);
934febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x48);
935ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[68], 0x52, 8 * KiB);
936ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[69], 0x52, 8 * KiB);
937ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[70], 0x52, 8 * KiB);
938ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[71], 0x52, 8 * KiB);
939febbe308SPeter Delevoryas 
940ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[73], 0x53, 8 * KiB);
941febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x49);
942febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x48);
943ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[76], 0x52, 8 * KiB);
944ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[77], 0x52, 8 * KiB);
945ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[78], 0x52, 8 * KiB);
946ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[79], 0x52, 8 * KiB);
947ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[28], 0x50, 256);
948febbe308SPeter Delevoryas 
949febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
9509077e09aSPeter Delevoryas         at24c_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB);
951febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[82 + i * 8], TYPE_TMP75, 0x48);
952febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[83 + i * 8], TYPE_TMP75, 0x4b);
953febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[84 + i * 8], TYPE_TMP75, 0x4a);
954febbe308SPeter Delevoryas     }
955febbe308SPeter Delevoryas }
956febbe308SPeter Delevoryas 
957a20c54b1SPatrick Williams #define TYPE_TMP421 "tmp421"
958a20c54b1SPatrick Williams 
959a20c54b1SPatrick Williams static void bletchley_bmc_i2c_init(AspeedMachineState *bmc)
960a20c54b1SPatrick Williams {
9613c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
962a20c54b1SPatrick Williams     I2CBus *i2c[13] = {};
963a20c54b1SPatrick Williams     for (int i = 0; i < 13; i++) {
964a20c54b1SPatrick Williams         if ((i == 8) || (i == 11)) {
965a20c54b1SPatrick Williams             continue;
966a20c54b1SPatrick Williams         }
967a20c54b1SPatrick Williams         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
968a20c54b1SPatrick Williams     }
969a20c54b1SPatrick Williams 
970a20c54b1SPatrick Williams     /* Bus 0 - 5 all have the same config. */
971a20c54b1SPatrick Williams     for (int i = 0; i < 6; i++) {
972a20c54b1SPatrick Williams         /* Missing model: ti,ina230 @ 0x45 */
973a20c54b1SPatrick Williams         /* Missing model: mps,mp5023 @ 0x40 */
974a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_TMP421, 0x4f);
975a20c54b1SPatrick Williams         /* Missing model: nxp,pca9539 @ 0x76, but PCA9552 works enough */
976a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x76);
977a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x67);
978a20c54b1SPatrick Williams         /* Missing model: fsc,fusb302 @ 0x22 */
979a20c54b1SPatrick Williams     }
980a20c54b1SPatrick Williams 
981a20c54b1SPatrick Williams     /* Bus 6 */
982a20c54b1SPatrick Williams     at24c_eeprom_init(i2c[6], 0x56, 65536);
983a20c54b1SPatrick Williams     /* Missing model: nxp,pcf85263 @ 0x51 , but ds1338 works enough */
984a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[6], "ds1338", 0x51);
985a20c54b1SPatrick Williams 
986a20c54b1SPatrick Williams 
987a20c54b1SPatrick Williams     /* Bus 7 */
988a20c54b1SPatrick Williams     at24c_eeprom_init(i2c[7], 0x54, 65536);
989a20c54b1SPatrick Williams 
990a20c54b1SPatrick Williams     /* Bus 9 */
991a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[9], TYPE_TMP421, 0x4f);
992a20c54b1SPatrick Williams 
993a20c54b1SPatrick Williams     /* Bus 10 */
994a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[10], TYPE_TMP421, 0x4f);
995a20c54b1SPatrick Williams     /* Missing model: ti,hdc1080 @ 0x40 */
996a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[10], TYPE_PCA9552, 0x67);
997a20c54b1SPatrick Williams 
998a20c54b1SPatrick Williams     /* Bus 12 */
999a20c54b1SPatrick Williams     /* Missing model: adi,adm1278 @ 0x11 */
1000a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4c);
1001a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4d);
1002a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_PCA9552, 0x67);
1003a20c54b1SPatrick Williams }
1004a20c54b1SPatrick Williams 
1005fa699e80SPeter Delevoryas static void fby35_i2c_init(AspeedMachineState *bmc)
1006fa699e80SPeter Delevoryas {
10073c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
1008fa699e80SPeter Delevoryas     I2CBus *i2c[16];
1009fa699e80SPeter Delevoryas 
1010fa699e80SPeter Delevoryas     for (int i = 0; i < 16; i++) {
1011fa699e80SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
1012fa699e80SPeter Delevoryas     }
1013fa699e80SPeter Delevoryas 
1014fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[2], TYPE_LM75, 0x4f);
1015fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_TMP421, 0x1f);
1016fa699e80SPeter Delevoryas     /* Hotswap controller is actually supposed to be mp5920 or ltc4282. */
1017fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[11], "adm1272", 0x44);
1018fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4e);
1019fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4f);
1020fa699e80SPeter Delevoryas 
10219077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[4], 0x51, 128 * KiB);
10229077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[6], 0x51, 128 * KiB);
1023c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[8], 0x50, 32 * KiB, fby35_nic_fruid,
1024c0216b94SPeter Delevoryas                           fby35_nic_fruid_len);
1025c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[11], 0x51, 128 * KiB, fby35_bb_fruid,
1026c0216b94SPeter Delevoryas                           fby35_bb_fruid_len);
1027c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[11], 0x54, 128 * KiB, fby35_bmc_fruid,
1028c0216b94SPeter Delevoryas                           fby35_bmc_fruid_len);
1029fa699e80SPeter Delevoryas 
1030fa699e80SPeter Delevoryas     /*
1031fa699e80SPeter Delevoryas      * TODO: There is a multi-master i2c connection to an AST1030 MiniBMC on
1032fa699e80SPeter Delevoryas      * buses 0, 1, 2, 3, and 9. Source address 0x10, target address 0x20 on
1033fa699e80SPeter Delevoryas      * each.
1034fa699e80SPeter Delevoryas      */
1035fa699e80SPeter Delevoryas }
1036fa699e80SPeter Delevoryas 
1037fb6b3c8dSJae Hyun Yoo static void qcom_dc_scm_bmc_i2c_init(AspeedMachineState *bmc)
1038fb6b3c8dSJae Hyun Yoo {
10393c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
1040fb6b3c8dSJae Hyun Yoo 
1041fb6b3c8dSJae Hyun Yoo     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 15), "tmp105", 0x4d);
1042fb6b3c8dSJae Hyun Yoo }
1043fb6b3c8dSJae Hyun Yoo 
1044ece4cccdSGraeme Gregory static void qcom_dc_scm_firework_i2c_init(AspeedMachineState *bmc)
1045ece4cccdSGraeme Gregory {
10463c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
10472a7a5d5cSJae Hyun Yoo     I2CSlave *therm_mux, *cpuvr_mux;
1048ece4cccdSGraeme Gregory 
1049ece4cccdSGraeme Gregory     /* Create the generic DC-SCM hardware */
1050ece4cccdSGraeme Gregory     qcom_dc_scm_bmc_i2c_init(bmc);
1051ece4cccdSGraeme Gregory 
1052ece4cccdSGraeme Gregory     /* Now create the Firework specific hardware */
10532a75e8c3SMaheswara Kurapati 
10542a7a5d5cSJae Hyun Yoo     /* I2C7 CPUVR MUX */
10552a7a5d5cSJae Hyun Yoo     cpuvr_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
10562a7a5d5cSJae Hyun Yoo                                         "pca9546", 0x70);
10572a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 0), "pca9548", 0x72);
10582a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 1), "pca9548", 0x72);
10592a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 2), "pca9548", 0x72);
10602a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 3), "pca9548", 0x72);
10612a7a5d5cSJae Hyun Yoo 
1062cfc68f16SMaheswara Kurapati     /* I2C8 Thermal Diodes*/
1063cfc68f16SMaheswara Kurapati     therm_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
1064cfc68f16SMaheswara Kurapati                                         "pca9548", 0x70);
1065cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 0), TYPE_LM75, 0x4C);
1066cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 1), TYPE_LM75, 0x4C);
1067cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 2), TYPE_LM75, 0x48);
1068cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 3), TYPE_LM75, 0x48);
1069cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 4), TYPE_LM75, 0x48);
1070cfc68f16SMaheswara Kurapati 
10712a75e8c3SMaheswara Kurapati     /* I2C9 Fan Controller (MAX31785) */
10722a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x52);
10732a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x54);
1074ece4cccdSGraeme Gregory }
1075ece4cccdSGraeme Gregory 
10761a15311aSCédric Le Goater static bool aspeed_get_mmio_exec(Object *obj, Error **errp)
10771a15311aSCédric Le Goater {
10781a15311aSCédric Le Goater     return ASPEED_MACHINE(obj)->mmio_exec;
10791a15311aSCédric Le Goater }
10801a15311aSCédric Le Goater 
10811a15311aSCédric Le Goater static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp)
10821a15311aSCédric Le Goater {
10831a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = value;
10841a15311aSCédric Le Goater }
10851a15311aSCédric Le Goater 
10861a15311aSCédric Le Goater static void aspeed_machine_instance_init(Object *obj)
10871a15311aSCédric Le Goater {
1088621845a9SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(obj);
1089621845a9SCédric Le Goater 
10901a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = false;
1091621845a9SCédric Le Goater     ASPEED_MACHINE(obj)->hw_strap1 = amc->hw_strap1;
10921a15311aSCédric Le Goater }
10931a15311aSCédric Le Goater 
10949820e52fSCédric Le Goater static char *aspeed_get_fmc_model(Object *obj, Error **errp)
10959820e52fSCédric Le Goater {
10969820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10979820e52fSCédric Le Goater     return g_strdup(bmc->fmc_model);
10989820e52fSCédric Le Goater }
10999820e52fSCédric Le Goater 
11009820e52fSCédric Le Goater static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp)
11019820e52fSCédric Le Goater {
11029820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
11039820e52fSCédric Le Goater 
11049820e52fSCédric Le Goater     g_free(bmc->fmc_model);
11059820e52fSCédric Le Goater     bmc->fmc_model = g_strdup(value);
11069820e52fSCédric Le Goater }
11079820e52fSCédric Le Goater 
11089820e52fSCédric Le Goater static char *aspeed_get_spi_model(Object *obj, Error **errp)
11099820e52fSCédric Le Goater {
11109820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
11119820e52fSCédric Le Goater     return g_strdup(bmc->spi_model);
11129820e52fSCédric Le Goater }
11139820e52fSCédric Le Goater 
11149820e52fSCédric Le Goater static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp)
11159820e52fSCédric Le Goater {
11169820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
11179820e52fSCédric Le Goater 
11189820e52fSCédric Le Goater     g_free(bmc->spi_model);
11199820e52fSCédric Le Goater     bmc->spi_model = g_strdup(value);
11209820e52fSCédric Le Goater }
11219820e52fSCédric Le Goater 
1122f65f6ad5SCédric Le Goater static char *aspeed_get_bmc_console(Object *obj, Error **errp)
1123f65f6ad5SCédric Le Goater {
1124f65f6ad5SCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1125f65f6ad5SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
1126f65f6ad5SCédric Le Goater     int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default;
1127f65f6ad5SCédric Le Goater 
1128944128eeSJamin Lin     return g_strdup_printf("uart%d", aspeed_uart_index(uart_chosen));
1129f65f6ad5SCédric Le Goater }
1130f65f6ad5SCédric Le Goater 
1131f65f6ad5SCédric Le Goater static void aspeed_set_bmc_console(Object *obj, const char *value, Error **errp)
1132f65f6ad5SCédric Le Goater {
1133f65f6ad5SCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1134f65f6ad5SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
1135f65f6ad5SCédric Le Goater     AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(amc->soc_name));
1136f65f6ad5SCédric Le Goater     int val;
1137944128eeSJamin Lin     int uart_first = aspeed_uart_first(sc);
1138944128eeSJamin Lin     int uart_last = aspeed_uart_last(sc);
1139f65f6ad5SCédric Le Goater 
1140f65f6ad5SCédric Le Goater     if (sscanf(value, "uart%u", &val) != 1) {
1141f65f6ad5SCédric Le Goater         error_setg(errp, "Bad value for \"uart\" property");
1142f65f6ad5SCédric Le Goater         return;
1143f65f6ad5SCédric Le Goater     }
1144f65f6ad5SCédric Le Goater 
1145f65f6ad5SCédric Le Goater     /* The number of UART depends on the SoC */
1146944128eeSJamin Lin     if (val < uart_first || val > uart_last) {
1147944128eeSJamin Lin         error_setg(errp, "\"uart\" should be in range [%d - %d]",
1148944128eeSJamin Lin                    uart_first, uart_last);
1149f65f6ad5SCédric Le Goater         return;
1150f65f6ad5SCédric Le Goater     }
1151944128eeSJamin Lin     bmc->uart_chosen = val + ASPEED_DEV_UART0;
1152f65f6ad5SCédric Le Goater }
1153f65f6ad5SCédric Le Goater 
11541a15311aSCédric Le Goater static void aspeed_machine_class_props_init(ObjectClass *oc)
11551a15311aSCédric Le Goater {
11561a15311aSCédric Le Goater     object_class_property_add_bool(oc, "execute-in-place",
11571a15311aSCédric Le Goater                                    aspeed_get_mmio_exec,
1158d2623129SMarkus Armbruster                                    aspeed_set_mmio_exec);
11591a15311aSCédric Le Goater     object_class_property_set_description(oc, "execute-in-place",
11607eecec7dSMarkus Armbruster                            "boot directly from CE0 flash device");
11619820e52fSCédric Le Goater 
1162f65f6ad5SCédric Le Goater     object_class_property_add_str(oc, "bmc-console", aspeed_get_bmc_console,
1163f65f6ad5SCédric Le Goater                                   aspeed_set_bmc_console);
1164f65f6ad5SCédric Le Goater     object_class_property_set_description(oc, "bmc-console",
1165f65f6ad5SCédric Le Goater                            "Change the default UART to \"uartX\"");
1166f65f6ad5SCédric Le Goater 
11679820e52fSCédric Le Goater     object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model,
11689820e52fSCédric Le Goater                                    aspeed_set_fmc_model);
11699820e52fSCédric Le Goater     object_class_property_set_description(oc, "fmc-model",
11709820e52fSCédric Le Goater                                           "Change the FMC Flash model");
11719820e52fSCédric Le Goater     object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model,
11729820e52fSCédric Le Goater                                    aspeed_set_spi_model);
11739820e52fSCédric Le Goater     object_class_property_set_description(oc, "spi-model",
11749820e52fSCédric Le Goater                                           "Change the SPI Flash model");
11751a15311aSCédric Le Goater }
11761a15311aSCédric Le Goater 
117743a0a5c9SPhilippe Mathieu-Daudé static void aspeed_machine_class_init_cpus_defaults(MachineClass *mc)
1178b7f1a0cbSCédric Le Goater {
117943a0a5c9SPhilippe Mathieu-Daudé     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(mc);
118043a0a5c9SPhilippe Mathieu-Daudé     AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(amc->soc_name));
118143a0a5c9SPhilippe Mathieu-Daudé 
118243a0a5c9SPhilippe Mathieu-Daudé     mc->default_cpus = sc->num_cpus;
118343a0a5c9SPhilippe Mathieu-Daudé     mc->min_cpus = sc->num_cpus;
118443a0a5c9SPhilippe Mathieu-Daudé     mc->max_cpus = sc->num_cpus;
1185dc13909eSPhilippe Mathieu-Daudé     mc->valid_cpu_types = sc->valid_cpu_types;
1186b7f1a0cbSCédric Le Goater }
1187b7f1a0cbSCédric Le Goater 
1188056b779eSCédric Le Goater static bool aspeed_machine_ast2600_get_boot_from_emmc(Object *obj, Error **errp)
1189056b779eSCédric Le Goater {
1190056b779eSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1191056b779eSCédric Le Goater 
1192056b779eSCédric Le Goater     return !!(bmc->hw_strap1 & SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC);
1193056b779eSCédric Le Goater }
1194056b779eSCédric Le Goater 
1195056b779eSCédric Le Goater static void aspeed_machine_ast2600_set_boot_from_emmc(Object *obj, bool value,
1196056b779eSCédric Le Goater                                                       Error **errp)
1197056b779eSCédric Le Goater {
1198056b779eSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1199056b779eSCédric Le Goater 
1200056b779eSCédric Le Goater     if (value) {
1201056b779eSCédric Le Goater         bmc->hw_strap1 |= SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC;
1202056b779eSCédric Le Goater     } else {
1203056b779eSCédric Le Goater         bmc->hw_strap1 &= ~SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC;
1204056b779eSCédric Le Goater     }
1205056b779eSCédric Le Goater }
1206056b779eSCédric Le Goater 
1207056b779eSCédric Le Goater static void aspeed_machine_ast2600_class_emmc_init(ObjectClass *oc)
1208056b779eSCédric Le Goater {
1209056b779eSCédric Le Goater     object_class_property_add_bool(oc, "boot-emmc",
1210056b779eSCédric Le Goater                                    aspeed_machine_ast2600_get_boot_from_emmc,
1211056b779eSCédric Le Goater                                    aspeed_machine_ast2600_set_boot_from_emmc);
1212056b779eSCédric Le Goater     object_class_property_set_description(oc, "boot-emmc",
1213056b779eSCédric Le Goater                                           "Set or unset boot from EMMC");
1214056b779eSCédric Le Goater }
1215056b779eSCédric Le Goater 
1216fca9ca1bSCédric Le Goater static void aspeed_machine_class_init(ObjectClass *oc, void *data)
121762c2c2ebSCédric Le Goater {
121862c2c2ebSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1219d3bad7e7SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
122062c2c2ebSCédric Le Goater 
1221fca9ca1bSCédric Le Goater     mc->init = aspeed_machine_init;
122262c2c2ebSCédric Le Goater     mc->no_floppy = 1;
122362c2c2ebSCédric Le Goater     mc->no_cdrom = 1;
122462c2c2ebSCédric Le Goater     mc->no_parallel = 1;
1225afcbaed6SIgor Mammedov     mc->default_ram_id = "ram";
1226d3bad7e7SCédric Le Goater     amc->macs_mask = ASPEED_MAC0_ON;
12275d63d0c7SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART5;
12281a15311aSCédric Le Goater 
12291a15311aSCédric Le Goater     aspeed_machine_class_props_init(oc);
123062c2c2ebSCédric Le Goater }
123162c2c2ebSCédric Le Goater 
1232baa4732bSCédric Le Goater static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
1233baa4732bSCédric Le Goater {
1234baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1235baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1236baa4732bSCédric Le Goater 
1237baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Palmetto BMC (ARM926EJ-S)";
1238baa4732bSCédric Le Goater     amc->soc_name  = "ast2400-a1";
1239baa4732bSCédric Le Goater     amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1;
1240baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
124170322913SCédric Le Goater     amc->spi_model = "mx25l25635f";
1242baa4732bSCédric Le Goater     amc->num_cs    = 1;
1243baa4732bSCédric Le Goater     amc->i2c_init  = palmetto_bmc_i2c_init;
1244baa4732bSCédric Le Goater     mc->default_ram_size       = 256 * MiB;
124543a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1246baa4732bSCédric Le Goater };
1247baa4732bSCédric Le Goater 
12489cccb912SPatrick Venture static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data)
12499cccb912SPatrick Venture {
12509cccb912SPatrick Venture     MachineClass *mc = MACHINE_CLASS(oc);
12519cccb912SPatrick Venture     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
12529cccb912SPatrick Venture 
12539cccb912SPatrick Venture     mc->desc       = "Quanta-Q71l BMC (ARM926EJ-S)";
12549cccb912SPatrick Venture     amc->soc_name  = "ast2400-a1";
12559cccb912SPatrick Venture     amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1;
12569cccb912SPatrick Venture     amc->fmc_model = "n25q256a";
12579cccb912SPatrick Venture     amc->spi_model = "mx25l25635e";
12589cccb912SPatrick Venture     amc->num_cs    = 1;
12599cccb912SPatrick Venture     amc->i2c_init  = quanta_q71l_bmc_i2c_init;
12609cccb912SPatrick Venture     mc->default_ram_size       = 128 * MiB;
126143a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
12629cccb912SPatrick Venture }
12639cccb912SPatrick Venture 
126440a38df5SErik Smit static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc,
126540a38df5SErik Smit                                                         void *data)
126640a38df5SErik Smit {
126740a38df5SErik Smit     MachineClass *mc = MACHINE_CLASS(oc);
126840a38df5SErik Smit     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
126940a38df5SErik Smit 
127040a38df5SErik Smit     mc->desc       = "Supermicro X11 BMC (ARM926EJ-S)";
127140a38df5SErik Smit     amc->soc_name  = "ast2400-a1";
127240a38df5SErik Smit     amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1;
127340a38df5SErik Smit     amc->fmc_model = "mx25l25635e";
127440a38df5SErik Smit     amc->spi_model = "mx25l25635e";
127540a38df5SErik Smit     amc->num_cs    = 1;
127640a38df5SErik Smit     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
127740a38df5SErik Smit     amc->i2c_init  = palmetto_bmc_i2c_init;
127840a38df5SErik Smit     mc->default_ram_size = 256 * MiB;
127943a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
128040a38df5SErik Smit }
128140a38df5SErik Smit 
128247936597SGuenter Roeck static void aspeed_machine_supermicro_x11spi_bmc_class_init(ObjectClass *oc,
128347936597SGuenter Roeck                                                             void *data)
128447936597SGuenter Roeck {
128547936597SGuenter Roeck     MachineClass *mc = MACHINE_CLASS(oc);
128647936597SGuenter Roeck     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
128747936597SGuenter Roeck 
128847936597SGuenter Roeck     mc->desc       = "Supermicro X11 SPI BMC (ARM1176)";
128947936597SGuenter Roeck     amc->soc_name  = "ast2500-a1";
129047936597SGuenter Roeck     amc->hw_strap1 = SUPERMICRO_X11SPI_BMC_HW_STRAP1;
129147936597SGuenter Roeck     amc->fmc_model = "mx25l25635e";
129247936597SGuenter Roeck     amc->spi_model = "mx25l25635e";
129347936597SGuenter Roeck     amc->num_cs    = 1;
129447936597SGuenter Roeck     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
129547936597SGuenter Roeck     amc->i2c_init  = palmetto_bmc_i2c_init;
129647936597SGuenter Roeck     mc->default_ram_size = 512 * MiB;
129743a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
129847936597SGuenter Roeck }
129947936597SGuenter Roeck 
1300baa4732bSCédric Le Goater static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data)
1301baa4732bSCédric Le Goater {
1302baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1303baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1304baa4732bSCédric Le Goater 
1305baa4732bSCédric Le Goater     mc->desc       = "Aspeed AST2500 EVB (ARM1176)";
1306baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1307baa4732bSCédric Le Goater     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
1308753abfc4SJae Hyun Yoo     amc->fmc_model = "mx25l25635e";
130970322913SCédric Le Goater     amc->spi_model = "mx25l25635f";
1310baa4732bSCédric Le Goater     amc->num_cs    = 1;
1311baa4732bSCédric Le Goater     amc->i2c_init  = ast2500_evb_i2c_init;
1312baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
131343a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1314baa4732bSCédric Le Goater };
1315baa4732bSCédric Le Goater 
131634f73a81SKarthikeyan Pasupathi static void aspeed_machine_yosemitev2_class_init(ObjectClass *oc, void *data)
131734f73a81SKarthikeyan Pasupathi {
131834f73a81SKarthikeyan Pasupathi     MachineClass *mc = MACHINE_CLASS(oc);
131934f73a81SKarthikeyan Pasupathi     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
132034f73a81SKarthikeyan Pasupathi 
132134f73a81SKarthikeyan Pasupathi     mc->desc       = "Facebook YosemiteV2 BMC (ARM1176)";
132234f73a81SKarthikeyan Pasupathi     amc->soc_name  = "ast2500-a1";
132334f73a81SKarthikeyan Pasupathi     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
132434f73a81SKarthikeyan Pasupathi     amc->hw_strap2 = 0;
132534f73a81SKarthikeyan Pasupathi     amc->fmc_model = "n25q256a";
132634f73a81SKarthikeyan Pasupathi     amc->spi_model = "mx25l25635e";
132734f73a81SKarthikeyan Pasupathi     amc->num_cs    = 2;
132834f73a81SKarthikeyan Pasupathi     amc->i2c_init  = yosemitev2_bmc_i2c_init;
132934f73a81SKarthikeyan Pasupathi     mc->default_ram_size       = 512 * MiB;
133043a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
133134f73a81SKarthikeyan Pasupathi };
133234f73a81SKarthikeyan Pasupathi 
1333baa4732bSCédric Le Goater static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data)
1334baa4732bSCédric Le Goater {
1335baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1336baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1337baa4732bSCédric Le Goater 
1338baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Romulus BMC (ARM1176)";
1339baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1340baa4732bSCédric Le Goater     amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1;
1341baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
1342baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1343baa4732bSCédric Le Goater     amc->num_cs    = 2;
1344baa4732bSCédric Le Goater     amc->i2c_init  = romulus_bmc_i2c_init;
1345baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
134643a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1347baa4732bSCédric Le Goater };
1348baa4732bSCédric Le Goater 
13496c323abaSKarthikeyan Pasupathi static void aspeed_machine_tiogapass_class_init(ObjectClass *oc, void *data)
13506c323abaSKarthikeyan Pasupathi {
13516c323abaSKarthikeyan Pasupathi     MachineClass *mc = MACHINE_CLASS(oc);
13526c323abaSKarthikeyan Pasupathi     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
13536c323abaSKarthikeyan Pasupathi 
13546c323abaSKarthikeyan Pasupathi     mc->desc       = "Facebook Tiogapass BMC (ARM1176)";
13556c323abaSKarthikeyan Pasupathi     amc->soc_name  = "ast2500-a1";
13566c323abaSKarthikeyan Pasupathi     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
13576c323abaSKarthikeyan Pasupathi     amc->hw_strap2 = 0;
13586c323abaSKarthikeyan Pasupathi     amc->fmc_model = "n25q256a";
13596c323abaSKarthikeyan Pasupathi     amc->spi_model = "mx25l25635e";
13606c323abaSKarthikeyan Pasupathi     amc->num_cs    = 2;
13616c323abaSKarthikeyan Pasupathi     amc->i2c_init  = tiogapass_bmc_i2c_init;
13626c323abaSKarthikeyan Pasupathi     mc->default_ram_size       = 1 * GiB;
136343a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
13646c323abaSKarthikeyan Pasupathi };
13656c323abaSKarthikeyan Pasupathi 
1366143b040fSPatrick Williams static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data)
1367143b040fSPatrick Williams {
1368143b040fSPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1369143b040fSPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1370143b040fSPatrick Williams 
1371143b040fSPatrick Williams     mc->desc       = "OCP SonoraPass BMC (ARM1176)";
1372143b040fSPatrick Williams     amc->soc_name  = "ast2500-a1";
1373143b040fSPatrick Williams     amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1;
1374143b040fSPatrick Williams     amc->fmc_model = "mx66l1g45g";
1375143b040fSPatrick Williams     amc->spi_model = "mx66l1g45g";
1376143b040fSPatrick Williams     amc->num_cs    = 2;
1377143b040fSPatrick Williams     amc->i2c_init  = sonorapass_bmc_i2c_init;
1378143b040fSPatrick Williams     mc->default_ram_size       = 512 * MiB;
137943a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1380143b040fSPatrick Williams };
1381143b040fSPatrick Williams 
1382baa4732bSCédric Le Goater static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data)
1383baa4732bSCédric Le Goater {
1384baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1385baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1386baa4732bSCédric Le Goater 
1387baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Witherspoon BMC (ARM1176)";
1388baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1389baa4732bSCédric Le Goater     amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1;
139070322913SCédric Le Goater     amc->fmc_model = "mx25l25635f";
1391baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1392baa4732bSCédric Le Goater     amc->num_cs    = 2;
1393baa4732bSCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init;
1394baa4732bSCédric Le Goater     mc->default_ram_size = 512 * MiB;
139543a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1396baa4732bSCédric Le Goater };
1397baa4732bSCédric Le Goater 
1398baa4732bSCédric Le Goater static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
1399baa4732bSCédric Le Goater {
1400baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1401baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1402baa4732bSCédric Le Goater 
1403f548f201SPeter Maydell     mc->desc       = "Aspeed AST2600 EVB (Cortex-A7)";
1404c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
1405baa4732bSCédric Le Goater     amc->hw_strap1 = AST2600_EVB_HW_STRAP1;
1406baa4732bSCédric Le Goater     amc->hw_strap2 = AST2600_EVB_HW_STRAP2;
1407753abfc4SJae Hyun Yoo     amc->fmc_model = "mx66u51235f";
1408baa4732bSCédric Le Goater     amc->spi_model = "mx66u51235f";
1409baa4732bSCédric Le Goater     amc->num_cs    = 1;
141029193286SGuenter Roeck     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON |
141129193286SGuenter Roeck                      ASPEED_MAC3_ON;
1412baa4732bSCédric Le Goater     amc->i2c_init  = ast2600_evb_i2c_init;
1413baa4732bSCédric Le Goater     mc->default_ram_size = 1 * GiB;
141443a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1415056b779eSCédric Le Goater     aspeed_machine_ast2600_class_emmc_init(oc);
1416baa4732bSCédric Le Goater };
1417baa4732bSCédric Le Goater 
141863ceb818SCédric Le Goater static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data)
141963ceb818SCédric Le Goater {
142063ceb818SCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
142163ceb818SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
142263ceb818SCédric Le Goater 
1423f548f201SPeter Maydell     mc->desc       = "OpenPOWER Tacoma BMC (Cortex-A7)";
1424c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
142563ceb818SCédric Le Goater     amc->hw_strap1 = TACOMA_BMC_HW_STRAP1;
142663ceb818SCédric Le Goater     amc->hw_strap2 = TACOMA_BMC_HW_STRAP2;
142763ceb818SCédric Le Goater     amc->fmc_model = "mx66l1g45g";
142863ceb818SCédric Le Goater     amc->spi_model = "mx66l1g45g";
142963ceb818SCédric Le Goater     amc->num_cs    = 2;
1430d3bad7e7SCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON;
143163ceb818SCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init; /* Same board layout */
143263ceb818SCédric Le Goater     mc->default_ram_size = 1 * GiB;
143343a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
143456a37edaSCédric Le Goater 
143556a37edaSCédric Le Goater     mc->deprecation_reason = "Please use the similar 'rainier-bmc' machine";
143663ceb818SCédric Le Goater };
143763ceb818SCédric Le Goater 
143895f068c8SJohn Wang static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data)
143995f068c8SJohn Wang {
144095f068c8SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
144195f068c8SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
144295f068c8SJohn Wang 
144395f068c8SJohn Wang     mc->desc       = "Bytedance G220A BMC (ARM1176)";
144495f068c8SJohn Wang     amc->soc_name  = "ast2500-a1";
144595f068c8SJohn Wang     amc->hw_strap1 = G220A_BMC_HW_STRAP1;
144695f068c8SJohn Wang     amc->fmc_model = "n25q512a";
144795f068c8SJohn Wang     amc->spi_model = "mx25l25635e";
144895f068c8SJohn Wang     amc->num_cs    = 2;
14495bb825c8SGuenter Roeck     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
145095f068c8SJohn Wang     amc->i2c_init  = g220a_bmc_i2c_init;
145195f068c8SJohn Wang     mc->default_ram_size = 1024 * MiB;
145243a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
145395f068c8SJohn Wang };
145495f068c8SJohn Wang 
145582b6a3f6SJohn Wang static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc, void *data)
145682b6a3f6SJohn Wang {
145782b6a3f6SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
145882b6a3f6SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
145982b6a3f6SJohn Wang 
146082b6a3f6SJohn Wang     mc->desc       = "Inspur FP5280G2 BMC (ARM1176)";
146182b6a3f6SJohn Wang     amc->soc_name  = "ast2500-a1";
146282b6a3f6SJohn Wang     amc->hw_strap1 = FP5280G2_BMC_HW_STRAP1;
146382b6a3f6SJohn Wang     amc->fmc_model = "n25q512a";
146482b6a3f6SJohn Wang     amc->spi_model = "mx25l25635e";
146582b6a3f6SJohn Wang     amc->num_cs    = 2;
146682b6a3f6SJohn Wang     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
146782b6a3f6SJohn Wang     amc->i2c_init  = fp5280g2_bmc_i2c_init;
146882b6a3f6SJohn Wang     mc->default_ram_size = 512 * MiB;
146943a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
147082b6a3f6SJohn Wang };
147182b6a3f6SJohn Wang 
147258e52bdbSCédric Le Goater static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data)
147358e52bdbSCédric Le Goater {
147458e52bdbSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
147558e52bdbSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
147658e52bdbSCédric Le Goater 
1477f548f201SPeter Maydell     mc->desc       = "IBM Rainier BMC (Cortex-A7)";
1478c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
147958e52bdbSCédric Le Goater     amc->hw_strap1 = RAINIER_BMC_HW_STRAP1;
148058e52bdbSCédric Le Goater     amc->hw_strap2 = RAINIER_BMC_HW_STRAP2;
148158e52bdbSCédric Le Goater     amc->fmc_model = "mx66l1g45g";
148258e52bdbSCédric Le Goater     amc->spi_model = "mx66l1g45g";
148358e52bdbSCédric Le Goater     amc->num_cs    = 2;
148458e52bdbSCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
148558e52bdbSCédric Le Goater     amc->i2c_init  = rainier_bmc_i2c_init;
148658e52bdbSCédric Le Goater     mc->default_ram_size = 1 * GiB;
148743a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1488056b779eSCédric Le Goater     aspeed_machine_ast2600_class_emmc_init(oc);
148958e52bdbSCédric Le Goater };
149058e52bdbSCédric Le Goater 
14911e2c22c9SCédric Le Goater #define FUJI_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB)
1492febbe308SPeter Delevoryas 
1493febbe308SPeter Delevoryas static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data)
1494febbe308SPeter Delevoryas {
1495febbe308SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1496febbe308SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1497febbe308SPeter Delevoryas 
1498febbe308SPeter Delevoryas     mc->desc = "Facebook Fuji BMC (Cortex-A7)";
1499febbe308SPeter Delevoryas     amc->soc_name = "ast2600-a3";
1500febbe308SPeter Delevoryas     amc->hw_strap1 = FUJI_BMC_HW_STRAP1;
1501febbe308SPeter Delevoryas     amc->hw_strap2 = FUJI_BMC_HW_STRAP2;
1502febbe308SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1503febbe308SPeter Delevoryas     amc->spi_model = "mx66l1g45g";
1504febbe308SPeter Delevoryas     amc->num_cs = 2;
1505febbe308SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1506febbe308SPeter Delevoryas     amc->i2c_init = fuji_bmc_i2c_init;
1507febbe308SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART1;
1508febbe308SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
150943a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1510febbe308SPeter Delevoryas };
1511febbe308SPeter Delevoryas 
15121e2c22c9SCédric Le Goater #define BLETCHLEY_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB)
1513104bdaffSPatrick Williams 
1514a20c54b1SPatrick Williams static void aspeed_machine_bletchley_class_init(ObjectClass *oc, void *data)
1515a20c54b1SPatrick Williams {
1516a20c54b1SPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1517a20c54b1SPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1518a20c54b1SPatrick Williams 
1519a20c54b1SPatrick Williams     mc->desc       = "Facebook Bletchley BMC (Cortex-A7)";
1520a20c54b1SPatrick Williams     amc->soc_name  = "ast2600-a3";
1521a20c54b1SPatrick Williams     amc->hw_strap1 = BLETCHLEY_BMC_HW_STRAP1;
1522a20c54b1SPatrick Williams     amc->hw_strap2 = BLETCHLEY_BMC_HW_STRAP2;
1523a20c54b1SPatrick Williams     amc->fmc_model = "w25q01jvq";
1524a20c54b1SPatrick Williams     amc->spi_model = NULL;
1525a20c54b1SPatrick Williams     amc->num_cs    = 2;
1526a20c54b1SPatrick Williams     amc->macs_mask = ASPEED_MAC2_ON;
1527a20c54b1SPatrick Williams     amc->i2c_init  = bletchley_bmc_i2c_init;
1528104bdaffSPatrick Williams     mc->default_ram_size = BLETCHLEY_BMC_RAM_SIZE;
152943a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1530a20c54b1SPatrick Williams }
1531a20c54b1SPatrick Williams 
15327966d70fSJason A. Donenfeld static void fby35_reset(MachineState *state, ShutdownCause reason)
1533fa699e80SPeter Delevoryas {
1534fa699e80SPeter Delevoryas     AspeedMachineState *bmc = ASPEED_MACHINE(state);
15353c392e87SPhilippe Mathieu-Daudé     AspeedGPIOState *gpio = &bmc->soc->gpio;
1536fa699e80SPeter Delevoryas 
15377966d70fSJason A. Donenfeld     qemu_devices_reset(reason);
1538fa699e80SPeter Delevoryas 
1539f0418558SPeter Delevoryas     /* Board ID: 7 (Class-1, 4 slots) */
1540fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV4", true, &error_fatal);
1541fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV5", true, &error_fatal);
1542fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV6", true, &error_fatal);
1543fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV7", false, &error_fatal);
1544f0418558SPeter Delevoryas 
1545f0418558SPeter Delevoryas     /* Slot presence pins, inverse polarity. (False means present) */
1546f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH4", false, &error_fatal);
1547f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH5", true, &error_fatal);
1548f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH6", true, &error_fatal);
1549f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH7", true, &error_fatal);
1550f0418558SPeter Delevoryas 
1551f0418558SPeter Delevoryas     /* Slot 12v power pins, normal polarity. (True means powered-on) */
1552f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB2", true, &error_fatal);
1553f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB3", false, &error_fatal);
1554f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB4", false, &error_fatal);
1555f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB5", false, &error_fatal);
1556fa699e80SPeter Delevoryas }
1557fa699e80SPeter Delevoryas 
1558fa699e80SPeter Delevoryas static void aspeed_machine_fby35_class_init(ObjectClass *oc, void *data)
1559fa699e80SPeter Delevoryas {
1560fa699e80SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1561fa699e80SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1562fa699e80SPeter Delevoryas 
1563fa699e80SPeter Delevoryas     mc->desc       = "Facebook fby35 BMC (Cortex-A7)";
1564fa699e80SPeter Delevoryas     mc->reset      = fby35_reset;
1565fa699e80SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1566fa699e80SPeter Delevoryas     amc->num_cs    = 2;
1567fa699e80SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1568fa699e80SPeter Delevoryas     amc->i2c_init  = fby35_i2c_init;
1569fa699e80SPeter Delevoryas     /* FIXME: Replace this macro with something more general */
1570fa699e80SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
157143a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1572fa699e80SPeter Delevoryas }
1573fa699e80SPeter Delevoryas 
157466c895b8SJamin Lin #define AST1030_INTERNAL_FLASH_SIZE (1024 * 1024)
157566c895b8SJamin Lin /* Main SYSCLK frequency in Hz (200MHz) */
157666c895b8SJamin Lin #define SYSCLK_FRQ 200000000ULL
157766c895b8SJamin Lin 
157866c895b8SJamin Lin static void aspeed_minibmc_machine_init(MachineState *machine)
157966c895b8SJamin Lin {
158066c895b8SJamin Lin     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
158166c895b8SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
158266c895b8SJamin Lin     Clock *sysclk;
158366c895b8SJamin Lin 
158466c895b8SJamin Lin     sysclk = clock_new(OBJECT(machine), "SYSCLK");
158566c895b8SJamin Lin     clock_set_hz(sysclk, SYSCLK_FRQ);
158666c895b8SJamin Lin 
15873c392e87SPhilippe Mathieu-Daudé     bmc->soc = ASPEED_SOC(object_new(amc->soc_name));
15883c392e87SPhilippe Mathieu-Daudé     object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc));
15893c392e87SPhilippe Mathieu-Daudé     object_unref(OBJECT(bmc->soc));
15903c392e87SPhilippe Mathieu-Daudé     qdev_connect_clock_in(DEVICE(bmc->soc), "sysclk", sysclk);
159166c895b8SJamin Lin 
15923c392e87SPhilippe Mathieu-Daudé     object_property_set_link(OBJECT(bmc->soc), "memory",
15934dd9d554SPeter Delevoryas                              OBJECT(get_system_memory()), &error_abort);
1594d2b3eaefSPeter Delevoryas     connect_serial_hds_to_uarts(bmc);
15953c392e87SPhilippe Mathieu-Daudé     qdev_realize(DEVICE(bmc->soc), NULL, &error_abort);
159666c895b8SJamin Lin 
15973c392e87SPhilippe Mathieu-Daudé     aspeed_board_init_flashes(&bmc->soc->fmc,
159866c895b8SJamin Lin                               bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
159966c895b8SJamin Lin                               amc->num_cs,
160066c895b8SJamin Lin                               0);
160166c895b8SJamin Lin 
16023c392e87SPhilippe Mathieu-Daudé     aspeed_board_init_flashes(&bmc->soc->spi[0],
160366c895b8SJamin Lin                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
160466c895b8SJamin Lin                               amc->num_cs, amc->num_cs);
160566c895b8SJamin Lin 
16063c392e87SPhilippe Mathieu-Daudé     aspeed_board_init_flashes(&bmc->soc->spi[1],
160766c895b8SJamin Lin                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
160866c895b8SJamin Lin                               amc->num_cs, (amc->num_cs * 2));
160966c895b8SJamin Lin 
161066c895b8SJamin Lin     if (amc->i2c_init) {
161166c895b8SJamin Lin         amc->i2c_init(bmc);
161266c895b8SJamin Lin     }
161366c895b8SJamin Lin 
161466c895b8SJamin Lin     armv7m_load_kernel(ARM_CPU(first_cpu),
161566c895b8SJamin Lin                        machine->kernel_filename,
1616761c532aSPeter Maydell                        0,
161766c895b8SJamin Lin                        AST1030_INTERNAL_FLASH_SIZE);
161866c895b8SJamin Lin }
161966c895b8SJamin Lin 
16204c70ab16STroy Lee static void ast1030_evb_i2c_init(AspeedMachineState *bmc)
16214c70ab16STroy Lee {
16223c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
16234c70ab16STroy Lee 
1624673d8215SMichael Tokarev     /* U10 24C08 connects to SDA/SCL Group 1 by default */
16254c70ab16STroy Lee     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
16264c70ab16STroy Lee     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, eeprom_buf);
16274c70ab16STroy Lee 
16284c70ab16STroy Lee     /* U11 LM75 connects to SDA/SCL Group 2 by default */
16294c70ab16STroy Lee     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d);
16304c70ab16STroy Lee }
16314c70ab16STroy Lee 
163266c895b8SJamin Lin static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc,
163366c895b8SJamin Lin                                                           void *data)
163466c895b8SJamin Lin {
163566c895b8SJamin Lin     MachineClass *mc = MACHINE_CLASS(oc);
163666c895b8SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
163766c895b8SJamin Lin 
163866c895b8SJamin Lin     mc->desc = "Aspeed AST1030 MiniBMC (Cortex-M4)";
163966c895b8SJamin Lin     amc->soc_name = "ast1030-a1";
164066c895b8SJamin Lin     amc->hw_strap1 = 0;
164166c895b8SJamin Lin     amc->hw_strap2 = 0;
164266c895b8SJamin Lin     mc->init = aspeed_minibmc_machine_init;
16434c70ab16STroy Lee     amc->i2c_init = ast1030_evb_i2c_init;
164466c895b8SJamin Lin     mc->default_ram_size = 0;
164566c895b8SJamin Lin     amc->fmc_model = "sst25vf032b";
164666c895b8SJamin Lin     amc->spi_model = "sst25vf032b";
164766c895b8SJamin Lin     amc->num_cs = 2;
164866c895b8SJamin Lin     amc->macs_mask = 0;
164943a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
165066c895b8SJamin Lin }
165166c895b8SJamin Lin 
165292707992SJamin Lin #ifdef TARGET_AARCH64
1653*2c075ff3SJamin Lin static void ast2700_evb_i2c_init(AspeedMachineState *bmc)
1654*2c075ff3SJamin Lin {
1655*2c075ff3SJamin Lin     AspeedSoCState *soc = bmc->soc;
1656*2c075ff3SJamin Lin 
1657*2c075ff3SJamin Lin     /* LM75 is compatible with TMP105 driver */
1658*2c075ff3SJamin Lin     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0),
1659*2c075ff3SJamin Lin                             TYPE_TMP105, 0x4d);
1660*2c075ff3SJamin Lin }
1661*2c075ff3SJamin Lin 
166292707992SJamin Lin static void aspeed_machine_ast2700_evb_class_init(ObjectClass *oc, void *data)
166392707992SJamin Lin {
166492707992SJamin Lin     MachineClass *mc = MACHINE_CLASS(oc);
166592707992SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
166692707992SJamin Lin 
166792707992SJamin Lin     mc->desc = "Aspeed AST2700 EVB (Cortex-A35)";
166892707992SJamin Lin     amc->soc_name  = "ast2700-a0";
166992707992SJamin Lin     amc->hw_strap1 = AST2700_EVB_HW_STRAP1;
167092707992SJamin Lin     amc->hw_strap2 = AST2700_EVB_HW_STRAP2;
167192707992SJamin Lin     amc->fmc_model = "w25q01jvq";
167292707992SJamin Lin     amc->spi_model = "w25q512jv";
167392707992SJamin Lin     amc->num_cs    = 2;
167492707992SJamin Lin     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON;
167592707992SJamin Lin     amc->uart_default = ASPEED_DEV_UART12;
1676*2c075ff3SJamin Lin     amc->i2c_init  = ast2700_evb_i2c_init;
167792707992SJamin Lin     mc->default_ram_size = 1 * GiB;
167892707992SJamin Lin     aspeed_machine_class_init_cpus_defaults(mc);
167992707992SJamin Lin }
168092707992SJamin Lin #endif
168192707992SJamin Lin 
1682fb6b3c8dSJae Hyun Yoo static void aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass *oc,
1683fb6b3c8dSJae Hyun Yoo                                                      void *data)
1684fb6b3c8dSJae Hyun Yoo {
1685fb6b3c8dSJae Hyun Yoo     MachineClass *mc = MACHINE_CLASS(oc);
1686fb6b3c8dSJae Hyun Yoo     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1687fb6b3c8dSJae Hyun Yoo 
1688fb6b3c8dSJae Hyun Yoo     mc->desc       = "Qualcomm DC-SCM V1 BMC (Cortex A7)";
1689fb6b3c8dSJae Hyun Yoo     amc->soc_name  = "ast2600-a3";
1690fb6b3c8dSJae Hyun Yoo     amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1691fb6b3c8dSJae Hyun Yoo     amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1692fb6b3c8dSJae Hyun Yoo     amc->fmc_model = "n25q512a";
1693fb6b3c8dSJae Hyun Yoo     amc->spi_model = "n25q512a";
1694fb6b3c8dSJae Hyun Yoo     amc->num_cs    = 2;
1695fb6b3c8dSJae Hyun Yoo     amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1696fb6b3c8dSJae Hyun Yoo     amc->i2c_init  = qcom_dc_scm_bmc_i2c_init;
1697fb6b3c8dSJae Hyun Yoo     mc->default_ram_size = 1 * GiB;
169843a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1699fb6b3c8dSJae Hyun Yoo };
1700fb6b3c8dSJae Hyun Yoo 
1701ece4cccdSGraeme Gregory static void aspeed_machine_qcom_firework_class_init(ObjectClass *oc,
1702ece4cccdSGraeme Gregory                                                     void *data)
1703ece4cccdSGraeme Gregory {
1704ece4cccdSGraeme Gregory     MachineClass *mc = MACHINE_CLASS(oc);
1705ece4cccdSGraeme Gregory     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1706ece4cccdSGraeme Gregory 
1707ece4cccdSGraeme Gregory     mc->desc       = "Qualcomm DC-SCM V1/Firework BMC (Cortex A7)";
1708ece4cccdSGraeme Gregory     amc->soc_name  = "ast2600-a3";
1709ece4cccdSGraeme Gregory     amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1710ece4cccdSGraeme Gregory     amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1711ece4cccdSGraeme Gregory     amc->fmc_model = "n25q512a";
1712ece4cccdSGraeme Gregory     amc->spi_model = "n25q512a";
1713ece4cccdSGraeme Gregory     amc->num_cs    = 2;
1714ece4cccdSGraeme Gregory     amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1715ece4cccdSGraeme Gregory     amc->i2c_init  = qcom_dc_scm_firework_i2c_init;
1716ece4cccdSGraeme Gregory     mc->default_ram_size = 1 * GiB;
171743a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1718ece4cccdSGraeme Gregory };
1719ece4cccdSGraeme Gregory 
1720baa4732bSCédric Le Goater static const TypeInfo aspeed_machine_types[] = {
1721baa4732bSCédric Le Goater     {
1722baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("palmetto-bmc"),
1723baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1724baa4732bSCédric Le Goater         .class_init    = aspeed_machine_palmetto_class_init,
1725baa4732bSCédric Le Goater     }, {
172640a38df5SErik Smit         .name          = MACHINE_TYPE_NAME("supermicrox11-bmc"),
172740a38df5SErik Smit         .parent        = TYPE_ASPEED_MACHINE,
172840a38df5SErik Smit         .class_init    = aspeed_machine_supermicrox11_bmc_class_init,
172940a38df5SErik Smit     }, {
173047936597SGuenter Roeck         .name          = MACHINE_TYPE_NAME("supermicro-x11spi-bmc"),
173147936597SGuenter Roeck         .parent        = TYPE_ASPEED_MACHINE,
173247936597SGuenter Roeck         .class_init    = aspeed_machine_supermicro_x11spi_bmc_class_init,
173347936597SGuenter Roeck     }, {
1734baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2500-evb"),
1735baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1736baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2500_evb_class_init,
1737baa4732bSCédric Le Goater     }, {
1738baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("romulus-bmc"),
1739baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1740baa4732bSCédric Le Goater         .class_init    = aspeed_machine_romulus_class_init,
1741baa4732bSCédric Le Goater     }, {
1742143b040fSPatrick Williams         .name          = MACHINE_TYPE_NAME("sonorapass-bmc"),
1743143b040fSPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1744143b040fSPatrick Williams         .class_init    = aspeed_machine_sonorapass_class_init,
1745143b040fSPatrick Williams     }, {
1746baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("witherspoon-bmc"),
1747baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1748baa4732bSCédric Le Goater         .class_init    = aspeed_machine_witherspoon_class_init,
1749baa4732bSCédric Le Goater     }, {
1750baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2600-evb"),
1751baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1752baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2600_evb_class_init,
1753baa4732bSCédric Le Goater     }, {
175434f73a81SKarthikeyan Pasupathi         .name          = MACHINE_TYPE_NAME("yosemitev2-bmc"),
175534f73a81SKarthikeyan Pasupathi         .parent        = TYPE_ASPEED_MACHINE,
175634f73a81SKarthikeyan Pasupathi         .class_init    = aspeed_machine_yosemitev2_class_init,
175734f73a81SKarthikeyan Pasupathi     }, {
175863ceb818SCédric Le Goater         .name          = MACHINE_TYPE_NAME("tacoma-bmc"),
175963ceb818SCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
176063ceb818SCédric Le Goater         .class_init    = aspeed_machine_tacoma_class_init,
176163ceb818SCédric Le Goater     }, {
17626c323abaSKarthikeyan Pasupathi         .name          = MACHINE_TYPE_NAME("tiogapass-bmc"),
17636c323abaSKarthikeyan Pasupathi         .parent        = TYPE_ASPEED_MACHINE,
17646c323abaSKarthikeyan Pasupathi         .class_init    = aspeed_machine_tiogapass_class_init,
17656c323abaSKarthikeyan Pasupathi     }, {
176695f068c8SJohn Wang         .name          = MACHINE_TYPE_NAME("g220a-bmc"),
176795f068c8SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
176895f068c8SJohn Wang         .class_init    = aspeed_machine_g220a_class_init,
176995f068c8SJohn Wang     }, {
1770fb6b3c8dSJae Hyun Yoo         .name          = MACHINE_TYPE_NAME("qcom-dc-scm-v1-bmc"),
1771fb6b3c8dSJae Hyun Yoo         .parent        = TYPE_ASPEED_MACHINE,
1772fb6b3c8dSJae Hyun Yoo         .class_init    = aspeed_machine_qcom_dc_scm_v1_class_init,
1773fb6b3c8dSJae Hyun Yoo     }, {
1774ece4cccdSGraeme Gregory         .name          = MACHINE_TYPE_NAME("qcom-firework-bmc"),
1775ece4cccdSGraeme Gregory         .parent        = TYPE_ASPEED_MACHINE,
1776ece4cccdSGraeme Gregory         .class_init    = aspeed_machine_qcom_firework_class_init,
1777ece4cccdSGraeme Gregory     }, {
177882b6a3f6SJohn Wang         .name          = MACHINE_TYPE_NAME("fp5280g2-bmc"),
177982b6a3f6SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
178082b6a3f6SJohn Wang         .class_init    = aspeed_machine_fp5280g2_class_init,
178182b6a3f6SJohn Wang     }, {
17829cccb912SPatrick Venture         .name          = MACHINE_TYPE_NAME("quanta-q71l-bmc"),
17839cccb912SPatrick Venture         .parent        = TYPE_ASPEED_MACHINE,
17849cccb912SPatrick Venture         .class_init    = aspeed_machine_quanta_q71l_class_init,
17859cccb912SPatrick Venture     }, {
178658e52bdbSCédric Le Goater         .name          = MACHINE_TYPE_NAME("rainier-bmc"),
178758e52bdbSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
178858e52bdbSCédric Le Goater         .class_init    = aspeed_machine_rainier_class_init,
178958e52bdbSCédric Le Goater     }, {
1790febbe308SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fuji-bmc"),
1791febbe308SPeter Delevoryas         .parent        = TYPE_ASPEED_MACHINE,
1792febbe308SPeter Delevoryas         .class_init    = aspeed_machine_fuji_class_init,
1793febbe308SPeter Delevoryas     }, {
1794a20c54b1SPatrick Williams         .name          = MACHINE_TYPE_NAME("bletchley-bmc"),
1795a20c54b1SPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1796a20c54b1SPatrick Williams         .class_init    = aspeed_machine_bletchley_class_init,
1797a20c54b1SPatrick Williams     }, {
1798fa699e80SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fby35-bmc"),
1799fa699e80SPeter Delevoryas         .parent        = MACHINE_TYPE_NAME("ast2600-evb"),
1800fa699e80SPeter Delevoryas         .class_init    = aspeed_machine_fby35_class_init,
1801fa699e80SPeter Delevoryas     }, {
180266c895b8SJamin Lin         .name           = MACHINE_TYPE_NAME("ast1030-evb"),
180366c895b8SJamin Lin         .parent         = TYPE_ASPEED_MACHINE,
180466c895b8SJamin Lin         .class_init     = aspeed_minibmc_machine_ast1030_evb_class_init,
180592707992SJamin Lin #ifdef TARGET_AARCH64
180692707992SJamin Lin     }, {
180792707992SJamin Lin         .name          = MACHINE_TYPE_NAME("ast2700-evb"),
180892707992SJamin Lin         .parent        = TYPE_ASPEED_MACHINE,
180992707992SJamin Lin         .class_init    = aspeed_machine_ast2700_evb_class_init,
181092707992SJamin Lin #endif
181166c895b8SJamin Lin     }, {
1812fca9ca1bSCédric Le Goater         .name          = TYPE_ASPEED_MACHINE,
181362c2c2ebSCédric Le Goater         .parent        = TYPE_MACHINE,
1814888b2b03SPhilippe Mathieu-Daudé         .instance_size = sizeof(AspeedMachineState),
18151a15311aSCédric Le Goater         .instance_init = aspeed_machine_instance_init,
1816fca9ca1bSCédric Le Goater         .class_size    = sizeof(AspeedMachineClass),
1817fca9ca1bSCédric Le Goater         .class_init    = aspeed_machine_class_init,
1818baa4732bSCédric Le Goater         .abstract      = true,
1819baa4732bSCédric Le Goater     }
1820fca9ca1bSCédric Le Goater };
182174fb1f38SCédric Le Goater 
1822baa4732bSCédric Le Goater DEFINE_TYPES(aspeed_machine_types)
1823