xref: /qemu/hw/arm/aspeed.c (revision 6d0d9add0d98effc7045466249921a09845225ac)
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"
30*ee447054SJamin Lin #include "qemu/datadir.h"
31a9df9622SJoel Stanley #include "qemu/units.h"
3266c895b8SJamin Lin #include "hw/qdev-clock.h"
3332cad1ffSPhilippe Mathieu-Daudé #include "system/system.h"
34327d8e4eSAndrew Jeffery 
3574fb1f38SCédric Le Goater static struct arm_boot_info aspeed_board_binfo = {
36b033271fSCédric Le Goater     .board_id = -1, /* device-tree-only board */
37327d8e4eSAndrew Jeffery };
38327d8e4eSAndrew Jeffery 
39612b219aSPhilippe Mathieu-Daudé struct AspeedMachineState {
40888b2b03SPhilippe Mathieu-Daudé     /* Private */
41888b2b03SPhilippe Mathieu-Daudé     MachineState parent_obj;
42888b2b03SPhilippe Mathieu-Daudé     /* Public */
43888b2b03SPhilippe Mathieu-Daudé 
443c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc;
45262259eaSCédric Le Goater     MemoryRegion boot_rom;
46888b2b03SPhilippe Mathieu-Daudé     bool mmio_exec;
47f65f6ad5SCédric Le Goater     uint32_t uart_chosen;
489820e52fSCédric Le Goater     char *fmc_model;
499820e52fSCédric Le Goater     char *spi_model;
50621845a9SCédric Le Goater     uint32_t hw_strap1;
51ea066d39SThomas Huth };
52327d8e4eSAndrew Jeffery 
531e2c22c9SCédric Le Goater /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */
541e2c22c9SCédric Le Goater #if HOST_LONG_BITS == 32
551e2c22c9SCédric Le Goater #define ASPEED_RAM_SIZE(sz) MIN((sz), 1 * GiB)
561e2c22c9SCédric Le Goater #else
571e2c22c9SCédric Le Goater #define ASPEED_RAM_SIZE(sz) (sz)
581e2c22c9SCédric Le Goater #endif
591e2c22c9SCédric Le Goater 
60ef17f836SCédric Le Goater /* Palmetto hardware value: 0x120CE416 */
618da33ef7SCédric Le Goater #define PALMETTO_BMC_HW_STRAP1 (                                        \
628da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_256MB) |               \
638da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2 /* DDR3 with CL=6, CWL=5 */) | \
648da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
658da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) |       \
668da33ef7SCédric Le Goater         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
678da33ef7SCédric Le Goater         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
688da33ef7SCédric Le Goater         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) |                \
698da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
708da33ef7SCédric Le Goater         SCU_HW_STRAP_SPI_WIDTH |                                        \
718da33ef7SCédric Le Goater         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
728da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
738da33ef7SCédric Le Goater 
7440a38df5SErik Smit /* TODO: Find the actual hardware value */
7540a38df5SErik Smit #define SUPERMICROX11_BMC_HW_STRAP1 (                                   \
7640a38df5SErik Smit         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) |               \
7740a38df5SErik Smit         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2) |                           \
7840a38df5SErik Smit         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
7940a38df5SErik Smit         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) |       \
8040a38df5SErik Smit         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
8140a38df5SErik Smit         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
8240a38df5SErik Smit         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) |                \
8340a38df5SErik Smit         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
8440a38df5SErik Smit         SCU_HW_STRAP_SPI_WIDTH |                                        \
8540a38df5SErik Smit         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
8640a38df5SErik Smit         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
8740a38df5SErik Smit 
8847936597SGuenter Roeck /* TODO: Find the actual hardware value */
8947936597SGuenter Roeck #define SUPERMICRO_X11SPI_BMC_HW_STRAP1 (                               \
9047936597SGuenter Roeck         AST2500_HW_STRAP1_DEFAULTS |                                    \
9147936597SGuenter Roeck         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
9247936597SGuenter Roeck         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
9347936597SGuenter Roeck         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
9447936597SGuenter Roeck         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
9547936597SGuenter Roeck         SCU_HW_STRAP_SPI_WIDTH |                                        \
9647936597SGuenter Roeck         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN))
9747936597SGuenter Roeck 
98ef17f836SCédric Le Goater /* AST2500 evb hardware value: 0xF100C2E6 */
999a7c1750SCédric Le Goater #define AST2500_EVB_HW_STRAP1 ((                                        \
1009a7c1750SCédric Le Goater         AST2500_HW_STRAP1_DEFAULTS |                                    \
1019a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
1029a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
1039a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
1049a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
1059a7c1750SCédric Le Goater         SCU_HW_STRAP_MAC1_RGMII |                                       \
1069a7c1750SCédric Le Goater         SCU_HW_STRAP_MAC0_RGMII) &                                      \
1079a7c1750SCédric Le Goater         ~SCU_HW_STRAP_2ND_BOOT_WDT)
1089a7c1750SCédric Le Goater 
109ef17f836SCédric Le Goater /* Romulus hardware value: 0xF10AD206 */
110ef17f836SCédric Le Goater #define ROMULUS_BMC_HW_STRAP1 (                                         \
111ef17f836SCédric Le Goater         AST2500_HW_STRAP1_DEFAULTS |                                    \
112ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
113ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
114ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
115ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
116ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_ACPI_ENABLE |                              \
117ef17f836SCédric Le Goater         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER))
118ef17f836SCédric Le Goater 
119143b040fSPatrick Williams /* Sonorapass hardware value: 0xF100D216 */
120143b040fSPatrick Williams #define SONORAPASS_BMC_HW_STRAP1 (                                      \
121143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
122143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
123143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
124143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
125143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
126143b040fSPatrick Williams         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
127143b040fSPatrick Williams         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
128143b040fSPatrick Williams         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
129143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
130143b040fSPatrick Williams         SCU_HW_STRAP_VGA_BIOS_ROM |                                     \
131143b040fSPatrick Williams         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
132143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_RESERVED1)
133143b040fSPatrick Williams 
13495f068c8SJohn Wang #define G220A_BMC_HW_STRAP1 (                                      \
13595f068c8SJohn Wang         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
13695f068c8SJohn Wang         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
13795f068c8SJohn Wang         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
13895f068c8SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
13995f068c8SJohn Wang         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
14095f068c8SJohn Wang         SCU_HW_STRAP_2ND_BOOT_WDT |                                     \
14195f068c8SJohn Wang         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
14295f068c8SJohn Wang         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
14395f068c8SJohn Wang         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
14495f068c8SJohn Wang         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
14595f068c8SJohn Wang         SCU_HW_STRAP_VGA_SIZE_SET(VGA_64M_DRAM) |                       \
14695f068c8SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED1)
14795f068c8SJohn Wang 
14882b6a3f6SJohn Wang /* FP5280G2 hardware value: 0XF100D286 */
14982b6a3f6SJohn Wang #define FP5280G2_BMC_HW_STRAP1 (                                      \
15082b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
15182b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
15282b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
15382b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
15482b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
15582b6a3f6SJohn Wang         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
15682b6a3f6SJohn Wang         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
15782b6a3f6SJohn Wang         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
15882b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
15982b6a3f6SJohn Wang         SCU_HW_STRAP_MAC1_RGMII |                                       \
16082b6a3f6SJohn Wang         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
16182b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED1)
16282b6a3f6SJohn Wang 
16362c2c2ebSCédric Le Goater /* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */
16462c2c2ebSCédric Le Goater #define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1
16562c2c2ebSCédric Le Goater 
1669cccb912SPatrick Venture /* Quanta-Q71l hardware value */
1679cccb912SPatrick Venture #define QUANTA_Q71L_BMC_HW_STRAP1 (                                     \
1689cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) |               \
1699cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2/* DDR3 with CL=6, CWL=5 */) | \
1709cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
1719cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_24M_IN) |       \
1729cccb912SPatrick Venture         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
1739cccb912SPatrick Venture         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_PASS_THROUGH) |          \
1749cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
1759cccb912SPatrick Venture         SCU_HW_STRAP_SPI_WIDTH |                                        \
1769cccb912SPatrick Venture         SCU_HW_STRAP_VGA_SIZE_SET(VGA_8M_DRAM) |                        \
1779cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
1789cccb912SPatrick Venture 
179ccc2c418SCédric Le Goater /* AST2600 evb hardware value */
180ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP1 0x000000C0
181ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP2 0x00000003
182ccc2c418SCédric Le Goater 
18392707992SJamin Lin #ifdef TARGET_AARCH64
18492707992SJamin Lin /* AST2700 evb hardware value */
185172329c6SJamin Lin /* SCU HW Strap1 */
186172329c6SJamin Lin #define AST2700_EVB_HW_STRAP1 0x00000800
187172329c6SJamin Lin /* SCUIO HW Strap1 */
188172329c6SJamin Lin #define AST2700_EVB_HW_STRAP2 0x00000700
18992707992SJamin Lin #endif
19092707992SJamin Lin 
19158e52bdbSCédric Le Goater /* Rainier hardware value: (QEMU prototype) */
19201ea09ebSCédric Le Goater #define RAINIER_BMC_HW_STRAP1 (0x00422016 | SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC)
193b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP2 0x80000848
19458e52bdbSCédric Le Goater 
195febbe308SPeter Delevoryas /* Fuji hardware value */
196febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP1    0x00000000
197febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP2    0x00000000
198febbe308SPeter Delevoryas 
199a20c54b1SPatrick Williams /* Bletchley hardware value */
200a20c54b1SPatrick Williams /* TODO: Leave same as EVB for now. */
201a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP1 AST2600_EVB_HW_STRAP1
202a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP2 AST2600_EVB_HW_STRAP2
203a20c54b1SPatrick Williams 
204fb6b3c8dSJae Hyun Yoo /* Qualcomm DC-SCM hardware value */
205fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP1  0x00000000
206fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP2  0x00000041
207fb6b3c8dSJae Hyun Yoo 
2089bb6d140SJoel Stanley #define AST_SMP_MAILBOX_BASE            0x1e6e2180
2099bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_ENTRY        (AST_SMP_MAILBOX_BASE + 0x0)
2109bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_GOSIGN       (AST_SMP_MAILBOX_BASE + 0x4)
2119bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_READY        (AST_SMP_MAILBOX_BASE + 0x8)
2129bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_POLLINSN     (AST_SMP_MAILBOX_BASE + 0xc)
2139bb6d140SJoel Stanley #define AST_SMP_MBOX_CODE               (AST_SMP_MAILBOX_BASE + 0x10)
2149bb6d140SJoel Stanley #define AST_SMP_MBOX_GOSIGN             0xabbaab00
2159bb6d140SJoel Stanley 
aspeed_write_smpboot(ARMCPU * cpu,const struct arm_boot_info * info)2169bb6d140SJoel Stanley static void aspeed_write_smpboot(ARMCPU *cpu,
2179bb6d140SJoel Stanley                                  const struct arm_boot_info *info)
2189bb6d140SJoel Stanley {
219902bba54SCédric Le Goater     AddressSpace *as = arm_boot_address_space(cpu, info);
220902bba54SCédric Le Goater     static const ARMInsnFixup poll_mailbox_ready[] = {
2219bb6d140SJoel Stanley         /*
2229bb6d140SJoel Stanley          * r2 = per-cpu go sign value
2239bb6d140SJoel Stanley          * r1 = AST_SMP_MBOX_FIELD_ENTRY
2249bb6d140SJoel Stanley          * r0 = AST_SMP_MBOX_FIELD_GOSIGN
2259bb6d140SJoel Stanley          */
226902bba54SCédric Le Goater         { 0xee100fb0 },  /* mrc     p15, 0, r0, c0, c0, 5 */
227902bba54SCédric Le Goater         { 0xe21000ff },  /* ands    r0, r0, #255          */
228902bba54SCédric Le Goater         { 0xe59f201c },  /* ldr     r2, [pc, #28]         */
229902bba54SCédric Le Goater         { 0xe1822000 },  /* orr     r2, r2, r0            */
2309bb6d140SJoel Stanley 
231902bba54SCédric Le Goater         { 0xe59f1018 },  /* ldr     r1, [pc, #24]         */
232902bba54SCédric Le Goater         { 0xe59f0018 },  /* ldr     r0, [pc, #24]         */
2339bb6d140SJoel Stanley 
234902bba54SCédric Le Goater         { 0xe320f002 },  /* wfe                           */
235902bba54SCédric Le Goater         { 0xe5904000 },  /* ldr     r4, [r0]              */
236902bba54SCédric Le Goater         { 0xe1520004 },  /* cmp     r2, r4                */
237902bba54SCédric Le Goater         { 0x1afffffb },  /* bne     <wfe>                 */
238902bba54SCédric Le Goater         { 0xe591f000 },  /* ldr     pc, [r1]              */
239902bba54SCédric Le Goater         { AST_SMP_MBOX_GOSIGN },
240902bba54SCédric Le Goater         { AST_SMP_MBOX_FIELD_ENTRY },
241902bba54SCédric Le Goater         { AST_SMP_MBOX_FIELD_GOSIGN },
242902bba54SCédric Le Goater         { 0, FIXUP_TERMINATOR }
2439bb6d140SJoel Stanley     };
244902bba54SCédric Le Goater     static const uint32_t fixupcontext[FIXUP_MAX] = { 0 };
2459bb6d140SJoel Stanley 
246902bba54SCédric Le Goater     arm_write_bootloader("aspeed.smpboot", as, info->smp_loader_start,
247902bba54SCédric Le Goater                          poll_mailbox_ready, fixupcontext);
2489bb6d140SJoel Stanley }
2499bb6d140SJoel Stanley 
aspeed_reset_secondary(ARMCPU * cpu,const struct arm_boot_info * info)2509bb6d140SJoel Stanley static void aspeed_reset_secondary(ARMCPU *cpu,
2519bb6d140SJoel Stanley                                    const struct arm_boot_info *info)
2529bb6d140SJoel Stanley {
2539bb6d140SJoel Stanley     AddressSpace *as = arm_boot_address_space(cpu, info);
2549bb6d140SJoel Stanley     CPUState *cs = CPU(cpu);
2559bb6d140SJoel Stanley 
2569bb6d140SJoel Stanley     /* info->smp_bootreg_addr */
2579bb6d140SJoel Stanley     address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0,
2589bb6d140SJoel Stanley                                MEMTXATTRS_UNSPECIFIED, NULL);
2599bb6d140SJoel Stanley     cpu_set_pc(cs, info->smp_loader_start);
2609bb6d140SJoel Stanley }
2619bb6d140SJoel Stanley 
write_boot_rom(BlockBackend * blk,hwaddr addr,size_t rom_size,Error ** errp)2628b744a6aSCédric Le Goater static void write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size,
263d769a1daSCédric Le Goater                            Error **errp)
264d769a1daSCédric Le Goater {
26505e6e40aSWentao_Liang     g_autofree void *storage = NULL;
2660c7209beSCédric Le Goater     int64_t size;
267d769a1daSCédric Le Goater 
2684db1c164SJamin Lin     /*
2694db1c164SJamin Lin      * The block backend size should have already been 'validated' by
2700c7209beSCédric Le Goater      * the creation of the m25p80 object.
2710c7209beSCédric Le Goater      */
2720c7209beSCédric Le Goater     size = blk_getlength(blk);
2730c7209beSCédric Le Goater     if (size <= 0) {
2740c7209beSCédric Le Goater         error_setg(errp, "failed to get flash size");
2750c7209beSCédric Le Goater         return;
2760c7209beSCédric Le Goater     }
2770c7209beSCédric Le Goater 
2780c7209beSCédric Le Goater     if (rom_size > size) {
2790c7209beSCédric Le Goater         rom_size = size;
280d769a1daSCédric Le Goater     }
281d769a1daSCédric Le Goater 
28205e6e40aSWentao_Liang     storage = g_malloc0(rom_size);
283a9262f55SAlberto Faria     if (blk_pread(blk, 0, rom_size, storage, 0) < 0) {
284d769a1daSCédric Le Goater         error_setg(errp, "failed to read the initial flash content");
285d769a1daSCédric Le Goater         return;
286d769a1daSCédric Le Goater     }
287d769a1daSCédric Le Goater 
288d769a1daSCédric Le Goater     rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr);
289d769a1daSCédric Le Goater }
290d769a1daSCédric Le Goater 
2918b744a6aSCédric Le Goater /*
2928b744a6aSCédric Le Goater  * Create a ROM and copy the flash contents at the expected address
2938b744a6aSCédric Le Goater  * (0x0). Boots faster than execute-in-place.
2948b744a6aSCédric Le Goater  */
aspeed_install_boot_rom(AspeedMachineState * bmc,BlockBackend * blk,uint64_t rom_size)295262259eaSCédric Le Goater static void aspeed_install_boot_rom(AspeedMachineState *bmc, BlockBackend *blk,
2968b744a6aSCédric Le Goater                                     uint64_t rom_size)
2978b744a6aSCédric Le Goater {
2983c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
299db052d0eSJamin Lin     AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(soc);
3008b744a6aSCédric Le Goater 
301262259eaSCédric Le Goater     memory_region_init_rom(&bmc->boot_rom, NULL, "aspeed.boot_rom", rom_size,
3028b744a6aSCédric Le Goater                            &error_abort);
3038b744a6aSCédric Le Goater     memory_region_add_subregion_overlap(&soc->spi_boot_container, 0,
304262259eaSCédric Le Goater                                         &bmc->boot_rom, 1);
305db052d0eSJamin Lin     write_boot_rom(blk, sc->memmap[ASPEED_DEV_SPI_BOOT],
306db052d0eSJamin Lin                    rom_size, &error_abort);
3078b744a6aSCédric Le Goater }
3088b744a6aSCédric Le Goater 
309*ee447054SJamin Lin #define VBOOTROM_FILE_NAME  "ast27x0_bootrom.bin"
310*ee447054SJamin Lin 
311*ee447054SJamin Lin /*
312*ee447054SJamin Lin  * This function locates the vbootrom image file specified via the command line
313*ee447054SJamin Lin  * using the -bios option. It loads the specified image into the vbootrom
314*ee447054SJamin Lin  * memory region and handles errors if the file cannot be found or loaded.
315*ee447054SJamin Lin  */
aspeed_load_vbootrom(AspeedMachineState * bmc,const char * bios_name,Error ** errp)316*ee447054SJamin Lin static void aspeed_load_vbootrom(AspeedMachineState *bmc, const char *bios_name,
317*ee447054SJamin Lin                                  Error **errp)
318*ee447054SJamin Lin {
319*ee447054SJamin Lin     g_autofree char *filename = NULL;
320*ee447054SJamin Lin     AspeedSoCState *soc = bmc->soc;
321*ee447054SJamin Lin     int ret;
322*ee447054SJamin Lin 
323*ee447054SJamin Lin     filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
324*ee447054SJamin Lin     if (!filename) {
325*ee447054SJamin Lin         error_setg(errp, "Could not find vbootrom image '%s'", bios_name);
326*ee447054SJamin Lin         return;
327*ee447054SJamin Lin     }
328*ee447054SJamin Lin 
329*ee447054SJamin Lin     ret = load_image_mr(filename, &soc->vbootrom);
330*ee447054SJamin Lin     if (ret < 0) {
331*ee447054SJamin Lin         error_setg(errp, "Failed to load vbootrom image '%s'", bios_name);
332*ee447054SJamin Lin         return;
333*ee447054SJamin Lin     }
334*ee447054SJamin Lin }
335*ee447054SJamin Lin 
aspeed_board_init_flashes(AspeedSMCState * s,const char * flashtype,unsigned int count,int unit0)3361099ad10SPeter Delevoryas void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
3379bd4ac61SCédric Le Goater                                       unsigned int count, int unit0)
338e1ad9bc4SCédric Le Goater {
339e1ad9bc4SCédric Le Goater     int i;
340179b2058SPatrick Williams 
341179b2058SPatrick Williams     if (!flashtype) {
342179b2058SPatrick Williams         return;
343179b2058SPatrick Williams     }
344e1ad9bc4SCédric Le Goater 
3459bd4ac61SCédric Le Goater     for (i = 0; i < count; ++i) {
3468ec239f2SMarkus Armbruster         DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i);
347a7d78befSCédric Le Goater         DeviceState *dev;
348e1ad9bc4SCédric Le Goater 
349a7d78befSCédric Le Goater         dev = qdev_new(flashtype);
350e1ad9bc4SCédric Le Goater         if (dinfo) {
351a7d78befSCédric Le Goater             qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo));
352e1ad9bc4SCédric Le Goater         }
35327a2c66cSCédric Le Goater         qdev_prop_set_uint8(dev, "cs", i);
354a7d78befSCédric Le Goater         qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal);
355e1ad9bc4SCédric Le Goater     }
356e1ad9bc4SCédric Le Goater }
357e1ad9bc4SCédric Le Goater 
sdhci_attach_drive(SDHCIState * sdhci,DriveInfo * dinfo,bool emmc,bool boot_emmc)358e554e45bSCédric Le Goater static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo, bool emmc,
359e554e45bSCédric Le Goater                                bool boot_emmc)
360a29e3e12SAndrew Jeffery {
361a29e3e12SAndrew Jeffery         DeviceState *card;
362a29e3e12SAndrew Jeffery 
363756f739bSPhilippe Mathieu-Daudé         if (!dinfo) {
364756f739bSPhilippe Mathieu-Daudé             return;
365756f739bSPhilippe Mathieu-Daudé         }
366dddfc771SCédric Le Goater         card = qdev_new(emmc ? TYPE_EMMC : TYPE_SD_CARD);
367e8f3acdbSCédric Le Goater 
368e8f3acdbSCédric Le Goater         /*
369e8f3acdbSCédric Le Goater          * Force the boot properties of the eMMC device only when the
370e8f3acdbSCédric Le Goater          * machine is strapped to boot from eMMC. Without these
371e8f3acdbSCédric Le Goater          * settings, the machine would not boot.
372e8f3acdbSCédric Le Goater          *
373e8f3acdbSCédric Le Goater          * This also allows the machine to use an eMMC device without
374e8f3acdbSCédric Le Goater          * boot areas when booting from the flash device (or -kernel)
375e8f3acdbSCédric Le Goater          * Ideally, the device and its properties should be defined on
376e8f3acdbSCédric Le Goater          * the command line.
377e8f3acdbSCédric Le Goater          */
378e8f3acdbSCédric Le Goater         if (emmc && boot_emmc) {
379e554e45bSCédric Le Goater             qdev_prop_set_uint64(card, "boot-partition-size", 1 * MiB);
380e8f3acdbSCédric Le Goater             qdev_prop_set_uint8(card, "boot-config", 0x1 << 3);
381e554e45bSCédric Le Goater         }
382934df912SMarkus Armbruster         qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
383a29e3e12SAndrew Jeffery                                 &error_fatal);
3843e80f690SMarkus Armbruster         qdev_realize_and_unref(card,
3853e80f690SMarkus Armbruster                                qdev_get_child_bus(DEVICE(sdhci), "sd-bus"),
3863e80f690SMarkus Armbruster                                &error_fatal);
387a29e3e12SAndrew Jeffery }
388a29e3e12SAndrew Jeffery 
connect_serial_hds_to_uarts(AspeedMachineState * bmc)389d2b3eaefSPeter Delevoryas static void connect_serial_hds_to_uarts(AspeedMachineState *bmc)
390d2b3eaefSPeter Delevoryas {
391d2b3eaefSPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
3923c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *s = bmc->soc;
393d2b3eaefSPeter Delevoryas     AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
394f65f6ad5SCédric Le Goater     int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default;
395d2b3eaefSPeter Delevoryas 
396f65f6ad5SCédric Le Goater     aspeed_soc_uart_set_chr(s, uart_chosen, serial_hd(0));
3978a139ae7SKenneth Jia     for (int i = 1, uart = sc->uarts_base; i < sc->uarts_num; uart++) {
398f65f6ad5SCédric Le Goater         if (uart == uart_chosen) {
399d2b3eaefSPeter Delevoryas             continue;
400d2b3eaefSPeter Delevoryas         }
4018a139ae7SKenneth Jia         aspeed_soc_uart_set_chr(s, uart, serial_hd(i++));
402d2b3eaefSPeter Delevoryas     }
403d2b3eaefSPeter Delevoryas }
404d2b3eaefSPeter Delevoryas 
aspeed_machine_init(MachineState * machine)405baa4732bSCédric Le Goater static void aspeed_machine_init(MachineState *machine)
406327d8e4eSAndrew Jeffery {
407888b2b03SPhilippe Mathieu-Daudé     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
408baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
409b033271fSCédric Le Goater     AspeedSoCClass *sc;
4102bea128cSEddie James     int i;
411*ee447054SJamin Lin     const char *bios_name = NULL;
412255aed81SCédric Le Goater     DriveInfo *emmc0 = NULL;
413e554e45bSCédric Le Goater     bool boot_emmc;
414327d8e4eSAndrew Jeffery 
4153c392e87SPhilippe Mathieu-Daudé     bmc->soc = ASPEED_SOC(object_new(amc->soc_name));
4163c392e87SPhilippe Mathieu-Daudé     object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc));
4173c392e87SPhilippe Mathieu-Daudé     object_unref(OBJECT(bmc->soc));
4183c392e87SPhilippe Mathieu-Daudé     sc = ASPEED_SOC_GET_CLASS(bmc->soc);
419b033271fSCédric Le Goater 
420533eb415SIgor Mammedov     /*
421346160cbSCédric Le Goater      * This will error out if the RAM size is not supported by the
422346160cbSCédric Le Goater      * memory controller of the SoC.
423533eb415SIgor Mammedov      */
4243c392e87SPhilippe Mathieu-Daudé     object_property_set_uint(OBJECT(bmc->soc), "ram-size", machine->ram_size,
425533eb415SIgor Mammedov                              &error_fatal);
426533eb415SIgor Mammedov 
427d3bad7e7SCédric Le Goater     for (i = 0; i < sc->macs_num; i++) {
428b3cfec5bSDavid Woodhouse         if ((amc->macs_mask & (1 << i)) &&
429b3cfec5bSDavid Woodhouse             !qemu_configure_nic_device(DEVICE(&bmc->soc->ftgmac100[i]),
430b3cfec5bSDavid Woodhouse                                        true, NULL)) {
431b3cfec5bSDavid Woodhouse             break; /* No configs left; stop asking */
432d3bad7e7SCédric Le Goater         }
433d3bad7e7SCédric Le Goater     }
434d3bad7e7SCédric Le Goater 
435621845a9SCédric Le Goater     object_property_set_int(OBJECT(bmc->soc), "hw-strap1", bmc->hw_strap1,
43687e79af0SAndrew Jeffery                             &error_abort);
4373c392e87SPhilippe Mathieu-Daudé     object_property_set_int(OBJECT(bmc->soc), "hw-strap2", amc->hw_strap2,
438ccc2c418SCédric Le Goater                             &error_abort);
4393c392e87SPhilippe Mathieu-Daudé     object_property_set_link(OBJECT(bmc->soc), "memory",
4404dd9d554SPeter Delevoryas                              OBJECT(get_system_memory()), &error_abort);
4413c392e87SPhilippe Mathieu-Daudé     object_property_set_link(OBJECT(bmc->soc), "dram",
4420df2d9a6SCédric Le Goater                              OBJECT(machine->ram), &error_abort);
443bf8a471aSJamin Lin     if (amc->sdhci_wp_inverted) {
444bf8a471aSJamin Lin         for (i = 0; i < bmc->soc->sdhci.num_slots; i++) {
445bf8a471aSJamin Lin             object_property_set_bool(OBJECT(&bmc->soc->sdhci.slots[i]),
446bf8a471aSJamin Lin                                      "wp-inverted", true, &error_abort);
447bf8a471aSJamin Lin         }
448bf8a471aSJamin Lin     }
449b6e70d1dSJoel Stanley     if (machine->kernel_filename) {
450b6e70d1dSJoel Stanley         /*
451b6e70d1dSJoel Stanley          * When booting with a -kernel command line there is no u-boot
452b6e70d1dSJoel Stanley          * that runs to unlock the SCU. In this case set the default to
453b6e70d1dSJoel Stanley          * be unlocked as the kernel expects
454b6e70d1dSJoel Stanley          */
4553c392e87SPhilippe Mathieu-Daudé         object_property_set_int(OBJECT(bmc->soc), "hw-prot-key",
4565325cc34SMarkus Armbruster                                 ASPEED_SCU_PROT_KEY, &error_abort);
457b6e70d1dSJoel Stanley     }
458d2b3eaefSPeter Delevoryas     connect_serial_hds_to_uarts(bmc);
4593c392e87SPhilippe Mathieu-Daudé     qdev_realize(DEVICE(bmc->soc), NULL, &error_abort);
460327d8e4eSAndrew Jeffery 
461c7e313aeSCédric Le Goater     if (defaults_enabled()) {
4623c392e87SPhilippe Mathieu-Daudé         aspeed_board_init_flashes(&bmc->soc->fmc,
4638ec239f2SMarkus Armbruster                               bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
4649bd4ac61SCédric Le Goater                               amc->num_cs, 0);
4653c392e87SPhilippe Mathieu-Daudé         aspeed_board_init_flashes(&bmc->soc->spi[0],
4668ec239f2SMarkus Armbruster                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
4679bd4ac61SCédric Le Goater                               1, amc->num_cs);
468c7e313aeSCédric Le Goater     }
469e1ad9bc4SCédric Le Goater 
470b7f1a0cbSCédric Le Goater     if (machine->kernel_filename && sc->num_cpus > 1) {
4719bb6d140SJoel Stanley         /* With no u-boot we must set up a boot stub for the secondary CPU */
4729bb6d140SJoel Stanley         MemoryRegion *smpboot = g_new(MemoryRegion, 1);
473f489960dSPhilippe Mathieu-Daudé         memory_region_init_ram(smpboot, NULL, "aspeed.smpboot",
4749bb6d140SJoel Stanley                                0x80, &error_abort);
4759bb6d140SJoel Stanley         memory_region_add_subregion(get_system_memory(),
4769bb6d140SJoel Stanley                                     AST_SMP_MAILBOX_BASE, smpboot);
4779bb6d140SJoel Stanley 
4789bb6d140SJoel Stanley         aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot;
4799bb6d140SJoel Stanley         aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary;
4809bb6d140SJoel Stanley         aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE;
4819bb6d140SJoel Stanley     }
4829bb6d140SJoel Stanley 
4836e504a98SPaolo Bonzini     aspeed_board_binfo.ram_size = machine->ram_size;
484347df6f8SEduardo Habkost     aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM];
485b033271fSCédric Le Goater 
486baa4732bSCédric Le Goater     if (amc->i2c_init) {
487baa4732bSCédric Le Goater         amc->i2c_init(bmc);
4882cf6cb50SCédric Le Goater     }
4892cf6cb50SCédric Le Goater 
490e9085846SCédric Le Goater     for (i = 0; i < bmc->soc->sdhci.num_slots && defaults_enabled(); i++) {
4913c392e87SPhilippe Mathieu-Daudé         sdhci_attach_drive(&bmc->soc->sdhci.slots[i],
492e554e45bSCédric Le Goater                            drive_get(IF_SD, 0, i), false, false);
493a29e3e12SAndrew Jeffery     }
4942bea128cSEddie James 
495e554e45bSCédric Le Goater     boot_emmc = sc->boot_from_emmc(bmc->soc);
496e554e45bSCédric Le Goater 
497e9085846SCédric Le Goater     if (bmc->soc->emmc.num_slots && defaults_enabled()) {
498255aed81SCédric Le Goater         emmc0 = drive_get(IF_SD, 0, bmc->soc->sdhci.num_slots);
499e554e45bSCédric Le Goater         sdhci_attach_drive(&bmc->soc->emmc.slots[0], emmc0, true, boot_emmc);
5002bea128cSEddie James     }
5012bea128cSEddie James 
5028b744a6aSCédric Le Goater     if (!bmc->mmio_exec) {
5033c392e87SPhilippe Mathieu-Daudé         DeviceState *dev = ssi_get_cs(bmc->soc->fmc.spi, 0);
5048285490bSCédric Le Goater         BlockBackend *fmc0 = dev ? m25p80_get_blk(dev) : NULL;
5058b744a6aSCédric Le Goater 
506e554e45bSCédric Le Goater         if (fmc0 && !boot_emmc) {
5073c392e87SPhilippe Mathieu-Daudé             uint64_t rom_size = memory_region_size(&bmc->soc->spi_boot);
5088285490bSCédric Le Goater             aspeed_install_boot_rom(bmc, fmc0, rom_size);
509255aed81SCédric Le Goater         } else if (emmc0) {
510255aed81SCédric Le Goater             aspeed_install_boot_rom(bmc, blk_by_legacy_dinfo(emmc0), 64 * KiB);
5118b744a6aSCédric Le Goater         }
5128b744a6aSCédric Le Goater     }
5138b744a6aSCédric Le Goater 
514*ee447054SJamin Lin     if (amc->vbootrom) {
515*ee447054SJamin Lin         bios_name = machine->firmware ?: VBOOTROM_FILE_NAME;
516*ee447054SJamin Lin         aspeed_load_vbootrom(bmc, bios_name, &error_abort);
517*ee447054SJamin Lin     }
518*ee447054SJamin Lin 
5192744ece8STao Xu     arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo);
520327d8e4eSAndrew Jeffery }
521327d8e4eSAndrew Jeffery 
palmetto_bmc_i2c_init(AspeedMachineState * bmc)522612b219aSPhilippe Mathieu-Daudé static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
5232cf6cb50SCédric Le Goater {
5243c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
525a87e81b9SCédric Le Goater     DeviceState *dev;
5263d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
5272cf6cb50SCédric Le Goater 
5284db1c164SJamin Lin     /*
5294db1c164SJamin Lin      * The palmetto platform expects a ds3231 RTC but a ds1338 is
5304db1c164SJamin Lin      * enough to provide basic RTC features. Alarms will be missing
5314db1c164SJamin Lin      */
5321373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
533a87e81b9SCédric Le Goater 
5347a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
5353d165f12SCédric Le Goater                           eeprom_buf);
5363d165f12SCédric Le Goater 
537a87e81b9SCédric Le Goater     /* add a TMP423 temperature sensor */
5381373b15bSPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
5391373b15bSPhilippe Mathieu-Daudé                                          "tmp423", 0x4c));
5405325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
5415325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
5425325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
5435325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort);
5442cf6cb50SCédric Le Goater }
5452cf6cb50SCédric Le Goater 
quanta_q71l_bmc_i2c_init(AspeedMachineState * bmc)5469cccb912SPatrick Venture static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc)
5479cccb912SPatrick Venture {
5483c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
5499cccb912SPatrick Venture 
5509cccb912SPatrick Venture     /*
5519cccb912SPatrick Venture      * The quanta-q71l platform expects tmp75s which are compatible with
5529cccb912SPatrick Venture      * tmp105s.
5539cccb912SPatrick Venture      */
5549cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c);
5559cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e);
5569cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f);
5579cccb912SPatrick Venture 
5589cccb912SPatrick Venture     /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */
5599cccb912SPatrick Venture     /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */
5609cccb912SPatrick Venture     /* TODO: Add Memory Riser i2c mux and eeproms. */
5619cccb912SPatrick Venture 
5623ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74);
5633ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77);
5643ec75e39SPatrick Venture 
5659cccb912SPatrick Venture     /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */
5663ec75e39SPatrick Venture 
5673ec75e39SPatrick Venture     /* i2c-7 */
5683ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70);
5699cccb912SPatrick Venture     /*        - i2c@0: pmbus@59 */
5709cccb912SPatrick Venture     /*        - i2c@1: pmbus@58 */
5719cccb912SPatrick Venture     /*        - i2c@2: pmbus@58 */
5729cccb912SPatrick Venture     /*        - i2c@3: pmbus@59 */
5733ec75e39SPatrick Venture 
5749cccb912SPatrick Venture     /* TODO: i2c-7: Add PDB FRU eeprom@52 */
5759cccb912SPatrick Venture     /* TODO: i2c-8: Add BMC FRU eeprom@50 */
5769cccb912SPatrick Venture }
5779cccb912SPatrick Venture 
ast2500_evb_i2c_init(AspeedMachineState * bmc)578612b219aSPhilippe Mathieu-Daudé static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
5792cf6cb50SCédric Le Goater {
5803c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
5813d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
5823d165f12SCédric Le Goater 
5837a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50,
5843d165f12SCédric Le Goater                           eeprom_buf);
5852cf6cb50SCédric Le Goater 
5862cf6cb50SCédric Le Goater     /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
5871373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
588044475f3SPhilippe Mathieu-Daudé                      TYPE_TMP105, 0x4d);
5892cf6cb50SCédric Le Goater }
5902cf6cb50SCédric Le Goater 
ast2600_evb_i2c_init(AspeedMachineState * bmc)591612b219aSPhilippe Mathieu-Daudé static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
592ccc2c418SCédric Le Goater {
5933c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
59452bcd997SHoward Chiu     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
59552bcd997SHoward Chiu 
59652bcd997SHoward Chiu     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50,
59752bcd997SHoward Chiu                           eeprom_buf);
59852bcd997SHoward Chiu 
59952bcd997SHoward Chiu     /* LM75 is compatible with TMP105 driver */
60052bcd997SHoward Chiu     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
60152bcd997SHoward Chiu                      TYPE_TMP105, 0x4d);
602ccc2c418SCédric Le Goater }
603ccc2c418SCédric Le Goater 
yosemitev2_bmc_i2c_init(AspeedMachineState * bmc)60434f73a81SKarthikeyan Pasupathi static void yosemitev2_bmc_i2c_init(AspeedMachineState *bmc)
60534f73a81SKarthikeyan Pasupathi {
6063c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
60734f73a81SKarthikeyan Pasupathi 
60834f73a81SKarthikeyan Pasupathi     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x51, 128 * KiB);
60934f73a81SKarthikeyan Pasupathi     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 128 * KiB,
61034f73a81SKarthikeyan Pasupathi                           yosemitev2_bmc_fruid, yosemitev2_bmc_fruid_len);
6110a1f86baSKarthikeyan Pasupathi     /* TMP421 */
6120a1f86baSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "tmp421", 0x1f);
6130a1f86baSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4e);
6140a1f86baSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4f);
6150a1f86baSKarthikeyan Pasupathi 
61634f73a81SKarthikeyan Pasupathi }
61734f73a81SKarthikeyan Pasupathi 
romulus_bmc_i2c_init(AspeedMachineState * bmc)618612b219aSPhilippe Mathieu-Daudé static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
6196c4567c7SCédric Le Goater {
6203c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
6216c4567c7SCédric Le Goater 
6224db1c164SJamin Lin     /*
6234db1c164SJamin Lin      * The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
6244db1c164SJamin Lin      * good enough
6254db1c164SJamin Lin      */
6261373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
6276c4567c7SCédric Le Goater }
6286c4567c7SCédric Le Goater 
tiogapass_bmc_i2c_init(AspeedMachineState * bmc)6296c323abaSKarthikeyan Pasupathi static void tiogapass_bmc_i2c_init(AspeedMachineState *bmc)
6306c323abaSKarthikeyan Pasupathi {
6313c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
6326c323abaSKarthikeyan Pasupathi 
6336c323abaSKarthikeyan Pasupathi     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 128 * KiB);
6346c323abaSKarthikeyan Pasupathi     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 6), 0x54, 128 * KiB,
6356c323abaSKarthikeyan Pasupathi                           tiogapass_bmc_fruid, tiogapass_bmc_fruid_len);
636a09d357dSKarthikeyan Pasupathi     /* TMP421 */
637a09d357dSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "tmp421", 0x1f);
638a09d357dSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4f);
639a09d357dSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4e);
6406c323abaSKarthikeyan Pasupathi }
6416c323abaSKarthikeyan Pasupathi 
create_pca9552(AspeedSoCState * soc,int bus_id,int addr)642f4aec252SCédric Le Goater static void create_pca9552(AspeedSoCState *soc, int bus_id, int addr)
643f4aec252SCédric Le Goater {
644f4aec252SCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, bus_id),
645f4aec252SCédric Le Goater                             TYPE_PCA9552, addr);
646f4aec252SCédric Le Goater }
647f4aec252SCédric Le Goater 
sonorapass_bmc_i2c_init(AspeedMachineState * bmc)648612b219aSPhilippe Mathieu-Daudé static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc)
649143b040fSPatrick Williams {
6503c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
651143b040fSPatrick Williams 
652143b040fSPatrick Williams     /* bus 2 : */
6531373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48);
6541373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49);
655143b040fSPatrick Williams     /* bus 2 : pca9546 @ 0x73 */
656143b040fSPatrick Williams 
657143b040fSPatrick Williams     /* bus 3 : pca9548 @ 0x70 */
658143b040fSPatrick Williams 
659143b040fSPatrick Williams     /* bus 4 : */
660143b040fSPatrick Williams     uint8_t *eeprom4_54 = g_malloc0(8 * 1024);
6617a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54,
662143b040fSPatrick Williams                           eeprom4_54);
663143b040fSPatrick Williams     /* PCA9539 @ 0x76, but PCA9552 is compatible */
664f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x76);
665143b040fSPatrick Williams     /* PCA9539 @ 0x77, but PCA9552 is compatible */
666f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x77);
667143b040fSPatrick Williams 
668143b040fSPatrick Williams     /* bus 6 : */
6691373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48);
6701373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49);
671143b040fSPatrick Williams     /* bus 6 : pca9546 @ 0x73 */
672143b040fSPatrick Williams 
673143b040fSPatrick Williams     /* bus 8 : */
674143b040fSPatrick Williams     uint8_t *eeprom8_56 = g_malloc0(8 * 1024);
6757a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56,
676143b040fSPatrick Williams                           eeprom8_56);
677f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x60);
678f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x61);
679143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1d */
680143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1f */
681143b040fSPatrick Williams 
682143b040fSPatrick Williams     /*
683143b040fSPatrick Williams      * bus 13 : pca9548 @ 0x71
684143b040fSPatrick Williams      *      - channel 3:
685143b040fSPatrick Williams      *          - tmm421 @ 0x4c
686143b040fSPatrick Williams      *          - tmp421 @ 0x4e
687143b040fSPatrick Williams      *          - tmp421 @ 0x4f
688143b040fSPatrick Williams      */
689143b040fSPatrick Williams 
690143b040fSPatrick Williams }
691143b040fSPatrick Williams 
witherspoon_bmc_i2c_init(AspeedMachineState * bmc)692612b219aSPhilippe Mathieu-Daudé static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
69362c2c2ebSCédric Le Goater {
6947cfbde5eSPhilippe Mathieu-Daudé     static const struct {
6957cfbde5eSPhilippe Mathieu-Daudé         unsigned gpio_id;
6967cfbde5eSPhilippe Mathieu-Daudé         LEDColor color;
6977cfbde5eSPhilippe Mathieu-Daudé         const char *description;
6987cfbde5eSPhilippe Mathieu-Daudé         bool gpio_polarity;
6997cfbde5eSPhilippe Mathieu-Daudé     } pca1_leds[] = {
7007cfbde5eSPhilippe Mathieu-Daudé         {13, LED_COLOR_GREEN, "front-fault-4",  GPIO_POLARITY_ACTIVE_LOW},
7017cfbde5eSPhilippe Mathieu-Daudé         {14, LED_COLOR_GREEN, "front-power-3",  GPIO_POLARITY_ACTIVE_LOW},
7027cfbde5eSPhilippe Mathieu-Daudé         {15, LED_COLOR_GREEN, "front-id-5",     GPIO_POLARITY_ACTIVE_LOW},
7037cfbde5eSPhilippe Mathieu-Daudé     };
7043c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
7053d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
70615ce12cfSPhilippe Mathieu-Daudé     DeviceState *dev;
7077cfbde5eSPhilippe Mathieu-Daudé     LEDState *led;
70862c2c2ebSCédric Le Goater 
70963ceb818SCédric Le Goater     /* Bus 3: TODO bmp280@77 */
710db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
71115ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca1");
7122616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
7132616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 3),
71415ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
7158c9a61d7SCédric Le Goater 
7167cfbde5eSPhilippe Mathieu-Daudé     for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) {
7177cfbde5eSPhilippe Mathieu-Daudé         led = led_create_simple(OBJECT(bmc),
7187cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].gpio_polarity,
7197cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].color,
7207cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].description);
7217cfbde5eSPhilippe Mathieu-Daudé         qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id,
7227cfbde5eSPhilippe Mathieu-Daudé                               qdev_get_gpio_in(DEVICE(led), 0));
7237cfbde5eSPhilippe Mathieu-Daudé     }
724b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76);
7252a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "max31785", 0x52);
7261373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c);
7271373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c);
72862c2c2ebSCédric Le Goater 
72962c2c2ebSCédric Le Goater     /* The Witherspoon expects a TMP275 but a TMP105 is compatible */
7301373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105,
731044475f3SPhilippe Mathieu-Daudé                      0x4a);
7326c4567c7SCédric Le Goater 
7334db1c164SJamin Lin     /*
7344db1c164SJamin Lin      * The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
7354db1c164SJamin Lin      * good enough
7364db1c164SJamin Lin      */
7371373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
7383d165f12SCédric Le Goater 
7397a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51,
7403d165f12SCédric Le Goater                           eeprom_buf);
741db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
74215ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca0");
7432616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
7442616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 11),
74515ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
74663ceb818SCédric Le Goater     /* Bus 11: TODO ucd90160@64 */
74762c2c2ebSCédric Le Goater }
74862c2c2ebSCédric Le Goater 
g220a_bmc_i2c_init(AspeedMachineState * bmc)74995f068c8SJohn Wang static void g220a_bmc_i2c_init(AspeedMachineState *bmc)
75095f068c8SJohn Wang {
7513c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
75295f068c8SJohn Wang     DeviceState *dev;
75395f068c8SJohn Wang 
75495f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3),
75595f068c8SJohn Wang                                          "emc1413", 0x4c));
75695f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
75795f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
75895f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
75995f068c8SJohn Wang 
76095f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12),
76195f068c8SJohn Wang                                          "emc1413", 0x4c));
76295f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
76395f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
76495f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
76595f068c8SJohn Wang 
76695f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13),
76795f068c8SJohn Wang                                          "emc1413", 0x4c));
76895f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
76995f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
77095f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
7716f5f6507SJohn Wang 
7726f5f6507SJohn Wang     static uint8_t eeprom_buf[2 * 1024] = {
7736f5f6507SJohn Wang             0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe,
7746f5f6507SJohn Wang             0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65,
7756f5f6507SJohn Wang             0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32,
7766f5f6507SJohn Wang             0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42,
7776f5f6507SJohn Wang             0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45,
7786f5f6507SJohn Wang             0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1,
7796f5f6507SJohn Wang             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7,
7806f5f6507SJohn Wang     };
7816f5f6507SJohn Wang     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57,
7826f5f6507SJohn Wang                           eeprom_buf);
78395f068c8SJohn Wang }
78495f068c8SJohn Wang 
fp5280g2_bmc_i2c_init(AspeedMachineState * bmc)78582b6a3f6SJohn Wang static void fp5280g2_bmc_i2c_init(AspeedMachineState *bmc)
78682b6a3f6SJohn Wang {
7873c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
78882b6a3f6SJohn Wang     I2CSlave *i2c_mux;
78982b6a3f6SJohn Wang 
79082b6a3f6SJohn Wang     /* The at24c256 */
79182b6a3f6SJohn Wang     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 1), 0x50, 32768);
79282b6a3f6SJohn Wang 
79382b6a3f6SJohn Wang     /* The fp5280g2 expects a TMP112 but a TMP105 is compatible */
79482b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
79582b6a3f6SJohn Wang                      0x48);
79682b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
79782b6a3f6SJohn Wang                      0x49);
79882b6a3f6SJohn Wang 
79982b6a3f6SJohn Wang     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
80082b6a3f6SJohn Wang                      "pca9546", 0x70);
80182b6a3f6SJohn Wang     /* It expects a TMP112 but a TMP105 is compatible */
80282b6a3f6SJohn Wang     i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0), TYPE_TMP105,
80382b6a3f6SJohn Wang                      0x4a);
80482b6a3f6SJohn Wang 
80582b6a3f6SJohn Wang     /* It expects a ds3232 but a ds1338 is good enough */
80682b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "ds1338", 0x68);
80782b6a3f6SJohn Wang 
80882b6a3f6SJohn Wang     /* It expects a pca9555 but a pca9552 is compatible */
809f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x30);
81082b6a3f6SJohn Wang }
81182b6a3f6SJohn Wang 
rainier_bmc_i2c_init(AspeedMachineState * bmc)81258e52bdbSCédric Le Goater static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
81358e52bdbSCédric Le Goater {
8143c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
815fa6d98c0SJoel Stanley     I2CSlave *i2c_mux;
816fa6d98c0SJoel Stanley 
8179077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB);
81858e52bdbSCédric Le Goater 
819f4aec252SCédric Le Goater     create_pca9552(soc, 3, 0x61);
820bcb122f8SJoel Stanley 
82158e52bdbSCédric Le Goater     /* The rainier expects a TMP275 but a TMP105 is compatible */
82258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
82358e52bdbSCédric Le Goater                      0x48);
82458e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
82558e52bdbSCédric Le Goater                      0x49);
82658e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
82758e52bdbSCédric Le Goater                      0x4a);
828fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4),
829fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
8309077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
8319077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
8329077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB);
833f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x60);
83458e52bdbSCédric Le Goater 
83558e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
83658e52bdbSCédric Le Goater                      0x48);
83758e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
83858e52bdbSCédric Le Goater                      0x49);
839f4aec252SCédric Le Goater     create_pca9552(soc, 5, 0x60);
840f4aec252SCédric Le Goater     create_pca9552(soc, 5, 0x61);
841fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5),
842fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
8439077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
8449077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
84558e52bdbSCédric Le Goater 
84658e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
84758e52bdbSCédric Le Goater                      0x48);
84858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
84958e52bdbSCédric Le Goater                      0x4a);
85058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
85158e52bdbSCédric Le Goater                      0x4b);
852fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6),
853fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
8549077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
8559077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
8569077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB);
8579077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB);
85858e52bdbSCédric Le Goater 
859f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x30);
860f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x31);
861f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x32);
862f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x33);
863f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x60);
864f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x61);
865b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76);
86658e52bdbSCédric Le Goater     /* Bus 7: TODO si7021-a20@20 */
86758e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105,
86858e52bdbSCédric Le Goater                      0x48);
8692a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "max31785", 0x52);
8709077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB);
8719077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB);
87258e52bdbSCédric Le Goater 
87358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
87458e52bdbSCédric Le Goater                      0x48);
87558e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
87658e52bdbSCédric Le Goater                      0x4a);
877be85508fSNinad Palsule     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50,
878be85508fSNinad Palsule                           64 * KiB, rainier_bb_fruid, rainier_bb_fruid_len);
879be85508fSNinad Palsule     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51,
880be85508fSNinad Palsule                           64 * KiB, rainier_bmc_fruid, rainier_bmc_fruid_len);
881f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x60);
882f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x61);
88358e52bdbSCédric Le Goater     /* Bus 8: ucd90320@11 */
88458e52bdbSCédric Le Goater     /* Bus 8: ucd90320@b */
88558e52bdbSCédric Le Goater     /* Bus 8: ucd90320@c */
88658e52bdbSCédric Le Goater 
88758e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c);
88858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d);
8899077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB);
89058e52bdbSCédric Le Goater 
89158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c);
89258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d);
8939077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB);
89458e52bdbSCédric Le Goater 
89558e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
89658e52bdbSCédric Le Goater                      0x48);
89758e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
89858e52bdbSCédric Le Goater                      0x49);
899fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11),
900fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
9019077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
9029077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
903f4aec252SCédric Le Goater     create_pca9552(soc, 11, 0x60);
904fa6d98c0SJoel Stanley 
905fa6d98c0SJoel Stanley 
9069077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB);
907f4aec252SCédric Le Goater     create_pca9552(soc, 13, 0x60);
908fa6d98c0SJoel Stanley 
9099077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB);
910f4aec252SCédric Le Goater     create_pca9552(soc, 14, 0x60);
911fa6d98c0SJoel Stanley 
9129077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB);
913f4aec252SCédric Le Goater     create_pca9552(soc, 15, 0x60);
91458e52bdbSCédric Le Goater }
91558e52bdbSCédric Le Goater 
get_pca9548_channels(I2CBus * bus,uint8_t mux_addr,I2CBus ** channels)916febbe308SPeter Delevoryas static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr,
917febbe308SPeter Delevoryas                                  I2CBus **channels)
918febbe308SPeter Delevoryas {
919febbe308SPeter Delevoryas     I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr);
920febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
921febbe308SPeter Delevoryas         channels[i] = pca954x_i2c_get_bus(mux, i);
922febbe308SPeter Delevoryas     }
923febbe308SPeter Delevoryas }
924febbe308SPeter Delevoryas 
925febbe308SPeter Delevoryas #define TYPE_LM75 TYPE_TMP105
926febbe308SPeter Delevoryas #define TYPE_TMP75 TYPE_TMP105
927febbe308SPeter Delevoryas #define TYPE_TMP422 "tmp422"
928febbe308SPeter Delevoryas 
fuji_bmc_i2c_init(AspeedMachineState * bmc)929febbe308SPeter Delevoryas static void fuji_bmc_i2c_init(AspeedMachineState *bmc)
930febbe308SPeter Delevoryas {
9313c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
932febbe308SPeter Delevoryas     I2CBus *i2c[144] = {};
933febbe308SPeter Delevoryas 
934febbe308SPeter Delevoryas     for (int i = 0; i < 16; i++) {
935febbe308SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
936febbe308SPeter Delevoryas     }
937febbe308SPeter Delevoryas     I2CBus *i2c180 = i2c[2];
938febbe308SPeter Delevoryas     I2CBus *i2c480 = i2c[8];
939febbe308SPeter Delevoryas     I2CBus *i2c600 = i2c[11];
940febbe308SPeter Delevoryas 
941febbe308SPeter Delevoryas     get_pca9548_channels(i2c180, 0x70, &i2c[16]);
942febbe308SPeter Delevoryas     get_pca9548_channels(i2c480, 0x70, &i2c[24]);
943febbe308SPeter Delevoryas     /* NOTE: The device tree skips [32, 40) in the alias numbering */
944febbe308SPeter Delevoryas     get_pca9548_channels(i2c600, 0x77, &i2c[40]);
945febbe308SPeter Delevoryas     get_pca9548_channels(i2c[24], 0x71, &i2c[48]);
946febbe308SPeter Delevoryas     get_pca9548_channels(i2c[25], 0x72, &i2c[56]);
947febbe308SPeter Delevoryas     get_pca9548_channels(i2c[26], 0x76, &i2c[64]);
948febbe308SPeter Delevoryas     get_pca9548_channels(i2c[27], 0x76, &i2c[72]);
949febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
950febbe308SPeter Delevoryas         get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]);
951febbe308SPeter Delevoryas     }
952febbe308SPeter Delevoryas 
953febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c);
954febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d);
955febbe308SPeter Delevoryas 
956ef0eb67eSSittisak Sinprem     /*
957ef0eb67eSSittisak Sinprem      * EEPROM 24c64 size is 64Kbits or 8 Kbytes
958ef0eb67eSSittisak Sinprem      *        24c02 size is 2Kbits or 256 bytes
959ef0eb67eSSittisak Sinprem      */
960ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[19], 0x52, 8 * KiB);
961ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[20], 0x50, 256);
962ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[22], 0x52, 256);
963febbe308SPeter Delevoryas 
964febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x48);
965febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x49);
966febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x4a);
967febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_TMP422, 0x4c);
968febbe308SPeter Delevoryas 
969ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[8], 0x51, 8 * KiB);
970febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a);
971febbe308SPeter Delevoryas 
972febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[50], TYPE_LM75, 0x4c);
973ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[50], 0x52, 8 * KiB);
974febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[51], TYPE_TMP75, 0x48);
975febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[52], TYPE_TMP75, 0x49);
976febbe308SPeter Delevoryas 
977febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[59], TYPE_TMP75, 0x48);
978febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[60], TYPE_TMP75, 0x49);
979febbe308SPeter Delevoryas 
980ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[65], 0x53, 8 * KiB);
981febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x49);
982febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x48);
983ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[68], 0x52, 8 * KiB);
984ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[69], 0x52, 8 * KiB);
985ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[70], 0x52, 8 * KiB);
986ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[71], 0x52, 8 * KiB);
987febbe308SPeter Delevoryas 
988ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[73], 0x53, 8 * KiB);
989febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x49);
990febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x48);
991ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[76], 0x52, 8 * KiB);
992ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[77], 0x52, 8 * KiB);
993ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[78], 0x52, 8 * KiB);
994ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[79], 0x52, 8 * KiB);
995ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[28], 0x50, 256);
996febbe308SPeter Delevoryas 
997febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
9989077e09aSPeter Delevoryas         at24c_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB);
999febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[82 + i * 8], TYPE_TMP75, 0x48);
1000febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[83 + i * 8], TYPE_TMP75, 0x4b);
1001febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[84 + i * 8], TYPE_TMP75, 0x4a);
1002febbe308SPeter Delevoryas     }
1003febbe308SPeter Delevoryas }
1004febbe308SPeter Delevoryas 
1005a20c54b1SPatrick Williams #define TYPE_TMP421 "tmp421"
1006a20c54b1SPatrick Williams 
bletchley_bmc_i2c_init(AspeedMachineState * bmc)1007a20c54b1SPatrick Williams static void bletchley_bmc_i2c_init(AspeedMachineState *bmc)
1008a20c54b1SPatrick Williams {
10093c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
1010a20c54b1SPatrick Williams     I2CBus *i2c[13] = {};
1011a20c54b1SPatrick Williams     for (int i = 0; i < 13; i++) {
1012a20c54b1SPatrick Williams         if ((i == 8) || (i == 11)) {
1013a20c54b1SPatrick Williams             continue;
1014a20c54b1SPatrick Williams         }
1015a20c54b1SPatrick Williams         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
1016a20c54b1SPatrick Williams     }
1017a20c54b1SPatrick Williams 
1018a20c54b1SPatrick Williams     /* Bus 0 - 5 all have the same config. */
1019a20c54b1SPatrick Williams     for (int i = 0; i < 6; i++) {
1020a20c54b1SPatrick Williams         /* Missing model: ti,ina230 @ 0x45 */
1021a20c54b1SPatrick Williams         /* Missing model: mps,mp5023 @ 0x40 */
1022a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_TMP421, 0x4f);
1023a20c54b1SPatrick Williams         /* Missing model: nxp,pca9539 @ 0x76, but PCA9552 works enough */
1024a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x76);
1025a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x67);
1026a20c54b1SPatrick Williams         /* Missing model: fsc,fusb302 @ 0x22 */
1027a20c54b1SPatrick Williams     }
1028a20c54b1SPatrick Williams 
1029a20c54b1SPatrick Williams     /* Bus 6 */
1030a20c54b1SPatrick Williams     at24c_eeprom_init(i2c[6], 0x56, 65536);
1031a20c54b1SPatrick Williams     /* Missing model: nxp,pcf85263 @ 0x51 , but ds1338 works enough */
1032a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[6], "ds1338", 0x51);
1033a20c54b1SPatrick Williams 
1034a20c54b1SPatrick Williams 
1035a20c54b1SPatrick Williams     /* Bus 7 */
1036a20c54b1SPatrick Williams     at24c_eeprom_init(i2c[7], 0x54, 65536);
1037a20c54b1SPatrick Williams 
1038a20c54b1SPatrick Williams     /* Bus 9 */
1039a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[9], TYPE_TMP421, 0x4f);
1040a20c54b1SPatrick Williams 
1041a20c54b1SPatrick Williams     /* Bus 10 */
1042a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[10], TYPE_TMP421, 0x4f);
1043a20c54b1SPatrick Williams     /* Missing model: ti,hdc1080 @ 0x40 */
1044a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[10], TYPE_PCA9552, 0x67);
1045a20c54b1SPatrick Williams 
1046a20c54b1SPatrick Williams     /* Bus 12 */
1047a20c54b1SPatrick Williams     /* Missing model: adi,adm1278 @ 0x11 */
1048a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4c);
1049a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4d);
1050a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_PCA9552, 0x67);
1051a20c54b1SPatrick Williams }
1052a20c54b1SPatrick Williams 
fby35_i2c_init(AspeedMachineState * bmc)1053fa699e80SPeter Delevoryas static void fby35_i2c_init(AspeedMachineState *bmc)
1054fa699e80SPeter Delevoryas {
10553c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
1056fa699e80SPeter Delevoryas     I2CBus *i2c[16];
1057fa699e80SPeter Delevoryas 
1058fa699e80SPeter Delevoryas     for (int i = 0; i < 16; i++) {
1059fa699e80SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
1060fa699e80SPeter Delevoryas     }
1061fa699e80SPeter Delevoryas 
1062fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[2], TYPE_LM75, 0x4f);
1063fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_TMP421, 0x1f);
1064fa699e80SPeter Delevoryas     /* Hotswap controller is actually supposed to be mp5920 or ltc4282. */
1065fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[11], "adm1272", 0x44);
1066fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4e);
1067fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4f);
1068fa699e80SPeter Delevoryas 
10699077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[4], 0x51, 128 * KiB);
10709077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[6], 0x51, 128 * KiB);
1071c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[8], 0x50, 32 * KiB, fby35_nic_fruid,
1072c0216b94SPeter Delevoryas                           fby35_nic_fruid_len);
1073c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[11], 0x51, 128 * KiB, fby35_bb_fruid,
1074c0216b94SPeter Delevoryas                           fby35_bb_fruid_len);
1075c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[11], 0x54, 128 * KiB, fby35_bmc_fruid,
1076c0216b94SPeter Delevoryas                           fby35_bmc_fruid_len);
1077fa699e80SPeter Delevoryas 
1078fa699e80SPeter Delevoryas     /*
1079fa699e80SPeter Delevoryas      * TODO: There is a multi-master i2c connection to an AST1030 MiniBMC on
1080fa699e80SPeter Delevoryas      * buses 0, 1, 2, 3, and 9. Source address 0x10, target address 0x20 on
1081fa699e80SPeter Delevoryas      * each.
1082fa699e80SPeter Delevoryas      */
1083fa699e80SPeter Delevoryas }
1084fa699e80SPeter Delevoryas 
qcom_dc_scm_bmc_i2c_init(AspeedMachineState * bmc)1085fb6b3c8dSJae Hyun Yoo static void qcom_dc_scm_bmc_i2c_init(AspeedMachineState *bmc)
1086fb6b3c8dSJae Hyun Yoo {
10873c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
1088fb6b3c8dSJae Hyun Yoo 
1089fb6b3c8dSJae Hyun Yoo     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 15), "tmp105", 0x4d);
1090fb6b3c8dSJae Hyun Yoo }
1091fb6b3c8dSJae Hyun Yoo 
qcom_dc_scm_firework_i2c_init(AspeedMachineState * bmc)1092ece4cccdSGraeme Gregory static void qcom_dc_scm_firework_i2c_init(AspeedMachineState *bmc)
1093ece4cccdSGraeme Gregory {
10943c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
10952a7a5d5cSJae Hyun Yoo     I2CSlave *therm_mux, *cpuvr_mux;
1096ece4cccdSGraeme Gregory 
1097ece4cccdSGraeme Gregory     /* Create the generic DC-SCM hardware */
1098ece4cccdSGraeme Gregory     qcom_dc_scm_bmc_i2c_init(bmc);
1099ece4cccdSGraeme Gregory 
1100ece4cccdSGraeme Gregory     /* Now create the Firework specific hardware */
11012a75e8c3SMaheswara Kurapati 
11022a7a5d5cSJae Hyun Yoo     /* I2C7 CPUVR MUX */
11032a7a5d5cSJae Hyun Yoo     cpuvr_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
11042a7a5d5cSJae Hyun Yoo                                         "pca9546", 0x70);
11052a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 0), "pca9548", 0x72);
11062a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 1), "pca9548", 0x72);
11072a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 2), "pca9548", 0x72);
11082a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 3), "pca9548", 0x72);
11092a7a5d5cSJae Hyun Yoo 
1110cfc68f16SMaheswara Kurapati     /* I2C8 Thermal Diodes*/
1111cfc68f16SMaheswara Kurapati     therm_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
1112cfc68f16SMaheswara Kurapati                                         "pca9548", 0x70);
1113cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 0), TYPE_LM75, 0x4C);
1114cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 1), TYPE_LM75, 0x4C);
1115cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 2), TYPE_LM75, 0x48);
1116cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 3), TYPE_LM75, 0x48);
1117cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 4), TYPE_LM75, 0x48);
1118cfc68f16SMaheswara Kurapati 
11192a75e8c3SMaheswara Kurapati     /* I2C9 Fan Controller (MAX31785) */
11202a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x52);
11212a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x54);
1122ece4cccdSGraeme Gregory }
1123ece4cccdSGraeme Gregory 
aspeed_get_mmio_exec(Object * obj,Error ** errp)11241a15311aSCédric Le Goater static bool aspeed_get_mmio_exec(Object *obj, Error **errp)
11251a15311aSCédric Le Goater {
11261a15311aSCédric Le Goater     return ASPEED_MACHINE(obj)->mmio_exec;
11271a15311aSCédric Le Goater }
11281a15311aSCédric Le Goater 
aspeed_set_mmio_exec(Object * obj,bool value,Error ** errp)11291a15311aSCédric Le Goater static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp)
11301a15311aSCédric Le Goater {
11311a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = value;
11321a15311aSCédric Le Goater }
11331a15311aSCédric Le Goater 
aspeed_machine_instance_init(Object * obj)11341a15311aSCédric Le Goater static void aspeed_machine_instance_init(Object *obj)
11351a15311aSCédric Le Goater {
1136621845a9SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(obj);
1137621845a9SCédric Le Goater 
11381a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = false;
1139621845a9SCédric Le Goater     ASPEED_MACHINE(obj)->hw_strap1 = amc->hw_strap1;
11401a15311aSCédric Le Goater }
11411a15311aSCédric Le Goater 
aspeed_get_fmc_model(Object * obj,Error ** errp)11429820e52fSCédric Le Goater static char *aspeed_get_fmc_model(Object *obj, Error **errp)
11439820e52fSCédric Le Goater {
11449820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
11459820e52fSCédric Le Goater     return g_strdup(bmc->fmc_model);
11469820e52fSCédric Le Goater }
11479820e52fSCédric Le Goater 
aspeed_set_fmc_model(Object * obj,const char * value,Error ** errp)11489820e52fSCédric Le Goater static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp)
11499820e52fSCédric Le Goater {
11509820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
11519820e52fSCédric Le Goater 
11529820e52fSCédric Le Goater     g_free(bmc->fmc_model);
11539820e52fSCédric Le Goater     bmc->fmc_model = g_strdup(value);
11549820e52fSCédric Le Goater }
11559820e52fSCédric Le Goater 
aspeed_get_spi_model(Object * obj,Error ** errp)11569820e52fSCédric Le Goater static char *aspeed_get_spi_model(Object *obj, Error **errp)
11579820e52fSCédric Le Goater {
11589820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
11599820e52fSCédric Le Goater     return g_strdup(bmc->spi_model);
11609820e52fSCédric Le Goater }
11619820e52fSCédric Le Goater 
aspeed_set_spi_model(Object * obj,const char * value,Error ** errp)11629820e52fSCédric Le Goater static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp)
11639820e52fSCédric Le Goater {
11649820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
11659820e52fSCédric Le Goater 
11669820e52fSCédric Le Goater     g_free(bmc->spi_model);
11679820e52fSCédric Le Goater     bmc->spi_model = g_strdup(value);
11689820e52fSCédric Le Goater }
11699820e52fSCédric Le Goater 
aspeed_get_bmc_console(Object * obj,Error ** errp)1170f65f6ad5SCédric Le Goater static char *aspeed_get_bmc_console(Object *obj, Error **errp)
1171f65f6ad5SCédric Le Goater {
1172f65f6ad5SCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1173f65f6ad5SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
1174f65f6ad5SCédric Le Goater     int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default;
1175f65f6ad5SCédric Le Goater 
1176944128eeSJamin Lin     return g_strdup_printf("uart%d", aspeed_uart_index(uart_chosen));
1177f65f6ad5SCédric Le Goater }
1178f65f6ad5SCédric Le Goater 
aspeed_set_bmc_console(Object * obj,const char * value,Error ** errp)1179f65f6ad5SCédric Le Goater static void aspeed_set_bmc_console(Object *obj, const char *value, Error **errp)
1180f65f6ad5SCédric Le Goater {
1181f65f6ad5SCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1182f65f6ad5SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
1183f65f6ad5SCédric Le Goater     AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(amc->soc_name));
1184f65f6ad5SCédric Le Goater     int val;
1185944128eeSJamin Lin     int uart_first = aspeed_uart_first(sc);
1186944128eeSJamin Lin     int uart_last = aspeed_uart_last(sc);
1187f65f6ad5SCédric Le Goater 
1188f65f6ad5SCédric Le Goater     if (sscanf(value, "uart%u", &val) != 1) {
1189f65f6ad5SCédric Le Goater         error_setg(errp, "Bad value for \"uart\" property");
1190f65f6ad5SCédric Le Goater         return;
1191f65f6ad5SCédric Le Goater     }
1192f65f6ad5SCédric Le Goater 
1193f65f6ad5SCédric Le Goater     /* The number of UART depends on the SoC */
1194944128eeSJamin Lin     if (val < uart_first || val > uart_last) {
1195944128eeSJamin Lin         error_setg(errp, "\"uart\" should be in range [%d - %d]",
1196944128eeSJamin Lin                    uart_first, uart_last);
1197f65f6ad5SCédric Le Goater         return;
1198f65f6ad5SCédric Le Goater     }
1199944128eeSJamin Lin     bmc->uart_chosen = val + ASPEED_DEV_UART0;
1200f65f6ad5SCédric Le Goater }
1201f65f6ad5SCédric Le Goater 
aspeed_machine_class_props_init(ObjectClass * oc)12021a15311aSCédric Le Goater static void aspeed_machine_class_props_init(ObjectClass *oc)
12031a15311aSCédric Le Goater {
12041a15311aSCédric Le Goater     object_class_property_add_bool(oc, "execute-in-place",
12051a15311aSCédric Le Goater                                    aspeed_get_mmio_exec,
1206d2623129SMarkus Armbruster                                    aspeed_set_mmio_exec);
12071a15311aSCédric Le Goater     object_class_property_set_description(oc, "execute-in-place",
12087eecec7dSMarkus Armbruster                            "boot directly from CE0 flash device");
12099820e52fSCédric Le Goater 
1210f65f6ad5SCédric Le Goater     object_class_property_add_str(oc, "bmc-console", aspeed_get_bmc_console,
1211f65f6ad5SCédric Le Goater                                   aspeed_set_bmc_console);
1212f65f6ad5SCédric Le Goater     object_class_property_set_description(oc, "bmc-console",
1213f65f6ad5SCédric Le Goater                            "Change the default UART to \"uartX\"");
1214f65f6ad5SCédric Le Goater 
12159820e52fSCédric Le Goater     object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model,
12169820e52fSCédric Le Goater                                    aspeed_set_fmc_model);
12179820e52fSCédric Le Goater     object_class_property_set_description(oc, "fmc-model",
12189820e52fSCédric Le Goater                                           "Change the FMC Flash model");
12199820e52fSCédric Le Goater     object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model,
12209820e52fSCédric Le Goater                                    aspeed_set_spi_model);
12219820e52fSCédric Le Goater     object_class_property_set_description(oc, "spi-model",
12229820e52fSCédric Le Goater                                           "Change the SPI Flash model");
12231a15311aSCédric Le Goater }
12241a15311aSCédric Le Goater 
aspeed_machine_class_init_cpus_defaults(MachineClass * mc)122543a0a5c9SPhilippe Mathieu-Daudé static void aspeed_machine_class_init_cpus_defaults(MachineClass *mc)
1226b7f1a0cbSCédric Le Goater {
122743a0a5c9SPhilippe Mathieu-Daudé     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(mc);
122843a0a5c9SPhilippe Mathieu-Daudé     AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(amc->soc_name));
122943a0a5c9SPhilippe Mathieu-Daudé 
123043a0a5c9SPhilippe Mathieu-Daudé     mc->default_cpus = sc->num_cpus;
123143a0a5c9SPhilippe Mathieu-Daudé     mc->min_cpus = sc->num_cpus;
123243a0a5c9SPhilippe Mathieu-Daudé     mc->max_cpus = sc->num_cpus;
1233dc13909eSPhilippe Mathieu-Daudé     mc->valid_cpu_types = sc->valid_cpu_types;
1234b7f1a0cbSCédric Le Goater }
1235b7f1a0cbSCédric Le Goater 
aspeed_machine_ast2600_get_boot_from_emmc(Object * obj,Error ** errp)1236056b779eSCédric Le Goater static bool aspeed_machine_ast2600_get_boot_from_emmc(Object *obj, Error **errp)
1237056b779eSCédric Le Goater {
1238056b779eSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1239056b779eSCédric Le Goater 
1240056b779eSCédric Le Goater     return !!(bmc->hw_strap1 & SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC);
1241056b779eSCédric Le Goater }
1242056b779eSCédric Le Goater 
aspeed_machine_ast2600_set_boot_from_emmc(Object * obj,bool value,Error ** errp)1243056b779eSCédric Le Goater static void aspeed_machine_ast2600_set_boot_from_emmc(Object *obj, bool value,
1244056b779eSCédric Le Goater                                                       Error **errp)
1245056b779eSCédric Le Goater {
1246056b779eSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1247056b779eSCédric Le Goater 
1248056b779eSCédric Le Goater     if (value) {
1249056b779eSCédric Le Goater         bmc->hw_strap1 |= SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC;
1250056b779eSCédric Le Goater     } else {
1251056b779eSCédric Le Goater         bmc->hw_strap1 &= ~SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC;
1252056b779eSCédric Le Goater     }
1253056b779eSCédric Le Goater }
1254056b779eSCédric Le Goater 
aspeed_machine_ast2600_class_emmc_init(ObjectClass * oc)1255056b779eSCédric Le Goater static void aspeed_machine_ast2600_class_emmc_init(ObjectClass *oc)
1256056b779eSCédric Le Goater {
1257056b779eSCédric Le Goater     object_class_property_add_bool(oc, "boot-emmc",
1258056b779eSCédric Le Goater                                    aspeed_machine_ast2600_get_boot_from_emmc,
1259056b779eSCédric Le Goater                                    aspeed_machine_ast2600_set_boot_from_emmc);
1260056b779eSCédric Le Goater     object_class_property_set_description(oc, "boot-emmc",
1261056b779eSCédric Le Goater                                           "Set or unset boot from EMMC");
1262056b779eSCédric Le Goater }
1263056b779eSCédric Le Goater 
aspeed_machine_class_init(ObjectClass * oc,const void * data)126412d1a768SPhilippe Mathieu-Daudé static void aspeed_machine_class_init(ObjectClass *oc, const void *data)
126562c2c2ebSCédric Le Goater {
126662c2c2ebSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1267d3bad7e7SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
126862c2c2ebSCédric Le Goater 
1269fca9ca1bSCédric Le Goater     mc->init = aspeed_machine_init;
127062c2c2ebSCédric Le Goater     mc->no_floppy = 1;
127162c2c2ebSCédric Le Goater     mc->no_cdrom = 1;
127262c2c2ebSCédric Le Goater     mc->no_parallel = 1;
1273afcbaed6SIgor Mammedov     mc->default_ram_id = "ram";
1274d3bad7e7SCédric Le Goater     amc->macs_mask = ASPEED_MAC0_ON;
12755d63d0c7SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART5;
12761a15311aSCédric Le Goater 
12771a15311aSCédric Le Goater     aspeed_machine_class_props_init(oc);
127862c2c2ebSCédric Le Goater }
127962c2c2ebSCédric Le Goater 
aspeed_machine_palmetto_class_init(ObjectClass * oc,const void * data)128012d1a768SPhilippe Mathieu-Daudé static void aspeed_machine_palmetto_class_init(ObjectClass *oc,
128112d1a768SPhilippe Mathieu-Daudé                                                const void *data)
1282baa4732bSCédric Le Goater {
1283baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1284baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1285baa4732bSCédric Le Goater 
1286baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Palmetto BMC (ARM926EJ-S)";
1287baa4732bSCédric Le Goater     amc->soc_name  = "ast2400-a1";
1288baa4732bSCédric Le Goater     amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1;
1289baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
129070322913SCédric Le Goater     amc->spi_model = "mx25l25635f";
1291baa4732bSCédric Le Goater     amc->num_cs    = 1;
1292baa4732bSCédric Le Goater     amc->i2c_init  = palmetto_bmc_i2c_init;
1293cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
1294baa4732bSCédric Le Goater     mc->default_ram_size       = 256 * MiB;
129543a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1296baa4732bSCédric Le Goater };
1297baa4732bSCédric Le Goater 
aspeed_machine_quanta_q71l_class_init(ObjectClass * oc,const void * data)129812d1a768SPhilippe Mathieu-Daudé static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc,
129912d1a768SPhilippe Mathieu-Daudé                                                   const void *data)
13009cccb912SPatrick Venture {
13019cccb912SPatrick Venture     MachineClass *mc = MACHINE_CLASS(oc);
13029cccb912SPatrick Venture     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
13039cccb912SPatrick Venture 
13049cccb912SPatrick Venture     mc->desc       = "Quanta-Q71l BMC (ARM926EJ-S)";
13059cccb912SPatrick Venture     amc->soc_name  = "ast2400-a1";
13069cccb912SPatrick Venture     amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1;
13079cccb912SPatrick Venture     amc->fmc_model = "n25q256a";
13089cccb912SPatrick Venture     amc->spi_model = "mx25l25635e";
13099cccb912SPatrick Venture     amc->num_cs    = 1;
13109cccb912SPatrick Venture     amc->i2c_init  = quanta_q71l_bmc_i2c_init;
1311cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
13129cccb912SPatrick Venture     mc->default_ram_size       = 128 * MiB;
131343a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
13149cccb912SPatrick Venture }
13159cccb912SPatrick Venture 
aspeed_machine_supermicrox11_bmc_class_init(ObjectClass * oc,const void * data)131640a38df5SErik Smit static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc,
131712d1a768SPhilippe Mathieu-Daudé                                                         const void *data)
131840a38df5SErik Smit {
131940a38df5SErik Smit     MachineClass *mc = MACHINE_CLASS(oc);
132040a38df5SErik Smit     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
132140a38df5SErik Smit 
132240a38df5SErik Smit     mc->desc       = "Supermicro X11 BMC (ARM926EJ-S)";
132340a38df5SErik Smit     amc->soc_name  = "ast2400-a1";
132440a38df5SErik Smit     amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1;
132540a38df5SErik Smit     amc->fmc_model = "mx25l25635e";
132640a38df5SErik Smit     amc->spi_model = "mx25l25635e";
132740a38df5SErik Smit     amc->num_cs    = 1;
132840a38df5SErik Smit     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
132940a38df5SErik Smit     amc->i2c_init  = palmetto_bmc_i2c_init;
1330cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
133140a38df5SErik Smit     mc->default_ram_size = 256 * MiB;
133243a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
133340a38df5SErik Smit }
133440a38df5SErik Smit 
aspeed_machine_supermicro_x11spi_bmc_class_init(ObjectClass * oc,const void * data)133547936597SGuenter Roeck static void aspeed_machine_supermicro_x11spi_bmc_class_init(ObjectClass *oc,
133612d1a768SPhilippe Mathieu-Daudé                                                             const void *data)
133747936597SGuenter Roeck {
133847936597SGuenter Roeck     MachineClass *mc = MACHINE_CLASS(oc);
133947936597SGuenter Roeck     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
134047936597SGuenter Roeck 
134147936597SGuenter Roeck     mc->desc       = "Supermicro X11 SPI BMC (ARM1176)";
134247936597SGuenter Roeck     amc->soc_name  = "ast2500-a1";
134347936597SGuenter Roeck     amc->hw_strap1 = SUPERMICRO_X11SPI_BMC_HW_STRAP1;
134447936597SGuenter Roeck     amc->fmc_model = "mx25l25635e";
134547936597SGuenter Roeck     amc->spi_model = "mx25l25635e";
134647936597SGuenter Roeck     amc->num_cs    = 1;
134747936597SGuenter Roeck     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
134847936597SGuenter Roeck     amc->i2c_init  = palmetto_bmc_i2c_init;
1349cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
135047936597SGuenter Roeck     mc->default_ram_size = 512 * MiB;
135143a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
135247936597SGuenter Roeck }
135347936597SGuenter Roeck 
aspeed_machine_ast2500_evb_class_init(ObjectClass * oc,const void * data)135412d1a768SPhilippe Mathieu-Daudé static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc,
135512d1a768SPhilippe Mathieu-Daudé                                                   const void *data)
1356baa4732bSCédric Le Goater {
1357baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1358baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1359baa4732bSCédric Le Goater 
1360baa4732bSCédric Le Goater     mc->desc       = "Aspeed AST2500 EVB (ARM1176)";
1361baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1362baa4732bSCédric Le Goater     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
1363753abfc4SJae Hyun Yoo     amc->fmc_model = "mx25l25635e";
136470322913SCédric Le Goater     amc->spi_model = "mx25l25635f";
1365baa4732bSCédric Le Goater     amc->num_cs    = 1;
1366baa4732bSCédric Le Goater     amc->i2c_init  = ast2500_evb_i2c_init;
1367cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
1368baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
136943a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1370baa4732bSCédric Le Goater };
1371baa4732bSCédric Le Goater 
aspeed_machine_yosemitev2_class_init(ObjectClass * oc,const void * data)137212d1a768SPhilippe Mathieu-Daudé static void aspeed_machine_yosemitev2_class_init(ObjectClass *oc,
137312d1a768SPhilippe Mathieu-Daudé                                                  const void *data)
137434f73a81SKarthikeyan Pasupathi {
137534f73a81SKarthikeyan Pasupathi     MachineClass *mc = MACHINE_CLASS(oc);
137634f73a81SKarthikeyan Pasupathi     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
137734f73a81SKarthikeyan Pasupathi 
137834f73a81SKarthikeyan Pasupathi     mc->desc       = "Facebook YosemiteV2 BMC (ARM1176)";
137934f73a81SKarthikeyan Pasupathi     amc->soc_name  = "ast2500-a1";
138034f73a81SKarthikeyan Pasupathi     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
138134f73a81SKarthikeyan Pasupathi     amc->hw_strap2 = 0;
138234f73a81SKarthikeyan Pasupathi     amc->fmc_model = "n25q256a";
138334f73a81SKarthikeyan Pasupathi     amc->spi_model = "mx25l25635e";
138434f73a81SKarthikeyan Pasupathi     amc->num_cs    = 2;
138534f73a81SKarthikeyan Pasupathi     amc->i2c_init  = yosemitev2_bmc_i2c_init;
1386cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
138734f73a81SKarthikeyan Pasupathi     mc->default_ram_size       = 512 * MiB;
138843a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
138934f73a81SKarthikeyan Pasupathi };
139034f73a81SKarthikeyan Pasupathi 
aspeed_machine_romulus_class_init(ObjectClass * oc,const void * data)139112d1a768SPhilippe Mathieu-Daudé static void aspeed_machine_romulus_class_init(ObjectClass *oc,
139212d1a768SPhilippe Mathieu-Daudé                                               const void *data)
1393baa4732bSCédric Le Goater {
1394baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1395baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1396baa4732bSCédric Le Goater 
1397baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Romulus BMC (ARM1176)";
1398baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1399baa4732bSCédric Le Goater     amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1;
1400baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
1401baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1402baa4732bSCédric Le Goater     amc->num_cs    = 2;
1403baa4732bSCédric Le Goater     amc->i2c_init  = romulus_bmc_i2c_init;
1404cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
1405baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
140643a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1407baa4732bSCédric Le Goater };
1408baa4732bSCédric Le Goater 
aspeed_machine_tiogapass_class_init(ObjectClass * oc,const void * data)140912d1a768SPhilippe Mathieu-Daudé static void aspeed_machine_tiogapass_class_init(ObjectClass *oc,
141012d1a768SPhilippe Mathieu-Daudé                                                 const void *data)
14116c323abaSKarthikeyan Pasupathi {
14126c323abaSKarthikeyan Pasupathi     MachineClass *mc = MACHINE_CLASS(oc);
14136c323abaSKarthikeyan Pasupathi     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
14146c323abaSKarthikeyan Pasupathi 
14156c323abaSKarthikeyan Pasupathi     mc->desc       = "Facebook Tiogapass BMC (ARM1176)";
14166c323abaSKarthikeyan Pasupathi     amc->soc_name  = "ast2500-a1";
14176c323abaSKarthikeyan Pasupathi     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
14186c323abaSKarthikeyan Pasupathi     amc->hw_strap2 = 0;
14196c323abaSKarthikeyan Pasupathi     amc->fmc_model = "n25q256a";
14206c323abaSKarthikeyan Pasupathi     amc->spi_model = "mx25l25635e";
14216c323abaSKarthikeyan Pasupathi     amc->num_cs    = 2;
14226c323abaSKarthikeyan Pasupathi     amc->i2c_init  = tiogapass_bmc_i2c_init;
1423cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
14246c323abaSKarthikeyan Pasupathi     mc->default_ram_size       = 1 * GiB;
142543a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
14266c323abaSKarthikeyan Pasupathi };
14276c323abaSKarthikeyan Pasupathi 
aspeed_machine_sonorapass_class_init(ObjectClass * oc,const void * data)142812d1a768SPhilippe Mathieu-Daudé static void aspeed_machine_sonorapass_class_init(ObjectClass *oc,
142912d1a768SPhilippe Mathieu-Daudé                                                  const void *data)
1430143b040fSPatrick Williams {
1431143b040fSPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1432143b040fSPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1433143b040fSPatrick Williams 
1434143b040fSPatrick Williams     mc->desc       = "OCP SonoraPass BMC (ARM1176)";
1435143b040fSPatrick Williams     amc->soc_name  = "ast2500-a1";
1436143b040fSPatrick Williams     amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1;
1437143b040fSPatrick Williams     amc->fmc_model = "mx66l1g45g";
1438143b040fSPatrick Williams     amc->spi_model = "mx66l1g45g";
1439143b040fSPatrick Williams     amc->num_cs    = 2;
1440143b040fSPatrick Williams     amc->i2c_init  = sonorapass_bmc_i2c_init;
1441cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
1442143b040fSPatrick Williams     mc->default_ram_size       = 512 * MiB;
144343a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1444143b040fSPatrick Williams };
1445143b040fSPatrick Williams 
aspeed_machine_witherspoon_class_init(ObjectClass * oc,const void * data)144612d1a768SPhilippe Mathieu-Daudé static void aspeed_machine_witherspoon_class_init(ObjectClass *oc,
144712d1a768SPhilippe Mathieu-Daudé                                                   const void *data)
1448baa4732bSCédric Le Goater {
1449baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1450baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1451baa4732bSCédric Le Goater 
1452baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Witherspoon BMC (ARM1176)";
1453baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1454baa4732bSCédric Le Goater     amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1;
145570322913SCédric Le Goater     amc->fmc_model = "mx25l25635f";
1456baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1457baa4732bSCédric Le Goater     amc->num_cs    = 2;
1458baa4732bSCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init;
1459cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
1460baa4732bSCédric Le Goater     mc->default_ram_size = 512 * MiB;
146143a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1462baa4732bSCédric Le Goater };
1463baa4732bSCédric Le Goater 
aspeed_machine_ast2600_evb_class_init(ObjectClass * oc,const void * data)146412d1a768SPhilippe Mathieu-Daudé static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc,
146512d1a768SPhilippe Mathieu-Daudé                                                   const void *data)
1466baa4732bSCédric Le Goater {
1467baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1468baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1469baa4732bSCédric Le Goater 
1470f548f201SPeter Maydell     mc->desc       = "Aspeed AST2600 EVB (Cortex-A7)";
1471c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
1472baa4732bSCédric Le Goater     amc->hw_strap1 = AST2600_EVB_HW_STRAP1;
1473baa4732bSCédric Le Goater     amc->hw_strap2 = AST2600_EVB_HW_STRAP2;
1474753abfc4SJae Hyun Yoo     amc->fmc_model = "mx66u51235f";
1475baa4732bSCédric Le Goater     amc->spi_model = "mx66u51235f";
1476baa4732bSCédric Le Goater     amc->num_cs    = 1;
147729193286SGuenter Roeck     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON |
147829193286SGuenter Roeck                      ASPEED_MAC3_ON;
1479bf8a471aSJamin Lin     amc->sdhci_wp_inverted = true;
1480baa4732bSCédric Le Goater     amc->i2c_init  = ast2600_evb_i2c_init;
1481cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
1482baa4732bSCédric Le Goater     mc->default_ram_size = 1 * GiB;
148343a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1484056b779eSCédric Le Goater     aspeed_machine_ast2600_class_emmc_init(oc);
1485baa4732bSCédric Le Goater };
1486baa4732bSCédric Le Goater 
aspeed_machine_g220a_class_init(ObjectClass * oc,const void * data)148712d1a768SPhilippe Mathieu-Daudé static void aspeed_machine_g220a_class_init(ObjectClass *oc, const void *data)
148895f068c8SJohn Wang {
148995f068c8SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
149095f068c8SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
149195f068c8SJohn Wang 
149295f068c8SJohn Wang     mc->desc       = "Bytedance G220A BMC (ARM1176)";
149395f068c8SJohn Wang     amc->soc_name  = "ast2500-a1";
149495f068c8SJohn Wang     amc->hw_strap1 = G220A_BMC_HW_STRAP1;
149595f068c8SJohn Wang     amc->fmc_model = "n25q512a";
149695f068c8SJohn Wang     amc->spi_model = "mx25l25635e";
149795f068c8SJohn Wang     amc->num_cs    = 2;
14985bb825c8SGuenter Roeck     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
149995f068c8SJohn Wang     amc->i2c_init  = g220a_bmc_i2c_init;
1500cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
150195f068c8SJohn Wang     mc->default_ram_size = 1024 * MiB;
150243a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
150395f068c8SJohn Wang };
150495f068c8SJohn Wang 
aspeed_machine_fp5280g2_class_init(ObjectClass * oc,const void * data)150512d1a768SPhilippe Mathieu-Daudé static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc,
150612d1a768SPhilippe Mathieu-Daudé                                                const void *data)
150782b6a3f6SJohn Wang {
150882b6a3f6SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
150982b6a3f6SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
151082b6a3f6SJohn Wang 
151182b6a3f6SJohn Wang     mc->desc       = "Inspur FP5280G2 BMC (ARM1176)";
151282b6a3f6SJohn Wang     amc->soc_name  = "ast2500-a1";
151382b6a3f6SJohn Wang     amc->hw_strap1 = FP5280G2_BMC_HW_STRAP1;
151482b6a3f6SJohn Wang     amc->fmc_model = "n25q512a";
151582b6a3f6SJohn Wang     amc->spi_model = "mx25l25635e";
151682b6a3f6SJohn Wang     amc->num_cs    = 2;
151782b6a3f6SJohn Wang     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
151882b6a3f6SJohn Wang     amc->i2c_init  = fp5280g2_bmc_i2c_init;
1519cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
152082b6a3f6SJohn Wang     mc->default_ram_size = 512 * MiB;
152143a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
152282b6a3f6SJohn Wang };
152382b6a3f6SJohn Wang 
aspeed_machine_rainier_class_init(ObjectClass * oc,const void * data)152412d1a768SPhilippe Mathieu-Daudé static void aspeed_machine_rainier_class_init(ObjectClass *oc, const void *data)
152558e52bdbSCédric Le Goater {
152658e52bdbSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
152758e52bdbSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
152858e52bdbSCédric Le Goater 
1529f548f201SPeter Maydell     mc->desc       = "IBM Rainier BMC (Cortex-A7)";
1530c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
153158e52bdbSCédric Le Goater     amc->hw_strap1 = RAINIER_BMC_HW_STRAP1;
153258e52bdbSCédric Le Goater     amc->hw_strap2 = RAINIER_BMC_HW_STRAP2;
153358e52bdbSCédric Le Goater     amc->fmc_model = "mx66l1g45g";
153458e52bdbSCédric Le Goater     amc->spi_model = "mx66l1g45g";
153558e52bdbSCédric Le Goater     amc->num_cs    = 2;
153658e52bdbSCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
153758e52bdbSCédric Le Goater     amc->i2c_init  = rainier_bmc_i2c_init;
1538cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
153958e52bdbSCédric Le Goater     mc->default_ram_size = 1 * GiB;
154043a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1541056b779eSCédric Le Goater     aspeed_machine_ast2600_class_emmc_init(oc);
154258e52bdbSCédric Le Goater };
154358e52bdbSCédric Le Goater 
15441e2c22c9SCédric Le Goater #define FUJI_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB)
1545febbe308SPeter Delevoryas 
aspeed_machine_fuji_class_init(ObjectClass * oc,const void * data)154612d1a768SPhilippe Mathieu-Daudé static void aspeed_machine_fuji_class_init(ObjectClass *oc, const void *data)
1547febbe308SPeter Delevoryas {
1548febbe308SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1549febbe308SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1550febbe308SPeter Delevoryas 
1551febbe308SPeter Delevoryas     mc->desc = "Facebook Fuji BMC (Cortex-A7)";
1552febbe308SPeter Delevoryas     amc->soc_name = "ast2600-a3";
1553febbe308SPeter Delevoryas     amc->hw_strap1 = FUJI_BMC_HW_STRAP1;
1554febbe308SPeter Delevoryas     amc->hw_strap2 = FUJI_BMC_HW_STRAP2;
1555febbe308SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1556febbe308SPeter Delevoryas     amc->spi_model = "mx66l1g45g";
1557febbe308SPeter Delevoryas     amc->num_cs = 2;
1558febbe308SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1559febbe308SPeter Delevoryas     amc->i2c_init = fuji_bmc_i2c_init;
1560febbe308SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART1;
1561cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
1562febbe308SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
156343a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1564febbe308SPeter Delevoryas };
1565febbe308SPeter Delevoryas 
15661e2c22c9SCédric Le Goater #define BLETCHLEY_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB)
1567104bdaffSPatrick Williams 
aspeed_machine_bletchley_class_init(ObjectClass * oc,const void * data)156812d1a768SPhilippe Mathieu-Daudé static void aspeed_machine_bletchley_class_init(ObjectClass *oc,
156912d1a768SPhilippe Mathieu-Daudé                                                 const void *data)
1570a20c54b1SPatrick Williams {
1571a20c54b1SPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1572a20c54b1SPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1573a20c54b1SPatrick Williams 
1574a20c54b1SPatrick Williams     mc->desc       = "Facebook Bletchley BMC (Cortex-A7)";
1575a20c54b1SPatrick Williams     amc->soc_name  = "ast2600-a3";
1576a20c54b1SPatrick Williams     amc->hw_strap1 = BLETCHLEY_BMC_HW_STRAP1;
1577a20c54b1SPatrick Williams     amc->hw_strap2 = BLETCHLEY_BMC_HW_STRAP2;
1578a20c54b1SPatrick Williams     amc->fmc_model = "w25q01jvq";
1579a20c54b1SPatrick Williams     amc->spi_model = NULL;
1580a20c54b1SPatrick Williams     amc->num_cs    = 2;
1581a20c54b1SPatrick Williams     amc->macs_mask = ASPEED_MAC2_ON;
1582a20c54b1SPatrick Williams     amc->i2c_init  = bletchley_bmc_i2c_init;
1583cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
1584104bdaffSPatrick Williams     mc->default_ram_size = BLETCHLEY_BMC_RAM_SIZE;
158543a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1586a20c54b1SPatrick Williams }
1587a20c54b1SPatrick Williams 
fby35_reset(MachineState * state,ResetType type)15881b063fe2SJuraj Marcin static void fby35_reset(MachineState *state, ResetType type)
1589fa699e80SPeter Delevoryas {
1590fa699e80SPeter Delevoryas     AspeedMachineState *bmc = ASPEED_MACHINE(state);
15913c392e87SPhilippe Mathieu-Daudé     AspeedGPIOState *gpio = &bmc->soc->gpio;
1592fa699e80SPeter Delevoryas 
15931b063fe2SJuraj Marcin     qemu_devices_reset(type);
1594fa699e80SPeter Delevoryas 
1595f0418558SPeter Delevoryas     /* Board ID: 7 (Class-1, 4 slots) */
1596fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV4", true, &error_fatal);
1597fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV5", true, &error_fatal);
1598fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV6", true, &error_fatal);
1599fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV7", false, &error_fatal);
1600f0418558SPeter Delevoryas 
1601f0418558SPeter Delevoryas     /* Slot presence pins, inverse polarity. (False means present) */
1602f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH4", false, &error_fatal);
1603f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH5", true, &error_fatal);
1604f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH6", true, &error_fatal);
1605f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH7", true, &error_fatal);
1606f0418558SPeter Delevoryas 
1607f0418558SPeter Delevoryas     /* Slot 12v power pins, normal polarity. (True means powered-on) */
1608f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB2", true, &error_fatal);
1609f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB3", false, &error_fatal);
1610f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB4", false, &error_fatal);
1611f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB5", false, &error_fatal);
1612fa699e80SPeter Delevoryas }
1613fa699e80SPeter Delevoryas 
aspeed_machine_fby35_class_init(ObjectClass * oc,const void * data)161412d1a768SPhilippe Mathieu-Daudé static void aspeed_machine_fby35_class_init(ObjectClass *oc, const void *data)
1615fa699e80SPeter Delevoryas {
1616fa699e80SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1617fa699e80SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1618fa699e80SPeter Delevoryas 
1619fa699e80SPeter Delevoryas     mc->desc       = "Facebook fby35 BMC (Cortex-A7)";
1620fa699e80SPeter Delevoryas     mc->reset      = fby35_reset;
1621fa699e80SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1622fa699e80SPeter Delevoryas     amc->num_cs    = 2;
1623fa699e80SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1624fa699e80SPeter Delevoryas     amc->i2c_init  = fby35_i2c_init;
1625cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
1626fa699e80SPeter Delevoryas     /* FIXME: Replace this macro with something more general */
1627fa699e80SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
162843a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1629fa699e80SPeter Delevoryas }
1630fa699e80SPeter Delevoryas 
163166c895b8SJamin Lin #define AST1030_INTERNAL_FLASH_SIZE (1024 * 1024)
163266c895b8SJamin Lin /* Main SYSCLK frequency in Hz (200MHz) */
163366c895b8SJamin Lin #define SYSCLK_FRQ 200000000ULL
163466c895b8SJamin Lin 
aspeed_minibmc_machine_init(MachineState * machine)163566c895b8SJamin Lin static void aspeed_minibmc_machine_init(MachineState *machine)
163666c895b8SJamin Lin {
163766c895b8SJamin Lin     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
163866c895b8SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
163966c895b8SJamin Lin     Clock *sysclk;
164066c895b8SJamin Lin 
164166c895b8SJamin Lin     sysclk = clock_new(OBJECT(machine), "SYSCLK");
164266c895b8SJamin Lin     clock_set_hz(sysclk, SYSCLK_FRQ);
164366c895b8SJamin Lin 
16443c392e87SPhilippe Mathieu-Daudé     bmc->soc = ASPEED_SOC(object_new(amc->soc_name));
16453c392e87SPhilippe Mathieu-Daudé     object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc));
16463c392e87SPhilippe Mathieu-Daudé     object_unref(OBJECT(bmc->soc));
16473c392e87SPhilippe Mathieu-Daudé     qdev_connect_clock_in(DEVICE(bmc->soc), "sysclk", sysclk);
164866c895b8SJamin Lin 
16493c392e87SPhilippe Mathieu-Daudé     object_property_set_link(OBJECT(bmc->soc), "memory",
16504dd9d554SPeter Delevoryas                              OBJECT(get_system_memory()), &error_abort);
1651d2b3eaefSPeter Delevoryas     connect_serial_hds_to_uarts(bmc);
16523c392e87SPhilippe Mathieu-Daudé     qdev_realize(DEVICE(bmc->soc), NULL, &error_abort);
165366c895b8SJamin Lin 
165422b3c557SJamin Lin     if (defaults_enabled()) {
16553c392e87SPhilippe Mathieu-Daudé         aspeed_board_init_flashes(&bmc->soc->fmc,
165666c895b8SJamin Lin                             bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
165766c895b8SJamin Lin                             amc->num_cs,
165866c895b8SJamin Lin                             0);
165966c895b8SJamin Lin 
16603c392e87SPhilippe Mathieu-Daudé         aspeed_board_init_flashes(&bmc->soc->spi[0],
166166c895b8SJamin Lin                             bmc->spi_model ? bmc->spi_model : amc->spi_model,
166266c895b8SJamin Lin                             amc->num_cs, amc->num_cs);
166366c895b8SJamin Lin 
16643c392e87SPhilippe Mathieu-Daudé         aspeed_board_init_flashes(&bmc->soc->spi[1],
166566c895b8SJamin Lin                             bmc->spi_model ? bmc->spi_model : amc->spi_model,
166666c895b8SJamin Lin                             amc->num_cs, (amc->num_cs * 2));
166722b3c557SJamin Lin     }
166866c895b8SJamin Lin 
166966c895b8SJamin Lin     if (amc->i2c_init) {
167066c895b8SJamin Lin         amc->i2c_init(bmc);
167166c895b8SJamin Lin     }
167266c895b8SJamin Lin 
167366c895b8SJamin Lin     armv7m_load_kernel(ARM_CPU(first_cpu),
167466c895b8SJamin Lin                        machine->kernel_filename,
1675761c532aSPeter Maydell                        0,
167666c895b8SJamin Lin                        AST1030_INTERNAL_FLASH_SIZE);
167766c895b8SJamin Lin }
167866c895b8SJamin Lin 
ast1030_evb_i2c_init(AspeedMachineState * bmc)16794c70ab16STroy Lee static void ast1030_evb_i2c_init(AspeedMachineState *bmc)
16804c70ab16STroy Lee {
16813c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
16824c70ab16STroy Lee 
1683673d8215SMichael Tokarev     /* U10 24C08 connects to SDA/SCL Group 1 by default */
16844c70ab16STroy Lee     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
16854c70ab16STroy Lee     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, eeprom_buf);
16864c70ab16STroy Lee 
16874c70ab16STroy Lee     /* U11 LM75 connects to SDA/SCL Group 2 by default */
16884c70ab16STroy Lee     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d);
16894c70ab16STroy Lee }
16904c70ab16STroy Lee 
aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass * oc,const void * data)169166c895b8SJamin Lin static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc,
169212d1a768SPhilippe Mathieu-Daudé                                                           const void *data)
169366c895b8SJamin Lin {
169466c895b8SJamin Lin     MachineClass *mc = MACHINE_CLASS(oc);
169566c895b8SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
169666c895b8SJamin Lin 
169766c895b8SJamin Lin     mc->desc = "Aspeed AST1030 MiniBMC (Cortex-M4)";
169866c895b8SJamin Lin     amc->soc_name = "ast1030-a1";
169966c895b8SJamin Lin     amc->hw_strap1 = 0;
170066c895b8SJamin Lin     amc->hw_strap2 = 0;
170166c895b8SJamin Lin     mc->init = aspeed_minibmc_machine_init;
17024c70ab16STroy Lee     amc->i2c_init = ast1030_evb_i2c_init;
170366c895b8SJamin Lin     mc->default_ram_size = 0;
1704e15001bcSJamin Lin     amc->fmc_model = "w25q80bl";
1705a37bbfbbSJamin Lin     amc->spi_model = "w25q256";
170666c895b8SJamin Lin     amc->num_cs = 2;
170766c895b8SJamin Lin     amc->macs_mask = 0;
170843a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
170966c895b8SJamin Lin }
171066c895b8SJamin Lin 
171192707992SJamin Lin #ifdef TARGET_AARCH64
ast2700_evb_i2c_init(AspeedMachineState * bmc)17122c075ff3SJamin Lin static void ast2700_evb_i2c_init(AspeedMachineState *bmc)
17132c075ff3SJamin Lin {
17142c075ff3SJamin Lin     AspeedSoCState *soc = bmc->soc;
17152c075ff3SJamin Lin 
17162c075ff3SJamin Lin     /* LM75 is compatible with TMP105 driver */
17172c075ff3SJamin Lin     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0),
17182c075ff3SJamin Lin                             TYPE_TMP105, 0x4d);
17192c075ff3SJamin Lin }
17202c075ff3SJamin Lin 
aspeed_machine_ast2700a0_evb_class_init(ObjectClass * oc,const void * data)172112d1a768SPhilippe Mathieu-Daudé static void aspeed_machine_ast2700a0_evb_class_init(ObjectClass *oc,
172212d1a768SPhilippe Mathieu-Daudé                                                     const void *data)
172392707992SJamin Lin {
172492707992SJamin Lin     MachineClass *mc = MACHINE_CLASS(oc);
172592707992SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
172692707992SJamin Lin 
1727de4e9799SJamin Lin     mc->alias = "ast2700-evb";
1728de4e9799SJamin Lin     mc->desc = "Aspeed AST2700 A0 EVB (Cortex-A35)";
172992707992SJamin Lin     amc->soc_name  = "ast2700-a0";
173092707992SJamin Lin     amc->hw_strap1 = AST2700_EVB_HW_STRAP1;
173192707992SJamin Lin     amc->hw_strap2 = AST2700_EVB_HW_STRAP2;
173292707992SJamin Lin     amc->fmc_model = "w25q01jvq";
173392707992SJamin Lin     amc->spi_model = "w25q512jv";
173492707992SJamin Lin     amc->num_cs    = 2;
173592707992SJamin Lin     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON;
173692707992SJamin Lin     amc->uart_default = ASPEED_DEV_UART12;
17372c075ff3SJamin Lin     amc->i2c_init  = ast2700_evb_i2c_init;
1738*ee447054SJamin Lin     amc->vbootrom = true;
1739cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
174092707992SJamin Lin     mc->default_ram_size = 1 * GiB;
174192707992SJamin Lin     aspeed_machine_class_init_cpus_defaults(mc);
174292707992SJamin Lin }
1743498c519eSJamin Lin 
aspeed_machine_ast2700a1_evb_class_init(ObjectClass * oc,const void * data)174412d1a768SPhilippe Mathieu-Daudé static void aspeed_machine_ast2700a1_evb_class_init(ObjectClass *oc,
174512d1a768SPhilippe Mathieu-Daudé                                                     const void *data)
1746498c519eSJamin Lin {
1747498c519eSJamin Lin     MachineClass *mc = MACHINE_CLASS(oc);
1748498c519eSJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1749498c519eSJamin Lin 
1750498c519eSJamin Lin     mc->desc = "Aspeed AST2700 A1 EVB (Cortex-A35)";
1751498c519eSJamin Lin     amc->soc_name  = "ast2700-a1";
1752498c519eSJamin Lin     amc->hw_strap1 = AST2700_EVB_HW_STRAP1;
1753498c519eSJamin Lin     amc->hw_strap2 = AST2700_EVB_HW_STRAP2;
1754498c519eSJamin Lin     amc->fmc_model = "w25q01jvq";
1755498c519eSJamin Lin     amc->spi_model = "w25q512jv";
1756498c519eSJamin Lin     amc->num_cs    = 2;
1757498c519eSJamin Lin     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON;
1758498c519eSJamin Lin     amc->uart_default = ASPEED_DEV_UART12;
1759498c519eSJamin Lin     amc->i2c_init  = ast2700_evb_i2c_init;
1760*ee447054SJamin Lin     amc->vbootrom = true;
1761498c519eSJamin Lin     mc->auto_create_sdcard = true;
1762498c519eSJamin Lin     mc->default_ram_size = 1 * GiB;
1763498c519eSJamin Lin     aspeed_machine_class_init_cpus_defaults(mc);
1764498c519eSJamin Lin }
176592707992SJamin Lin #endif
176692707992SJamin Lin 
aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass * oc,const void * data)1767fb6b3c8dSJae Hyun Yoo static void aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass *oc,
176812d1a768SPhilippe Mathieu-Daudé                                                      const void *data)
1769fb6b3c8dSJae Hyun Yoo {
1770fb6b3c8dSJae Hyun Yoo     MachineClass *mc = MACHINE_CLASS(oc);
1771fb6b3c8dSJae Hyun Yoo     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1772fb6b3c8dSJae Hyun Yoo 
1773fb6b3c8dSJae Hyun Yoo     mc->desc       = "Qualcomm DC-SCM V1 BMC (Cortex A7)";
1774fb6b3c8dSJae Hyun Yoo     amc->soc_name  = "ast2600-a3";
1775fb6b3c8dSJae Hyun Yoo     amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1776fb6b3c8dSJae Hyun Yoo     amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1777fb6b3c8dSJae Hyun Yoo     amc->fmc_model = "n25q512a";
1778fb6b3c8dSJae Hyun Yoo     amc->spi_model = "n25q512a";
1779fb6b3c8dSJae Hyun Yoo     amc->num_cs    = 2;
1780fb6b3c8dSJae Hyun Yoo     amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1781fb6b3c8dSJae Hyun Yoo     amc->i2c_init  = qcom_dc_scm_bmc_i2c_init;
1782cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
1783fb6b3c8dSJae Hyun Yoo     mc->default_ram_size = 1 * GiB;
178443a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1785fb6b3c8dSJae Hyun Yoo };
1786fb6b3c8dSJae Hyun Yoo 
aspeed_machine_qcom_firework_class_init(ObjectClass * oc,const void * data)1787ece4cccdSGraeme Gregory static void aspeed_machine_qcom_firework_class_init(ObjectClass *oc,
178812d1a768SPhilippe Mathieu-Daudé                                                     const void *data)
1789ece4cccdSGraeme Gregory {
1790ece4cccdSGraeme Gregory     MachineClass *mc = MACHINE_CLASS(oc);
1791ece4cccdSGraeme Gregory     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1792ece4cccdSGraeme Gregory 
1793ece4cccdSGraeme Gregory     mc->desc       = "Qualcomm DC-SCM V1/Firework BMC (Cortex A7)";
1794ece4cccdSGraeme Gregory     amc->soc_name  = "ast2600-a3";
1795ece4cccdSGraeme Gregory     amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1796ece4cccdSGraeme Gregory     amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1797ece4cccdSGraeme Gregory     amc->fmc_model = "n25q512a";
1798ece4cccdSGraeme Gregory     amc->spi_model = "n25q512a";
1799ece4cccdSGraeme Gregory     amc->num_cs    = 2;
1800ece4cccdSGraeme Gregory     amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1801ece4cccdSGraeme Gregory     amc->i2c_init  = qcom_dc_scm_firework_i2c_init;
1802cdc8d7caSPhilippe Mathieu-Daudé     mc->auto_create_sdcard = true;
1803ece4cccdSGraeme Gregory     mc->default_ram_size = 1 * GiB;
180443a0a5c9SPhilippe Mathieu-Daudé     aspeed_machine_class_init_cpus_defaults(mc);
1805ece4cccdSGraeme Gregory };
1806ece4cccdSGraeme Gregory 
1807baa4732bSCédric Le Goater static const TypeInfo aspeed_machine_types[] = {
1808baa4732bSCédric Le Goater     {
1809baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("palmetto-bmc"),
1810baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1811baa4732bSCédric Le Goater         .class_init    = aspeed_machine_palmetto_class_init,
1812baa4732bSCédric Le Goater     }, {
181340a38df5SErik Smit         .name          = MACHINE_TYPE_NAME("supermicrox11-bmc"),
181440a38df5SErik Smit         .parent        = TYPE_ASPEED_MACHINE,
181540a38df5SErik Smit         .class_init    = aspeed_machine_supermicrox11_bmc_class_init,
181640a38df5SErik Smit     }, {
181747936597SGuenter Roeck         .name          = MACHINE_TYPE_NAME("supermicro-x11spi-bmc"),
181847936597SGuenter Roeck         .parent        = TYPE_ASPEED_MACHINE,
181947936597SGuenter Roeck         .class_init    = aspeed_machine_supermicro_x11spi_bmc_class_init,
182047936597SGuenter Roeck     }, {
1821baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2500-evb"),
1822baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1823baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2500_evb_class_init,
1824baa4732bSCédric Le Goater     }, {
1825baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("romulus-bmc"),
1826baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1827baa4732bSCédric Le Goater         .class_init    = aspeed_machine_romulus_class_init,
1828baa4732bSCédric Le Goater     }, {
1829143b040fSPatrick Williams         .name          = MACHINE_TYPE_NAME("sonorapass-bmc"),
1830143b040fSPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1831143b040fSPatrick Williams         .class_init    = aspeed_machine_sonorapass_class_init,
1832143b040fSPatrick Williams     }, {
1833baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("witherspoon-bmc"),
1834baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1835baa4732bSCédric Le Goater         .class_init    = aspeed_machine_witherspoon_class_init,
1836baa4732bSCédric Le Goater     }, {
1837baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2600-evb"),
1838baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1839baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2600_evb_class_init,
1840baa4732bSCédric Le Goater     }, {
184134f73a81SKarthikeyan Pasupathi         .name          = MACHINE_TYPE_NAME("yosemitev2-bmc"),
184234f73a81SKarthikeyan Pasupathi         .parent        = TYPE_ASPEED_MACHINE,
184334f73a81SKarthikeyan Pasupathi         .class_init    = aspeed_machine_yosemitev2_class_init,
184434f73a81SKarthikeyan Pasupathi     }, {
18456c323abaSKarthikeyan Pasupathi         .name          = MACHINE_TYPE_NAME("tiogapass-bmc"),
18466c323abaSKarthikeyan Pasupathi         .parent        = TYPE_ASPEED_MACHINE,
18476c323abaSKarthikeyan Pasupathi         .class_init    = aspeed_machine_tiogapass_class_init,
18486c323abaSKarthikeyan Pasupathi     }, {
184995f068c8SJohn Wang         .name          = MACHINE_TYPE_NAME("g220a-bmc"),
185095f068c8SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
185195f068c8SJohn Wang         .class_init    = aspeed_machine_g220a_class_init,
185295f068c8SJohn Wang     }, {
1853fb6b3c8dSJae Hyun Yoo         .name          = MACHINE_TYPE_NAME("qcom-dc-scm-v1-bmc"),
1854fb6b3c8dSJae Hyun Yoo         .parent        = TYPE_ASPEED_MACHINE,
1855fb6b3c8dSJae Hyun Yoo         .class_init    = aspeed_machine_qcom_dc_scm_v1_class_init,
1856fb6b3c8dSJae Hyun Yoo     }, {
1857ece4cccdSGraeme Gregory         .name          = MACHINE_TYPE_NAME("qcom-firework-bmc"),
1858ece4cccdSGraeme Gregory         .parent        = TYPE_ASPEED_MACHINE,
1859ece4cccdSGraeme Gregory         .class_init    = aspeed_machine_qcom_firework_class_init,
1860ece4cccdSGraeme Gregory     }, {
186182b6a3f6SJohn Wang         .name          = MACHINE_TYPE_NAME("fp5280g2-bmc"),
186282b6a3f6SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
186382b6a3f6SJohn Wang         .class_init    = aspeed_machine_fp5280g2_class_init,
186482b6a3f6SJohn Wang     }, {
18659cccb912SPatrick Venture         .name          = MACHINE_TYPE_NAME("quanta-q71l-bmc"),
18669cccb912SPatrick Venture         .parent        = TYPE_ASPEED_MACHINE,
18679cccb912SPatrick Venture         .class_init    = aspeed_machine_quanta_q71l_class_init,
18689cccb912SPatrick Venture     }, {
186958e52bdbSCédric Le Goater         .name          = MACHINE_TYPE_NAME("rainier-bmc"),
187058e52bdbSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
187158e52bdbSCédric Le Goater         .class_init    = aspeed_machine_rainier_class_init,
187258e52bdbSCédric Le Goater     }, {
1873febbe308SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fuji-bmc"),
1874febbe308SPeter Delevoryas         .parent        = TYPE_ASPEED_MACHINE,
1875febbe308SPeter Delevoryas         .class_init    = aspeed_machine_fuji_class_init,
1876febbe308SPeter Delevoryas     }, {
1877a20c54b1SPatrick Williams         .name          = MACHINE_TYPE_NAME("bletchley-bmc"),
1878a20c54b1SPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1879a20c54b1SPatrick Williams         .class_init    = aspeed_machine_bletchley_class_init,
1880a20c54b1SPatrick Williams     }, {
1881fa699e80SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fby35-bmc"),
1882fa699e80SPeter Delevoryas         .parent        = MACHINE_TYPE_NAME("ast2600-evb"),
1883fa699e80SPeter Delevoryas         .class_init    = aspeed_machine_fby35_class_init,
1884fa699e80SPeter Delevoryas     }, {
188566c895b8SJamin Lin         .name           = MACHINE_TYPE_NAME("ast1030-evb"),
188666c895b8SJamin Lin         .parent         = TYPE_ASPEED_MACHINE,
188766c895b8SJamin Lin         .class_init     = aspeed_minibmc_machine_ast1030_evb_class_init,
188892707992SJamin Lin #ifdef TARGET_AARCH64
188992707992SJamin Lin     }, {
1890de4e9799SJamin Lin         .name          = MACHINE_TYPE_NAME("ast2700a0-evb"),
189192707992SJamin Lin         .parent        = TYPE_ASPEED_MACHINE,
1892de4e9799SJamin Lin         .class_init    = aspeed_machine_ast2700a0_evb_class_init,
1893498c519eSJamin Lin         }, {
1894498c519eSJamin Lin         .name          = MACHINE_TYPE_NAME("ast2700a1-evb"),
1895498c519eSJamin Lin         .parent        = TYPE_ASPEED_MACHINE,
1896498c519eSJamin Lin         .class_init    = aspeed_machine_ast2700a1_evb_class_init,
189792707992SJamin Lin #endif
189866c895b8SJamin Lin     }, {
1899fca9ca1bSCédric Le Goater         .name          = TYPE_ASPEED_MACHINE,
190062c2c2ebSCédric Le Goater         .parent        = TYPE_MACHINE,
1901888b2b03SPhilippe Mathieu-Daudé         .instance_size = sizeof(AspeedMachineState),
19021a15311aSCédric Le Goater         .instance_init = aspeed_machine_instance_init,
1903fca9ca1bSCédric Le Goater         .class_size    = sizeof(AspeedMachineClass),
1904fca9ca1bSCédric Le Goater         .class_init    = aspeed_machine_class_init,
1905baa4732bSCédric Le Goater         .abstract      = true,
1906baa4732bSCédric Le Goater     }
1907fca9ca1bSCédric Le Goater };
190874fb1f38SCédric Le Goater 
1909baa4732bSCédric Le Goater DEFINE_TYPES(aspeed_machine_types)
1910