xref: /qemu/hw/arm/aspeed.c (revision de4e979973ce5c09d0b9a6d8a7aa17ab77c869c8)
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 */
184172329c6SJamin Lin /* SCU HW Strap1 */
185172329c6SJamin Lin #define AST2700_EVB_HW_STRAP1 0x00000800
186172329c6SJamin Lin /* SCUIO HW Strap1 */
187172329c6SJamin Lin #define AST2700_EVB_HW_STRAP2 0x00000700
18892707992SJamin Lin #endif
18992707992SJamin Lin 
19058e52bdbSCédric Le Goater /* Rainier hardware value: (QEMU prototype) */
19101ea09ebSCédric Le Goater #define RAINIER_BMC_HW_STRAP1 (0x00422016 | SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC)
192b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP2 0x80000848
19358e52bdbSCédric Le Goater 
194febbe308SPeter Delevoryas /* Fuji hardware value */
195febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP1    0x00000000
196febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP2    0x00000000
197febbe308SPeter Delevoryas 
198a20c54b1SPatrick Williams /* Bletchley hardware value */
199a20c54b1SPatrick Williams /* TODO: Leave same as EVB for now. */
200a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP1 AST2600_EVB_HW_STRAP1
201a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP2 AST2600_EVB_HW_STRAP2
202a20c54b1SPatrick Williams 
203fb6b3c8dSJae Hyun Yoo /* Qualcomm DC-SCM hardware value */
204fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP1  0x00000000
205fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP2  0x00000041
206fb6b3c8dSJae Hyun Yoo 
2079bb6d140SJoel Stanley #define AST_SMP_MAILBOX_BASE            0x1e6e2180
2089bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_ENTRY        (AST_SMP_MAILBOX_BASE + 0x0)
2099bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_GOSIGN       (AST_SMP_MAILBOX_BASE + 0x4)
2109bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_READY        (AST_SMP_MAILBOX_BASE + 0x8)
2119bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_POLLINSN     (AST_SMP_MAILBOX_BASE + 0xc)
2129bb6d140SJoel Stanley #define AST_SMP_MBOX_CODE               (AST_SMP_MAILBOX_BASE + 0x10)
2139bb6d140SJoel Stanley #define AST_SMP_MBOX_GOSIGN             0xabbaab00
2149bb6d140SJoel Stanley 
2159bb6d140SJoel Stanley static void aspeed_write_smpboot(ARMCPU *cpu,
2169bb6d140SJoel Stanley                                  const struct arm_boot_info *info)
2179bb6d140SJoel Stanley {
218902bba54SCédric Le Goater     AddressSpace *as = arm_boot_address_space(cpu, info);
219902bba54SCédric Le Goater     static const ARMInsnFixup poll_mailbox_ready[] = {
2209bb6d140SJoel Stanley         /*
2219bb6d140SJoel Stanley          * r2 = per-cpu go sign value
2229bb6d140SJoel Stanley          * r1 = AST_SMP_MBOX_FIELD_ENTRY
2239bb6d140SJoel Stanley          * r0 = AST_SMP_MBOX_FIELD_GOSIGN
2249bb6d140SJoel Stanley          */
225902bba54SCédric Le Goater         { 0xee100fb0 },  /* mrc     p15, 0, r0, c0, c0, 5 */
226902bba54SCédric Le Goater         { 0xe21000ff },  /* ands    r0, r0, #255          */
227902bba54SCédric Le Goater         { 0xe59f201c },  /* ldr     r2, [pc, #28]         */
228902bba54SCédric Le Goater         { 0xe1822000 },  /* orr     r2, r2, r0            */
2299bb6d140SJoel Stanley 
230902bba54SCédric Le Goater         { 0xe59f1018 },  /* ldr     r1, [pc, #24]         */
231902bba54SCédric Le Goater         { 0xe59f0018 },  /* ldr     r0, [pc, #24]         */
2329bb6d140SJoel Stanley 
233902bba54SCédric Le Goater         { 0xe320f002 },  /* wfe                           */
234902bba54SCédric Le Goater         { 0xe5904000 },  /* ldr     r4, [r0]              */
235902bba54SCédric Le Goater         { 0xe1520004 },  /* cmp     r2, r4                */
236902bba54SCédric Le Goater         { 0x1afffffb },  /* bne     <wfe>                 */
237902bba54SCédric Le Goater         { 0xe591f000 },  /* ldr     pc, [r1]              */
238902bba54SCédric Le Goater         { AST_SMP_MBOX_GOSIGN },
239902bba54SCédric Le Goater         { AST_SMP_MBOX_FIELD_ENTRY },
240902bba54SCédric Le Goater         { AST_SMP_MBOX_FIELD_GOSIGN },
241902bba54SCédric Le Goater         { 0, FIXUP_TERMINATOR }
2429bb6d140SJoel Stanley     };
243902bba54SCédric Le Goater     static const uint32_t fixupcontext[FIXUP_MAX] = { 0 };
2449bb6d140SJoel Stanley 
245902bba54SCédric Le Goater     arm_write_bootloader("aspeed.smpboot", as, info->smp_loader_start,
246902bba54SCédric Le Goater                          poll_mailbox_ready, fixupcontext);
2479bb6d140SJoel Stanley }
2489bb6d140SJoel Stanley 
2499bb6d140SJoel Stanley static void aspeed_reset_secondary(ARMCPU *cpu,
2509bb6d140SJoel Stanley                                    const struct arm_boot_info *info)
2519bb6d140SJoel Stanley {
2529bb6d140SJoel Stanley     AddressSpace *as = arm_boot_address_space(cpu, info);
2539bb6d140SJoel Stanley     CPUState *cs = CPU(cpu);
2549bb6d140SJoel Stanley 
2559bb6d140SJoel Stanley     /* info->smp_bootreg_addr */
2569bb6d140SJoel Stanley     address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0,
2579bb6d140SJoel Stanley                                MEMTXATTRS_UNSPECIFIED, NULL);
2589bb6d140SJoel Stanley     cpu_set_pc(cs, info->smp_loader_start);
2599bb6d140SJoel Stanley }
2609bb6d140SJoel Stanley 
2618b744a6aSCédric Le Goater static void write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size,
262d769a1daSCédric Le Goater                            Error **errp)
263d769a1daSCédric Le Goater {
26405e6e40aSWentao_Liang     g_autofree void *storage = NULL;
2650c7209beSCédric Le Goater     int64_t size;
266d769a1daSCédric Le Goater 
2674db1c164SJamin Lin     /*
2684db1c164SJamin Lin      * The block backend size should have already been 'validated' by
2690c7209beSCédric Le Goater      * the creation of the m25p80 object.
2700c7209beSCédric Le Goater      */
2710c7209beSCédric Le Goater     size = blk_getlength(blk);
2720c7209beSCédric Le Goater     if (size <= 0) {
2730c7209beSCédric Le Goater         error_setg(errp, "failed to get flash size");
2740c7209beSCédric Le Goater         return;
2750c7209beSCédric Le Goater     }
2760c7209beSCédric Le Goater 
2770c7209beSCédric Le Goater     if (rom_size > size) {
2780c7209beSCédric Le Goater         rom_size = size;
279d769a1daSCédric Le Goater     }
280d769a1daSCédric Le Goater 
28105e6e40aSWentao_Liang     storage = g_malloc0(rom_size);
282a9262f55SAlberto Faria     if (blk_pread(blk, 0, rom_size, storage, 0) < 0) {
283d769a1daSCédric Le Goater         error_setg(errp, "failed to read the initial flash content");
284d769a1daSCédric Le Goater         return;
285d769a1daSCédric Le Goater     }
286d769a1daSCédric Le Goater 
287d769a1daSCédric Le Goater     rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr);
288d769a1daSCédric Le Goater }
289d769a1daSCédric Le Goater 
2908b744a6aSCédric Le Goater /*
2918b744a6aSCédric Le Goater  * Create a ROM and copy the flash contents at the expected address
2928b744a6aSCédric Le Goater  * (0x0). Boots faster than execute-in-place.
2938b744a6aSCédric Le Goater  */
294262259eaSCédric Le Goater static void aspeed_install_boot_rom(AspeedMachineState *bmc, BlockBackend *blk,
2958b744a6aSCédric Le Goater                                     uint64_t rom_size)
2968b744a6aSCédric Le Goater {
2973c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
298db052d0eSJamin Lin     AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(soc);
2998b744a6aSCédric Le Goater 
300262259eaSCédric Le Goater     memory_region_init_rom(&bmc->boot_rom, NULL, "aspeed.boot_rom", rom_size,
3018b744a6aSCédric Le Goater                            &error_abort);
3028b744a6aSCédric Le Goater     memory_region_add_subregion_overlap(&soc->spi_boot_container, 0,
303262259eaSCédric Le Goater                                         &bmc->boot_rom, 1);
304db052d0eSJamin Lin     write_boot_rom(blk, sc->memmap[ASPEED_DEV_SPI_BOOT],
305db052d0eSJamin Lin                    rom_size, &error_abort);
3068b744a6aSCédric Le Goater }
3078b744a6aSCédric Le Goater 
3081099ad10SPeter Delevoryas void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
3099bd4ac61SCédric Le Goater                                       unsigned int count, int unit0)
310e1ad9bc4SCédric Le Goater {
311e1ad9bc4SCédric Le Goater     int i;
312179b2058SPatrick Williams 
313179b2058SPatrick Williams     if (!flashtype) {
314179b2058SPatrick Williams         return;
315179b2058SPatrick Williams     }
316e1ad9bc4SCédric Le Goater 
3179bd4ac61SCédric Le Goater     for (i = 0; i < count; ++i) {
3188ec239f2SMarkus Armbruster         DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i);
319a7d78befSCédric Le Goater         DeviceState *dev;
320e1ad9bc4SCédric Le Goater 
321a7d78befSCédric Le Goater         dev = qdev_new(flashtype);
322e1ad9bc4SCédric Le Goater         if (dinfo) {
323a7d78befSCédric Le Goater             qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo));
324e1ad9bc4SCédric Le Goater         }
32527a2c66cSCédric Le Goater         qdev_prop_set_uint8(dev, "cs", i);
326a7d78befSCédric Le Goater         qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal);
327e1ad9bc4SCédric Le Goater     }
328e1ad9bc4SCédric Le Goater }
329e1ad9bc4SCédric Le Goater 
330e554e45bSCédric Le Goater static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo, bool emmc,
331e554e45bSCédric Le Goater                                bool boot_emmc)
332a29e3e12SAndrew Jeffery {
333a29e3e12SAndrew Jeffery         DeviceState *card;
334a29e3e12SAndrew Jeffery 
335756f739bSPhilippe Mathieu-Daudé         if (!dinfo) {
336756f739bSPhilippe Mathieu-Daudé             return;
337756f739bSPhilippe Mathieu-Daudé         }
338dddfc771SCédric Le Goater         card = qdev_new(emmc ? TYPE_EMMC : TYPE_SD_CARD);
339e8f3acdbSCédric Le Goater 
340e8f3acdbSCédric Le Goater         /*
341e8f3acdbSCédric Le Goater          * Force the boot properties of the eMMC device only when the
342e8f3acdbSCédric Le Goater          * machine is strapped to boot from eMMC. Without these
343e8f3acdbSCédric Le Goater          * settings, the machine would not boot.
344e8f3acdbSCédric Le Goater          *
345e8f3acdbSCédric Le Goater          * This also allows the machine to use an eMMC device without
346e8f3acdbSCédric Le Goater          * boot areas when booting from the flash device (or -kernel)
347e8f3acdbSCédric Le Goater          * Ideally, the device and its properties should be defined on
348e8f3acdbSCédric Le Goater          * the command line.
349e8f3acdbSCédric Le Goater          */
350e8f3acdbSCédric Le Goater         if (emmc && boot_emmc) {
351e554e45bSCédric Le Goater             qdev_prop_set_uint64(card, "boot-partition-size", 1 * MiB);
352e8f3acdbSCédric Le Goater             qdev_prop_set_uint8(card, "boot-config", 0x1 << 3);
353e554e45bSCédric Le Goater         }
354934df912SMarkus Armbruster         qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
355a29e3e12SAndrew Jeffery                                 &error_fatal);
3563e80f690SMarkus Armbruster         qdev_realize_and_unref(card,
3573e80f690SMarkus Armbruster                                qdev_get_child_bus(DEVICE(sdhci), "sd-bus"),
3583e80f690SMarkus Armbruster                                &error_fatal);
359a29e3e12SAndrew Jeffery }
360a29e3e12SAndrew Jeffery 
361d2b3eaefSPeter Delevoryas static void connect_serial_hds_to_uarts(AspeedMachineState *bmc)
362d2b3eaefSPeter Delevoryas {
363d2b3eaefSPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
3643c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *s = bmc->soc;
365d2b3eaefSPeter Delevoryas     AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
366f65f6ad5SCédric Le Goater     int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default;
367d2b3eaefSPeter Delevoryas 
368f65f6ad5SCédric Le Goater     aspeed_soc_uart_set_chr(s, uart_chosen, serial_hd(0));
3698a139ae7SKenneth Jia     for (int i = 1, uart = sc->uarts_base; i < sc->uarts_num; uart++) {
370f65f6ad5SCédric Le Goater         if (uart == uart_chosen) {
371d2b3eaefSPeter Delevoryas             continue;
372d2b3eaefSPeter Delevoryas         }
3738a139ae7SKenneth Jia         aspeed_soc_uart_set_chr(s, uart, serial_hd(i++));
374d2b3eaefSPeter Delevoryas     }
375d2b3eaefSPeter Delevoryas }
376d2b3eaefSPeter Delevoryas 
377baa4732bSCédric Le Goater static void aspeed_machine_init(MachineState *machine)
378327d8e4eSAndrew Jeffery {
379888b2b03SPhilippe Mathieu-Daudé     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
380baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
381b033271fSCédric Le Goater     AspeedSoCClass *sc;
3822bea128cSEddie James     int i;
383255aed81SCédric Le Goater     DriveInfo *emmc0 = NULL;
384e554e45bSCédric Le Goater     bool boot_emmc;
385327d8e4eSAndrew Jeffery 
3863c392e87SPhilippe Mathieu-Daudé     bmc->soc = ASPEED_SOC(object_new(amc->soc_name));
3873c392e87SPhilippe Mathieu-Daudé     object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc));
3883c392e87SPhilippe Mathieu-Daudé     object_unref(OBJECT(bmc->soc));
3893c392e87SPhilippe Mathieu-Daudé     sc = ASPEED_SOC_GET_CLASS(bmc->soc);
390b033271fSCédric Le Goater 
391533eb415SIgor Mammedov     /*
392346160cbSCédric Le Goater      * This will error out if the RAM size is not supported by the
393346160cbSCédric Le Goater      * memory controller of the SoC.
394533eb415SIgor Mammedov      */
3953c392e87SPhilippe Mathieu-Daudé     object_property_set_uint(OBJECT(bmc->soc), "ram-size", machine->ram_size,
396533eb415SIgor Mammedov                              &error_fatal);
397533eb415SIgor Mammedov 
398d3bad7e7SCédric Le Goater     for (i = 0; i < sc->macs_num; i++) {
399b3cfec5bSDavid Woodhouse         if ((amc->macs_mask & (1 << i)) &&
400b3cfec5bSDavid Woodhouse             !qemu_configure_nic_device(DEVICE(&bmc->soc->ftgmac100[i]),
401b3cfec5bSDavid Woodhouse                                        true, NULL)) {
402b3cfec5bSDavid Woodhouse             break; /* No configs left; stop asking */
403d3bad7e7SCédric Le Goater         }
404d3bad7e7SCédric Le Goater     }
405d3bad7e7SCédric Le Goater 
406621845a9SCédric Le Goater     object_property_set_int(OBJECT(bmc->soc), "hw-strap1", bmc->hw_strap1,
40787e79af0SAndrew Jeffery                             &error_abort);
4083c392e87SPhilippe Mathieu-Daudé     object_property_set_int(OBJECT(bmc->soc), "hw-strap2", amc->hw_strap2,
409ccc2c418SCédric Le Goater                             &error_abort);
4103c392e87SPhilippe Mathieu-Daudé     object_property_set_link(OBJECT(bmc->soc), "memory",
4114dd9d554SPeter Delevoryas                              OBJECT(get_system_memory()), &error_abort);
4123c392e87SPhilippe Mathieu-Daudé     object_property_set_link(OBJECT(bmc->soc), "dram",
4130df2d9a6SCédric Le Goater                              OBJECT(machine->ram), &error_abort);
414bf8a471aSJamin Lin     if (amc->sdhci_wp_inverted) {
415bf8a471aSJamin Lin         for (i = 0; i < bmc->soc->sdhci.num_slots; i++) {
416bf8a471aSJamin Lin             object_property_set_bool(OBJECT(&bmc->soc->sdhci.slots[i]),
417bf8a471aSJamin Lin                                      "wp-inverted", true, &error_abort);
418bf8a471aSJamin Lin         }
419bf8a471aSJamin Lin     }
420b6e70d1dSJoel Stanley     if (machine->kernel_filename) {
421b6e70d1dSJoel Stanley         /*
422b6e70d1dSJoel Stanley          * When booting with a -kernel command line there is no u-boot
423b6e70d1dSJoel Stanley          * that runs to unlock the SCU. In this case set the default to
424b6e70d1dSJoel Stanley          * be unlocked as the kernel expects
425b6e70d1dSJoel Stanley          */
4263c392e87SPhilippe Mathieu-Daudé         object_property_set_int(OBJECT(bmc->soc), "hw-prot-key",
4275325cc34SMarkus Armbruster                                 ASPEED_SCU_PROT_KEY, &error_abort);
428b6e70d1dSJoel Stanley     }
429d2b3eaefSPeter Delevoryas     connect_serial_hds_to_uarts(bmc);
4303c392e87SPhilippe Mathieu-Daudé     qdev_realize(DEVICE(bmc->soc), NULL, &error_abort);
431327d8e4eSAndrew Jeffery 
432c7e313aeSCédric Le Goater     if (defaults_enabled()) {
4333c392e87SPhilippe Mathieu-Daudé         aspeed_board_init_flashes(&bmc->soc->fmc,
4348ec239f2SMarkus Armbruster                               bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
4359bd4ac61SCédric Le Goater                               amc->num_cs, 0);
4363c392e87SPhilippe Mathieu-Daudé         aspeed_board_init_flashes(&bmc->soc->spi[0],
4378ec239f2SMarkus Armbruster                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
4389bd4ac61SCédric Le Goater                               1, amc->num_cs);
439c7e313aeSCédric Le Goater     }
440e1ad9bc4SCédric Le Goater 
441b7f1a0cbSCédric Le Goater     if (machine->kernel_filename && sc->num_cpus > 1) {
4429bb6d140SJoel Stanley         /* With no u-boot we must set up a boot stub for the secondary CPU */
4439bb6d140SJoel Stanley         MemoryRegion *smpboot = g_new(MemoryRegion, 1);
444f489960dSPhilippe Mathieu-Daudé         memory_region_init_ram(smpboot, NULL, "aspeed.smpboot",
4459bb6d140SJoel Stanley                                0x80, &error_abort);
4469bb6d140SJoel Stanley         memory_region_add_subregion(get_system_memory(),
4479bb6d140SJoel Stanley                                     AST_SMP_MAILBOX_BASE, smpboot);
4489bb6d140SJoel Stanley 
4499bb6d140SJoel Stanley         aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot;
4509bb6d140SJoel Stanley         aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary;
4519bb6d140SJoel Stanley         aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE;
4529bb6d140SJoel Stanley     }
4539bb6d140SJoel Stanley 
4546e504a98SPaolo Bonzini     aspeed_board_binfo.ram_size = machine->ram_size;
455347df6f8SEduardo Habkost     aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM];
456b033271fSCédric Le Goater 
457baa4732bSCédric Le Goater     if (amc->i2c_init) {
458baa4732bSCédric Le Goater         amc->i2c_init(bmc);
4592cf6cb50SCédric Le Goater     }
4602cf6cb50SCédric Le Goater 
461e9085846SCédric Le Goater     for (i = 0; i < bmc->soc->sdhci.num_slots && defaults_enabled(); i++) {
4623c392e87SPhilippe Mathieu-Daudé         sdhci_attach_drive(&bmc->soc->sdhci.slots[i],
463e554e45bSCédric Le Goater                            drive_get(IF_SD, 0, i), false, false);
464a29e3e12SAndrew Jeffery     }
4652bea128cSEddie James 
466e554e45bSCédric Le Goater     boot_emmc = sc->boot_from_emmc(bmc->soc);
467e554e45bSCédric Le Goater 
468e9085846SCédric Le Goater     if (bmc->soc->emmc.num_slots && defaults_enabled()) {
469255aed81SCédric Le Goater         emmc0 = drive_get(IF_SD, 0, bmc->soc->sdhci.num_slots);
470e554e45bSCédric Le Goater         sdhci_attach_drive(&bmc->soc->emmc.slots[0], emmc0, true, boot_emmc);
4712bea128cSEddie James     }
4722bea128cSEddie James 
4738b744a6aSCédric Le Goater     if (!bmc->mmio_exec) {
4743c392e87SPhilippe Mathieu-Daudé         DeviceState *dev = ssi_get_cs(bmc->soc->fmc.spi, 0);
4758285490bSCédric Le Goater         BlockBackend *fmc0 = dev ? m25p80_get_blk(dev) : NULL;
4768b744a6aSCédric Le Goater 
477e554e45bSCédric Le Goater         if (fmc0 && !boot_emmc) {
4783c392e87SPhilippe Mathieu-Daudé             uint64_t rom_size = memory_region_size(&bmc->soc->spi_boot);
4798285490bSCédric Le Goater             aspeed_install_boot_rom(bmc, fmc0, rom_size);
480255aed81SCédric Le Goater         } else if (emmc0) {
481255aed81SCédric Le Goater             aspeed_install_boot_rom(bmc, blk_by_legacy_dinfo(emmc0), 64 * KiB);
4828b744a6aSCédric Le Goater         }
4838b744a6aSCédric Le Goater     }
4848b744a6aSCédric Le Goater 
4852744ece8STao Xu     arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo);
486327d8e4eSAndrew Jeffery }
487327d8e4eSAndrew Jeffery 
488612b219aSPhilippe Mathieu-Daudé static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
4892cf6cb50SCédric Le Goater {
4903c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
491a87e81b9SCédric Le Goater     DeviceState *dev;
4923d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
4932cf6cb50SCédric Le Goater 
4944db1c164SJamin Lin     /*
4954db1c164SJamin Lin      * The palmetto platform expects a ds3231 RTC but a ds1338 is
4964db1c164SJamin Lin      * enough to provide basic RTC features. Alarms will be missing
4974db1c164SJamin Lin      */
4981373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
499a87e81b9SCédric Le Goater 
5007a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
5013d165f12SCédric Le Goater                           eeprom_buf);
5023d165f12SCédric Le Goater 
503a87e81b9SCédric Le Goater     /* add a TMP423 temperature sensor */
5041373b15bSPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
5051373b15bSPhilippe Mathieu-Daudé                                          "tmp423", 0x4c));
5065325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
5075325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
5085325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
5095325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort);
5102cf6cb50SCédric Le Goater }
5112cf6cb50SCédric Le Goater 
5129cccb912SPatrick Venture static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc)
5139cccb912SPatrick Venture {
5143c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
5159cccb912SPatrick Venture 
5169cccb912SPatrick Venture     /*
5179cccb912SPatrick Venture      * The quanta-q71l platform expects tmp75s which are compatible with
5189cccb912SPatrick Venture      * tmp105s.
5199cccb912SPatrick Venture      */
5209cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c);
5219cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e);
5229cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f);
5239cccb912SPatrick Venture 
5249cccb912SPatrick Venture     /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */
5259cccb912SPatrick Venture     /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */
5269cccb912SPatrick Venture     /* TODO: Add Memory Riser i2c mux and eeproms. */
5279cccb912SPatrick Venture 
5283ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74);
5293ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77);
5303ec75e39SPatrick Venture 
5319cccb912SPatrick Venture     /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */
5323ec75e39SPatrick Venture 
5333ec75e39SPatrick Venture     /* i2c-7 */
5343ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70);
5359cccb912SPatrick Venture     /*        - i2c@0: pmbus@59 */
5369cccb912SPatrick Venture     /*        - i2c@1: pmbus@58 */
5379cccb912SPatrick Venture     /*        - i2c@2: pmbus@58 */
5389cccb912SPatrick Venture     /*        - i2c@3: pmbus@59 */
5393ec75e39SPatrick Venture 
5409cccb912SPatrick Venture     /* TODO: i2c-7: Add PDB FRU eeprom@52 */
5419cccb912SPatrick Venture     /* TODO: i2c-8: Add BMC FRU eeprom@50 */
5429cccb912SPatrick Venture }
5439cccb912SPatrick Venture 
544612b219aSPhilippe Mathieu-Daudé static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
5452cf6cb50SCédric Le Goater {
5463c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
5473d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
5483d165f12SCédric Le Goater 
5497a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50,
5503d165f12SCédric Le Goater                           eeprom_buf);
5512cf6cb50SCédric Le Goater 
5522cf6cb50SCédric Le Goater     /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
5531373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
554044475f3SPhilippe Mathieu-Daudé                      TYPE_TMP105, 0x4d);
5552cf6cb50SCédric Le Goater }
5562cf6cb50SCédric Le Goater 
557612b219aSPhilippe Mathieu-Daudé static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
558ccc2c418SCédric Le Goater {
5593c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
56052bcd997SHoward Chiu     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
56152bcd997SHoward Chiu 
56252bcd997SHoward Chiu     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50,
56352bcd997SHoward Chiu                           eeprom_buf);
56452bcd997SHoward Chiu 
56552bcd997SHoward Chiu     /* LM75 is compatible with TMP105 driver */
56652bcd997SHoward Chiu     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
56752bcd997SHoward Chiu                      TYPE_TMP105, 0x4d);
568ccc2c418SCédric Le Goater }
569ccc2c418SCédric Le Goater 
57034f73a81SKarthikeyan Pasupathi static void yosemitev2_bmc_i2c_init(AspeedMachineState *bmc)
57134f73a81SKarthikeyan Pasupathi {
5723c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
57334f73a81SKarthikeyan Pasupathi 
57434f73a81SKarthikeyan Pasupathi     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x51, 128 * KiB);
57534f73a81SKarthikeyan Pasupathi     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 128 * KiB,
57634f73a81SKarthikeyan Pasupathi                           yosemitev2_bmc_fruid, yosemitev2_bmc_fruid_len);
5770a1f86baSKarthikeyan Pasupathi     /* TMP421 */
5780a1f86baSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "tmp421", 0x1f);
5790a1f86baSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4e);
5800a1f86baSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4f);
5810a1f86baSKarthikeyan Pasupathi 
58234f73a81SKarthikeyan Pasupathi }
58334f73a81SKarthikeyan Pasupathi 
584612b219aSPhilippe Mathieu-Daudé static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
5856c4567c7SCédric Le Goater {
5863c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
5876c4567c7SCédric Le Goater 
5884db1c164SJamin Lin     /*
5894db1c164SJamin Lin      * The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
5904db1c164SJamin Lin      * good enough
5914db1c164SJamin Lin      */
5921373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
5936c4567c7SCédric Le Goater }
5946c4567c7SCédric Le Goater 
5956c323abaSKarthikeyan Pasupathi static void tiogapass_bmc_i2c_init(AspeedMachineState *bmc)
5966c323abaSKarthikeyan Pasupathi {
5973c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
5986c323abaSKarthikeyan Pasupathi 
5996c323abaSKarthikeyan Pasupathi     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 128 * KiB);
6006c323abaSKarthikeyan Pasupathi     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 6), 0x54, 128 * KiB,
6016c323abaSKarthikeyan Pasupathi                           tiogapass_bmc_fruid, tiogapass_bmc_fruid_len);
602a09d357dSKarthikeyan Pasupathi     /* TMP421 */
603a09d357dSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "tmp421", 0x1f);
604a09d357dSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4f);
605a09d357dSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4e);
6066c323abaSKarthikeyan Pasupathi }
6076c323abaSKarthikeyan Pasupathi 
608f4aec252SCédric Le Goater static void create_pca9552(AspeedSoCState *soc, int bus_id, int addr)
609f4aec252SCédric Le Goater {
610f4aec252SCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, bus_id),
611f4aec252SCédric Le Goater                             TYPE_PCA9552, addr);
612f4aec252SCédric Le Goater }
613f4aec252SCédric Le Goater 
614612b219aSPhilippe Mathieu-Daudé static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc)
615143b040fSPatrick Williams {
6163c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
617143b040fSPatrick Williams 
618143b040fSPatrick Williams     /* bus 2 : */
6191373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48);
6201373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49);
621143b040fSPatrick Williams     /* bus 2 : pca9546 @ 0x73 */
622143b040fSPatrick Williams 
623143b040fSPatrick Williams     /* bus 3 : pca9548 @ 0x70 */
624143b040fSPatrick Williams 
625143b040fSPatrick Williams     /* bus 4 : */
626143b040fSPatrick Williams     uint8_t *eeprom4_54 = g_malloc0(8 * 1024);
6277a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54,
628143b040fSPatrick Williams                           eeprom4_54);
629143b040fSPatrick Williams     /* PCA9539 @ 0x76, but PCA9552 is compatible */
630f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x76);
631143b040fSPatrick Williams     /* PCA9539 @ 0x77, but PCA9552 is compatible */
632f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x77);
633143b040fSPatrick Williams 
634143b040fSPatrick Williams     /* bus 6 : */
6351373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48);
6361373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49);
637143b040fSPatrick Williams     /* bus 6 : pca9546 @ 0x73 */
638143b040fSPatrick Williams 
639143b040fSPatrick Williams     /* bus 8 : */
640143b040fSPatrick Williams     uint8_t *eeprom8_56 = g_malloc0(8 * 1024);
6417a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56,
642143b040fSPatrick Williams                           eeprom8_56);
643f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x60);
644f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x61);
645143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1d */
646143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1f */
647143b040fSPatrick Williams 
648143b040fSPatrick Williams     /*
649143b040fSPatrick Williams      * bus 13 : pca9548 @ 0x71
650143b040fSPatrick Williams      *      - channel 3:
651143b040fSPatrick Williams      *          - tmm421 @ 0x4c
652143b040fSPatrick Williams      *          - tmp421 @ 0x4e
653143b040fSPatrick Williams      *          - tmp421 @ 0x4f
654143b040fSPatrick Williams      */
655143b040fSPatrick Williams 
656143b040fSPatrick Williams }
657143b040fSPatrick Williams 
658612b219aSPhilippe Mathieu-Daudé static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
65962c2c2ebSCédric Le Goater {
6607cfbde5eSPhilippe Mathieu-Daudé     static const struct {
6617cfbde5eSPhilippe Mathieu-Daudé         unsigned gpio_id;
6627cfbde5eSPhilippe Mathieu-Daudé         LEDColor color;
6637cfbde5eSPhilippe Mathieu-Daudé         const char *description;
6647cfbde5eSPhilippe Mathieu-Daudé         bool gpio_polarity;
6657cfbde5eSPhilippe Mathieu-Daudé     } pca1_leds[] = {
6667cfbde5eSPhilippe Mathieu-Daudé         {13, LED_COLOR_GREEN, "front-fault-4",  GPIO_POLARITY_ACTIVE_LOW},
6677cfbde5eSPhilippe Mathieu-Daudé         {14, LED_COLOR_GREEN, "front-power-3",  GPIO_POLARITY_ACTIVE_LOW},
6687cfbde5eSPhilippe Mathieu-Daudé         {15, LED_COLOR_GREEN, "front-id-5",     GPIO_POLARITY_ACTIVE_LOW},
6697cfbde5eSPhilippe Mathieu-Daudé     };
6703c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
6713d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
67215ce12cfSPhilippe Mathieu-Daudé     DeviceState *dev;
6737cfbde5eSPhilippe Mathieu-Daudé     LEDState *led;
67462c2c2ebSCédric Le Goater 
67563ceb818SCédric Le Goater     /* Bus 3: TODO bmp280@77 */
676db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
67715ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca1");
6782616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
6792616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 3),
68015ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
6818c9a61d7SCédric Le Goater 
6827cfbde5eSPhilippe Mathieu-Daudé     for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) {
6837cfbde5eSPhilippe Mathieu-Daudé         led = led_create_simple(OBJECT(bmc),
6847cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].gpio_polarity,
6857cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].color,
6867cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].description);
6877cfbde5eSPhilippe Mathieu-Daudé         qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id,
6887cfbde5eSPhilippe Mathieu-Daudé                               qdev_get_gpio_in(DEVICE(led), 0));
6897cfbde5eSPhilippe Mathieu-Daudé     }
690b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76);
6912a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "max31785", 0x52);
6921373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c);
6931373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c);
69462c2c2ebSCédric Le Goater 
69562c2c2ebSCédric Le Goater     /* The Witherspoon expects a TMP275 but a TMP105 is compatible */
6961373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105,
697044475f3SPhilippe Mathieu-Daudé                      0x4a);
6986c4567c7SCédric Le Goater 
6994db1c164SJamin Lin     /*
7004db1c164SJamin Lin      * The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
7014db1c164SJamin Lin      * good enough
7024db1c164SJamin Lin      */
7031373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
7043d165f12SCédric Le Goater 
7057a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51,
7063d165f12SCédric Le Goater                           eeprom_buf);
707db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
70815ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca0");
7092616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
7102616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 11),
71115ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
71263ceb818SCédric Le Goater     /* Bus 11: TODO ucd90160@64 */
71362c2c2ebSCédric Le Goater }
71462c2c2ebSCédric Le Goater 
71595f068c8SJohn Wang static void g220a_bmc_i2c_init(AspeedMachineState *bmc)
71695f068c8SJohn Wang {
7173c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
71895f068c8SJohn Wang     DeviceState *dev;
71995f068c8SJohn Wang 
72095f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3),
72195f068c8SJohn Wang                                          "emc1413", 0x4c));
72295f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
72395f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
72495f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
72595f068c8SJohn Wang 
72695f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12),
72795f068c8SJohn Wang                                          "emc1413", 0x4c));
72895f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
72995f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
73095f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
73195f068c8SJohn Wang 
73295f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13),
73395f068c8SJohn Wang                                          "emc1413", 0x4c));
73495f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
73595f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
73695f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
7376f5f6507SJohn Wang 
7386f5f6507SJohn Wang     static uint8_t eeprom_buf[2 * 1024] = {
7396f5f6507SJohn Wang             0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe,
7406f5f6507SJohn Wang             0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65,
7416f5f6507SJohn Wang             0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32,
7426f5f6507SJohn Wang             0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42,
7436f5f6507SJohn Wang             0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45,
7446f5f6507SJohn Wang             0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1,
7456f5f6507SJohn Wang             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7,
7466f5f6507SJohn Wang     };
7476f5f6507SJohn Wang     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57,
7486f5f6507SJohn Wang                           eeprom_buf);
74995f068c8SJohn Wang }
75095f068c8SJohn Wang 
75182b6a3f6SJohn Wang static void fp5280g2_bmc_i2c_init(AspeedMachineState *bmc)
75282b6a3f6SJohn Wang {
7533c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
75482b6a3f6SJohn Wang     I2CSlave *i2c_mux;
75582b6a3f6SJohn Wang 
75682b6a3f6SJohn Wang     /* The at24c256 */
75782b6a3f6SJohn Wang     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 1), 0x50, 32768);
75882b6a3f6SJohn Wang 
75982b6a3f6SJohn Wang     /* The fp5280g2 expects a TMP112 but a TMP105 is compatible */
76082b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
76182b6a3f6SJohn Wang                      0x48);
76282b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
76382b6a3f6SJohn Wang                      0x49);
76482b6a3f6SJohn Wang 
76582b6a3f6SJohn Wang     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
76682b6a3f6SJohn Wang                      "pca9546", 0x70);
76782b6a3f6SJohn Wang     /* It expects a TMP112 but a TMP105 is compatible */
76882b6a3f6SJohn Wang     i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0), TYPE_TMP105,
76982b6a3f6SJohn Wang                      0x4a);
77082b6a3f6SJohn Wang 
77182b6a3f6SJohn Wang     /* It expects a ds3232 but a ds1338 is good enough */
77282b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "ds1338", 0x68);
77382b6a3f6SJohn Wang 
77482b6a3f6SJohn Wang     /* It expects a pca9555 but a pca9552 is compatible */
775f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x30);
77682b6a3f6SJohn Wang }
77782b6a3f6SJohn Wang 
77858e52bdbSCédric Le Goater static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
77958e52bdbSCédric Le Goater {
7803c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
781fa6d98c0SJoel Stanley     I2CSlave *i2c_mux;
782fa6d98c0SJoel Stanley 
7839077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB);
78458e52bdbSCédric Le Goater 
785f4aec252SCédric Le Goater     create_pca9552(soc, 3, 0x61);
786bcb122f8SJoel Stanley 
78758e52bdbSCédric Le Goater     /* The rainier expects a TMP275 but a TMP105 is compatible */
78858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
78958e52bdbSCédric Le Goater                      0x48);
79058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
79158e52bdbSCédric Le Goater                      0x49);
79258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
79358e52bdbSCédric Le Goater                      0x4a);
794fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4),
795fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
7969077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
7979077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
7989077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB);
799f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x60);
80058e52bdbSCédric Le Goater 
80158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
80258e52bdbSCédric Le Goater                      0x48);
80358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
80458e52bdbSCédric Le Goater                      0x49);
805f4aec252SCédric Le Goater     create_pca9552(soc, 5, 0x60);
806f4aec252SCédric Le Goater     create_pca9552(soc, 5, 0x61);
807fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5),
808fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
8099077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
8109077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
81158e52bdbSCédric Le Goater 
81258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
81358e52bdbSCédric Le Goater                      0x48);
81458e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
81558e52bdbSCédric Le Goater                      0x4a);
81658e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
81758e52bdbSCédric Le Goater                      0x4b);
818fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6),
819fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
8209077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
8219077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
8229077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB);
8239077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB);
82458e52bdbSCédric Le Goater 
825f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x30);
826f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x31);
827f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x32);
828f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x33);
829f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x60);
830f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x61);
831b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76);
83258e52bdbSCédric Le Goater     /* Bus 7: TODO si7021-a20@20 */
83358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105,
83458e52bdbSCédric Le Goater                      0x48);
8352a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "max31785", 0x52);
8369077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB);
8379077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB);
83858e52bdbSCédric Le Goater 
83958e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
84058e52bdbSCédric Le Goater                      0x48);
84158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
84258e52bdbSCédric Le Goater                      0x4a);
843be85508fSNinad Palsule     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50,
844be85508fSNinad Palsule                           64 * KiB, rainier_bb_fruid, rainier_bb_fruid_len);
845be85508fSNinad Palsule     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51,
846be85508fSNinad Palsule                           64 * KiB, rainier_bmc_fruid, rainier_bmc_fruid_len);
847f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x60);
848f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x61);
84958e52bdbSCédric Le Goater     /* Bus 8: ucd90320@11 */
85058e52bdbSCédric Le Goater     /* Bus 8: ucd90320@b */
85158e52bdbSCédric Le Goater     /* Bus 8: ucd90320@c */
85258e52bdbSCédric Le Goater 
85358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c);
85458e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d);
8559077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB);
85658e52bdbSCédric Le Goater 
85758e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c);
85858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d);
8599077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB);
86058e52bdbSCédric Le Goater 
86158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
86258e52bdbSCédric Le Goater                      0x48);
86358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
86458e52bdbSCédric Le Goater                      0x49);
865fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11),
866fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
8679077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
8689077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
869f4aec252SCédric Le Goater     create_pca9552(soc, 11, 0x60);
870fa6d98c0SJoel Stanley 
871fa6d98c0SJoel Stanley 
8729077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB);
873f4aec252SCédric Le Goater     create_pca9552(soc, 13, 0x60);
874fa6d98c0SJoel Stanley 
8759077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB);
876f4aec252SCédric Le Goater     create_pca9552(soc, 14, 0x60);
877fa6d98c0SJoel Stanley 
8789077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB);
879f4aec252SCédric Le Goater     create_pca9552(soc, 15, 0x60);
88058e52bdbSCédric Le Goater }
88158e52bdbSCédric Le Goater 
882febbe308SPeter Delevoryas static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr,
883febbe308SPeter Delevoryas                                  I2CBus **channels)
884febbe308SPeter Delevoryas {
885febbe308SPeter Delevoryas     I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr);
886febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
887febbe308SPeter Delevoryas         channels[i] = pca954x_i2c_get_bus(mux, i);
888febbe308SPeter Delevoryas     }
889febbe308SPeter Delevoryas }
890febbe308SPeter Delevoryas 
891febbe308SPeter Delevoryas #define TYPE_LM75 TYPE_TMP105
892febbe308SPeter Delevoryas #define TYPE_TMP75 TYPE_TMP105
893febbe308SPeter Delevoryas #define TYPE_TMP422 "tmp422"
894febbe308SPeter Delevoryas 
895febbe308SPeter Delevoryas static void fuji_bmc_i2c_init(AspeedMachineState *bmc)
896febbe308SPeter Delevoryas {
8973c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
898febbe308SPeter Delevoryas     I2CBus *i2c[144] = {};
899febbe308SPeter Delevoryas 
900febbe308SPeter Delevoryas     for (int i = 0; i < 16; i++) {
901febbe308SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
902febbe308SPeter Delevoryas     }
903febbe308SPeter Delevoryas     I2CBus *i2c180 = i2c[2];
904febbe308SPeter Delevoryas     I2CBus *i2c480 = i2c[8];
905febbe308SPeter Delevoryas     I2CBus *i2c600 = i2c[11];
906febbe308SPeter Delevoryas 
907febbe308SPeter Delevoryas     get_pca9548_channels(i2c180, 0x70, &i2c[16]);
908febbe308SPeter Delevoryas     get_pca9548_channels(i2c480, 0x70, &i2c[24]);
909febbe308SPeter Delevoryas     /* NOTE: The device tree skips [32, 40) in the alias numbering */
910febbe308SPeter Delevoryas     get_pca9548_channels(i2c600, 0x77, &i2c[40]);
911febbe308SPeter Delevoryas     get_pca9548_channels(i2c[24], 0x71, &i2c[48]);
912febbe308SPeter Delevoryas     get_pca9548_channels(i2c[25], 0x72, &i2c[56]);
913febbe308SPeter Delevoryas     get_pca9548_channels(i2c[26], 0x76, &i2c[64]);
914febbe308SPeter Delevoryas     get_pca9548_channels(i2c[27], 0x76, &i2c[72]);
915febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
916febbe308SPeter Delevoryas         get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]);
917febbe308SPeter Delevoryas     }
918febbe308SPeter Delevoryas 
919febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c);
920febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d);
921febbe308SPeter Delevoryas 
922ef0eb67eSSittisak Sinprem     /*
923ef0eb67eSSittisak Sinprem      * EEPROM 24c64 size is 64Kbits or 8 Kbytes
924ef0eb67eSSittisak Sinprem      *        24c02 size is 2Kbits or 256 bytes
925ef0eb67eSSittisak Sinprem      */
926ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[19], 0x52, 8 * KiB);
927ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[20], 0x50, 256);
928ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[22], 0x52, 256);
929febbe308SPeter Delevoryas 
930febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x48);
931febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x49);
932febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x4a);
933febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_TMP422, 0x4c);
934febbe308SPeter Delevoryas 
935ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[8], 0x51, 8 * KiB);
936febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a);
937febbe308SPeter Delevoryas 
938febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[50], TYPE_LM75, 0x4c);
939ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[50], 0x52, 8 * KiB);
940febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[51], TYPE_TMP75, 0x48);
941febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[52], TYPE_TMP75, 0x49);
942febbe308SPeter Delevoryas 
943febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[59], TYPE_TMP75, 0x48);
944febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[60], TYPE_TMP75, 0x49);
945febbe308SPeter Delevoryas 
946ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[65], 0x53, 8 * KiB);
947febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x49);
948febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x48);
949ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[68], 0x52, 8 * KiB);
950ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[69], 0x52, 8 * KiB);
951ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[70], 0x52, 8 * KiB);
952ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[71], 0x52, 8 * KiB);
953febbe308SPeter Delevoryas 
954ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[73], 0x53, 8 * KiB);
955febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x49);
956febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x48);
957ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[76], 0x52, 8 * KiB);
958ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[77], 0x52, 8 * KiB);
959ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[78], 0x52, 8 * KiB);
960ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[79], 0x52, 8 * KiB);
961ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[28], 0x50, 256);
962febbe308SPeter Delevoryas 
963febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
9649077e09aSPeter Delevoryas         at24c_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB);
965febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[82 + i * 8], TYPE_TMP75, 0x48);
966febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[83 + i * 8], TYPE_TMP75, 0x4b);
967febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[84 + i * 8], TYPE_TMP75, 0x4a);
968febbe308SPeter Delevoryas     }
969febbe308SPeter Delevoryas }
970febbe308SPeter Delevoryas 
971a20c54b1SPatrick Williams #define TYPE_TMP421 "tmp421"
972a20c54b1SPatrick Williams 
973a20c54b1SPatrick Williams static void bletchley_bmc_i2c_init(AspeedMachineState *bmc)
974a20c54b1SPatrick Williams {
9753c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
976a20c54b1SPatrick Williams     I2CBus *i2c[13] = {};
977a20c54b1SPatrick Williams     for (int i = 0; i < 13; i++) {
978a20c54b1SPatrick Williams         if ((i == 8) || (i == 11)) {
979a20c54b1SPatrick Williams             continue;
980a20c54b1SPatrick Williams         }
981a20c54b1SPatrick Williams         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
982a20c54b1SPatrick Williams     }
983a20c54b1SPatrick Williams 
984a20c54b1SPatrick Williams     /* Bus 0 - 5 all have the same config. */
985a20c54b1SPatrick Williams     for (int i = 0; i < 6; i++) {
986a20c54b1SPatrick Williams         /* Missing model: ti,ina230 @ 0x45 */
987a20c54b1SPatrick Williams         /* Missing model: mps,mp5023 @ 0x40 */
988a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_TMP421, 0x4f);
989a20c54b1SPatrick Williams         /* Missing model: nxp,pca9539 @ 0x76, but PCA9552 works enough */
990a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x76);
991a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x67);
992a20c54b1SPatrick Williams         /* Missing model: fsc,fusb302 @ 0x22 */
993a20c54b1SPatrick Williams     }
994a20c54b1SPatrick Williams 
995a20c54b1SPatrick Williams     /* Bus 6 */
996a20c54b1SPatrick Williams     at24c_eeprom_init(i2c[6], 0x56, 65536);
997a20c54b1SPatrick Williams     /* Missing model: nxp,pcf85263 @ 0x51 , but ds1338 works enough */
998a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[6], "ds1338", 0x51);
999a20c54b1SPatrick Williams 
1000a20c54b1SPatrick Williams 
1001a20c54b1SPatrick Williams     /* Bus 7 */
1002a20c54b1SPatrick Williams     at24c_eeprom_init(i2c[7], 0x54, 65536);
1003a20c54b1SPatrick Williams 
1004a20c54b1SPatrick Williams     /* Bus 9 */
1005a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[9], TYPE_TMP421, 0x4f);
1006a20c54b1SPatrick Williams 
1007a20c54b1SPatrick Williams     /* Bus 10 */
1008a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[10], TYPE_TMP421, 0x4f);
1009a20c54b1SPatrick Williams     /* Missing model: ti,hdc1080 @ 0x40 */
1010a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[10], TYPE_PCA9552, 0x67);
1011a20c54b1SPatrick Williams 
1012a20c54b1SPatrick Williams     /* Bus 12 */
1013a20c54b1SPatrick Williams     /* Missing model: adi,adm1278 @ 0x11 */
1014a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4c);
1015a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4d);
1016a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_PCA9552, 0x67);
1017a20c54b1SPatrick Williams }
1018a20c54b1SPatrick Williams 
1019fa699e80SPeter Delevoryas static void fby35_i2c_init(AspeedMachineState *bmc)
1020fa699e80SPeter Delevoryas {
10213c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
1022fa699e80SPeter Delevoryas     I2CBus *i2c[16];
1023fa699e80SPeter Delevoryas 
1024fa699e80SPeter Delevoryas     for (int i = 0; i < 16; i++) {
1025fa699e80SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
1026fa699e80SPeter Delevoryas     }
1027fa699e80SPeter Delevoryas 
1028fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[2], TYPE_LM75, 0x4f);
1029fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_TMP421, 0x1f);
1030fa699e80SPeter Delevoryas     /* Hotswap controller is actually supposed to be mp5920 or ltc4282. */
1031fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[11], "adm1272", 0x44);
1032fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4e);
1033fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4f);
1034fa699e80SPeter Delevoryas 
10359077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[4], 0x51, 128 * KiB);
10369077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[6], 0x51, 128 * KiB);
1037c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[8], 0x50, 32 * KiB, fby35_nic_fruid,
1038c0216b94SPeter Delevoryas                           fby35_nic_fruid_len);
1039c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[11], 0x51, 128 * KiB, fby35_bb_fruid,
1040c0216b94SPeter Delevoryas                           fby35_bb_fruid_len);
1041c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[11], 0x54, 128 * KiB, fby35_bmc_fruid,
1042c0216b94SPeter Delevoryas                           fby35_bmc_fruid_len);
1043fa699e80SPeter Delevoryas 
1044fa699e80SPeter Delevoryas     /*
1045fa699e80SPeter Delevoryas      * TODO: There is a multi-master i2c connection to an AST1030 MiniBMC on
1046fa699e80SPeter Delevoryas      * buses 0, 1, 2, 3, and 9. Source address 0x10, target address 0x20 on
1047fa699e80SPeter Delevoryas      * each.
1048fa699e80SPeter Delevoryas      */
1049fa699e80SPeter Delevoryas }
1050fa699e80SPeter Delevoryas 
1051fb6b3c8dSJae Hyun Yoo static void qcom_dc_scm_bmc_i2c_init(AspeedMachineState *bmc)
1052fb6b3c8dSJae Hyun Yoo {
10533c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
1054fb6b3c8dSJae Hyun Yoo 
1055fb6b3c8dSJae Hyun Yoo     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 15), "tmp105", 0x4d);
1056fb6b3c8dSJae Hyun Yoo }
1057fb6b3c8dSJae Hyun Yoo 
1058ece4cccdSGraeme Gregory static void qcom_dc_scm_firework_i2c_init(AspeedMachineState *bmc)
1059ece4cccdSGraeme Gregory {
10603c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
10612a7a5d5cSJae Hyun Yoo     I2CSlave *therm_mux, *cpuvr_mux;
1062ece4cccdSGraeme Gregory 
1063ece4cccdSGraeme Gregory     /* Create the generic DC-SCM hardware */
1064ece4cccdSGraeme Gregory     qcom_dc_scm_bmc_i2c_init(bmc);
1065ece4cccdSGraeme Gregory 
1066ece4cccdSGraeme Gregory     /* Now create the Firework specific hardware */
10672a75e8c3SMaheswara Kurapati 
10682a7a5d5cSJae Hyun Yoo     /* I2C7 CPUVR MUX */
10692a7a5d5cSJae Hyun Yoo     cpuvr_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
10702a7a5d5cSJae Hyun Yoo                                         "pca9546", 0x70);
10712a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 0), "pca9548", 0x72);
10722a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 1), "pca9548", 0x72);
10732a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 2), "pca9548", 0x72);
10742a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 3), "pca9548", 0x72);
10752a7a5d5cSJae Hyun Yoo 
1076cfc68f16SMaheswara Kurapati     /* I2C8 Thermal Diodes*/
1077cfc68f16SMaheswara Kurapati     therm_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
1078cfc68f16SMaheswara Kurapati                                         "pca9548", 0x70);
1079cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 0), TYPE_LM75, 0x4C);
1080cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 1), TYPE_LM75, 0x4C);
1081cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 2), TYPE_LM75, 0x48);
1082cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 3), TYPE_LM75, 0x48);
1083cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 4), TYPE_LM75, 0x48);
1084cfc68f16SMaheswara Kurapati 
10852a75e8c3SMaheswara Kurapati     /* I2C9 Fan Controller (MAX31785) */
10862a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x52);
10872a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x54);
1088ece4cccdSGraeme Gregory }
1089ece4cccdSGraeme Gregory 
10901a15311aSCédric Le Goater static bool aspeed_get_mmio_exec(Object *obj, Error **errp)
10911a15311aSCédric Le Goater {
10921a15311aSCédric Le Goater     return ASPEED_MACHINE(obj)->mmio_exec;
10931a15311aSCédric Le Goater }
10941a15311aSCédric Le Goater 
10951a15311aSCédric Le Goater static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp)
10961a15311aSCédric Le Goater {
10971a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = value;
10981a15311aSCédric Le Goater }
10991a15311aSCédric Le Goater 
11001a15311aSCédric Le Goater static void aspeed_machine_instance_init(Object *obj)
11011a15311aSCédric Le Goater {
1102621845a9SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(obj);
1103621845a9SCédric Le Goater 
11041a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = false;
1105621845a9SCédric Le Goater     ASPEED_MACHINE(obj)->hw_strap1 = amc->hw_strap1;
11061a15311aSCédric Le Goater }
11071a15311aSCédric Le Goater 
11089820e52fSCédric Le Goater static char *aspeed_get_fmc_model(Object *obj, Error **errp)
11099820e52fSCédric Le Goater {
11109820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
11119820e52fSCédric Le Goater     return g_strdup(bmc->fmc_model);
11129820e52fSCédric Le Goater }
11139820e52fSCédric Le Goater 
11149820e52fSCédric Le Goater static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp)
11159820e52fSCédric Le Goater {
11169820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
11179820e52fSCédric Le Goater 
11189820e52fSCédric Le Goater     g_free(bmc->fmc_model);
11199820e52fSCédric Le Goater     bmc->fmc_model = g_strdup(value);
11209820e52fSCédric Le Goater }
11219820e52fSCédric Le Goater 
11229820e52fSCédric Le Goater static char *aspeed_get_spi_model(Object *obj, Error **errp)
11239820e52fSCédric Le Goater {
11249820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
11259820e52fSCédric Le Goater     return g_strdup(bmc->spi_model);
11269820e52fSCédric Le Goater }
11279820e52fSCédric Le Goater 
11289820e52fSCédric Le Goater static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp)
11299820e52fSCédric Le Goater {
11309820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
11319820e52fSCédric Le Goater 
11329820e52fSCédric Le Goater     g_free(bmc->spi_model);
11339820e52fSCédric Le Goater     bmc->spi_model = g_strdup(value);
11349820e52fSCédric Le Goater }
11359820e52fSCédric Le Goater 
1136f65f6ad5SCédric Le Goater static char *aspeed_get_bmc_console(Object *obj, Error **errp)
1137f65f6ad5SCédric Le Goater {
1138f65f6ad5SCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1139f65f6ad5SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
1140f65f6ad5SCédric Le Goater     int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default;
1141f65f6ad5SCédric Le Goater 
1142944128eeSJamin Lin     return g_strdup_printf("uart%d", aspeed_uart_index(uart_chosen));
1143f65f6ad5SCédric Le Goater }
1144f65f6ad5SCédric Le Goater 
1145f65f6ad5SCédric Le Goater static void aspeed_set_bmc_console(Object *obj, const char *value, Error **errp)
1146f65f6ad5SCédric Le Goater {
1147f65f6ad5SCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1148f65f6ad5SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
1149f65f6ad5SCédric Le Goater     AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(amc->soc_name));
1150f65f6ad5SCédric Le Goater     int val;
1151944128eeSJamin Lin     int uart_first = aspeed_uart_first(sc);
1152944128eeSJamin Lin     int uart_last = aspeed_uart_last(sc);
1153f65f6ad5SCédric Le Goater 
1154f65f6ad5SCédric Le Goater     if (sscanf(value, "uart%u", &val) != 1) {
1155f65f6ad5SCédric Le Goater         error_setg(errp, "Bad value for \"uart\" property");
1156f65f6ad5SCédric Le Goater         return;
1157f65f6ad5SCédric Le Goater     }
1158f65f6ad5SCédric Le Goater 
1159f65f6ad5SCédric Le Goater     /* The number of UART depends on the SoC */
1160944128eeSJamin Lin     if (val < uart_first || val > uart_last) {
1161944128eeSJamin Lin         error_setg(errp, "\"uart\" should be in range [%d - %d]",
1162944128eeSJamin Lin                    uart_first, uart_last);
1163f65f6ad5SCédric Le Goater         return;
1164f65f6ad5SCédric Le Goater     }
1165944128eeSJamin Lin     bmc->uart_chosen = val + ASPEED_DEV_UART0;
1166f65f6ad5SCédric Le Goater }
1167f65f6ad5SCédric Le Goater 
11681a15311aSCédric Le Goater static void aspeed_machine_class_props_init(ObjectClass *oc)
11691a15311aSCédric Le Goater {
11701a15311aSCédric Le Goater     object_class_property_add_bool(oc, "execute-in-place",
11711a15311aSCédric Le Goater                                    aspeed_get_mmio_exec,
1172d2623129SMarkus Armbruster                                    aspeed_set_mmio_exec);
11731a15311aSCédric Le Goater     object_class_property_set_description(oc, "execute-in-place",
11747eecec7dSMarkus Armbruster                            "boot directly from CE0 flash device");
11759820e52fSCédric Le Goater 
1176f65f6ad5SCédric Le Goater     object_class_property_add_str(oc, "bmc-console", aspeed_get_bmc_console,
1177f65f6ad5SCédric Le Goater                                   aspeed_set_bmc_console);
1178f65f6ad5SCédric Le Goater     object_class_property_set_description(oc, "bmc-console",
1179f65f6ad5SCédric Le Goater                            "Change the default UART to \"uartX\"");
1180f65f6ad5SCédric Le Goater 
11819820e52fSCédric Le Goater     object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model,
11829820e52fSCédric Le Goater                                    aspeed_set_fmc_model);
11839820e52fSCédric Le Goater     object_class_property_set_description(oc, "fmc-model",
11849820e52fSCédric Le Goater                                           "Change the FMC Flash model");
11859820e52fSCédric Le Goater     object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model,
11869820e52fSCédric Le Goater                                    aspeed_set_spi_model);
11879820e52fSCédric Le Goater     object_class_property_set_description(oc, "spi-model",
11889820e52fSCédric Le Goater                                           "Change the SPI Flash model");
11891a15311aSCédric Le Goater }
11901a15311aSCédric Le Goater 
119143a0a5c9SPhilippe Mathieu-Daudé static void aspeed_machine_class_init_cpus_defaults(MachineClass *mc)
1192b7f1a0cbSCédric Le Goater {
119343a0a5c9SPhilippe Mathieu-Daudé     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(mc);
119443a0a5c9SPhilippe Mathieu-Daudé     AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(amc->soc_name));
119543a0a5c9SPhilippe Mathieu-Daudé 
119643a0a5c9SPhilippe Mathieu-Daudé     mc->default_cpus = sc->num_cpus;
119743a0a5c9SPhilippe Mathieu-Daudé     mc->min_cpus = sc->num_cpus;
119843a0a5c9SPhilippe Mathieu-Daudé     mc->max_cpus = sc->num_cpus;
1199dc13909eSPhilippe Mathieu-Daudé     mc->valid_cpu_types = sc->valid_cpu_types;
1200b7f1a0cbSCédric Le Goater }
1201b7f1a0cbSCédric Le Goater 
1202056b779eSCédric Le Goater static bool aspeed_machine_ast2600_get_boot_from_emmc(Object *obj, Error **errp)
1203056b779eSCédric Le Goater {
1204056b779eSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1205056b779eSCédric Le Goater 
1206056b779eSCédric Le Goater     return !!(bmc->hw_strap1 & SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC);
1207056b779eSCédric Le Goater }
1208056b779eSCédric Le Goater 
1209056b779eSCédric Le Goater static void aspeed_machine_ast2600_set_boot_from_emmc(Object *obj, bool value,
1210056b779eSCédric Le Goater                                                       Error **errp)
1211056b779eSCédric Le Goater {
1212056b779eSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1213056b779eSCédric Le Goater 
1214056b779eSCédric Le Goater     if (value) {
1215056b779eSCédric Le Goater         bmc->hw_strap1 |= SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC;
1216056b779eSCédric Le Goater     } else {
1217056b779eSCédric Le Goater         bmc->hw_strap1 &= ~SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC;
1218056b779eSCédric Le Goater     }
1219056b779eSCédric Le Goater }
1220056b779eSCédric Le Goater 
1221056b779eSCédric Le Goater static void aspeed_machine_ast2600_class_emmc_init(ObjectClass *oc)
1222056b779eSCédric Le Goater {
1223056b779eSCédric Le Goater     object_class_property_add_bool(oc, "boot-emmc",
1224056b779eSCédric Le Goater                                    aspeed_machine_ast2600_get_boot_from_emmc,
1225056b779eSCédric Le Goater                                    aspeed_machine_ast2600_set_boot_from_emmc);
1226056b779eSCédric Le Goater     object_class_property_set_description(oc, "boot-emmc",
1227056b779eSCédric Le Goater                                           "Set or unset boot from EMMC");
1228056b779eSCédric Le Goater }
1229056b779eSCédric Le Goater 
1230fca9ca1bSCédric Le Goater static void aspeed_machine_class_init(ObjectClass *oc, void *data)
123162c2c2ebSCédric Le Goater {
123262c2c2ebSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1233d3bad7e7SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
123462c2c2ebSCédric Le Goater 
1235fca9ca1bSCédric Le Goater     mc->init = aspeed_machine_init;
123662c2c2ebSCédric Le Goater     mc->no_floppy = 1;
123762c2c2ebSCédric Le Goater     mc->no_cdrom = 1;
123862c2c2ebSCédric Le Goater     mc->no_parallel = 1;
1239afcbaed6SIgor Mammedov     mc->default_ram_id = "ram";
1240d3bad7e7SCédric Le Goater     amc->macs_mask = ASPEED_MAC0_ON;
12415d63d0c7SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART5;
12421a15311aSCédric Le Goater 
12431a15311aSCédric Le Goater     aspeed_machine_class_props_init(oc);
124462c2c2ebSCédric Le Goater }
124562c2c2ebSCédric Le Goater 
1246baa4732bSCédric Le Goater static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
1247baa4732bSCédric Le Goater {
1248baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1249baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1250baa4732bSCédric Le Goater 
1251baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Palmetto BMC (ARM926EJ-S)";
1252baa4732bSCédric Le Goater     amc->soc_name  = "ast2400-a1";
1253baa4732bSCédric Le Goater     amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1;
1254baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
125570322913SCédric Le Goater     amc->spi_model = "mx25l25635f";
1256baa4732bSCédric Le Goater     amc->num_cs    = 1;
1257baa4732bSCédric Le Goater     amc->i2c_init  = palmetto_bmc_i2c_init;
1258cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
1259baa4732bSCédric Le Goater     mc->default_ram_size       = 256 * MiB;
126043a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1261baa4732bSCédric Le Goater };
1262baa4732bSCédric Le Goater 
12639cccb912SPatrick Venture static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data)
12649cccb912SPatrick Venture {
12659cccb912SPatrick Venture     MachineClass *mc = MACHINE_CLASS(oc);
12669cccb912SPatrick Venture     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
12679cccb912SPatrick Venture 
12689cccb912SPatrick Venture     mc->desc       = "Quanta-Q71l BMC (ARM926EJ-S)";
12699cccb912SPatrick Venture     amc->soc_name  = "ast2400-a1";
12709cccb912SPatrick Venture     amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1;
12719cccb912SPatrick Venture     amc->fmc_model = "n25q256a";
12729cccb912SPatrick Venture     amc->spi_model = "mx25l25635e";
12739cccb912SPatrick Venture     amc->num_cs    = 1;
12749cccb912SPatrick Venture     amc->i2c_init  = quanta_q71l_bmc_i2c_init;
1275cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
12769cccb912SPatrick Venture     mc->default_ram_size       = 128 * MiB;
127743a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
12789cccb912SPatrick Venture }
12799cccb912SPatrick Venture 
128040a38df5SErik Smit static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc,
128140a38df5SErik Smit                                                         void *data)
128240a38df5SErik Smit {
128340a38df5SErik Smit     MachineClass *mc = MACHINE_CLASS(oc);
128440a38df5SErik Smit     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
128540a38df5SErik Smit 
128640a38df5SErik Smit     mc->desc       = "Supermicro X11 BMC (ARM926EJ-S)";
128740a38df5SErik Smit     amc->soc_name  = "ast2400-a1";
128840a38df5SErik Smit     amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1;
128940a38df5SErik Smit     amc->fmc_model = "mx25l25635e";
129040a38df5SErik Smit     amc->spi_model = "mx25l25635e";
129140a38df5SErik Smit     amc->num_cs    = 1;
129240a38df5SErik Smit     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
129340a38df5SErik Smit     amc->i2c_init  = palmetto_bmc_i2c_init;
1294cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
129540a38df5SErik Smit     mc->default_ram_size = 256 * MiB;
129643a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
129740a38df5SErik Smit }
129840a38df5SErik Smit 
129947936597SGuenter Roeck static void aspeed_machine_supermicro_x11spi_bmc_class_init(ObjectClass *oc,
130047936597SGuenter Roeck                                                             void *data)
130147936597SGuenter Roeck {
130247936597SGuenter Roeck     MachineClass *mc = MACHINE_CLASS(oc);
130347936597SGuenter Roeck     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
130447936597SGuenter Roeck 
130547936597SGuenter Roeck     mc->desc       = "Supermicro X11 SPI BMC (ARM1176)";
130647936597SGuenter Roeck     amc->soc_name  = "ast2500-a1";
130747936597SGuenter Roeck     amc->hw_strap1 = SUPERMICRO_X11SPI_BMC_HW_STRAP1;
130847936597SGuenter Roeck     amc->fmc_model = "mx25l25635e";
130947936597SGuenter Roeck     amc->spi_model = "mx25l25635e";
131047936597SGuenter Roeck     amc->num_cs    = 1;
131147936597SGuenter Roeck     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
131247936597SGuenter Roeck     amc->i2c_init  = palmetto_bmc_i2c_init;
1313cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
131447936597SGuenter Roeck     mc->default_ram_size = 512 * MiB;
131543a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
131647936597SGuenter Roeck }
131747936597SGuenter Roeck 
1318baa4732bSCédric Le Goater static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data)
1319baa4732bSCédric Le Goater {
1320baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1321baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1322baa4732bSCédric Le Goater 
1323baa4732bSCédric Le Goater     mc->desc       = "Aspeed AST2500 EVB (ARM1176)";
1324baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1325baa4732bSCédric Le Goater     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
1326753abfc4SJae Hyun Yoo     amc->fmc_model = "mx25l25635e";
132770322913SCédric Le Goater     amc->spi_model = "mx25l25635f";
1328baa4732bSCédric Le Goater     amc->num_cs    = 1;
1329baa4732bSCédric Le Goater     amc->i2c_init  = ast2500_evb_i2c_init;
1330cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
1331baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
133243a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1333baa4732bSCédric Le Goater };
1334baa4732bSCédric Le Goater 
133534f73a81SKarthikeyan Pasupathi static void aspeed_machine_yosemitev2_class_init(ObjectClass *oc, void *data)
133634f73a81SKarthikeyan Pasupathi {
133734f73a81SKarthikeyan Pasupathi     MachineClass *mc = MACHINE_CLASS(oc);
133834f73a81SKarthikeyan Pasupathi     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
133934f73a81SKarthikeyan Pasupathi 
134034f73a81SKarthikeyan Pasupathi     mc->desc       = "Facebook YosemiteV2 BMC (ARM1176)";
134134f73a81SKarthikeyan Pasupathi     amc->soc_name  = "ast2500-a1";
134234f73a81SKarthikeyan Pasupathi     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
134334f73a81SKarthikeyan Pasupathi     amc->hw_strap2 = 0;
134434f73a81SKarthikeyan Pasupathi     amc->fmc_model = "n25q256a";
134534f73a81SKarthikeyan Pasupathi     amc->spi_model = "mx25l25635e";
134634f73a81SKarthikeyan Pasupathi     amc->num_cs    = 2;
134734f73a81SKarthikeyan Pasupathi     amc->i2c_init  = yosemitev2_bmc_i2c_init;
1348cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
134934f73a81SKarthikeyan Pasupathi     mc->default_ram_size       = 512 * MiB;
135043a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
135134f73a81SKarthikeyan Pasupathi };
135234f73a81SKarthikeyan Pasupathi 
1353baa4732bSCédric Le Goater static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data)
1354baa4732bSCédric Le Goater {
1355baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1356baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1357baa4732bSCédric Le Goater 
1358baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Romulus BMC (ARM1176)";
1359baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1360baa4732bSCédric Le Goater     amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1;
1361baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
1362baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1363baa4732bSCédric Le Goater     amc->num_cs    = 2;
1364baa4732bSCédric Le Goater     amc->i2c_init  = romulus_bmc_i2c_init;
1365cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
1366baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
136743a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1368baa4732bSCédric Le Goater };
1369baa4732bSCédric Le Goater 
13706c323abaSKarthikeyan Pasupathi static void aspeed_machine_tiogapass_class_init(ObjectClass *oc, void *data)
13716c323abaSKarthikeyan Pasupathi {
13726c323abaSKarthikeyan Pasupathi     MachineClass *mc = MACHINE_CLASS(oc);
13736c323abaSKarthikeyan Pasupathi     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
13746c323abaSKarthikeyan Pasupathi 
13756c323abaSKarthikeyan Pasupathi     mc->desc       = "Facebook Tiogapass BMC (ARM1176)";
13766c323abaSKarthikeyan Pasupathi     amc->soc_name  = "ast2500-a1";
13776c323abaSKarthikeyan Pasupathi     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
13786c323abaSKarthikeyan Pasupathi     amc->hw_strap2 = 0;
13796c323abaSKarthikeyan Pasupathi     amc->fmc_model = "n25q256a";
13806c323abaSKarthikeyan Pasupathi     amc->spi_model = "mx25l25635e";
13816c323abaSKarthikeyan Pasupathi     amc->num_cs    = 2;
13826c323abaSKarthikeyan Pasupathi     amc->i2c_init  = tiogapass_bmc_i2c_init;
1383cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
13846c323abaSKarthikeyan Pasupathi     mc->default_ram_size       = 1 * GiB;
138543a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
13866c323abaSKarthikeyan Pasupathi };
13876c323abaSKarthikeyan Pasupathi 
1388143b040fSPatrick Williams static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data)
1389143b040fSPatrick Williams {
1390143b040fSPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1391143b040fSPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1392143b040fSPatrick Williams 
1393143b040fSPatrick Williams     mc->desc       = "OCP SonoraPass BMC (ARM1176)";
1394143b040fSPatrick Williams     amc->soc_name  = "ast2500-a1";
1395143b040fSPatrick Williams     amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1;
1396143b040fSPatrick Williams     amc->fmc_model = "mx66l1g45g";
1397143b040fSPatrick Williams     amc->spi_model = "mx66l1g45g";
1398143b040fSPatrick Williams     amc->num_cs    = 2;
1399143b040fSPatrick Williams     amc->i2c_init  = sonorapass_bmc_i2c_init;
1400cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
1401143b040fSPatrick Williams     mc->default_ram_size       = 512 * MiB;
140243a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1403143b040fSPatrick Williams };
1404143b040fSPatrick Williams 
1405baa4732bSCédric Le Goater static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data)
1406baa4732bSCédric Le Goater {
1407baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1408baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1409baa4732bSCédric Le Goater 
1410baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Witherspoon BMC (ARM1176)";
1411baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1412baa4732bSCédric Le Goater     amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1;
141370322913SCédric Le Goater     amc->fmc_model = "mx25l25635f";
1414baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1415baa4732bSCédric Le Goater     amc->num_cs    = 2;
1416baa4732bSCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init;
1417cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
1418baa4732bSCédric Le Goater     mc->default_ram_size = 512 * MiB;
141943a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1420baa4732bSCédric Le Goater };
1421baa4732bSCédric Le Goater 
1422baa4732bSCédric Le Goater static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
1423baa4732bSCédric Le Goater {
1424baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1425baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1426baa4732bSCédric Le Goater 
1427f548f201SPeter Maydell     mc->desc       = "Aspeed AST2600 EVB (Cortex-A7)";
1428c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
1429baa4732bSCédric Le Goater     amc->hw_strap1 = AST2600_EVB_HW_STRAP1;
1430baa4732bSCédric Le Goater     amc->hw_strap2 = AST2600_EVB_HW_STRAP2;
1431753abfc4SJae Hyun Yoo     amc->fmc_model = "mx66u51235f";
1432baa4732bSCédric Le Goater     amc->spi_model = "mx66u51235f";
1433baa4732bSCédric Le Goater     amc->num_cs    = 1;
143429193286SGuenter Roeck     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON |
143529193286SGuenter Roeck                      ASPEED_MAC3_ON;
1436bf8a471aSJamin Lin     amc->sdhci_wp_inverted = true;
1437baa4732bSCédric Le Goater     amc->i2c_init  = ast2600_evb_i2c_init;
1438cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
1439baa4732bSCédric Le Goater     mc->default_ram_size = 1 * GiB;
144043a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1441056b779eSCédric Le Goater     aspeed_machine_ast2600_class_emmc_init(oc);
1442baa4732bSCédric Le Goater };
1443baa4732bSCédric Le Goater 
144495f068c8SJohn Wang static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data)
144595f068c8SJohn Wang {
144695f068c8SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
144795f068c8SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
144895f068c8SJohn Wang 
144995f068c8SJohn Wang     mc->desc       = "Bytedance G220A BMC (ARM1176)";
145095f068c8SJohn Wang     amc->soc_name  = "ast2500-a1";
145195f068c8SJohn Wang     amc->hw_strap1 = G220A_BMC_HW_STRAP1;
145295f068c8SJohn Wang     amc->fmc_model = "n25q512a";
145395f068c8SJohn Wang     amc->spi_model = "mx25l25635e";
145495f068c8SJohn Wang     amc->num_cs    = 2;
14555bb825c8SGuenter Roeck     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
145695f068c8SJohn Wang     amc->i2c_init  = g220a_bmc_i2c_init;
1457cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
145895f068c8SJohn Wang     mc->default_ram_size = 1024 * MiB;
145943a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
146095f068c8SJohn Wang };
146195f068c8SJohn Wang 
146282b6a3f6SJohn Wang static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc, void *data)
146382b6a3f6SJohn Wang {
146482b6a3f6SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
146582b6a3f6SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
146682b6a3f6SJohn Wang 
146782b6a3f6SJohn Wang     mc->desc       = "Inspur FP5280G2 BMC (ARM1176)";
146882b6a3f6SJohn Wang     amc->soc_name  = "ast2500-a1";
146982b6a3f6SJohn Wang     amc->hw_strap1 = FP5280G2_BMC_HW_STRAP1;
147082b6a3f6SJohn Wang     amc->fmc_model = "n25q512a";
147182b6a3f6SJohn Wang     amc->spi_model = "mx25l25635e";
147282b6a3f6SJohn Wang     amc->num_cs    = 2;
147382b6a3f6SJohn Wang     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
147482b6a3f6SJohn Wang     amc->i2c_init  = fp5280g2_bmc_i2c_init;
1475cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
147682b6a3f6SJohn Wang     mc->default_ram_size = 512 * MiB;
147743a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
147882b6a3f6SJohn Wang };
147982b6a3f6SJohn Wang 
148058e52bdbSCédric Le Goater static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data)
148158e52bdbSCédric Le Goater {
148258e52bdbSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
148358e52bdbSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
148458e52bdbSCédric Le Goater 
1485f548f201SPeter Maydell     mc->desc       = "IBM Rainier BMC (Cortex-A7)";
1486c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
148758e52bdbSCédric Le Goater     amc->hw_strap1 = RAINIER_BMC_HW_STRAP1;
148858e52bdbSCédric Le Goater     amc->hw_strap2 = RAINIER_BMC_HW_STRAP2;
148958e52bdbSCédric Le Goater     amc->fmc_model = "mx66l1g45g";
149058e52bdbSCédric Le Goater     amc->spi_model = "mx66l1g45g";
149158e52bdbSCédric Le Goater     amc->num_cs    = 2;
149258e52bdbSCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
149358e52bdbSCédric Le Goater     amc->i2c_init  = rainier_bmc_i2c_init;
1494cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
149558e52bdbSCédric Le Goater     mc->default_ram_size = 1 * GiB;
149643a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1497056b779eSCédric Le Goater     aspeed_machine_ast2600_class_emmc_init(oc);
149858e52bdbSCédric Le Goater };
149958e52bdbSCédric Le Goater 
15001e2c22c9SCédric Le Goater #define FUJI_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB)
1501febbe308SPeter Delevoryas 
1502febbe308SPeter Delevoryas static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data)
1503febbe308SPeter Delevoryas {
1504febbe308SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1505febbe308SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1506febbe308SPeter Delevoryas 
1507febbe308SPeter Delevoryas     mc->desc = "Facebook Fuji BMC (Cortex-A7)";
1508febbe308SPeter Delevoryas     amc->soc_name = "ast2600-a3";
1509febbe308SPeter Delevoryas     amc->hw_strap1 = FUJI_BMC_HW_STRAP1;
1510febbe308SPeter Delevoryas     amc->hw_strap2 = FUJI_BMC_HW_STRAP2;
1511febbe308SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1512febbe308SPeter Delevoryas     amc->spi_model = "mx66l1g45g";
1513febbe308SPeter Delevoryas     amc->num_cs = 2;
1514febbe308SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1515febbe308SPeter Delevoryas     amc->i2c_init = fuji_bmc_i2c_init;
1516febbe308SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART1;
1517cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
1518febbe308SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
151943a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1520febbe308SPeter Delevoryas };
1521febbe308SPeter Delevoryas 
15221e2c22c9SCédric Le Goater #define BLETCHLEY_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB)
1523104bdaffSPatrick Williams 
1524a20c54b1SPatrick Williams static void aspeed_machine_bletchley_class_init(ObjectClass *oc, void *data)
1525a20c54b1SPatrick Williams {
1526a20c54b1SPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1527a20c54b1SPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1528a20c54b1SPatrick Williams 
1529a20c54b1SPatrick Williams     mc->desc       = "Facebook Bletchley BMC (Cortex-A7)";
1530a20c54b1SPatrick Williams     amc->soc_name  = "ast2600-a3";
1531a20c54b1SPatrick Williams     amc->hw_strap1 = BLETCHLEY_BMC_HW_STRAP1;
1532a20c54b1SPatrick Williams     amc->hw_strap2 = BLETCHLEY_BMC_HW_STRAP2;
1533a20c54b1SPatrick Williams     amc->fmc_model = "w25q01jvq";
1534a20c54b1SPatrick Williams     amc->spi_model = NULL;
1535a20c54b1SPatrick Williams     amc->num_cs    = 2;
1536a20c54b1SPatrick Williams     amc->macs_mask = ASPEED_MAC2_ON;
1537a20c54b1SPatrick Williams     amc->i2c_init  = bletchley_bmc_i2c_init;
1538cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
1539104bdaffSPatrick Williams     mc->default_ram_size = BLETCHLEY_BMC_RAM_SIZE;
154043a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1541a20c54b1SPatrick Williams }
1542a20c54b1SPatrick Williams 
15431b063fe2SJuraj Marcin static void fby35_reset(MachineState *state, ResetType type)
1544fa699e80SPeter Delevoryas {
1545fa699e80SPeter Delevoryas     AspeedMachineState *bmc = ASPEED_MACHINE(state);
15463c392e87SPhilippe Mathieu-Daudé     AspeedGPIOState *gpio = &bmc->soc->gpio;
1547fa699e80SPeter Delevoryas 
15481b063fe2SJuraj Marcin     qemu_devices_reset(type);
1549fa699e80SPeter Delevoryas 
1550f0418558SPeter Delevoryas     /* Board ID: 7 (Class-1, 4 slots) */
1551fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV4", true, &error_fatal);
1552fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV5", true, &error_fatal);
1553fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV6", true, &error_fatal);
1554fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV7", false, &error_fatal);
1555f0418558SPeter Delevoryas 
1556f0418558SPeter Delevoryas     /* Slot presence pins, inverse polarity. (False means present) */
1557f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH4", false, &error_fatal);
1558f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH5", true, &error_fatal);
1559f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH6", true, &error_fatal);
1560f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH7", true, &error_fatal);
1561f0418558SPeter Delevoryas 
1562f0418558SPeter Delevoryas     /* Slot 12v power pins, normal polarity. (True means powered-on) */
1563f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB2", true, &error_fatal);
1564f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB3", false, &error_fatal);
1565f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB4", false, &error_fatal);
1566f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB5", false, &error_fatal);
1567fa699e80SPeter Delevoryas }
1568fa699e80SPeter Delevoryas 
1569fa699e80SPeter Delevoryas static void aspeed_machine_fby35_class_init(ObjectClass *oc, void *data)
1570fa699e80SPeter Delevoryas {
1571fa699e80SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1572fa699e80SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1573fa699e80SPeter Delevoryas 
1574fa699e80SPeter Delevoryas     mc->desc       = "Facebook fby35 BMC (Cortex-A7)";
1575fa699e80SPeter Delevoryas     mc->reset      = fby35_reset;
1576fa699e80SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1577fa699e80SPeter Delevoryas     amc->num_cs    = 2;
1578fa699e80SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1579fa699e80SPeter Delevoryas     amc->i2c_init  = fby35_i2c_init;
1580cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
1581fa699e80SPeter Delevoryas     /* FIXME: Replace this macro with something more general */
1582fa699e80SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
158343a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1584fa699e80SPeter Delevoryas }
1585fa699e80SPeter Delevoryas 
158666c895b8SJamin Lin #define AST1030_INTERNAL_FLASH_SIZE (1024 * 1024)
158766c895b8SJamin Lin /* Main SYSCLK frequency in Hz (200MHz) */
158866c895b8SJamin Lin #define SYSCLK_FRQ 200000000ULL
158966c895b8SJamin Lin 
159066c895b8SJamin Lin static void aspeed_minibmc_machine_init(MachineState *machine)
159166c895b8SJamin Lin {
159266c895b8SJamin Lin     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
159366c895b8SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
159466c895b8SJamin Lin     Clock *sysclk;
159566c895b8SJamin Lin 
159666c895b8SJamin Lin     sysclk = clock_new(OBJECT(machine), "SYSCLK");
159766c895b8SJamin Lin     clock_set_hz(sysclk, SYSCLK_FRQ);
159866c895b8SJamin Lin 
15993c392e87SPhilippe Mathieu-Daudé     bmc->soc = ASPEED_SOC(object_new(amc->soc_name));
16003c392e87SPhilippe Mathieu-Daudé     object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc));
16013c392e87SPhilippe Mathieu-Daudé     object_unref(OBJECT(bmc->soc));
16023c392e87SPhilippe Mathieu-Daudé     qdev_connect_clock_in(DEVICE(bmc->soc), "sysclk", sysclk);
160366c895b8SJamin Lin 
16043c392e87SPhilippe Mathieu-Daudé     object_property_set_link(OBJECT(bmc->soc), "memory",
16054dd9d554SPeter Delevoryas                              OBJECT(get_system_memory()), &error_abort);
1606d2b3eaefSPeter Delevoryas     connect_serial_hds_to_uarts(bmc);
16073c392e87SPhilippe Mathieu-Daudé     qdev_realize(DEVICE(bmc->soc), NULL, &error_abort);
160866c895b8SJamin Lin 
160922b3c557SJamin Lin     if (defaults_enabled()) {
16103c392e87SPhilippe Mathieu-Daudé         aspeed_board_init_flashes(&bmc->soc->fmc,
161166c895b8SJamin Lin                             bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
161266c895b8SJamin Lin                             amc->num_cs,
161366c895b8SJamin Lin                             0);
161466c895b8SJamin Lin 
16153c392e87SPhilippe Mathieu-Daudé         aspeed_board_init_flashes(&bmc->soc->spi[0],
161666c895b8SJamin Lin                             bmc->spi_model ? bmc->spi_model : amc->spi_model,
161766c895b8SJamin Lin                             amc->num_cs, amc->num_cs);
161866c895b8SJamin Lin 
16193c392e87SPhilippe Mathieu-Daudé         aspeed_board_init_flashes(&bmc->soc->spi[1],
162066c895b8SJamin Lin                             bmc->spi_model ? bmc->spi_model : amc->spi_model,
162166c895b8SJamin Lin                             amc->num_cs, (amc->num_cs * 2));
162222b3c557SJamin Lin     }
162366c895b8SJamin Lin 
162466c895b8SJamin Lin     if (amc->i2c_init) {
162566c895b8SJamin Lin         amc->i2c_init(bmc);
162666c895b8SJamin Lin     }
162766c895b8SJamin Lin 
162866c895b8SJamin Lin     armv7m_load_kernel(ARM_CPU(first_cpu),
162966c895b8SJamin Lin                        machine->kernel_filename,
1630761c532aSPeter Maydell                        0,
163166c895b8SJamin Lin                        AST1030_INTERNAL_FLASH_SIZE);
163266c895b8SJamin Lin }
163366c895b8SJamin Lin 
16344c70ab16STroy Lee static void ast1030_evb_i2c_init(AspeedMachineState *bmc)
16354c70ab16STroy Lee {
16363c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
16374c70ab16STroy Lee 
1638673d8215SMichael Tokarev     /* U10 24C08 connects to SDA/SCL Group 1 by default */
16394c70ab16STroy Lee     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
16404c70ab16STroy Lee     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, eeprom_buf);
16414c70ab16STroy Lee 
16424c70ab16STroy Lee     /* U11 LM75 connects to SDA/SCL Group 2 by default */
16434c70ab16STroy Lee     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d);
16444c70ab16STroy Lee }
16454c70ab16STroy Lee 
164666c895b8SJamin Lin static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc,
164766c895b8SJamin Lin                                                           void *data)
164866c895b8SJamin Lin {
164966c895b8SJamin Lin     MachineClass *mc = MACHINE_CLASS(oc);
165066c895b8SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
165166c895b8SJamin Lin 
165266c895b8SJamin Lin     mc->desc = "Aspeed AST1030 MiniBMC (Cortex-M4)";
165366c895b8SJamin Lin     amc->soc_name = "ast1030-a1";
165466c895b8SJamin Lin     amc->hw_strap1 = 0;
165566c895b8SJamin Lin     amc->hw_strap2 = 0;
165666c895b8SJamin Lin     mc->init = aspeed_minibmc_machine_init;
16574c70ab16STroy Lee     amc->i2c_init = ast1030_evb_i2c_init;
165866c895b8SJamin Lin     mc->default_ram_size = 0;
1659e15001bcSJamin Lin     amc->fmc_model = "w25q80bl";
1660a37bbfbbSJamin Lin     amc->spi_model = "w25q256";
166166c895b8SJamin Lin     amc->num_cs = 2;
166266c895b8SJamin Lin     amc->macs_mask = 0;
166343a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
166466c895b8SJamin Lin }
166566c895b8SJamin Lin 
166692707992SJamin Lin #ifdef TARGET_AARCH64
16672c075ff3SJamin Lin static void ast2700_evb_i2c_init(AspeedMachineState *bmc)
16682c075ff3SJamin Lin {
16692c075ff3SJamin Lin     AspeedSoCState *soc = bmc->soc;
16702c075ff3SJamin Lin 
16712c075ff3SJamin Lin     /* LM75 is compatible with TMP105 driver */
16722c075ff3SJamin Lin     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0),
16732c075ff3SJamin Lin                             TYPE_TMP105, 0x4d);
16742c075ff3SJamin Lin }
16752c075ff3SJamin Lin 
1676*de4e9799SJamin Lin static void aspeed_machine_ast2700a0_evb_class_init(ObjectClass *oc, void *data)
167792707992SJamin Lin {
167892707992SJamin Lin     MachineClass *mc = MACHINE_CLASS(oc);
167992707992SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
168092707992SJamin Lin 
1681*de4e9799SJamin Lin     mc->alias = "ast2700-evb";
1682*de4e9799SJamin Lin     mc->desc = "Aspeed AST2700 A0 EVB (Cortex-A35)";
168392707992SJamin Lin     amc->soc_name  = "ast2700-a0";
168492707992SJamin Lin     amc->hw_strap1 = AST2700_EVB_HW_STRAP1;
168592707992SJamin Lin     amc->hw_strap2 = AST2700_EVB_HW_STRAP2;
168692707992SJamin Lin     amc->fmc_model = "w25q01jvq";
168792707992SJamin Lin     amc->spi_model = "w25q512jv";
168892707992SJamin Lin     amc->num_cs    = 2;
168992707992SJamin Lin     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON;
169092707992SJamin Lin     amc->uart_default = ASPEED_DEV_UART12;
16912c075ff3SJamin Lin     amc->i2c_init  = ast2700_evb_i2c_init;
1692cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
169392707992SJamin Lin     mc->default_ram_size = 1 * GiB;
169492707992SJamin Lin     aspeed_machine_class_init_cpus_defaults(mc);
169592707992SJamin Lin }
169692707992SJamin Lin #endif
169792707992SJamin Lin 
1698fb6b3c8dSJae Hyun Yoo static void aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass *oc,
1699fb6b3c8dSJae Hyun Yoo                                                      void *data)
1700fb6b3c8dSJae Hyun Yoo {
1701fb6b3c8dSJae Hyun Yoo     MachineClass *mc = MACHINE_CLASS(oc);
1702fb6b3c8dSJae Hyun Yoo     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1703fb6b3c8dSJae Hyun Yoo 
1704fb6b3c8dSJae Hyun Yoo     mc->desc       = "Qualcomm DC-SCM V1 BMC (Cortex A7)";
1705fb6b3c8dSJae Hyun Yoo     amc->soc_name  = "ast2600-a3";
1706fb6b3c8dSJae Hyun Yoo     amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1707fb6b3c8dSJae Hyun Yoo     amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1708fb6b3c8dSJae Hyun Yoo     amc->fmc_model = "n25q512a";
1709fb6b3c8dSJae Hyun Yoo     amc->spi_model = "n25q512a";
1710fb6b3c8dSJae Hyun Yoo     amc->num_cs    = 2;
1711fb6b3c8dSJae Hyun Yoo     amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1712fb6b3c8dSJae Hyun Yoo     amc->i2c_init  = qcom_dc_scm_bmc_i2c_init;
1713cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
1714fb6b3c8dSJae Hyun Yoo     mc->default_ram_size = 1 * GiB;
171543a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1716fb6b3c8dSJae Hyun Yoo };
1717fb6b3c8dSJae Hyun Yoo 
1718ece4cccdSGraeme Gregory static void aspeed_machine_qcom_firework_class_init(ObjectClass *oc,
1719ece4cccdSGraeme Gregory                                                     void *data)
1720ece4cccdSGraeme Gregory {
1721ece4cccdSGraeme Gregory     MachineClass *mc = MACHINE_CLASS(oc);
1722ece4cccdSGraeme Gregory     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1723ece4cccdSGraeme Gregory 
1724ece4cccdSGraeme Gregory     mc->desc       = "Qualcomm DC-SCM V1/Firework BMC (Cortex A7)";
1725ece4cccdSGraeme Gregory     amc->soc_name  = "ast2600-a3";
1726ece4cccdSGraeme Gregory     amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1727ece4cccdSGraeme Gregory     amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1728ece4cccdSGraeme Gregory     amc->fmc_model = "n25q512a";
1729ece4cccdSGraeme Gregory     amc->spi_model = "n25q512a";
1730ece4cccdSGraeme Gregory     amc->num_cs    = 2;
1731ece4cccdSGraeme Gregory     amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1732ece4cccdSGraeme Gregory     amc->i2c_init  = qcom_dc_scm_firework_i2c_init;
1733cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
1734ece4cccdSGraeme Gregory     mc->default_ram_size = 1 * GiB;
173543a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1736ece4cccdSGraeme Gregory };
1737ece4cccdSGraeme Gregory 
1738baa4732bSCédric Le Goater static const TypeInfo aspeed_machine_types[] = {
1739baa4732bSCédric Le Goater     {
1740baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("palmetto-bmc"),
1741baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1742baa4732bSCédric Le Goater         .class_init    = aspeed_machine_palmetto_class_init,
1743baa4732bSCédric Le Goater     }, {
174440a38df5SErik Smit         .name          = MACHINE_TYPE_NAME("supermicrox11-bmc"),
174540a38df5SErik Smit         .parent        = TYPE_ASPEED_MACHINE,
174640a38df5SErik Smit         .class_init    = aspeed_machine_supermicrox11_bmc_class_init,
174740a38df5SErik Smit     }, {
174847936597SGuenter Roeck         .name          = MACHINE_TYPE_NAME("supermicro-x11spi-bmc"),
174947936597SGuenter Roeck         .parent        = TYPE_ASPEED_MACHINE,
175047936597SGuenter Roeck         .class_init    = aspeed_machine_supermicro_x11spi_bmc_class_init,
175147936597SGuenter Roeck     }, {
1752baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2500-evb"),
1753baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1754baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2500_evb_class_init,
1755baa4732bSCédric Le Goater     }, {
1756baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("romulus-bmc"),
1757baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1758baa4732bSCédric Le Goater         .class_init    = aspeed_machine_romulus_class_init,
1759baa4732bSCédric Le Goater     }, {
1760143b040fSPatrick Williams         .name          = MACHINE_TYPE_NAME("sonorapass-bmc"),
1761143b040fSPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1762143b040fSPatrick Williams         .class_init    = aspeed_machine_sonorapass_class_init,
1763143b040fSPatrick Williams     }, {
1764baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("witherspoon-bmc"),
1765baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1766baa4732bSCédric Le Goater         .class_init    = aspeed_machine_witherspoon_class_init,
1767baa4732bSCédric Le Goater     }, {
1768baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2600-evb"),
1769baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1770baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2600_evb_class_init,
1771baa4732bSCédric Le Goater     }, {
177234f73a81SKarthikeyan Pasupathi         .name          = MACHINE_TYPE_NAME("yosemitev2-bmc"),
177334f73a81SKarthikeyan Pasupathi         .parent        = TYPE_ASPEED_MACHINE,
177434f73a81SKarthikeyan Pasupathi         .class_init    = aspeed_machine_yosemitev2_class_init,
177534f73a81SKarthikeyan Pasupathi     }, {
17766c323abaSKarthikeyan Pasupathi         .name          = MACHINE_TYPE_NAME("tiogapass-bmc"),
17776c323abaSKarthikeyan Pasupathi         .parent        = TYPE_ASPEED_MACHINE,
17786c323abaSKarthikeyan Pasupathi         .class_init    = aspeed_machine_tiogapass_class_init,
17796c323abaSKarthikeyan Pasupathi     }, {
178095f068c8SJohn Wang         .name          = MACHINE_TYPE_NAME("g220a-bmc"),
178195f068c8SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
178295f068c8SJohn Wang         .class_init    = aspeed_machine_g220a_class_init,
178395f068c8SJohn Wang     }, {
1784fb6b3c8dSJae Hyun Yoo         .name          = MACHINE_TYPE_NAME("qcom-dc-scm-v1-bmc"),
1785fb6b3c8dSJae Hyun Yoo         .parent        = TYPE_ASPEED_MACHINE,
1786fb6b3c8dSJae Hyun Yoo         .class_init    = aspeed_machine_qcom_dc_scm_v1_class_init,
1787fb6b3c8dSJae Hyun Yoo     }, {
1788ece4cccdSGraeme Gregory         .name          = MACHINE_TYPE_NAME("qcom-firework-bmc"),
1789ece4cccdSGraeme Gregory         .parent        = TYPE_ASPEED_MACHINE,
1790ece4cccdSGraeme Gregory         .class_init    = aspeed_machine_qcom_firework_class_init,
1791ece4cccdSGraeme Gregory     }, {
179282b6a3f6SJohn Wang         .name          = MACHINE_TYPE_NAME("fp5280g2-bmc"),
179382b6a3f6SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
179482b6a3f6SJohn Wang         .class_init    = aspeed_machine_fp5280g2_class_init,
179582b6a3f6SJohn Wang     }, {
17969cccb912SPatrick Venture         .name          = MACHINE_TYPE_NAME("quanta-q71l-bmc"),
17979cccb912SPatrick Venture         .parent        = TYPE_ASPEED_MACHINE,
17989cccb912SPatrick Venture         .class_init    = aspeed_machine_quanta_q71l_class_init,
17999cccb912SPatrick Venture     }, {
180058e52bdbSCédric Le Goater         .name          = MACHINE_TYPE_NAME("rainier-bmc"),
180158e52bdbSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
180258e52bdbSCédric Le Goater         .class_init    = aspeed_machine_rainier_class_init,
180358e52bdbSCédric Le Goater     }, {
1804febbe308SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fuji-bmc"),
1805febbe308SPeter Delevoryas         .parent        = TYPE_ASPEED_MACHINE,
1806febbe308SPeter Delevoryas         .class_init    = aspeed_machine_fuji_class_init,
1807febbe308SPeter Delevoryas     }, {
1808a20c54b1SPatrick Williams         .name          = MACHINE_TYPE_NAME("bletchley-bmc"),
1809a20c54b1SPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1810a20c54b1SPatrick Williams         .class_init    = aspeed_machine_bletchley_class_init,
1811a20c54b1SPatrick Williams     }, {
1812fa699e80SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fby35-bmc"),
1813fa699e80SPeter Delevoryas         .parent        = MACHINE_TYPE_NAME("ast2600-evb"),
1814fa699e80SPeter Delevoryas         .class_init    = aspeed_machine_fby35_class_init,
1815fa699e80SPeter Delevoryas     }, {
181666c895b8SJamin Lin         .name           = MACHINE_TYPE_NAME("ast1030-evb"),
181766c895b8SJamin Lin         .parent         = TYPE_ASPEED_MACHINE,
181866c895b8SJamin Lin         .class_init     = aspeed_minibmc_machine_ast1030_evb_class_init,
181992707992SJamin Lin #ifdef TARGET_AARCH64
182092707992SJamin Lin     }, {
1821*de4e9799SJamin Lin         .name          = MACHINE_TYPE_NAME("ast2700a0-evb"),
182292707992SJamin Lin         .parent        = TYPE_ASPEED_MACHINE,
1823*de4e9799SJamin Lin         .class_init    = aspeed_machine_ast2700a0_evb_class_init,
182492707992SJamin Lin #endif
182566c895b8SJamin Lin     }, {
1826fca9ca1bSCédric Le Goater         .name          = TYPE_ASPEED_MACHINE,
182762c2c2ebSCédric Le Goater         .parent        = TYPE_MACHINE,
1828888b2b03SPhilippe Mathieu-Daudé         .instance_size = sizeof(AspeedMachineState),
18291a15311aSCédric Le Goater         .instance_init = aspeed_machine_instance_init,
1830fca9ca1bSCédric Le Goater         .class_size    = sizeof(AspeedMachineClass),
1831fca9ca1bSCédric Le Goater         .class_init    = aspeed_machine_class_init,
1832baa4732bSCédric Le Goater         .abstract      = true,
1833baa4732bSCédric Le Goater     }
1834fca9ca1bSCédric Le Goater };
183574fb1f38SCédric Le Goater 
1836baa4732bSCédric Le Goater DEFINE_TYPES(aspeed_machine_types)
1837