xref: /qemu/hw/arm/aspeed.c (revision e90858464ab90e0e6aaede7f3c9d4750232b9755)
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"
2632cad1ffSPhilippe Mathieu-Daudé #include "system/block-backend.h"
2732cad1ffSPhilippe Mathieu-Daudé #include "system/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"
3232cad1ffSPhilippe Mathieu-Daudé #include "system/system.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 
18858e52bdbSCédric Le Goater /* Rainier hardware value: (QEMU prototype) */
18901ea09ebSCédric Le Goater #define RAINIER_BMC_HW_STRAP1 (0x00422016 | SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC)
190b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP2 0x80000848
19158e52bdbSCédric Le Goater 
192febbe308SPeter Delevoryas /* Fuji hardware value */
193febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP1    0x00000000
194febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP2    0x00000000
195febbe308SPeter Delevoryas 
196a20c54b1SPatrick Williams /* Bletchley hardware value */
197a20c54b1SPatrick Williams /* TODO: Leave same as EVB for now. */
198a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP1 AST2600_EVB_HW_STRAP1
199a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP2 AST2600_EVB_HW_STRAP2
200a20c54b1SPatrick Williams 
201fb6b3c8dSJae Hyun Yoo /* Qualcomm DC-SCM hardware value */
202fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP1  0x00000000
203fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP2  0x00000041
204fb6b3c8dSJae Hyun Yoo 
2059bb6d140SJoel Stanley #define AST_SMP_MAILBOX_BASE            0x1e6e2180
2069bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_ENTRY        (AST_SMP_MAILBOX_BASE + 0x0)
2079bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_GOSIGN       (AST_SMP_MAILBOX_BASE + 0x4)
2089bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_READY        (AST_SMP_MAILBOX_BASE + 0x8)
2099bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_POLLINSN     (AST_SMP_MAILBOX_BASE + 0xc)
2109bb6d140SJoel Stanley #define AST_SMP_MBOX_CODE               (AST_SMP_MAILBOX_BASE + 0x10)
2119bb6d140SJoel Stanley #define AST_SMP_MBOX_GOSIGN             0xabbaab00
2129bb6d140SJoel Stanley 
2139bb6d140SJoel Stanley static void aspeed_write_smpboot(ARMCPU *cpu,
2149bb6d140SJoel Stanley                                  const struct arm_boot_info *info)
2159bb6d140SJoel Stanley {
216902bba54SCédric Le Goater     AddressSpace *as = arm_boot_address_space(cpu, info);
217902bba54SCédric Le Goater     static const ARMInsnFixup poll_mailbox_ready[] = {
2189bb6d140SJoel Stanley         /*
2199bb6d140SJoel Stanley          * r2 = per-cpu go sign value
2209bb6d140SJoel Stanley          * r1 = AST_SMP_MBOX_FIELD_ENTRY
2219bb6d140SJoel Stanley          * r0 = AST_SMP_MBOX_FIELD_GOSIGN
2229bb6d140SJoel Stanley          */
223902bba54SCédric Le Goater         { 0xee100fb0 },  /* mrc     p15, 0, r0, c0, c0, 5 */
224902bba54SCédric Le Goater         { 0xe21000ff },  /* ands    r0, r0, #255          */
225902bba54SCédric Le Goater         { 0xe59f201c },  /* ldr     r2, [pc, #28]         */
226902bba54SCédric Le Goater         { 0xe1822000 },  /* orr     r2, r2, r0            */
2279bb6d140SJoel Stanley 
228902bba54SCédric Le Goater         { 0xe59f1018 },  /* ldr     r1, [pc, #24]         */
229902bba54SCédric Le Goater         { 0xe59f0018 },  /* ldr     r0, [pc, #24]         */
2309bb6d140SJoel Stanley 
231902bba54SCédric Le Goater         { 0xe320f002 },  /* wfe                           */
232902bba54SCédric Le Goater         { 0xe5904000 },  /* ldr     r4, [r0]              */
233902bba54SCédric Le Goater         { 0xe1520004 },  /* cmp     r2, r4                */
234902bba54SCédric Le Goater         { 0x1afffffb },  /* bne     <wfe>                 */
235902bba54SCédric Le Goater         { 0xe591f000 },  /* ldr     pc, [r1]              */
236902bba54SCédric Le Goater         { AST_SMP_MBOX_GOSIGN },
237902bba54SCédric Le Goater         { AST_SMP_MBOX_FIELD_ENTRY },
238902bba54SCédric Le Goater         { AST_SMP_MBOX_FIELD_GOSIGN },
239902bba54SCédric Le Goater         { 0, FIXUP_TERMINATOR }
2409bb6d140SJoel Stanley     };
241902bba54SCédric Le Goater     static const uint32_t fixupcontext[FIXUP_MAX] = { 0 };
2429bb6d140SJoel Stanley 
243902bba54SCédric Le Goater     arm_write_bootloader("aspeed.smpboot", as, info->smp_loader_start,
244902bba54SCédric Le Goater                          poll_mailbox_ready, fixupcontext);
2459bb6d140SJoel Stanley }
2469bb6d140SJoel Stanley 
2479bb6d140SJoel Stanley static void aspeed_reset_secondary(ARMCPU *cpu,
2489bb6d140SJoel Stanley                                    const struct arm_boot_info *info)
2499bb6d140SJoel Stanley {
2509bb6d140SJoel Stanley     AddressSpace *as = arm_boot_address_space(cpu, info);
2519bb6d140SJoel Stanley     CPUState *cs = CPU(cpu);
2529bb6d140SJoel Stanley 
2539bb6d140SJoel Stanley     /* info->smp_bootreg_addr */
2549bb6d140SJoel Stanley     address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0,
2559bb6d140SJoel Stanley                                MEMTXATTRS_UNSPECIFIED, NULL);
2569bb6d140SJoel Stanley     cpu_set_pc(cs, info->smp_loader_start);
2579bb6d140SJoel Stanley }
2589bb6d140SJoel Stanley 
2598b744a6aSCédric Le Goater static void write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size,
260d769a1daSCédric Le Goater                            Error **errp)
261d769a1daSCédric Le Goater {
26205e6e40aSWentao_Liang     g_autofree void *storage = NULL;
2630c7209beSCédric Le Goater     int64_t size;
264d769a1daSCédric Le Goater 
2654db1c164SJamin Lin     /*
2664db1c164SJamin Lin      * The block backend size should have already been 'validated' by
2670c7209beSCédric Le Goater      * the creation of the m25p80 object.
2680c7209beSCédric Le Goater      */
2690c7209beSCédric Le Goater     size = blk_getlength(blk);
2700c7209beSCédric Le Goater     if (size <= 0) {
2710c7209beSCédric Le Goater         error_setg(errp, "failed to get flash size");
2720c7209beSCédric Le Goater         return;
2730c7209beSCédric Le Goater     }
2740c7209beSCédric Le Goater 
2750c7209beSCédric Le Goater     if (rom_size > size) {
2760c7209beSCédric Le Goater         rom_size = size;
277d769a1daSCédric Le Goater     }
278d769a1daSCédric Le Goater 
27905e6e40aSWentao_Liang     storage = g_malloc0(rom_size);
280a9262f55SAlberto Faria     if (blk_pread(blk, 0, rom_size, storage, 0) < 0) {
281d769a1daSCédric Le Goater         error_setg(errp, "failed to read the initial flash content");
282d769a1daSCédric Le Goater         return;
283d769a1daSCédric Le Goater     }
284d769a1daSCédric Le Goater 
285d769a1daSCédric Le Goater     rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr);
286d769a1daSCédric Le Goater }
287d769a1daSCédric Le Goater 
2888b744a6aSCédric Le Goater /*
2898b744a6aSCédric Le Goater  * Create a ROM and copy the flash contents at the expected address
2908b744a6aSCédric Le Goater  * (0x0). Boots faster than execute-in-place.
2918b744a6aSCédric Le Goater  */
292262259eaSCédric Le Goater static void aspeed_install_boot_rom(AspeedMachineState *bmc, BlockBackend *blk,
2938b744a6aSCédric Le Goater                                     uint64_t rom_size)
2948b744a6aSCédric Le Goater {
2953c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
296db052d0eSJamin Lin     AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(soc);
2978b744a6aSCédric Le Goater 
298262259eaSCédric Le Goater     memory_region_init_rom(&bmc->boot_rom, NULL, "aspeed.boot_rom", rom_size,
2998b744a6aSCédric Le Goater                            &error_abort);
3008b744a6aSCédric Le Goater     memory_region_add_subregion_overlap(&soc->spi_boot_container, 0,
301262259eaSCédric Le Goater                                         &bmc->boot_rom, 1);
302db052d0eSJamin Lin     write_boot_rom(blk, sc->memmap[ASPEED_DEV_SPI_BOOT],
303db052d0eSJamin Lin                    rom_size, &error_abort);
3048b744a6aSCédric Le Goater }
3058b744a6aSCédric Le Goater 
3061099ad10SPeter Delevoryas void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
3079bd4ac61SCédric Le Goater                                       unsigned int count, int unit0)
308e1ad9bc4SCédric Le Goater {
309e1ad9bc4SCédric Le Goater     int i;
310179b2058SPatrick Williams 
311179b2058SPatrick Williams     if (!flashtype) {
312179b2058SPatrick Williams         return;
313179b2058SPatrick Williams     }
314e1ad9bc4SCédric Le Goater 
3159bd4ac61SCédric Le Goater     for (i = 0; i < count; ++i) {
3168ec239f2SMarkus Armbruster         DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i);
317a7d78befSCédric Le Goater         DeviceState *dev;
318e1ad9bc4SCédric Le Goater 
319a7d78befSCédric Le Goater         dev = qdev_new(flashtype);
320e1ad9bc4SCédric Le Goater         if (dinfo) {
321a7d78befSCédric Le Goater             qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo));
322e1ad9bc4SCédric Le Goater         }
32327a2c66cSCédric Le Goater         qdev_prop_set_uint8(dev, "cs", i);
324a7d78befSCédric Le Goater         qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal);
325e1ad9bc4SCédric Le Goater     }
326e1ad9bc4SCédric Le Goater }
327e1ad9bc4SCédric Le Goater 
328e554e45bSCédric Le Goater static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo, bool emmc,
329e554e45bSCédric Le Goater                                bool boot_emmc)
330a29e3e12SAndrew Jeffery {
331a29e3e12SAndrew Jeffery         DeviceState *card;
332a29e3e12SAndrew Jeffery 
333756f739bSPhilippe Mathieu-Daudé         if (!dinfo) {
334756f739bSPhilippe Mathieu-Daudé             return;
335756f739bSPhilippe Mathieu-Daudé         }
336dddfc771SCédric Le Goater         card = qdev_new(emmc ? TYPE_EMMC : TYPE_SD_CARD);
337e8f3acdbSCédric Le Goater 
338e8f3acdbSCédric Le Goater         /*
339e8f3acdbSCédric Le Goater          * Force the boot properties of the eMMC device only when the
340e8f3acdbSCédric Le Goater          * machine is strapped to boot from eMMC. Without these
341e8f3acdbSCédric Le Goater          * settings, the machine would not boot.
342e8f3acdbSCédric Le Goater          *
343e8f3acdbSCédric Le Goater          * This also allows the machine to use an eMMC device without
344e8f3acdbSCédric Le Goater          * boot areas when booting from the flash device (or -kernel)
345e8f3acdbSCédric Le Goater          * Ideally, the device and its properties should be defined on
346e8f3acdbSCédric Le Goater          * the command line.
347e8f3acdbSCédric Le Goater          */
348e8f3acdbSCédric Le Goater         if (emmc && boot_emmc) {
349e554e45bSCédric Le Goater             qdev_prop_set_uint64(card, "boot-partition-size", 1 * MiB);
350e8f3acdbSCédric Le Goater             qdev_prop_set_uint8(card, "boot-config", 0x1 << 3);
351e554e45bSCédric Le Goater         }
352934df912SMarkus Armbruster         qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
353a29e3e12SAndrew Jeffery                                 &error_fatal);
3543e80f690SMarkus Armbruster         qdev_realize_and_unref(card,
3553e80f690SMarkus Armbruster                                qdev_get_child_bus(DEVICE(sdhci), "sd-bus"),
3563e80f690SMarkus Armbruster                                &error_fatal);
357a29e3e12SAndrew Jeffery }
358a29e3e12SAndrew Jeffery 
359d2b3eaefSPeter Delevoryas static void connect_serial_hds_to_uarts(AspeedMachineState *bmc)
360d2b3eaefSPeter Delevoryas {
361d2b3eaefSPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
3623c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *s = bmc->soc;
363d2b3eaefSPeter Delevoryas     AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
364f65f6ad5SCédric Le Goater     int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default;
365d2b3eaefSPeter Delevoryas 
366f65f6ad5SCédric Le Goater     aspeed_soc_uart_set_chr(s, uart_chosen, serial_hd(0));
3678a139ae7SKenneth Jia     for (int i = 1, uart = sc->uarts_base; i < sc->uarts_num; uart++) {
368f65f6ad5SCédric Le Goater         if (uart == uart_chosen) {
369d2b3eaefSPeter Delevoryas             continue;
370d2b3eaefSPeter Delevoryas         }
3718a139ae7SKenneth Jia         aspeed_soc_uart_set_chr(s, uart, serial_hd(i++));
372d2b3eaefSPeter Delevoryas     }
373d2b3eaefSPeter Delevoryas }
374d2b3eaefSPeter Delevoryas 
375baa4732bSCédric Le Goater static void aspeed_machine_init(MachineState *machine)
376327d8e4eSAndrew Jeffery {
377888b2b03SPhilippe Mathieu-Daudé     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
378baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
379b033271fSCédric Le Goater     AspeedSoCClass *sc;
3802bea128cSEddie James     int i;
381255aed81SCédric Le Goater     DriveInfo *emmc0 = NULL;
382e554e45bSCédric Le Goater     bool boot_emmc;
383327d8e4eSAndrew Jeffery 
3843c392e87SPhilippe Mathieu-Daudé     bmc->soc = ASPEED_SOC(object_new(amc->soc_name));
3853c392e87SPhilippe Mathieu-Daudé     object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc));
3863c392e87SPhilippe Mathieu-Daudé     object_unref(OBJECT(bmc->soc));
3873c392e87SPhilippe Mathieu-Daudé     sc = ASPEED_SOC_GET_CLASS(bmc->soc);
388b033271fSCédric Le Goater 
389533eb415SIgor Mammedov     /*
390346160cbSCédric Le Goater      * This will error out if the RAM size is not supported by the
391346160cbSCédric Le Goater      * memory controller of the SoC.
392533eb415SIgor Mammedov      */
3933c392e87SPhilippe Mathieu-Daudé     object_property_set_uint(OBJECT(bmc->soc), "ram-size", machine->ram_size,
394533eb415SIgor Mammedov                              &error_fatal);
395533eb415SIgor Mammedov 
396d3bad7e7SCédric Le Goater     for (i = 0; i < sc->macs_num; i++) {
397b3cfec5bSDavid Woodhouse         if ((amc->macs_mask & (1 << i)) &&
398b3cfec5bSDavid Woodhouse             !qemu_configure_nic_device(DEVICE(&bmc->soc->ftgmac100[i]),
399b3cfec5bSDavid Woodhouse                                        true, NULL)) {
400b3cfec5bSDavid Woodhouse             break; /* No configs left; stop asking */
401d3bad7e7SCédric Le Goater         }
402d3bad7e7SCédric Le Goater     }
403d3bad7e7SCédric Le Goater 
404621845a9SCédric Le Goater     object_property_set_int(OBJECT(bmc->soc), "hw-strap1", bmc->hw_strap1,
40587e79af0SAndrew Jeffery                             &error_abort);
4063c392e87SPhilippe Mathieu-Daudé     object_property_set_int(OBJECT(bmc->soc), "hw-strap2", amc->hw_strap2,
407ccc2c418SCédric Le Goater                             &error_abort);
4083c392e87SPhilippe Mathieu-Daudé     object_property_set_link(OBJECT(bmc->soc), "memory",
4094dd9d554SPeter Delevoryas                              OBJECT(get_system_memory()), &error_abort);
4103c392e87SPhilippe Mathieu-Daudé     object_property_set_link(OBJECT(bmc->soc), "dram",
4110df2d9a6SCédric Le Goater                              OBJECT(machine->ram), &error_abort);
412bf8a471aSJamin Lin     if (amc->sdhci_wp_inverted) {
413bf8a471aSJamin Lin         for (i = 0; i < bmc->soc->sdhci.num_slots; i++) {
414bf8a471aSJamin Lin             object_property_set_bool(OBJECT(&bmc->soc->sdhci.slots[i]),
415bf8a471aSJamin Lin                                      "wp-inverted", true, &error_abort);
416bf8a471aSJamin Lin         }
417bf8a471aSJamin Lin     }
418b6e70d1dSJoel Stanley     if (machine->kernel_filename) {
419b6e70d1dSJoel Stanley         /*
420b6e70d1dSJoel Stanley          * When booting with a -kernel command line there is no u-boot
421b6e70d1dSJoel Stanley          * that runs to unlock the SCU. In this case set the default to
422b6e70d1dSJoel Stanley          * be unlocked as the kernel expects
423b6e70d1dSJoel Stanley          */
4243c392e87SPhilippe Mathieu-Daudé         object_property_set_int(OBJECT(bmc->soc), "hw-prot-key",
4255325cc34SMarkus Armbruster                                 ASPEED_SCU_PROT_KEY, &error_abort);
426b6e70d1dSJoel Stanley     }
427d2b3eaefSPeter Delevoryas     connect_serial_hds_to_uarts(bmc);
4283c392e87SPhilippe Mathieu-Daudé     qdev_realize(DEVICE(bmc->soc), NULL, &error_abort);
429327d8e4eSAndrew Jeffery 
430c7e313aeSCédric Le Goater     if (defaults_enabled()) {
4313c392e87SPhilippe Mathieu-Daudé         aspeed_board_init_flashes(&bmc->soc->fmc,
4328ec239f2SMarkus Armbruster                               bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
4339bd4ac61SCédric Le Goater                               amc->num_cs, 0);
4343c392e87SPhilippe Mathieu-Daudé         aspeed_board_init_flashes(&bmc->soc->spi[0],
4358ec239f2SMarkus Armbruster                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
4369bd4ac61SCédric Le Goater                               1, amc->num_cs);
437c7e313aeSCédric Le Goater     }
438e1ad9bc4SCédric Le Goater 
439b7f1a0cbSCédric Le Goater     if (machine->kernel_filename && sc->num_cpus > 1) {
4409bb6d140SJoel Stanley         /* With no u-boot we must set up a boot stub for the secondary CPU */
4419bb6d140SJoel Stanley         MemoryRegion *smpboot = g_new(MemoryRegion, 1);
442f489960dSPhilippe Mathieu-Daudé         memory_region_init_ram(smpboot, NULL, "aspeed.smpboot",
4439bb6d140SJoel Stanley                                0x80, &error_abort);
4449bb6d140SJoel Stanley         memory_region_add_subregion(get_system_memory(),
4459bb6d140SJoel Stanley                                     AST_SMP_MAILBOX_BASE, smpboot);
4469bb6d140SJoel Stanley 
4479bb6d140SJoel Stanley         aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot;
4489bb6d140SJoel Stanley         aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary;
4499bb6d140SJoel Stanley         aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE;
4509bb6d140SJoel Stanley     }
4519bb6d140SJoel Stanley 
4526e504a98SPaolo Bonzini     aspeed_board_binfo.ram_size = machine->ram_size;
453347df6f8SEduardo Habkost     aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM];
454b033271fSCédric Le Goater 
455baa4732bSCédric Le Goater     if (amc->i2c_init) {
456baa4732bSCédric Le Goater         amc->i2c_init(bmc);
4572cf6cb50SCédric Le Goater     }
4582cf6cb50SCédric Le Goater 
459*e9085846SCédric Le Goater     for (i = 0; i < bmc->soc->sdhci.num_slots && defaults_enabled(); i++) {
4603c392e87SPhilippe Mathieu-Daudé         sdhci_attach_drive(&bmc->soc->sdhci.slots[i],
461e554e45bSCédric Le Goater                            drive_get(IF_SD, 0, i), false, false);
462a29e3e12SAndrew Jeffery     }
4632bea128cSEddie James 
464e554e45bSCédric Le Goater     boot_emmc = sc->boot_from_emmc(bmc->soc);
465e554e45bSCédric Le Goater 
466*e9085846SCédric Le Goater     if (bmc->soc->emmc.num_slots && defaults_enabled()) {
467255aed81SCédric Le Goater         emmc0 = drive_get(IF_SD, 0, bmc->soc->sdhci.num_slots);
468e554e45bSCédric Le Goater         sdhci_attach_drive(&bmc->soc->emmc.slots[0], emmc0, true, boot_emmc);
4692bea128cSEddie James     }
4702bea128cSEddie James 
4718b744a6aSCédric Le Goater     if (!bmc->mmio_exec) {
4723c392e87SPhilippe Mathieu-Daudé         DeviceState *dev = ssi_get_cs(bmc->soc->fmc.spi, 0);
4738285490bSCédric Le Goater         BlockBackend *fmc0 = dev ? m25p80_get_blk(dev) : NULL;
4748b744a6aSCédric Le Goater 
475e554e45bSCédric Le Goater         if (fmc0 && !boot_emmc) {
4763c392e87SPhilippe Mathieu-Daudé             uint64_t rom_size = memory_region_size(&bmc->soc->spi_boot);
4778285490bSCédric Le Goater             aspeed_install_boot_rom(bmc, fmc0, rom_size);
478255aed81SCédric Le Goater         } else if (emmc0) {
479255aed81SCédric Le Goater             aspeed_install_boot_rom(bmc, blk_by_legacy_dinfo(emmc0), 64 * KiB);
4808b744a6aSCédric Le Goater         }
4818b744a6aSCédric Le Goater     }
4828b744a6aSCédric Le Goater 
4832744ece8STao Xu     arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo);
484327d8e4eSAndrew Jeffery }
485327d8e4eSAndrew Jeffery 
486612b219aSPhilippe Mathieu-Daudé static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
4872cf6cb50SCédric Le Goater {
4883c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
489a87e81b9SCédric Le Goater     DeviceState *dev;
4903d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
4912cf6cb50SCédric Le Goater 
4924db1c164SJamin Lin     /*
4934db1c164SJamin Lin      * The palmetto platform expects a ds3231 RTC but a ds1338 is
4944db1c164SJamin Lin      * enough to provide basic RTC features. Alarms will be missing
4954db1c164SJamin Lin      */
4961373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
497a87e81b9SCédric Le Goater 
4987a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
4993d165f12SCédric Le Goater                           eeprom_buf);
5003d165f12SCédric Le Goater 
501a87e81b9SCédric Le Goater     /* add a TMP423 temperature sensor */
5021373b15bSPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
5031373b15bSPhilippe Mathieu-Daudé                                          "tmp423", 0x4c));
5045325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
5055325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
5065325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
5075325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort);
5082cf6cb50SCédric Le Goater }
5092cf6cb50SCédric Le Goater 
5109cccb912SPatrick Venture static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc)
5119cccb912SPatrick Venture {
5123c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
5139cccb912SPatrick Venture 
5149cccb912SPatrick Venture     /*
5159cccb912SPatrick Venture      * The quanta-q71l platform expects tmp75s which are compatible with
5169cccb912SPatrick Venture      * tmp105s.
5179cccb912SPatrick Venture      */
5189cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c);
5199cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e);
5209cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f);
5219cccb912SPatrick Venture 
5229cccb912SPatrick Venture     /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */
5239cccb912SPatrick Venture     /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */
5249cccb912SPatrick Venture     /* TODO: Add Memory Riser i2c mux and eeproms. */
5259cccb912SPatrick Venture 
5263ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74);
5273ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77);
5283ec75e39SPatrick Venture 
5299cccb912SPatrick Venture     /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */
5303ec75e39SPatrick Venture 
5313ec75e39SPatrick Venture     /* i2c-7 */
5323ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70);
5339cccb912SPatrick Venture     /*        - i2c@0: pmbus@59 */
5349cccb912SPatrick Venture     /*        - i2c@1: pmbus@58 */
5359cccb912SPatrick Venture     /*        - i2c@2: pmbus@58 */
5369cccb912SPatrick Venture     /*        - i2c@3: pmbus@59 */
5373ec75e39SPatrick Venture 
5389cccb912SPatrick Venture     /* TODO: i2c-7: Add PDB FRU eeprom@52 */
5399cccb912SPatrick Venture     /* TODO: i2c-8: Add BMC FRU eeprom@50 */
5409cccb912SPatrick Venture }
5419cccb912SPatrick Venture 
542612b219aSPhilippe Mathieu-Daudé static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
5432cf6cb50SCédric Le Goater {
5443c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
5453d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
5463d165f12SCédric Le Goater 
5477a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50,
5483d165f12SCédric Le Goater                           eeprom_buf);
5492cf6cb50SCédric Le Goater 
5502cf6cb50SCédric Le Goater     /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
5511373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
552044475f3SPhilippe Mathieu-Daudé                      TYPE_TMP105, 0x4d);
5532cf6cb50SCédric Le Goater }
5542cf6cb50SCédric Le Goater 
555612b219aSPhilippe Mathieu-Daudé static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
556ccc2c418SCédric Le Goater {
5573c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
55852bcd997SHoward Chiu     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
55952bcd997SHoward Chiu 
56052bcd997SHoward Chiu     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50,
56152bcd997SHoward Chiu                           eeprom_buf);
56252bcd997SHoward Chiu 
56352bcd997SHoward Chiu     /* LM75 is compatible with TMP105 driver */
56452bcd997SHoward Chiu     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
56552bcd997SHoward Chiu                      TYPE_TMP105, 0x4d);
566ccc2c418SCédric Le Goater }
567ccc2c418SCédric Le Goater 
56834f73a81SKarthikeyan Pasupathi static void yosemitev2_bmc_i2c_init(AspeedMachineState *bmc)
56934f73a81SKarthikeyan Pasupathi {
5703c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
57134f73a81SKarthikeyan Pasupathi 
57234f73a81SKarthikeyan Pasupathi     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x51, 128 * KiB);
57334f73a81SKarthikeyan Pasupathi     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 128 * KiB,
57434f73a81SKarthikeyan Pasupathi                           yosemitev2_bmc_fruid, yosemitev2_bmc_fruid_len);
5750a1f86baSKarthikeyan Pasupathi     /* TMP421 */
5760a1f86baSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "tmp421", 0x1f);
5770a1f86baSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4e);
5780a1f86baSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4f);
5790a1f86baSKarthikeyan Pasupathi 
58034f73a81SKarthikeyan Pasupathi }
58134f73a81SKarthikeyan Pasupathi 
582612b219aSPhilippe Mathieu-Daudé static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
5836c4567c7SCédric Le Goater {
5843c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
5856c4567c7SCédric Le Goater 
5864db1c164SJamin Lin     /*
5874db1c164SJamin Lin      * The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
5884db1c164SJamin Lin      * good enough
5894db1c164SJamin Lin      */
5901373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
5916c4567c7SCédric Le Goater }
5926c4567c7SCédric Le Goater 
5936c323abaSKarthikeyan Pasupathi static void tiogapass_bmc_i2c_init(AspeedMachineState *bmc)
5946c323abaSKarthikeyan Pasupathi {
5953c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
5966c323abaSKarthikeyan Pasupathi 
5976c323abaSKarthikeyan Pasupathi     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 128 * KiB);
5986c323abaSKarthikeyan Pasupathi     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 6), 0x54, 128 * KiB,
5996c323abaSKarthikeyan Pasupathi                           tiogapass_bmc_fruid, tiogapass_bmc_fruid_len);
600a09d357dSKarthikeyan Pasupathi     /* TMP421 */
601a09d357dSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "tmp421", 0x1f);
602a09d357dSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4f);
603a09d357dSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4e);
6046c323abaSKarthikeyan Pasupathi }
6056c323abaSKarthikeyan Pasupathi 
606f4aec252SCédric Le Goater static void create_pca9552(AspeedSoCState *soc, int bus_id, int addr)
607f4aec252SCédric Le Goater {
608f4aec252SCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, bus_id),
609f4aec252SCédric Le Goater                             TYPE_PCA9552, addr);
610f4aec252SCédric Le Goater }
611f4aec252SCédric Le Goater 
612612b219aSPhilippe Mathieu-Daudé static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc)
613143b040fSPatrick Williams {
6143c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
615143b040fSPatrick Williams 
616143b040fSPatrick Williams     /* bus 2 : */
6171373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48);
6181373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49);
619143b040fSPatrick Williams     /* bus 2 : pca9546 @ 0x73 */
620143b040fSPatrick Williams 
621143b040fSPatrick Williams     /* bus 3 : pca9548 @ 0x70 */
622143b040fSPatrick Williams 
623143b040fSPatrick Williams     /* bus 4 : */
624143b040fSPatrick Williams     uint8_t *eeprom4_54 = g_malloc0(8 * 1024);
6257a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54,
626143b040fSPatrick Williams                           eeprom4_54);
627143b040fSPatrick Williams     /* PCA9539 @ 0x76, but PCA9552 is compatible */
628f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x76);
629143b040fSPatrick Williams     /* PCA9539 @ 0x77, but PCA9552 is compatible */
630f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x77);
631143b040fSPatrick Williams 
632143b040fSPatrick Williams     /* bus 6 : */
6331373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48);
6341373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49);
635143b040fSPatrick Williams     /* bus 6 : pca9546 @ 0x73 */
636143b040fSPatrick Williams 
637143b040fSPatrick Williams     /* bus 8 : */
638143b040fSPatrick Williams     uint8_t *eeprom8_56 = g_malloc0(8 * 1024);
6397a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56,
640143b040fSPatrick Williams                           eeprom8_56);
641f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x60);
642f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x61);
643143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1d */
644143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1f */
645143b040fSPatrick Williams 
646143b040fSPatrick Williams     /*
647143b040fSPatrick Williams      * bus 13 : pca9548 @ 0x71
648143b040fSPatrick Williams      *      - channel 3:
649143b040fSPatrick Williams      *          - tmm421 @ 0x4c
650143b040fSPatrick Williams      *          - tmp421 @ 0x4e
651143b040fSPatrick Williams      *          - tmp421 @ 0x4f
652143b040fSPatrick Williams      */
653143b040fSPatrick Williams 
654143b040fSPatrick Williams }
655143b040fSPatrick Williams 
656612b219aSPhilippe Mathieu-Daudé static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
65762c2c2ebSCédric Le Goater {
6587cfbde5eSPhilippe Mathieu-Daudé     static const struct {
6597cfbde5eSPhilippe Mathieu-Daudé         unsigned gpio_id;
6607cfbde5eSPhilippe Mathieu-Daudé         LEDColor color;
6617cfbde5eSPhilippe Mathieu-Daudé         const char *description;
6627cfbde5eSPhilippe Mathieu-Daudé         bool gpio_polarity;
6637cfbde5eSPhilippe Mathieu-Daudé     } pca1_leds[] = {
6647cfbde5eSPhilippe Mathieu-Daudé         {13, LED_COLOR_GREEN, "front-fault-4",  GPIO_POLARITY_ACTIVE_LOW},
6657cfbde5eSPhilippe Mathieu-Daudé         {14, LED_COLOR_GREEN, "front-power-3",  GPIO_POLARITY_ACTIVE_LOW},
6667cfbde5eSPhilippe Mathieu-Daudé         {15, LED_COLOR_GREEN, "front-id-5",     GPIO_POLARITY_ACTIVE_LOW},
6677cfbde5eSPhilippe Mathieu-Daudé     };
6683c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
6693d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
67015ce12cfSPhilippe Mathieu-Daudé     DeviceState *dev;
6717cfbde5eSPhilippe Mathieu-Daudé     LEDState *led;
67262c2c2ebSCédric Le Goater 
67363ceb818SCédric Le Goater     /* Bus 3: TODO bmp280@77 */
674db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
67515ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca1");
6762616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
6772616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 3),
67815ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
6798c9a61d7SCédric Le Goater 
6807cfbde5eSPhilippe Mathieu-Daudé     for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) {
6817cfbde5eSPhilippe Mathieu-Daudé         led = led_create_simple(OBJECT(bmc),
6827cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].gpio_polarity,
6837cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].color,
6847cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].description);
6857cfbde5eSPhilippe Mathieu-Daudé         qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id,
6867cfbde5eSPhilippe Mathieu-Daudé                               qdev_get_gpio_in(DEVICE(led), 0));
6877cfbde5eSPhilippe Mathieu-Daudé     }
688b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76);
6892a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "max31785", 0x52);
6901373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c);
6911373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c);
69262c2c2ebSCédric Le Goater 
69362c2c2ebSCédric Le Goater     /* The Witherspoon expects a TMP275 but a TMP105 is compatible */
6941373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105,
695044475f3SPhilippe Mathieu-Daudé                      0x4a);
6966c4567c7SCédric Le Goater 
6974db1c164SJamin Lin     /*
6984db1c164SJamin Lin      * The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
6994db1c164SJamin Lin      * good enough
7004db1c164SJamin Lin      */
7011373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
7023d165f12SCédric Le Goater 
7037a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51,
7043d165f12SCédric Le Goater                           eeprom_buf);
705db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
70615ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca0");
7072616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
7082616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 11),
70915ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
71063ceb818SCédric Le Goater     /* Bus 11: TODO ucd90160@64 */
71162c2c2ebSCédric Le Goater }
71262c2c2ebSCédric Le Goater 
71395f068c8SJohn Wang static void g220a_bmc_i2c_init(AspeedMachineState *bmc)
71495f068c8SJohn Wang {
7153c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
71695f068c8SJohn Wang     DeviceState *dev;
71795f068c8SJohn Wang 
71895f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3),
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);
72395f068c8SJohn Wang 
72495f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12),
72595f068c8SJohn Wang                                          "emc1413", 0x4c));
72695f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
72795f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
72895f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
72995f068c8SJohn Wang 
73095f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13),
73195f068c8SJohn Wang                                          "emc1413", 0x4c));
73295f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
73395f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
73495f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
7356f5f6507SJohn Wang 
7366f5f6507SJohn Wang     static uint8_t eeprom_buf[2 * 1024] = {
7376f5f6507SJohn Wang             0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe,
7386f5f6507SJohn Wang             0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65,
7396f5f6507SJohn Wang             0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32,
7406f5f6507SJohn Wang             0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42,
7416f5f6507SJohn Wang             0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45,
7426f5f6507SJohn Wang             0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1,
7436f5f6507SJohn Wang             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7,
7446f5f6507SJohn Wang     };
7456f5f6507SJohn Wang     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57,
7466f5f6507SJohn Wang                           eeprom_buf);
74795f068c8SJohn Wang }
74895f068c8SJohn Wang 
74982b6a3f6SJohn Wang static void fp5280g2_bmc_i2c_init(AspeedMachineState *bmc)
75082b6a3f6SJohn Wang {
7513c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
75282b6a3f6SJohn Wang     I2CSlave *i2c_mux;
75382b6a3f6SJohn Wang 
75482b6a3f6SJohn Wang     /* The at24c256 */
75582b6a3f6SJohn Wang     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 1), 0x50, 32768);
75682b6a3f6SJohn Wang 
75782b6a3f6SJohn Wang     /* The fp5280g2 expects a TMP112 but a TMP105 is compatible */
75882b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
75982b6a3f6SJohn Wang                      0x48);
76082b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
76182b6a3f6SJohn Wang                      0x49);
76282b6a3f6SJohn Wang 
76382b6a3f6SJohn Wang     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
76482b6a3f6SJohn Wang                      "pca9546", 0x70);
76582b6a3f6SJohn Wang     /* It expects a TMP112 but a TMP105 is compatible */
76682b6a3f6SJohn Wang     i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0), TYPE_TMP105,
76782b6a3f6SJohn Wang                      0x4a);
76882b6a3f6SJohn Wang 
76982b6a3f6SJohn Wang     /* It expects a ds3232 but a ds1338 is good enough */
77082b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "ds1338", 0x68);
77182b6a3f6SJohn Wang 
77282b6a3f6SJohn Wang     /* It expects a pca9555 but a pca9552 is compatible */
773f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x30);
77482b6a3f6SJohn Wang }
77582b6a3f6SJohn Wang 
77658e52bdbSCédric Le Goater static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
77758e52bdbSCédric Le Goater {
7783c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
779fa6d98c0SJoel Stanley     I2CSlave *i2c_mux;
780fa6d98c0SJoel Stanley 
7819077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB);
78258e52bdbSCédric Le Goater 
783f4aec252SCédric Le Goater     create_pca9552(soc, 3, 0x61);
784bcb122f8SJoel Stanley 
78558e52bdbSCédric Le Goater     /* The rainier expects a TMP275 but a TMP105 is compatible */
78658e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
78758e52bdbSCédric Le Goater                      0x48);
78858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
78958e52bdbSCédric Le Goater                      0x49);
79058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
79158e52bdbSCédric Le Goater                      0x4a);
792fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4),
793fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
7949077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
7959077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
7969077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB);
797f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x60);
79858e52bdbSCédric Le Goater 
79958e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
80058e52bdbSCédric Le Goater                      0x48);
80158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
80258e52bdbSCédric Le Goater                      0x49);
803f4aec252SCédric Le Goater     create_pca9552(soc, 5, 0x60);
804f4aec252SCédric Le Goater     create_pca9552(soc, 5, 0x61);
805fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5),
806fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
8079077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
8089077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
80958e52bdbSCédric Le Goater 
81058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
81158e52bdbSCédric Le Goater                      0x48);
81258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
81358e52bdbSCédric Le Goater                      0x4a);
81458e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
81558e52bdbSCédric Le Goater                      0x4b);
816fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6),
817fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
8189077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
8199077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
8209077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB);
8219077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB);
82258e52bdbSCédric Le Goater 
823f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x30);
824f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x31);
825f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x32);
826f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x33);
827f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x60);
828f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x61);
829b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76);
83058e52bdbSCédric Le Goater     /* Bus 7: TODO si7021-a20@20 */
83158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105,
83258e52bdbSCédric Le Goater                      0x48);
8332a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "max31785", 0x52);
8349077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB);
8359077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB);
83658e52bdbSCédric Le Goater 
83758e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
83858e52bdbSCédric Le Goater                      0x48);
83958e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
84058e52bdbSCédric Le Goater                      0x4a);
841be85508fSNinad Palsule     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50,
842be85508fSNinad Palsule                           64 * KiB, rainier_bb_fruid, rainier_bb_fruid_len);
843be85508fSNinad Palsule     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51,
844be85508fSNinad Palsule                           64 * KiB, rainier_bmc_fruid, rainier_bmc_fruid_len);
845f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x60);
846f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x61);
84758e52bdbSCédric Le Goater     /* Bus 8: ucd90320@11 */
84858e52bdbSCédric Le Goater     /* Bus 8: ucd90320@b */
84958e52bdbSCédric Le Goater     /* Bus 8: ucd90320@c */
85058e52bdbSCédric Le Goater 
85158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c);
85258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d);
8539077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB);
85458e52bdbSCédric Le Goater 
85558e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c);
85658e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d);
8579077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB);
85858e52bdbSCédric Le Goater 
85958e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
86058e52bdbSCédric Le Goater                      0x48);
86158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
86258e52bdbSCédric Le Goater                      0x49);
863fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11),
864fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
8659077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
8669077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
867f4aec252SCédric Le Goater     create_pca9552(soc, 11, 0x60);
868fa6d98c0SJoel Stanley 
869fa6d98c0SJoel Stanley 
8709077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB);
871f4aec252SCédric Le Goater     create_pca9552(soc, 13, 0x60);
872fa6d98c0SJoel Stanley 
8739077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB);
874f4aec252SCédric Le Goater     create_pca9552(soc, 14, 0x60);
875fa6d98c0SJoel Stanley 
8769077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB);
877f4aec252SCédric Le Goater     create_pca9552(soc, 15, 0x60);
87858e52bdbSCédric Le Goater }
87958e52bdbSCédric Le Goater 
880febbe308SPeter Delevoryas static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr,
881febbe308SPeter Delevoryas                                  I2CBus **channels)
882febbe308SPeter Delevoryas {
883febbe308SPeter Delevoryas     I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr);
884febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
885febbe308SPeter Delevoryas         channels[i] = pca954x_i2c_get_bus(mux, i);
886febbe308SPeter Delevoryas     }
887febbe308SPeter Delevoryas }
888febbe308SPeter Delevoryas 
889febbe308SPeter Delevoryas #define TYPE_LM75 TYPE_TMP105
890febbe308SPeter Delevoryas #define TYPE_TMP75 TYPE_TMP105
891febbe308SPeter Delevoryas #define TYPE_TMP422 "tmp422"
892febbe308SPeter Delevoryas 
893febbe308SPeter Delevoryas static void fuji_bmc_i2c_init(AspeedMachineState *bmc)
894febbe308SPeter Delevoryas {
8953c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
896febbe308SPeter Delevoryas     I2CBus *i2c[144] = {};
897febbe308SPeter Delevoryas 
898febbe308SPeter Delevoryas     for (int i = 0; i < 16; i++) {
899febbe308SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
900febbe308SPeter Delevoryas     }
901febbe308SPeter Delevoryas     I2CBus *i2c180 = i2c[2];
902febbe308SPeter Delevoryas     I2CBus *i2c480 = i2c[8];
903febbe308SPeter Delevoryas     I2CBus *i2c600 = i2c[11];
904febbe308SPeter Delevoryas 
905febbe308SPeter Delevoryas     get_pca9548_channels(i2c180, 0x70, &i2c[16]);
906febbe308SPeter Delevoryas     get_pca9548_channels(i2c480, 0x70, &i2c[24]);
907febbe308SPeter Delevoryas     /* NOTE: The device tree skips [32, 40) in the alias numbering */
908febbe308SPeter Delevoryas     get_pca9548_channels(i2c600, 0x77, &i2c[40]);
909febbe308SPeter Delevoryas     get_pca9548_channels(i2c[24], 0x71, &i2c[48]);
910febbe308SPeter Delevoryas     get_pca9548_channels(i2c[25], 0x72, &i2c[56]);
911febbe308SPeter Delevoryas     get_pca9548_channels(i2c[26], 0x76, &i2c[64]);
912febbe308SPeter Delevoryas     get_pca9548_channels(i2c[27], 0x76, &i2c[72]);
913febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
914febbe308SPeter Delevoryas         get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]);
915febbe308SPeter Delevoryas     }
916febbe308SPeter Delevoryas 
917febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c);
918febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d);
919febbe308SPeter Delevoryas 
920ef0eb67eSSittisak Sinprem     /*
921ef0eb67eSSittisak Sinprem      * EEPROM 24c64 size is 64Kbits or 8 Kbytes
922ef0eb67eSSittisak Sinprem      *        24c02 size is 2Kbits or 256 bytes
923ef0eb67eSSittisak Sinprem      */
924ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[19], 0x52, 8 * KiB);
925ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[20], 0x50, 256);
926ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[22], 0x52, 256);
927febbe308SPeter Delevoryas 
928febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x48);
929febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x49);
930febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x4a);
931febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_TMP422, 0x4c);
932febbe308SPeter Delevoryas 
933ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[8], 0x51, 8 * KiB);
934febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a);
935febbe308SPeter Delevoryas 
936febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[50], TYPE_LM75, 0x4c);
937ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[50], 0x52, 8 * KiB);
938febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[51], TYPE_TMP75, 0x48);
939febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[52], TYPE_TMP75, 0x49);
940febbe308SPeter Delevoryas 
941febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[59], TYPE_TMP75, 0x48);
942febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[60], TYPE_TMP75, 0x49);
943febbe308SPeter Delevoryas 
944ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[65], 0x53, 8 * KiB);
945febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x49);
946febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x48);
947ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[68], 0x52, 8 * KiB);
948ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[69], 0x52, 8 * KiB);
949ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[70], 0x52, 8 * KiB);
950ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[71], 0x52, 8 * KiB);
951febbe308SPeter Delevoryas 
952ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[73], 0x53, 8 * KiB);
953febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x49);
954febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x48);
955ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[76], 0x52, 8 * KiB);
956ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[77], 0x52, 8 * KiB);
957ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[78], 0x52, 8 * KiB);
958ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[79], 0x52, 8 * KiB);
959ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[28], 0x50, 256);
960febbe308SPeter Delevoryas 
961febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
9629077e09aSPeter Delevoryas         at24c_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB);
963febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[82 + i * 8], TYPE_TMP75, 0x48);
964febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[83 + i * 8], TYPE_TMP75, 0x4b);
965febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[84 + i * 8], TYPE_TMP75, 0x4a);
966febbe308SPeter Delevoryas     }
967febbe308SPeter Delevoryas }
968febbe308SPeter Delevoryas 
969a20c54b1SPatrick Williams #define TYPE_TMP421 "tmp421"
970a20c54b1SPatrick Williams 
971a20c54b1SPatrick Williams static void bletchley_bmc_i2c_init(AspeedMachineState *bmc)
972a20c54b1SPatrick Williams {
9733c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
974a20c54b1SPatrick Williams     I2CBus *i2c[13] = {};
975a20c54b1SPatrick Williams     for (int i = 0; i < 13; i++) {
976a20c54b1SPatrick Williams         if ((i == 8) || (i == 11)) {
977a20c54b1SPatrick Williams             continue;
978a20c54b1SPatrick Williams         }
979a20c54b1SPatrick Williams         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
980a20c54b1SPatrick Williams     }
981a20c54b1SPatrick Williams 
982a20c54b1SPatrick Williams     /* Bus 0 - 5 all have the same config. */
983a20c54b1SPatrick Williams     for (int i = 0; i < 6; i++) {
984a20c54b1SPatrick Williams         /* Missing model: ti,ina230 @ 0x45 */
985a20c54b1SPatrick Williams         /* Missing model: mps,mp5023 @ 0x40 */
986a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_TMP421, 0x4f);
987a20c54b1SPatrick Williams         /* Missing model: nxp,pca9539 @ 0x76, but PCA9552 works enough */
988a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x76);
989a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x67);
990a20c54b1SPatrick Williams         /* Missing model: fsc,fusb302 @ 0x22 */
991a20c54b1SPatrick Williams     }
992a20c54b1SPatrick Williams 
993a20c54b1SPatrick Williams     /* Bus 6 */
994a20c54b1SPatrick Williams     at24c_eeprom_init(i2c[6], 0x56, 65536);
995a20c54b1SPatrick Williams     /* Missing model: nxp,pcf85263 @ 0x51 , but ds1338 works enough */
996a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[6], "ds1338", 0x51);
997a20c54b1SPatrick Williams 
998a20c54b1SPatrick Williams 
999a20c54b1SPatrick Williams     /* Bus 7 */
1000a20c54b1SPatrick Williams     at24c_eeprom_init(i2c[7], 0x54, 65536);
1001a20c54b1SPatrick Williams 
1002a20c54b1SPatrick Williams     /* Bus 9 */
1003a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[9], TYPE_TMP421, 0x4f);
1004a20c54b1SPatrick Williams 
1005a20c54b1SPatrick Williams     /* Bus 10 */
1006a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[10], TYPE_TMP421, 0x4f);
1007a20c54b1SPatrick Williams     /* Missing model: ti,hdc1080 @ 0x40 */
1008a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[10], TYPE_PCA9552, 0x67);
1009a20c54b1SPatrick Williams 
1010a20c54b1SPatrick Williams     /* Bus 12 */
1011a20c54b1SPatrick Williams     /* Missing model: adi,adm1278 @ 0x11 */
1012a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4c);
1013a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4d);
1014a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_PCA9552, 0x67);
1015a20c54b1SPatrick Williams }
1016a20c54b1SPatrick Williams 
1017fa699e80SPeter Delevoryas static void fby35_i2c_init(AspeedMachineState *bmc)
1018fa699e80SPeter Delevoryas {
10193c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
1020fa699e80SPeter Delevoryas     I2CBus *i2c[16];
1021fa699e80SPeter Delevoryas 
1022fa699e80SPeter Delevoryas     for (int i = 0; i < 16; i++) {
1023fa699e80SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
1024fa699e80SPeter Delevoryas     }
1025fa699e80SPeter Delevoryas 
1026fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[2], TYPE_LM75, 0x4f);
1027fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_TMP421, 0x1f);
1028fa699e80SPeter Delevoryas     /* Hotswap controller is actually supposed to be mp5920 or ltc4282. */
1029fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[11], "adm1272", 0x44);
1030fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4e);
1031fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4f);
1032fa699e80SPeter Delevoryas 
10339077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[4], 0x51, 128 * KiB);
10349077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[6], 0x51, 128 * KiB);
1035c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[8], 0x50, 32 * KiB, fby35_nic_fruid,
1036c0216b94SPeter Delevoryas                           fby35_nic_fruid_len);
1037c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[11], 0x51, 128 * KiB, fby35_bb_fruid,
1038c0216b94SPeter Delevoryas                           fby35_bb_fruid_len);
1039c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[11], 0x54, 128 * KiB, fby35_bmc_fruid,
1040c0216b94SPeter Delevoryas                           fby35_bmc_fruid_len);
1041fa699e80SPeter Delevoryas 
1042fa699e80SPeter Delevoryas     /*
1043fa699e80SPeter Delevoryas      * TODO: There is a multi-master i2c connection to an AST1030 MiniBMC on
1044fa699e80SPeter Delevoryas      * buses 0, 1, 2, 3, and 9. Source address 0x10, target address 0x20 on
1045fa699e80SPeter Delevoryas      * each.
1046fa699e80SPeter Delevoryas      */
1047fa699e80SPeter Delevoryas }
1048fa699e80SPeter Delevoryas 
1049fb6b3c8dSJae Hyun Yoo static void qcom_dc_scm_bmc_i2c_init(AspeedMachineState *bmc)
1050fb6b3c8dSJae Hyun Yoo {
10513c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
1052fb6b3c8dSJae Hyun Yoo 
1053fb6b3c8dSJae Hyun Yoo     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 15), "tmp105", 0x4d);
1054fb6b3c8dSJae Hyun Yoo }
1055fb6b3c8dSJae Hyun Yoo 
1056ece4cccdSGraeme Gregory static void qcom_dc_scm_firework_i2c_init(AspeedMachineState *bmc)
1057ece4cccdSGraeme Gregory {
10583c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
10592a7a5d5cSJae Hyun Yoo     I2CSlave *therm_mux, *cpuvr_mux;
1060ece4cccdSGraeme Gregory 
1061ece4cccdSGraeme Gregory     /* Create the generic DC-SCM hardware */
1062ece4cccdSGraeme Gregory     qcom_dc_scm_bmc_i2c_init(bmc);
1063ece4cccdSGraeme Gregory 
1064ece4cccdSGraeme Gregory     /* Now create the Firework specific hardware */
10652a75e8c3SMaheswara Kurapati 
10662a7a5d5cSJae Hyun Yoo     /* I2C7 CPUVR MUX */
10672a7a5d5cSJae Hyun Yoo     cpuvr_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
10682a7a5d5cSJae Hyun Yoo                                         "pca9546", 0x70);
10692a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 0), "pca9548", 0x72);
10702a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 1), "pca9548", 0x72);
10712a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 2), "pca9548", 0x72);
10722a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 3), "pca9548", 0x72);
10732a7a5d5cSJae Hyun Yoo 
1074cfc68f16SMaheswara Kurapati     /* I2C8 Thermal Diodes*/
1075cfc68f16SMaheswara Kurapati     therm_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
1076cfc68f16SMaheswara Kurapati                                         "pca9548", 0x70);
1077cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 0), TYPE_LM75, 0x4C);
1078cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 1), TYPE_LM75, 0x4C);
1079cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 2), TYPE_LM75, 0x48);
1080cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 3), TYPE_LM75, 0x48);
1081cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 4), TYPE_LM75, 0x48);
1082cfc68f16SMaheswara Kurapati 
10832a75e8c3SMaheswara Kurapati     /* I2C9 Fan Controller (MAX31785) */
10842a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x52);
10852a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x54);
1086ece4cccdSGraeme Gregory }
1087ece4cccdSGraeme Gregory 
10881a15311aSCédric Le Goater static bool aspeed_get_mmio_exec(Object *obj, Error **errp)
10891a15311aSCédric Le Goater {
10901a15311aSCédric Le Goater     return ASPEED_MACHINE(obj)->mmio_exec;
10911a15311aSCédric Le Goater }
10921a15311aSCédric Le Goater 
10931a15311aSCédric Le Goater static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp)
10941a15311aSCédric Le Goater {
10951a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = value;
10961a15311aSCédric Le Goater }
10971a15311aSCédric Le Goater 
10981a15311aSCédric Le Goater static void aspeed_machine_instance_init(Object *obj)
10991a15311aSCédric Le Goater {
1100621845a9SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(obj);
1101621845a9SCédric Le Goater 
11021a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = false;
1103621845a9SCédric Le Goater     ASPEED_MACHINE(obj)->hw_strap1 = amc->hw_strap1;
11041a15311aSCédric Le Goater }
11051a15311aSCédric Le Goater 
11069820e52fSCédric Le Goater static char *aspeed_get_fmc_model(Object *obj, Error **errp)
11079820e52fSCédric Le Goater {
11089820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
11099820e52fSCédric Le Goater     return g_strdup(bmc->fmc_model);
11109820e52fSCédric Le Goater }
11119820e52fSCédric Le Goater 
11129820e52fSCédric Le Goater static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp)
11139820e52fSCédric Le Goater {
11149820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
11159820e52fSCédric Le Goater 
11169820e52fSCédric Le Goater     g_free(bmc->fmc_model);
11179820e52fSCédric Le Goater     bmc->fmc_model = g_strdup(value);
11189820e52fSCédric Le Goater }
11199820e52fSCédric Le Goater 
11209820e52fSCédric Le Goater static char *aspeed_get_spi_model(Object *obj, Error **errp)
11219820e52fSCédric Le Goater {
11229820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
11239820e52fSCédric Le Goater     return g_strdup(bmc->spi_model);
11249820e52fSCédric Le Goater }
11259820e52fSCédric Le Goater 
11269820e52fSCédric Le Goater static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp)
11279820e52fSCédric Le Goater {
11289820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
11299820e52fSCédric Le Goater 
11309820e52fSCédric Le Goater     g_free(bmc->spi_model);
11319820e52fSCédric Le Goater     bmc->spi_model = g_strdup(value);
11329820e52fSCédric Le Goater }
11339820e52fSCédric Le Goater 
1134f65f6ad5SCédric Le Goater static char *aspeed_get_bmc_console(Object *obj, Error **errp)
1135f65f6ad5SCédric Le Goater {
1136f65f6ad5SCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1137f65f6ad5SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
1138f65f6ad5SCédric Le Goater     int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default;
1139f65f6ad5SCédric Le Goater 
1140944128eeSJamin Lin     return g_strdup_printf("uart%d", aspeed_uart_index(uart_chosen));
1141f65f6ad5SCédric Le Goater }
1142f65f6ad5SCédric Le Goater 
1143f65f6ad5SCédric Le Goater static void aspeed_set_bmc_console(Object *obj, const char *value, Error **errp)
1144f65f6ad5SCédric Le Goater {
1145f65f6ad5SCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1146f65f6ad5SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
1147f65f6ad5SCédric Le Goater     AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(amc->soc_name));
1148f65f6ad5SCédric Le Goater     int val;
1149944128eeSJamin Lin     int uart_first = aspeed_uart_first(sc);
1150944128eeSJamin Lin     int uart_last = aspeed_uart_last(sc);
1151f65f6ad5SCédric Le Goater 
1152f65f6ad5SCédric Le Goater     if (sscanf(value, "uart%u", &val) != 1) {
1153f65f6ad5SCédric Le Goater         error_setg(errp, "Bad value for \"uart\" property");
1154f65f6ad5SCédric Le Goater         return;
1155f65f6ad5SCédric Le Goater     }
1156f65f6ad5SCédric Le Goater 
1157f65f6ad5SCédric Le Goater     /* The number of UART depends on the SoC */
1158944128eeSJamin Lin     if (val < uart_first || val > uart_last) {
1159944128eeSJamin Lin         error_setg(errp, "\"uart\" should be in range [%d - %d]",
1160944128eeSJamin Lin                    uart_first, uart_last);
1161f65f6ad5SCédric Le Goater         return;
1162f65f6ad5SCédric Le Goater     }
1163944128eeSJamin Lin     bmc->uart_chosen = val + ASPEED_DEV_UART0;
1164f65f6ad5SCédric Le Goater }
1165f65f6ad5SCédric Le Goater 
11661a15311aSCédric Le Goater static void aspeed_machine_class_props_init(ObjectClass *oc)
11671a15311aSCédric Le Goater {
11681a15311aSCédric Le Goater     object_class_property_add_bool(oc, "execute-in-place",
11691a15311aSCédric Le Goater                                    aspeed_get_mmio_exec,
1170d2623129SMarkus Armbruster                                    aspeed_set_mmio_exec);
11711a15311aSCédric Le Goater     object_class_property_set_description(oc, "execute-in-place",
11727eecec7dSMarkus Armbruster                            "boot directly from CE0 flash device");
11739820e52fSCédric Le Goater 
1174f65f6ad5SCédric Le Goater     object_class_property_add_str(oc, "bmc-console", aspeed_get_bmc_console,
1175f65f6ad5SCédric Le Goater                                   aspeed_set_bmc_console);
1176f65f6ad5SCédric Le Goater     object_class_property_set_description(oc, "bmc-console",
1177f65f6ad5SCédric Le Goater                            "Change the default UART to \"uartX\"");
1178f65f6ad5SCédric Le Goater 
11799820e52fSCédric Le Goater     object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model,
11809820e52fSCédric Le Goater                                    aspeed_set_fmc_model);
11819820e52fSCédric Le Goater     object_class_property_set_description(oc, "fmc-model",
11829820e52fSCédric Le Goater                                           "Change the FMC Flash model");
11839820e52fSCédric Le Goater     object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model,
11849820e52fSCédric Le Goater                                    aspeed_set_spi_model);
11859820e52fSCédric Le Goater     object_class_property_set_description(oc, "spi-model",
11869820e52fSCédric Le Goater                                           "Change the SPI Flash model");
11871a15311aSCédric Le Goater }
11881a15311aSCédric Le Goater 
118943a0a5c9SPhilippe Mathieu-Daudé static void aspeed_machine_class_init_cpus_defaults(MachineClass *mc)
1190b7f1a0cbSCédric Le Goater {
119143a0a5c9SPhilippe Mathieu-Daudé     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(mc);
119243a0a5c9SPhilippe Mathieu-Daudé     AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(amc->soc_name));
119343a0a5c9SPhilippe Mathieu-Daudé 
119443a0a5c9SPhilippe Mathieu-Daudé     mc->default_cpus = sc->num_cpus;
119543a0a5c9SPhilippe Mathieu-Daudé     mc->min_cpus = sc->num_cpus;
119643a0a5c9SPhilippe Mathieu-Daudé     mc->max_cpus = sc->num_cpus;
1197dc13909eSPhilippe Mathieu-Daudé     mc->valid_cpu_types = sc->valid_cpu_types;
1198b7f1a0cbSCédric Le Goater }
1199b7f1a0cbSCédric Le Goater 
1200056b779eSCédric Le Goater static bool aspeed_machine_ast2600_get_boot_from_emmc(Object *obj, Error **errp)
1201056b779eSCédric Le Goater {
1202056b779eSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1203056b779eSCédric Le Goater 
1204056b779eSCédric Le Goater     return !!(bmc->hw_strap1 & SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC);
1205056b779eSCédric Le Goater }
1206056b779eSCédric Le Goater 
1207056b779eSCédric Le Goater static void aspeed_machine_ast2600_set_boot_from_emmc(Object *obj, bool value,
1208056b779eSCédric Le Goater                                                       Error **errp)
1209056b779eSCédric Le Goater {
1210056b779eSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1211056b779eSCédric Le Goater 
1212056b779eSCédric Le Goater     if (value) {
1213056b779eSCédric Le Goater         bmc->hw_strap1 |= SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC;
1214056b779eSCédric Le Goater     } else {
1215056b779eSCédric Le Goater         bmc->hw_strap1 &= ~SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC;
1216056b779eSCédric Le Goater     }
1217056b779eSCédric Le Goater }
1218056b779eSCédric Le Goater 
1219056b779eSCédric Le Goater static void aspeed_machine_ast2600_class_emmc_init(ObjectClass *oc)
1220056b779eSCédric Le Goater {
1221056b779eSCédric Le Goater     object_class_property_add_bool(oc, "boot-emmc",
1222056b779eSCédric Le Goater                                    aspeed_machine_ast2600_get_boot_from_emmc,
1223056b779eSCédric Le Goater                                    aspeed_machine_ast2600_set_boot_from_emmc);
1224056b779eSCédric Le Goater     object_class_property_set_description(oc, "boot-emmc",
1225056b779eSCédric Le Goater                                           "Set or unset boot from EMMC");
1226056b779eSCédric Le Goater }
1227056b779eSCédric Le Goater 
1228fca9ca1bSCédric Le Goater static void aspeed_machine_class_init(ObjectClass *oc, void *data)
122962c2c2ebSCédric Le Goater {
123062c2c2ebSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1231d3bad7e7SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
123262c2c2ebSCédric Le Goater 
1233fca9ca1bSCédric Le Goater     mc->init = aspeed_machine_init;
123462c2c2ebSCédric Le Goater     mc->no_floppy = 1;
123562c2c2ebSCédric Le Goater     mc->no_cdrom = 1;
123662c2c2ebSCédric Le Goater     mc->no_parallel = 1;
1237afcbaed6SIgor Mammedov     mc->default_ram_id = "ram";
1238d3bad7e7SCédric Le Goater     amc->macs_mask = ASPEED_MAC0_ON;
12395d63d0c7SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART5;
12401a15311aSCédric Le Goater 
12411a15311aSCédric Le Goater     aspeed_machine_class_props_init(oc);
124262c2c2ebSCédric Le Goater }
124362c2c2ebSCédric Le Goater 
1244baa4732bSCédric Le Goater static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
1245baa4732bSCédric Le Goater {
1246baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1247baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1248baa4732bSCédric Le Goater 
1249baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Palmetto BMC (ARM926EJ-S)";
1250baa4732bSCédric Le Goater     amc->soc_name  = "ast2400-a1";
1251baa4732bSCédric Le Goater     amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1;
1252baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
125370322913SCédric Le Goater     amc->spi_model = "mx25l25635f";
1254baa4732bSCédric Le Goater     amc->num_cs    = 1;
1255baa4732bSCédric Le Goater     amc->i2c_init  = palmetto_bmc_i2c_init;
1256baa4732bSCédric Le Goater     mc->default_ram_size       = 256 * MiB;
125743a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1258baa4732bSCédric Le Goater };
1259baa4732bSCédric Le Goater 
12609cccb912SPatrick Venture static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data)
12619cccb912SPatrick Venture {
12629cccb912SPatrick Venture     MachineClass *mc = MACHINE_CLASS(oc);
12639cccb912SPatrick Venture     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
12649cccb912SPatrick Venture 
12659cccb912SPatrick Venture     mc->desc       = "Quanta-Q71l BMC (ARM926EJ-S)";
12669cccb912SPatrick Venture     amc->soc_name  = "ast2400-a1";
12679cccb912SPatrick Venture     amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1;
12689cccb912SPatrick Venture     amc->fmc_model = "n25q256a";
12699cccb912SPatrick Venture     amc->spi_model = "mx25l25635e";
12709cccb912SPatrick Venture     amc->num_cs    = 1;
12719cccb912SPatrick Venture     amc->i2c_init  = quanta_q71l_bmc_i2c_init;
12729cccb912SPatrick Venture     mc->default_ram_size       = 128 * MiB;
127343a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
12749cccb912SPatrick Venture }
12759cccb912SPatrick Venture 
127640a38df5SErik Smit static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc,
127740a38df5SErik Smit                                                         void *data)
127840a38df5SErik Smit {
127940a38df5SErik Smit     MachineClass *mc = MACHINE_CLASS(oc);
128040a38df5SErik Smit     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
128140a38df5SErik Smit 
128240a38df5SErik Smit     mc->desc       = "Supermicro X11 BMC (ARM926EJ-S)";
128340a38df5SErik Smit     amc->soc_name  = "ast2400-a1";
128440a38df5SErik Smit     amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1;
128540a38df5SErik Smit     amc->fmc_model = "mx25l25635e";
128640a38df5SErik Smit     amc->spi_model = "mx25l25635e";
128740a38df5SErik Smit     amc->num_cs    = 1;
128840a38df5SErik Smit     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
128940a38df5SErik Smit     amc->i2c_init  = palmetto_bmc_i2c_init;
129040a38df5SErik Smit     mc->default_ram_size = 256 * MiB;
129143a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
129240a38df5SErik Smit }
129340a38df5SErik Smit 
129447936597SGuenter Roeck static void aspeed_machine_supermicro_x11spi_bmc_class_init(ObjectClass *oc,
129547936597SGuenter Roeck                                                             void *data)
129647936597SGuenter Roeck {
129747936597SGuenter Roeck     MachineClass *mc = MACHINE_CLASS(oc);
129847936597SGuenter Roeck     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
129947936597SGuenter Roeck 
130047936597SGuenter Roeck     mc->desc       = "Supermicro X11 SPI BMC (ARM1176)";
130147936597SGuenter Roeck     amc->soc_name  = "ast2500-a1";
130247936597SGuenter Roeck     amc->hw_strap1 = SUPERMICRO_X11SPI_BMC_HW_STRAP1;
130347936597SGuenter Roeck     amc->fmc_model = "mx25l25635e";
130447936597SGuenter Roeck     amc->spi_model = "mx25l25635e";
130547936597SGuenter Roeck     amc->num_cs    = 1;
130647936597SGuenter Roeck     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
130747936597SGuenter Roeck     amc->i2c_init  = palmetto_bmc_i2c_init;
130847936597SGuenter Roeck     mc->default_ram_size = 512 * MiB;
130943a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
131047936597SGuenter Roeck }
131147936597SGuenter Roeck 
1312baa4732bSCédric Le Goater static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data)
1313baa4732bSCédric Le Goater {
1314baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1315baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1316baa4732bSCédric Le Goater 
1317baa4732bSCédric Le Goater     mc->desc       = "Aspeed AST2500 EVB (ARM1176)";
1318baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1319baa4732bSCédric Le Goater     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
1320753abfc4SJae Hyun Yoo     amc->fmc_model = "mx25l25635e";
132170322913SCédric Le Goater     amc->spi_model = "mx25l25635f";
1322baa4732bSCédric Le Goater     amc->num_cs    = 1;
1323baa4732bSCédric Le Goater     amc->i2c_init  = ast2500_evb_i2c_init;
1324baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
132543a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1326baa4732bSCédric Le Goater };
1327baa4732bSCédric Le Goater 
132834f73a81SKarthikeyan Pasupathi static void aspeed_machine_yosemitev2_class_init(ObjectClass *oc, void *data)
132934f73a81SKarthikeyan Pasupathi {
133034f73a81SKarthikeyan Pasupathi     MachineClass *mc = MACHINE_CLASS(oc);
133134f73a81SKarthikeyan Pasupathi     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
133234f73a81SKarthikeyan Pasupathi 
133334f73a81SKarthikeyan Pasupathi     mc->desc       = "Facebook YosemiteV2 BMC (ARM1176)";
133434f73a81SKarthikeyan Pasupathi     amc->soc_name  = "ast2500-a1";
133534f73a81SKarthikeyan Pasupathi     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
133634f73a81SKarthikeyan Pasupathi     amc->hw_strap2 = 0;
133734f73a81SKarthikeyan Pasupathi     amc->fmc_model = "n25q256a";
133834f73a81SKarthikeyan Pasupathi     amc->spi_model = "mx25l25635e";
133934f73a81SKarthikeyan Pasupathi     amc->num_cs    = 2;
134034f73a81SKarthikeyan Pasupathi     amc->i2c_init  = yosemitev2_bmc_i2c_init;
134134f73a81SKarthikeyan Pasupathi     mc->default_ram_size       = 512 * MiB;
134243a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
134334f73a81SKarthikeyan Pasupathi };
134434f73a81SKarthikeyan Pasupathi 
1345baa4732bSCédric Le Goater static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data)
1346baa4732bSCédric Le Goater {
1347baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1348baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1349baa4732bSCédric Le Goater 
1350baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Romulus BMC (ARM1176)";
1351baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1352baa4732bSCédric Le Goater     amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1;
1353baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
1354baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1355baa4732bSCédric Le Goater     amc->num_cs    = 2;
1356baa4732bSCédric Le Goater     amc->i2c_init  = romulus_bmc_i2c_init;
1357baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
135843a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1359baa4732bSCédric Le Goater };
1360baa4732bSCédric Le Goater 
13616c323abaSKarthikeyan Pasupathi static void aspeed_machine_tiogapass_class_init(ObjectClass *oc, void *data)
13626c323abaSKarthikeyan Pasupathi {
13636c323abaSKarthikeyan Pasupathi     MachineClass *mc = MACHINE_CLASS(oc);
13646c323abaSKarthikeyan Pasupathi     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
13656c323abaSKarthikeyan Pasupathi 
13666c323abaSKarthikeyan Pasupathi     mc->desc       = "Facebook Tiogapass BMC (ARM1176)";
13676c323abaSKarthikeyan Pasupathi     amc->soc_name  = "ast2500-a1";
13686c323abaSKarthikeyan Pasupathi     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
13696c323abaSKarthikeyan Pasupathi     amc->hw_strap2 = 0;
13706c323abaSKarthikeyan Pasupathi     amc->fmc_model = "n25q256a";
13716c323abaSKarthikeyan Pasupathi     amc->spi_model = "mx25l25635e";
13726c323abaSKarthikeyan Pasupathi     amc->num_cs    = 2;
13736c323abaSKarthikeyan Pasupathi     amc->i2c_init  = tiogapass_bmc_i2c_init;
13746c323abaSKarthikeyan Pasupathi     mc->default_ram_size       = 1 * GiB;
137543a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
13766c323abaSKarthikeyan Pasupathi };
13776c323abaSKarthikeyan Pasupathi 
1378143b040fSPatrick Williams static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data)
1379143b040fSPatrick Williams {
1380143b040fSPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1381143b040fSPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1382143b040fSPatrick Williams 
1383143b040fSPatrick Williams     mc->desc       = "OCP SonoraPass BMC (ARM1176)";
1384143b040fSPatrick Williams     amc->soc_name  = "ast2500-a1";
1385143b040fSPatrick Williams     amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1;
1386143b040fSPatrick Williams     amc->fmc_model = "mx66l1g45g";
1387143b040fSPatrick Williams     amc->spi_model = "mx66l1g45g";
1388143b040fSPatrick Williams     amc->num_cs    = 2;
1389143b040fSPatrick Williams     amc->i2c_init  = sonorapass_bmc_i2c_init;
1390143b040fSPatrick Williams     mc->default_ram_size       = 512 * MiB;
139143a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1392143b040fSPatrick Williams };
1393143b040fSPatrick Williams 
1394baa4732bSCédric Le Goater static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data)
1395baa4732bSCédric Le Goater {
1396baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1397baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1398baa4732bSCédric Le Goater 
1399baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Witherspoon BMC (ARM1176)";
1400baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1401baa4732bSCédric Le Goater     amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1;
140270322913SCédric Le Goater     amc->fmc_model = "mx25l25635f";
1403baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1404baa4732bSCédric Le Goater     amc->num_cs    = 2;
1405baa4732bSCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init;
1406baa4732bSCédric Le Goater     mc->default_ram_size = 512 * MiB;
140743a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1408baa4732bSCédric Le Goater };
1409baa4732bSCédric Le Goater 
1410baa4732bSCédric Le Goater static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
1411baa4732bSCédric Le Goater {
1412baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1413baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1414baa4732bSCédric Le Goater 
1415f548f201SPeter Maydell     mc->desc       = "Aspeed AST2600 EVB (Cortex-A7)";
1416c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
1417baa4732bSCédric Le Goater     amc->hw_strap1 = AST2600_EVB_HW_STRAP1;
1418baa4732bSCédric Le Goater     amc->hw_strap2 = AST2600_EVB_HW_STRAP2;
1419753abfc4SJae Hyun Yoo     amc->fmc_model = "mx66u51235f";
1420baa4732bSCédric Le Goater     amc->spi_model = "mx66u51235f";
1421baa4732bSCédric Le Goater     amc->num_cs    = 1;
142229193286SGuenter Roeck     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON |
142329193286SGuenter Roeck                      ASPEED_MAC3_ON;
1424bf8a471aSJamin Lin     amc->sdhci_wp_inverted = true;
1425baa4732bSCédric Le Goater     amc->i2c_init  = ast2600_evb_i2c_init;
1426baa4732bSCédric Le Goater     mc->default_ram_size = 1 * GiB;
142743a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1428056b779eSCédric Le Goater     aspeed_machine_ast2600_class_emmc_init(oc);
1429baa4732bSCédric Le Goater };
1430baa4732bSCédric Le Goater 
143195f068c8SJohn Wang static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data)
143295f068c8SJohn Wang {
143395f068c8SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
143495f068c8SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
143595f068c8SJohn Wang 
143695f068c8SJohn Wang     mc->desc       = "Bytedance G220A BMC (ARM1176)";
143795f068c8SJohn Wang     amc->soc_name  = "ast2500-a1";
143895f068c8SJohn Wang     amc->hw_strap1 = G220A_BMC_HW_STRAP1;
143995f068c8SJohn Wang     amc->fmc_model = "n25q512a";
144095f068c8SJohn Wang     amc->spi_model = "mx25l25635e";
144195f068c8SJohn Wang     amc->num_cs    = 2;
14425bb825c8SGuenter Roeck     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
144395f068c8SJohn Wang     amc->i2c_init  = g220a_bmc_i2c_init;
144495f068c8SJohn Wang     mc->default_ram_size = 1024 * MiB;
144543a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
144695f068c8SJohn Wang };
144795f068c8SJohn Wang 
144882b6a3f6SJohn Wang static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc, void *data)
144982b6a3f6SJohn Wang {
145082b6a3f6SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
145182b6a3f6SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
145282b6a3f6SJohn Wang 
145382b6a3f6SJohn Wang     mc->desc       = "Inspur FP5280G2 BMC (ARM1176)";
145482b6a3f6SJohn Wang     amc->soc_name  = "ast2500-a1";
145582b6a3f6SJohn Wang     amc->hw_strap1 = FP5280G2_BMC_HW_STRAP1;
145682b6a3f6SJohn Wang     amc->fmc_model = "n25q512a";
145782b6a3f6SJohn Wang     amc->spi_model = "mx25l25635e";
145882b6a3f6SJohn Wang     amc->num_cs    = 2;
145982b6a3f6SJohn Wang     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
146082b6a3f6SJohn Wang     amc->i2c_init  = fp5280g2_bmc_i2c_init;
146182b6a3f6SJohn Wang     mc->default_ram_size = 512 * MiB;
146243a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
146382b6a3f6SJohn Wang };
146482b6a3f6SJohn Wang 
146558e52bdbSCédric Le Goater static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data)
146658e52bdbSCédric Le Goater {
146758e52bdbSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
146858e52bdbSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
146958e52bdbSCédric Le Goater 
1470f548f201SPeter Maydell     mc->desc       = "IBM Rainier BMC (Cortex-A7)";
1471c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
147258e52bdbSCédric Le Goater     amc->hw_strap1 = RAINIER_BMC_HW_STRAP1;
147358e52bdbSCédric Le Goater     amc->hw_strap2 = RAINIER_BMC_HW_STRAP2;
147458e52bdbSCédric Le Goater     amc->fmc_model = "mx66l1g45g";
147558e52bdbSCédric Le Goater     amc->spi_model = "mx66l1g45g";
147658e52bdbSCédric Le Goater     amc->num_cs    = 2;
147758e52bdbSCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
147858e52bdbSCédric Le Goater     amc->i2c_init  = rainier_bmc_i2c_init;
147958e52bdbSCédric Le Goater     mc->default_ram_size = 1 * GiB;
148043a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1481056b779eSCédric Le Goater     aspeed_machine_ast2600_class_emmc_init(oc);
148258e52bdbSCédric Le Goater };
148358e52bdbSCédric Le Goater 
14841e2c22c9SCédric Le Goater #define FUJI_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB)
1485febbe308SPeter Delevoryas 
1486febbe308SPeter Delevoryas static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data)
1487febbe308SPeter Delevoryas {
1488febbe308SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1489febbe308SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1490febbe308SPeter Delevoryas 
1491febbe308SPeter Delevoryas     mc->desc = "Facebook Fuji BMC (Cortex-A7)";
1492febbe308SPeter Delevoryas     amc->soc_name = "ast2600-a3";
1493febbe308SPeter Delevoryas     amc->hw_strap1 = FUJI_BMC_HW_STRAP1;
1494febbe308SPeter Delevoryas     amc->hw_strap2 = FUJI_BMC_HW_STRAP2;
1495febbe308SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1496febbe308SPeter Delevoryas     amc->spi_model = "mx66l1g45g";
1497febbe308SPeter Delevoryas     amc->num_cs = 2;
1498febbe308SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1499febbe308SPeter Delevoryas     amc->i2c_init = fuji_bmc_i2c_init;
1500febbe308SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART1;
1501febbe308SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
150243a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1503febbe308SPeter Delevoryas };
1504febbe308SPeter Delevoryas 
15051e2c22c9SCédric Le Goater #define BLETCHLEY_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB)
1506104bdaffSPatrick Williams 
1507a20c54b1SPatrick Williams static void aspeed_machine_bletchley_class_init(ObjectClass *oc, void *data)
1508a20c54b1SPatrick Williams {
1509a20c54b1SPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1510a20c54b1SPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1511a20c54b1SPatrick Williams 
1512a20c54b1SPatrick Williams     mc->desc       = "Facebook Bletchley BMC (Cortex-A7)";
1513a20c54b1SPatrick Williams     amc->soc_name  = "ast2600-a3";
1514a20c54b1SPatrick Williams     amc->hw_strap1 = BLETCHLEY_BMC_HW_STRAP1;
1515a20c54b1SPatrick Williams     amc->hw_strap2 = BLETCHLEY_BMC_HW_STRAP2;
1516a20c54b1SPatrick Williams     amc->fmc_model = "w25q01jvq";
1517a20c54b1SPatrick Williams     amc->spi_model = NULL;
1518a20c54b1SPatrick Williams     amc->num_cs    = 2;
1519a20c54b1SPatrick Williams     amc->macs_mask = ASPEED_MAC2_ON;
1520a20c54b1SPatrick Williams     amc->i2c_init  = bletchley_bmc_i2c_init;
1521104bdaffSPatrick Williams     mc->default_ram_size = BLETCHLEY_BMC_RAM_SIZE;
152243a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1523a20c54b1SPatrick Williams }
1524a20c54b1SPatrick Williams 
15251b063fe2SJuraj Marcin static void fby35_reset(MachineState *state, ResetType type)
1526fa699e80SPeter Delevoryas {
1527fa699e80SPeter Delevoryas     AspeedMachineState *bmc = ASPEED_MACHINE(state);
15283c392e87SPhilippe Mathieu-Daudé     AspeedGPIOState *gpio = &bmc->soc->gpio;
1529fa699e80SPeter Delevoryas 
15301b063fe2SJuraj Marcin     qemu_devices_reset(type);
1531fa699e80SPeter Delevoryas 
1532f0418558SPeter Delevoryas     /* Board ID: 7 (Class-1, 4 slots) */
1533fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV4", true, &error_fatal);
1534fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV5", true, &error_fatal);
1535fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV6", true, &error_fatal);
1536fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV7", false, &error_fatal);
1537f0418558SPeter Delevoryas 
1538f0418558SPeter Delevoryas     /* Slot presence pins, inverse polarity. (False means present) */
1539f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH4", false, &error_fatal);
1540f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH5", true, &error_fatal);
1541f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH6", true, &error_fatal);
1542f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH7", true, &error_fatal);
1543f0418558SPeter Delevoryas 
1544f0418558SPeter Delevoryas     /* Slot 12v power pins, normal polarity. (True means powered-on) */
1545f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB2", true, &error_fatal);
1546f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB3", false, &error_fatal);
1547f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB4", false, &error_fatal);
1548f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB5", false, &error_fatal);
1549fa699e80SPeter Delevoryas }
1550fa699e80SPeter Delevoryas 
1551fa699e80SPeter Delevoryas static void aspeed_machine_fby35_class_init(ObjectClass *oc, void *data)
1552fa699e80SPeter Delevoryas {
1553fa699e80SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1554fa699e80SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1555fa699e80SPeter Delevoryas 
1556fa699e80SPeter Delevoryas     mc->desc       = "Facebook fby35 BMC (Cortex-A7)";
1557fa699e80SPeter Delevoryas     mc->reset      = fby35_reset;
1558fa699e80SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1559fa699e80SPeter Delevoryas     amc->num_cs    = 2;
1560fa699e80SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1561fa699e80SPeter Delevoryas     amc->i2c_init  = fby35_i2c_init;
1562fa699e80SPeter Delevoryas     /* FIXME: Replace this macro with something more general */
1563fa699e80SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
156443a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1565fa699e80SPeter Delevoryas }
1566fa699e80SPeter Delevoryas 
156766c895b8SJamin Lin #define AST1030_INTERNAL_FLASH_SIZE (1024 * 1024)
156866c895b8SJamin Lin /* Main SYSCLK frequency in Hz (200MHz) */
156966c895b8SJamin Lin #define SYSCLK_FRQ 200000000ULL
157066c895b8SJamin Lin 
157166c895b8SJamin Lin static void aspeed_minibmc_machine_init(MachineState *machine)
157266c895b8SJamin Lin {
157366c895b8SJamin Lin     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
157466c895b8SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
157566c895b8SJamin Lin     Clock *sysclk;
157666c895b8SJamin Lin 
157766c895b8SJamin Lin     sysclk = clock_new(OBJECT(machine), "SYSCLK");
157866c895b8SJamin Lin     clock_set_hz(sysclk, SYSCLK_FRQ);
157966c895b8SJamin Lin 
15803c392e87SPhilippe Mathieu-Daudé     bmc->soc = ASPEED_SOC(object_new(amc->soc_name));
15813c392e87SPhilippe Mathieu-Daudé     object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc));
15823c392e87SPhilippe Mathieu-Daudé     object_unref(OBJECT(bmc->soc));
15833c392e87SPhilippe Mathieu-Daudé     qdev_connect_clock_in(DEVICE(bmc->soc), "sysclk", sysclk);
158466c895b8SJamin Lin 
15853c392e87SPhilippe Mathieu-Daudé     object_property_set_link(OBJECT(bmc->soc), "memory",
15864dd9d554SPeter Delevoryas                              OBJECT(get_system_memory()), &error_abort);
1587d2b3eaefSPeter Delevoryas     connect_serial_hds_to_uarts(bmc);
15883c392e87SPhilippe Mathieu-Daudé     qdev_realize(DEVICE(bmc->soc), NULL, &error_abort);
158966c895b8SJamin Lin 
159022b3c557SJamin Lin     if (defaults_enabled()) {
15913c392e87SPhilippe Mathieu-Daudé         aspeed_board_init_flashes(&bmc->soc->fmc,
159266c895b8SJamin Lin                             bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
159366c895b8SJamin Lin                             amc->num_cs,
159466c895b8SJamin Lin                             0);
159566c895b8SJamin Lin 
15963c392e87SPhilippe Mathieu-Daudé         aspeed_board_init_flashes(&bmc->soc->spi[0],
159766c895b8SJamin Lin                             bmc->spi_model ? bmc->spi_model : amc->spi_model,
159866c895b8SJamin Lin                             amc->num_cs, amc->num_cs);
159966c895b8SJamin Lin 
16003c392e87SPhilippe Mathieu-Daudé         aspeed_board_init_flashes(&bmc->soc->spi[1],
160166c895b8SJamin Lin                             bmc->spi_model ? bmc->spi_model : amc->spi_model,
160266c895b8SJamin Lin                             amc->num_cs, (amc->num_cs * 2));
160322b3c557SJamin Lin     }
160466c895b8SJamin Lin 
160566c895b8SJamin Lin     if (amc->i2c_init) {
160666c895b8SJamin Lin         amc->i2c_init(bmc);
160766c895b8SJamin Lin     }
160866c895b8SJamin Lin 
160966c895b8SJamin Lin     armv7m_load_kernel(ARM_CPU(first_cpu),
161066c895b8SJamin Lin                        machine->kernel_filename,
1611761c532aSPeter Maydell                        0,
161266c895b8SJamin Lin                        AST1030_INTERNAL_FLASH_SIZE);
161366c895b8SJamin Lin }
161466c895b8SJamin Lin 
16154c70ab16STroy Lee static void ast1030_evb_i2c_init(AspeedMachineState *bmc)
16164c70ab16STroy Lee {
16173c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
16184c70ab16STroy Lee 
1619673d8215SMichael Tokarev     /* U10 24C08 connects to SDA/SCL Group 1 by default */
16204c70ab16STroy Lee     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
16214c70ab16STroy Lee     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, eeprom_buf);
16224c70ab16STroy Lee 
16234c70ab16STroy Lee     /* U11 LM75 connects to SDA/SCL Group 2 by default */
16244c70ab16STroy Lee     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d);
16254c70ab16STroy Lee }
16264c70ab16STroy Lee 
162766c895b8SJamin Lin static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc,
162866c895b8SJamin Lin                                                           void *data)
162966c895b8SJamin Lin {
163066c895b8SJamin Lin     MachineClass *mc = MACHINE_CLASS(oc);
163166c895b8SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
163266c895b8SJamin Lin 
163366c895b8SJamin Lin     mc->desc = "Aspeed AST1030 MiniBMC (Cortex-M4)";
163466c895b8SJamin Lin     amc->soc_name = "ast1030-a1";
163566c895b8SJamin Lin     amc->hw_strap1 = 0;
163666c895b8SJamin Lin     amc->hw_strap2 = 0;
163766c895b8SJamin Lin     mc->init = aspeed_minibmc_machine_init;
16384c70ab16STroy Lee     amc->i2c_init = ast1030_evb_i2c_init;
163966c895b8SJamin Lin     mc->default_ram_size = 0;
1640e15001bcSJamin Lin     amc->fmc_model = "w25q80bl";
1641a37bbfbbSJamin Lin     amc->spi_model = "w25q256";
164266c895b8SJamin Lin     amc->num_cs = 2;
164366c895b8SJamin Lin     amc->macs_mask = 0;
164443a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
164566c895b8SJamin Lin }
164666c895b8SJamin Lin 
164792707992SJamin Lin #ifdef TARGET_AARCH64
16482c075ff3SJamin Lin static void ast2700_evb_i2c_init(AspeedMachineState *bmc)
16492c075ff3SJamin Lin {
16502c075ff3SJamin Lin     AspeedSoCState *soc = bmc->soc;
16512c075ff3SJamin Lin 
16522c075ff3SJamin Lin     /* LM75 is compatible with TMP105 driver */
16532c075ff3SJamin Lin     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0),
16542c075ff3SJamin Lin                             TYPE_TMP105, 0x4d);
16552c075ff3SJamin Lin }
16562c075ff3SJamin Lin 
165792707992SJamin Lin static void aspeed_machine_ast2700_evb_class_init(ObjectClass *oc, void *data)
165892707992SJamin Lin {
165992707992SJamin Lin     MachineClass *mc = MACHINE_CLASS(oc);
166092707992SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
166192707992SJamin Lin 
166292707992SJamin Lin     mc->desc = "Aspeed AST2700 EVB (Cortex-A35)";
166392707992SJamin Lin     amc->soc_name  = "ast2700-a0";
166492707992SJamin Lin     amc->hw_strap1 = AST2700_EVB_HW_STRAP1;
166592707992SJamin Lin     amc->hw_strap2 = AST2700_EVB_HW_STRAP2;
166692707992SJamin Lin     amc->fmc_model = "w25q01jvq";
166792707992SJamin Lin     amc->spi_model = "w25q512jv";
166892707992SJamin Lin     amc->num_cs    = 2;
166992707992SJamin Lin     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON;
167092707992SJamin Lin     amc->uart_default = ASPEED_DEV_UART12;
16712c075ff3SJamin Lin     amc->i2c_init  = ast2700_evb_i2c_init;
167292707992SJamin Lin     mc->default_ram_size = 1 * GiB;
167392707992SJamin Lin     aspeed_machine_class_init_cpus_defaults(mc);
167492707992SJamin Lin }
167592707992SJamin Lin #endif
167692707992SJamin Lin 
1677fb6b3c8dSJae Hyun Yoo static void aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass *oc,
1678fb6b3c8dSJae Hyun Yoo                                                      void *data)
1679fb6b3c8dSJae Hyun Yoo {
1680fb6b3c8dSJae Hyun Yoo     MachineClass *mc = MACHINE_CLASS(oc);
1681fb6b3c8dSJae Hyun Yoo     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1682fb6b3c8dSJae Hyun Yoo 
1683fb6b3c8dSJae Hyun Yoo     mc->desc       = "Qualcomm DC-SCM V1 BMC (Cortex A7)";
1684fb6b3c8dSJae Hyun Yoo     amc->soc_name  = "ast2600-a3";
1685fb6b3c8dSJae Hyun Yoo     amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1686fb6b3c8dSJae Hyun Yoo     amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1687fb6b3c8dSJae Hyun Yoo     amc->fmc_model = "n25q512a";
1688fb6b3c8dSJae Hyun Yoo     amc->spi_model = "n25q512a";
1689fb6b3c8dSJae Hyun Yoo     amc->num_cs    = 2;
1690fb6b3c8dSJae Hyun Yoo     amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1691fb6b3c8dSJae Hyun Yoo     amc->i2c_init  = qcom_dc_scm_bmc_i2c_init;
1692fb6b3c8dSJae Hyun Yoo     mc->default_ram_size = 1 * GiB;
169343a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1694fb6b3c8dSJae Hyun Yoo };
1695fb6b3c8dSJae Hyun Yoo 
1696ece4cccdSGraeme Gregory static void aspeed_machine_qcom_firework_class_init(ObjectClass *oc,
1697ece4cccdSGraeme Gregory                                                     void *data)
1698ece4cccdSGraeme Gregory {
1699ece4cccdSGraeme Gregory     MachineClass *mc = MACHINE_CLASS(oc);
1700ece4cccdSGraeme Gregory     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1701ece4cccdSGraeme Gregory 
1702ece4cccdSGraeme Gregory     mc->desc       = "Qualcomm DC-SCM V1/Firework BMC (Cortex A7)";
1703ece4cccdSGraeme Gregory     amc->soc_name  = "ast2600-a3";
1704ece4cccdSGraeme Gregory     amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1705ece4cccdSGraeme Gregory     amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1706ece4cccdSGraeme Gregory     amc->fmc_model = "n25q512a";
1707ece4cccdSGraeme Gregory     amc->spi_model = "n25q512a";
1708ece4cccdSGraeme Gregory     amc->num_cs    = 2;
1709ece4cccdSGraeme Gregory     amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1710ece4cccdSGraeme Gregory     amc->i2c_init  = qcom_dc_scm_firework_i2c_init;
1711ece4cccdSGraeme Gregory     mc->default_ram_size = 1 * GiB;
171243a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1713ece4cccdSGraeme Gregory };
1714ece4cccdSGraeme Gregory 
1715baa4732bSCédric Le Goater static const TypeInfo aspeed_machine_types[] = {
1716baa4732bSCédric Le Goater     {
1717baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("palmetto-bmc"),
1718baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1719baa4732bSCédric Le Goater         .class_init    = aspeed_machine_palmetto_class_init,
1720baa4732bSCédric Le Goater     }, {
172140a38df5SErik Smit         .name          = MACHINE_TYPE_NAME("supermicrox11-bmc"),
172240a38df5SErik Smit         .parent        = TYPE_ASPEED_MACHINE,
172340a38df5SErik Smit         .class_init    = aspeed_machine_supermicrox11_bmc_class_init,
172440a38df5SErik Smit     }, {
172547936597SGuenter Roeck         .name          = MACHINE_TYPE_NAME("supermicro-x11spi-bmc"),
172647936597SGuenter Roeck         .parent        = TYPE_ASPEED_MACHINE,
172747936597SGuenter Roeck         .class_init    = aspeed_machine_supermicro_x11spi_bmc_class_init,
172847936597SGuenter Roeck     }, {
1729baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2500-evb"),
1730baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1731baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2500_evb_class_init,
1732baa4732bSCédric Le Goater     }, {
1733baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("romulus-bmc"),
1734baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1735baa4732bSCédric Le Goater         .class_init    = aspeed_machine_romulus_class_init,
1736baa4732bSCédric Le Goater     }, {
1737143b040fSPatrick Williams         .name          = MACHINE_TYPE_NAME("sonorapass-bmc"),
1738143b040fSPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1739143b040fSPatrick Williams         .class_init    = aspeed_machine_sonorapass_class_init,
1740143b040fSPatrick Williams     }, {
1741baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("witherspoon-bmc"),
1742baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1743baa4732bSCédric Le Goater         .class_init    = aspeed_machine_witherspoon_class_init,
1744baa4732bSCédric Le Goater     }, {
1745baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2600-evb"),
1746baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1747baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2600_evb_class_init,
1748baa4732bSCédric Le Goater     }, {
174934f73a81SKarthikeyan Pasupathi         .name          = MACHINE_TYPE_NAME("yosemitev2-bmc"),
175034f73a81SKarthikeyan Pasupathi         .parent        = TYPE_ASPEED_MACHINE,
175134f73a81SKarthikeyan Pasupathi         .class_init    = aspeed_machine_yosemitev2_class_init,
175234f73a81SKarthikeyan Pasupathi     }, {
17536c323abaSKarthikeyan Pasupathi         .name          = MACHINE_TYPE_NAME("tiogapass-bmc"),
17546c323abaSKarthikeyan Pasupathi         .parent        = TYPE_ASPEED_MACHINE,
17556c323abaSKarthikeyan Pasupathi         .class_init    = aspeed_machine_tiogapass_class_init,
17566c323abaSKarthikeyan Pasupathi     }, {
175795f068c8SJohn Wang         .name          = MACHINE_TYPE_NAME("g220a-bmc"),
175895f068c8SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
175995f068c8SJohn Wang         .class_init    = aspeed_machine_g220a_class_init,
176095f068c8SJohn Wang     }, {
1761fb6b3c8dSJae Hyun Yoo         .name          = MACHINE_TYPE_NAME("qcom-dc-scm-v1-bmc"),
1762fb6b3c8dSJae Hyun Yoo         .parent        = TYPE_ASPEED_MACHINE,
1763fb6b3c8dSJae Hyun Yoo         .class_init    = aspeed_machine_qcom_dc_scm_v1_class_init,
1764fb6b3c8dSJae Hyun Yoo     }, {
1765ece4cccdSGraeme Gregory         .name          = MACHINE_TYPE_NAME("qcom-firework-bmc"),
1766ece4cccdSGraeme Gregory         .parent        = TYPE_ASPEED_MACHINE,
1767ece4cccdSGraeme Gregory         .class_init    = aspeed_machine_qcom_firework_class_init,
1768ece4cccdSGraeme Gregory     }, {
176982b6a3f6SJohn Wang         .name          = MACHINE_TYPE_NAME("fp5280g2-bmc"),
177082b6a3f6SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
177182b6a3f6SJohn Wang         .class_init    = aspeed_machine_fp5280g2_class_init,
177282b6a3f6SJohn Wang     }, {
17739cccb912SPatrick Venture         .name          = MACHINE_TYPE_NAME("quanta-q71l-bmc"),
17749cccb912SPatrick Venture         .parent        = TYPE_ASPEED_MACHINE,
17759cccb912SPatrick Venture         .class_init    = aspeed_machine_quanta_q71l_class_init,
17769cccb912SPatrick Venture     }, {
177758e52bdbSCédric Le Goater         .name          = MACHINE_TYPE_NAME("rainier-bmc"),
177858e52bdbSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
177958e52bdbSCédric Le Goater         .class_init    = aspeed_machine_rainier_class_init,
178058e52bdbSCédric Le Goater     }, {
1781febbe308SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fuji-bmc"),
1782febbe308SPeter Delevoryas         .parent        = TYPE_ASPEED_MACHINE,
1783febbe308SPeter Delevoryas         .class_init    = aspeed_machine_fuji_class_init,
1784febbe308SPeter Delevoryas     }, {
1785a20c54b1SPatrick Williams         .name          = MACHINE_TYPE_NAME("bletchley-bmc"),
1786a20c54b1SPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1787a20c54b1SPatrick Williams         .class_init    = aspeed_machine_bletchley_class_init,
1788a20c54b1SPatrick Williams     }, {
1789fa699e80SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fby35-bmc"),
1790fa699e80SPeter Delevoryas         .parent        = MACHINE_TYPE_NAME("ast2600-evb"),
1791fa699e80SPeter Delevoryas         .class_init    = aspeed_machine_fby35_class_init,
1792fa699e80SPeter Delevoryas     }, {
179366c895b8SJamin Lin         .name           = MACHINE_TYPE_NAME("ast1030-evb"),
179466c895b8SJamin Lin         .parent         = TYPE_ASPEED_MACHINE,
179566c895b8SJamin Lin         .class_init     = aspeed_minibmc_machine_ast1030_evb_class_init,
179692707992SJamin Lin #ifdef TARGET_AARCH64
179792707992SJamin Lin     }, {
179892707992SJamin Lin         .name          = MACHINE_TYPE_NAME("ast2700-evb"),
179992707992SJamin Lin         .parent        = TYPE_ASPEED_MACHINE,
180092707992SJamin Lin         .class_init    = aspeed_machine_ast2700_evb_class_init,
180192707992SJamin Lin #endif
180266c895b8SJamin Lin     }, {
1803fca9ca1bSCédric Le Goater         .name          = TYPE_ASPEED_MACHINE,
180462c2c2ebSCédric Le Goater         .parent        = TYPE_MACHINE,
1805888b2b03SPhilippe Mathieu-Daudé         .instance_size = sizeof(AspeedMachineState),
18061a15311aSCédric Le Goater         .instance_init = aspeed_machine_instance_init,
1807fca9ca1bSCédric Le Goater         .class_size    = sizeof(AspeedMachineClass),
1808fca9ca1bSCédric Le Goater         .class_init    = aspeed_machine_class_init,
1809baa4732bSCédric Le Goater         .abstract      = true,
1810baa4732bSCédric Le Goater     }
1811fca9ca1bSCédric Le Goater };
181274fb1f38SCédric Le Goater 
1813baa4732bSCédric Le Goater DEFINE_TYPES(aspeed_machine_types)
1814