xref: /qemu/hw/arm/aspeed.c (revision 3c392e87df051d457429274af55fe967808d6cb6)
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"
21044475f3SPhilippe Mathieu-Daudé #include "hw/misc/pca9552.h"
229618ebaeSPeter Delevoryas #include "hw/nvram/eeprom_at24c.h"
235e9ae4b1SCorey Minyard #include "hw/sensor/tmp105.h"
247cfbde5eSPhilippe Mathieu-Daudé #include "hw/misc/led.h"
25a27bd6c7SMarkus Armbruster #include "hw/qdev-properties.h"
26e1ad9bc4SCédric Le Goater #include "sysemu/block-backend.h"
27fa699e80SPeter Delevoryas #include "sysemu/reset.h"
28d769a1daSCédric Le Goater #include "hw/loader.h"
29d769a1daSCédric Le Goater #include "qemu/error-report.h"
30a9df9622SJoel Stanley #include "qemu/units.h"
3166c895b8SJamin Lin #include "hw/qdev-clock.h"
32d2b3eaefSPeter Delevoryas #include "sysemu/sysemu.h"
33327d8e4eSAndrew Jeffery 
3474fb1f38SCédric Le Goater static struct arm_boot_info aspeed_board_binfo = {
35b033271fSCédric Le Goater     .board_id = -1, /* device-tree-only board */
36327d8e4eSAndrew Jeffery };
37327d8e4eSAndrew Jeffery 
38612b219aSPhilippe Mathieu-Daudé struct AspeedMachineState {
39888b2b03SPhilippe Mathieu-Daudé     /* Private */
40888b2b03SPhilippe Mathieu-Daudé     MachineState parent_obj;
41888b2b03SPhilippe Mathieu-Daudé     /* Public */
42888b2b03SPhilippe Mathieu-Daudé 
43*3c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc;
44262259eaSCédric Le Goater     MemoryRegion boot_rom;
45888b2b03SPhilippe Mathieu-Daudé     bool mmio_exec;
46f65f6ad5SCédric Le Goater     uint32_t uart_chosen;
479820e52fSCédric Le Goater     char *fmc_model;
489820e52fSCédric Le Goater     char *spi_model;
49ea066d39SThomas Huth };
50327d8e4eSAndrew Jeffery 
511e2c22c9SCédric Le Goater /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */
521e2c22c9SCédric Le Goater #if HOST_LONG_BITS == 32
531e2c22c9SCédric Le Goater #define ASPEED_RAM_SIZE(sz) MIN((sz), 1 * GiB)
541e2c22c9SCédric Le Goater #else
551e2c22c9SCédric Le Goater #define ASPEED_RAM_SIZE(sz) (sz)
561e2c22c9SCédric Le Goater #endif
571e2c22c9SCédric Le Goater 
58ef17f836SCédric Le Goater /* Palmetto hardware value: 0x120CE416 */
598da33ef7SCédric Le Goater #define PALMETTO_BMC_HW_STRAP1 (                                        \
608da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_256MB) |               \
618da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2 /* DDR3 with CL=6, CWL=5 */) | \
628da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
638da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) |       \
648da33ef7SCédric Le Goater         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
658da33ef7SCédric Le Goater         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
668da33ef7SCédric Le Goater         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) |                \
678da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
688da33ef7SCédric Le Goater         SCU_HW_STRAP_SPI_WIDTH |                                        \
698da33ef7SCédric Le Goater         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
708da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
718da33ef7SCédric Le Goater 
7240a38df5SErik Smit /* TODO: Find the actual hardware value */
7340a38df5SErik Smit #define SUPERMICROX11_BMC_HW_STRAP1 (                                   \
7440a38df5SErik Smit         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) |               \
7540a38df5SErik Smit         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2) |                           \
7640a38df5SErik Smit         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
7740a38df5SErik Smit         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) |       \
7840a38df5SErik Smit         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
7940a38df5SErik Smit         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
8040a38df5SErik Smit         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) |                \
8140a38df5SErik Smit         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
8240a38df5SErik Smit         SCU_HW_STRAP_SPI_WIDTH |                                        \
8340a38df5SErik Smit         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
8440a38df5SErik Smit         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
8540a38df5SErik Smit 
8647936597SGuenter Roeck /* TODO: Find the actual hardware value */
8747936597SGuenter Roeck #define SUPERMICRO_X11SPI_BMC_HW_STRAP1 (                               \
8847936597SGuenter Roeck         AST2500_HW_STRAP1_DEFAULTS |                                    \
8947936597SGuenter Roeck         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
9047936597SGuenter Roeck         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
9147936597SGuenter Roeck         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
9247936597SGuenter Roeck         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
9347936597SGuenter Roeck         SCU_HW_STRAP_SPI_WIDTH |                                        \
9447936597SGuenter Roeck         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN))
9547936597SGuenter Roeck 
96ef17f836SCédric Le Goater /* AST2500 evb hardware value: 0xF100C2E6 */
979a7c1750SCédric Le Goater #define AST2500_EVB_HW_STRAP1 ((                                        \
989a7c1750SCédric Le Goater         AST2500_HW_STRAP1_DEFAULTS |                                    \
999a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
1009a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
1019a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
1029a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
1039a7c1750SCédric Le Goater         SCU_HW_STRAP_MAC1_RGMII |                                       \
1049a7c1750SCédric Le Goater         SCU_HW_STRAP_MAC0_RGMII) &                                      \
1059a7c1750SCédric Le Goater         ~SCU_HW_STRAP_2ND_BOOT_WDT)
1069a7c1750SCédric Le Goater 
107ef17f836SCédric Le Goater /* Romulus hardware value: 0xF10AD206 */
108ef17f836SCédric Le Goater #define ROMULUS_BMC_HW_STRAP1 (                                         \
109ef17f836SCédric Le Goater         AST2500_HW_STRAP1_DEFAULTS |                                    \
110ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
111ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
112ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
113ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
114ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_ACPI_ENABLE |                              \
115ef17f836SCédric Le Goater         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER))
116ef17f836SCédric Le Goater 
117143b040fSPatrick Williams /* Sonorapass hardware value: 0xF100D216 */
118143b040fSPatrick Williams #define SONORAPASS_BMC_HW_STRAP1 (                                      \
119143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
120143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
121143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
122143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
123143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
124143b040fSPatrick Williams         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
125143b040fSPatrick Williams         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
126143b040fSPatrick Williams         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
127143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
128143b040fSPatrick Williams         SCU_HW_STRAP_VGA_BIOS_ROM |                                     \
129143b040fSPatrick Williams         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
130143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_RESERVED1)
131143b040fSPatrick Williams 
13295f068c8SJohn Wang #define G220A_BMC_HW_STRAP1 (                                      \
13395f068c8SJohn Wang         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
13495f068c8SJohn Wang         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
13595f068c8SJohn Wang         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
13695f068c8SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
13795f068c8SJohn Wang         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
13895f068c8SJohn Wang         SCU_HW_STRAP_2ND_BOOT_WDT |                                     \
13995f068c8SJohn Wang         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
14095f068c8SJohn Wang         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
14195f068c8SJohn Wang         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
14295f068c8SJohn Wang         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
14395f068c8SJohn Wang         SCU_HW_STRAP_VGA_SIZE_SET(VGA_64M_DRAM) |                       \
14495f068c8SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED1)
14595f068c8SJohn Wang 
14682b6a3f6SJohn Wang /* FP5280G2 hardware value: 0XF100D286 */
14782b6a3f6SJohn Wang #define FP5280G2_BMC_HW_STRAP1 (                                      \
14882b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
14982b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
15082b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
15182b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
15282b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
15382b6a3f6SJohn Wang         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
15482b6a3f6SJohn Wang         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
15582b6a3f6SJohn Wang         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
15682b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
15782b6a3f6SJohn Wang         SCU_HW_STRAP_MAC1_RGMII |                                       \
15882b6a3f6SJohn Wang         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
15982b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED1)
16082b6a3f6SJohn Wang 
16162c2c2ebSCédric Le Goater /* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */
16262c2c2ebSCédric Le Goater #define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1
16362c2c2ebSCédric Le Goater 
1649cccb912SPatrick Venture /* Quanta-Q71l hardware value */
1659cccb912SPatrick Venture #define QUANTA_Q71L_BMC_HW_STRAP1 (                                     \
1669cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) |               \
1679cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2/* DDR3 with CL=6, CWL=5 */) | \
1689cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
1699cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_24M_IN) |       \
1709cccb912SPatrick Venture         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
1719cccb912SPatrick Venture         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_PASS_THROUGH) |          \
1729cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
1739cccb912SPatrick Venture         SCU_HW_STRAP_SPI_WIDTH |                                        \
1749cccb912SPatrick Venture         SCU_HW_STRAP_VGA_SIZE_SET(VGA_8M_DRAM) |                        \
1759cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
1769cccb912SPatrick Venture 
177ccc2c418SCédric Le Goater /* AST2600 evb hardware value */
178ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP1 0x000000C0
179ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP2 0x00000003
180ccc2c418SCédric Le Goater 
18163ceb818SCédric Le Goater /* Tacoma hardware value */
18263ceb818SCédric Le Goater #define TACOMA_BMC_HW_STRAP1  0x00000000
1837582591aSJoel Stanley #define TACOMA_BMC_HW_STRAP2  0x00000040
18463ceb818SCédric Le Goater 
18558e52bdbSCédric Le Goater /* Rainier hardware value: (QEMU prototype) */
186b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP1 0x00422016
187b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP2 0x80000848
18858e52bdbSCédric Le Goater 
189febbe308SPeter Delevoryas /* Fuji hardware value */
190febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP1    0x00000000
191febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP2    0x00000000
192febbe308SPeter Delevoryas 
193a20c54b1SPatrick Williams /* Bletchley hardware value */
194a20c54b1SPatrick Williams /* TODO: Leave same as EVB for now. */
195a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP1 AST2600_EVB_HW_STRAP1
196a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP2 AST2600_EVB_HW_STRAP2
197a20c54b1SPatrick Williams 
198fb6b3c8dSJae Hyun Yoo /* Qualcomm DC-SCM hardware value */
199fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP1  0x00000000
200fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP2  0x00000041
201fb6b3c8dSJae Hyun Yoo 
2029bb6d140SJoel Stanley #define AST_SMP_MAILBOX_BASE            0x1e6e2180
2039bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_ENTRY        (AST_SMP_MAILBOX_BASE + 0x0)
2049bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_GOSIGN       (AST_SMP_MAILBOX_BASE + 0x4)
2059bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_READY        (AST_SMP_MAILBOX_BASE + 0x8)
2069bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_POLLINSN     (AST_SMP_MAILBOX_BASE + 0xc)
2079bb6d140SJoel Stanley #define AST_SMP_MBOX_CODE               (AST_SMP_MAILBOX_BASE + 0x10)
2089bb6d140SJoel Stanley #define AST_SMP_MBOX_GOSIGN             0xabbaab00
2099bb6d140SJoel Stanley 
2109bb6d140SJoel Stanley static void aspeed_write_smpboot(ARMCPU *cpu,
2119bb6d140SJoel Stanley                                  const struct arm_boot_info *info)
2129bb6d140SJoel Stanley {
213902bba54SCédric Le Goater     AddressSpace *as = arm_boot_address_space(cpu, info);
214902bba54SCédric Le Goater     static const ARMInsnFixup poll_mailbox_ready[] = {
2159bb6d140SJoel Stanley         /*
2169bb6d140SJoel Stanley          * r2 = per-cpu go sign value
2179bb6d140SJoel Stanley          * r1 = AST_SMP_MBOX_FIELD_ENTRY
2189bb6d140SJoel Stanley          * r0 = AST_SMP_MBOX_FIELD_GOSIGN
2199bb6d140SJoel Stanley          */
220902bba54SCédric Le Goater         { 0xee100fb0 },  /* mrc     p15, 0, r0, c0, c0, 5 */
221902bba54SCédric Le Goater         { 0xe21000ff },  /* ands    r0, r0, #255          */
222902bba54SCédric Le Goater         { 0xe59f201c },  /* ldr     r2, [pc, #28]         */
223902bba54SCédric Le Goater         { 0xe1822000 },  /* orr     r2, r2, r0            */
2249bb6d140SJoel Stanley 
225902bba54SCédric Le Goater         { 0xe59f1018 },  /* ldr     r1, [pc, #24]         */
226902bba54SCédric Le Goater         { 0xe59f0018 },  /* ldr     r0, [pc, #24]         */
2279bb6d140SJoel Stanley 
228902bba54SCédric Le Goater         { 0xe320f002 },  /* wfe                           */
229902bba54SCédric Le Goater         { 0xe5904000 },  /* ldr     r4, [r0]              */
230902bba54SCédric Le Goater         { 0xe1520004 },  /* cmp     r2, r4                */
231902bba54SCédric Le Goater         { 0x1afffffb },  /* bne     <wfe>                 */
232902bba54SCédric Le Goater         { 0xe591f000 },  /* ldr     pc, [r1]              */
233902bba54SCédric Le Goater         { AST_SMP_MBOX_GOSIGN },
234902bba54SCédric Le Goater         { AST_SMP_MBOX_FIELD_ENTRY },
235902bba54SCédric Le Goater         { AST_SMP_MBOX_FIELD_GOSIGN },
236902bba54SCédric Le Goater         { 0, FIXUP_TERMINATOR }
2379bb6d140SJoel Stanley     };
238902bba54SCédric Le Goater     static const uint32_t fixupcontext[FIXUP_MAX] = { 0 };
2399bb6d140SJoel Stanley 
240902bba54SCédric Le Goater     arm_write_bootloader("aspeed.smpboot", as, info->smp_loader_start,
241902bba54SCédric Le Goater                          poll_mailbox_ready, fixupcontext);
2429bb6d140SJoel Stanley }
2439bb6d140SJoel Stanley 
2449bb6d140SJoel Stanley static void aspeed_reset_secondary(ARMCPU *cpu,
2459bb6d140SJoel Stanley                                    const struct arm_boot_info *info)
2469bb6d140SJoel Stanley {
2479bb6d140SJoel Stanley     AddressSpace *as = arm_boot_address_space(cpu, info);
2489bb6d140SJoel Stanley     CPUState *cs = CPU(cpu);
2499bb6d140SJoel Stanley 
2509bb6d140SJoel Stanley     /* info->smp_bootreg_addr */
2519bb6d140SJoel Stanley     address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0,
2529bb6d140SJoel Stanley                                MEMTXATTRS_UNSPECIFIED, NULL);
2539bb6d140SJoel Stanley     cpu_set_pc(cs, info->smp_loader_start);
2549bb6d140SJoel Stanley }
2559bb6d140SJoel Stanley 
2568b744a6aSCédric Le Goater static void write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size,
257d769a1daSCédric Le Goater                            Error **errp)
258d769a1daSCédric Le Goater {
25905e6e40aSWentao_Liang     g_autofree void *storage = NULL;
2600c7209beSCédric Le Goater     int64_t size;
261d769a1daSCédric Le Goater 
2620c7209beSCédric Le Goater     /* The block backend size should have already been 'validated' by
2630c7209beSCédric Le Goater      * the creation of the m25p80 object.
2640c7209beSCédric Le Goater      */
2650c7209beSCédric Le Goater     size = blk_getlength(blk);
2660c7209beSCédric Le Goater     if (size <= 0) {
2670c7209beSCédric Le Goater         error_setg(errp, "failed to get flash size");
2680c7209beSCédric Le Goater         return;
2690c7209beSCédric Le Goater     }
2700c7209beSCédric Le Goater 
2710c7209beSCédric Le Goater     if (rom_size > size) {
2720c7209beSCédric Le Goater         rom_size = size;
273d769a1daSCédric Le Goater     }
274d769a1daSCédric Le Goater 
27505e6e40aSWentao_Liang     storage = g_malloc0(rom_size);
276a9262f55SAlberto Faria     if (blk_pread(blk, 0, rom_size, storage, 0) < 0) {
277d769a1daSCédric Le Goater         error_setg(errp, "failed to read the initial flash content");
278d769a1daSCédric Le Goater         return;
279d769a1daSCédric Le Goater     }
280d769a1daSCédric Le Goater 
281d769a1daSCédric Le Goater     rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr);
282d769a1daSCédric Le Goater }
283d769a1daSCédric Le Goater 
2848b744a6aSCédric Le Goater /*
2858b744a6aSCédric Le Goater  * Create a ROM and copy the flash contents at the expected address
2868b744a6aSCédric Le Goater  * (0x0). Boots faster than execute-in-place.
2878b744a6aSCédric Le Goater  */
288262259eaSCédric Le Goater static void aspeed_install_boot_rom(AspeedMachineState *bmc, BlockBackend *blk,
2898b744a6aSCédric Le Goater                                     uint64_t rom_size)
2908b744a6aSCédric Le Goater {
291*3c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
2928b744a6aSCédric Le Goater 
293262259eaSCédric Le Goater     memory_region_init_rom(&bmc->boot_rom, NULL, "aspeed.boot_rom", rom_size,
2948b744a6aSCédric Le Goater                            &error_abort);
2958b744a6aSCédric Le Goater     memory_region_add_subregion_overlap(&soc->spi_boot_container, 0,
296262259eaSCédric Le Goater                                         &bmc->boot_rom, 1);
2978b744a6aSCédric Le Goater     write_boot_rom(blk, ASPEED_SOC_SPI_BOOT_ADDR, rom_size, &error_abort);
2988b744a6aSCédric Le Goater }
2998b744a6aSCédric Le Goater 
3001099ad10SPeter Delevoryas void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
3019bd4ac61SCédric Le Goater                                       unsigned int count, int unit0)
302e1ad9bc4SCédric Le Goater {
303e1ad9bc4SCédric Le Goater     int i;
304179b2058SPatrick Williams 
305179b2058SPatrick Williams     if (!flashtype) {
306179b2058SPatrick Williams         return;
307179b2058SPatrick Williams     }
308e1ad9bc4SCédric Le Goater 
3099bd4ac61SCédric Le Goater     for (i = 0; i < count; ++i) {
3108ec239f2SMarkus Armbruster         DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i);
311a7d78befSCédric Le Goater         DeviceState *dev;
312e1ad9bc4SCédric Le Goater 
313a7d78befSCédric Le Goater         dev = qdev_new(flashtype);
314e1ad9bc4SCédric Le Goater         if (dinfo) {
315a7d78befSCédric Le Goater             qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo));
316e1ad9bc4SCédric Le Goater         }
31727a2c66cSCédric Le Goater         qdev_prop_set_uint8(dev, "cs", i);
318a7d78befSCédric Le Goater         qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal);
319e1ad9bc4SCédric Le Goater     }
320e1ad9bc4SCédric Le Goater }
321e1ad9bc4SCédric Le Goater 
322a29e3e12SAndrew Jeffery static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo)
323a29e3e12SAndrew Jeffery {
324a29e3e12SAndrew Jeffery         DeviceState *card;
325a29e3e12SAndrew Jeffery 
326756f739bSPhilippe Mathieu-Daudé         if (!dinfo) {
327756f739bSPhilippe Mathieu-Daudé             return;
328756f739bSPhilippe Mathieu-Daudé         }
3293e80f690SMarkus Armbruster         card = qdev_new(TYPE_SD_CARD);
330934df912SMarkus Armbruster         qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
331a29e3e12SAndrew Jeffery                                 &error_fatal);
3323e80f690SMarkus Armbruster         qdev_realize_and_unref(card,
3333e80f690SMarkus Armbruster                                qdev_get_child_bus(DEVICE(sdhci), "sd-bus"),
3343e80f690SMarkus Armbruster                                &error_fatal);
335a29e3e12SAndrew Jeffery }
336a29e3e12SAndrew Jeffery 
337d2b3eaefSPeter Delevoryas static void connect_serial_hds_to_uarts(AspeedMachineState *bmc)
338d2b3eaefSPeter Delevoryas {
339d2b3eaefSPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
340*3c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *s = bmc->soc;
341d2b3eaefSPeter Delevoryas     AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
342f65f6ad5SCédric Le Goater     int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default;
343d2b3eaefSPeter Delevoryas 
344f65f6ad5SCédric Le Goater     aspeed_soc_uart_set_chr(s, uart_chosen, serial_hd(0));
345d2b3eaefSPeter Delevoryas     for (int i = 1, uart = ASPEED_DEV_UART1; i < sc->uarts_num; i++, uart++) {
346f65f6ad5SCédric Le Goater         if (uart == uart_chosen) {
347d2b3eaefSPeter Delevoryas             continue;
348d2b3eaefSPeter Delevoryas         }
349d2b3eaefSPeter Delevoryas         aspeed_soc_uart_set_chr(s, uart, serial_hd(i));
350d2b3eaefSPeter Delevoryas     }
351d2b3eaefSPeter Delevoryas }
352d2b3eaefSPeter Delevoryas 
353baa4732bSCédric Le Goater static void aspeed_machine_init(MachineState *machine)
354327d8e4eSAndrew Jeffery {
355888b2b03SPhilippe Mathieu-Daudé     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
356baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
357b033271fSCédric Le Goater     AspeedSoCClass *sc;
3582bea128cSEddie James     int i;
359d3bad7e7SCédric Le Goater     NICInfo *nd = &nd_table[0];
360327d8e4eSAndrew Jeffery 
361*3c392e87SPhilippe Mathieu-Daudé     bmc->soc = ASPEED_SOC(object_new(amc->soc_name));
362*3c392e87SPhilippe Mathieu-Daudé     object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc));
363*3c392e87SPhilippe Mathieu-Daudé     object_unref(OBJECT(bmc->soc));
364*3c392e87SPhilippe Mathieu-Daudé     sc = ASPEED_SOC_GET_CLASS(bmc->soc);
365b033271fSCédric Le Goater 
366533eb415SIgor Mammedov     /*
367346160cbSCédric Le Goater      * This will error out if the RAM size is not supported by the
368346160cbSCédric Le Goater      * memory controller of the SoC.
369533eb415SIgor Mammedov      */
370*3c392e87SPhilippe Mathieu-Daudé     object_property_set_uint(OBJECT(bmc->soc), "ram-size", machine->ram_size,
371533eb415SIgor Mammedov                              &error_fatal);
372533eb415SIgor Mammedov 
373d3bad7e7SCédric Le Goater     for (i = 0; i < sc->macs_num; i++) {
374d3bad7e7SCédric Le Goater         if ((amc->macs_mask & (1 << i)) && nd->used) {
375d3bad7e7SCédric Le Goater             qemu_check_nic_model(nd, TYPE_FTGMAC100);
376*3c392e87SPhilippe Mathieu-Daudé             qdev_set_nic_properties(DEVICE(&bmc->soc->ftgmac100[i]), nd);
377d3bad7e7SCédric Le Goater             nd++;
378d3bad7e7SCédric Le Goater         }
379d3bad7e7SCédric Le Goater     }
380d3bad7e7SCédric Le Goater 
381*3c392e87SPhilippe Mathieu-Daudé     object_property_set_int(OBJECT(bmc->soc), "hw-strap1", amc->hw_strap1,
38287e79af0SAndrew Jeffery                             &error_abort);
383*3c392e87SPhilippe Mathieu-Daudé     object_property_set_int(OBJECT(bmc->soc), "hw-strap2", amc->hw_strap2,
384ccc2c418SCédric Le Goater                             &error_abort);
385*3c392e87SPhilippe Mathieu-Daudé     object_property_set_link(OBJECT(bmc->soc), "memory",
3864dd9d554SPeter Delevoryas                              OBJECT(get_system_memory()), &error_abort);
387*3c392e87SPhilippe Mathieu-Daudé     object_property_set_link(OBJECT(bmc->soc), "dram",
3880df2d9a6SCédric Le Goater                              OBJECT(machine->ram), &error_abort);
389b6e70d1dSJoel Stanley     if (machine->kernel_filename) {
390b6e70d1dSJoel Stanley         /*
391b6e70d1dSJoel Stanley          * When booting with a -kernel command line there is no u-boot
392b6e70d1dSJoel Stanley          * that runs to unlock the SCU. In this case set the default to
393b6e70d1dSJoel Stanley          * be unlocked as the kernel expects
394b6e70d1dSJoel Stanley          */
395*3c392e87SPhilippe Mathieu-Daudé         object_property_set_int(OBJECT(bmc->soc), "hw-prot-key",
3965325cc34SMarkus Armbruster                                 ASPEED_SCU_PROT_KEY, &error_abort);
397b6e70d1dSJoel Stanley     }
398d2b3eaefSPeter Delevoryas     connect_serial_hds_to_uarts(bmc);
399*3c392e87SPhilippe Mathieu-Daudé     qdev_realize(DEVICE(bmc->soc), NULL, &error_abort);
400327d8e4eSAndrew Jeffery 
401c7e313aeSCédric Le Goater     if (defaults_enabled()) {
402*3c392e87SPhilippe Mathieu-Daudé         aspeed_board_init_flashes(&bmc->soc->fmc,
4038ec239f2SMarkus Armbruster                               bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
4049bd4ac61SCédric Le Goater                               amc->num_cs, 0);
405*3c392e87SPhilippe Mathieu-Daudé         aspeed_board_init_flashes(&bmc->soc->spi[0],
4068ec239f2SMarkus Armbruster                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
4079bd4ac61SCédric Le Goater                               1, amc->num_cs);
408c7e313aeSCédric Le Goater     }
409e1ad9bc4SCédric Le Goater 
410b7f1a0cbSCédric Le Goater     if (machine->kernel_filename && sc->num_cpus > 1) {
4119bb6d140SJoel Stanley         /* With no u-boot we must set up a boot stub for the secondary CPU */
4129bb6d140SJoel Stanley         MemoryRegion *smpboot = g_new(MemoryRegion, 1);
413f489960dSPhilippe Mathieu-Daudé         memory_region_init_ram(smpboot, NULL, "aspeed.smpboot",
4149bb6d140SJoel Stanley                                0x80, &error_abort);
4159bb6d140SJoel Stanley         memory_region_add_subregion(get_system_memory(),
4169bb6d140SJoel Stanley                                     AST_SMP_MAILBOX_BASE, smpboot);
4179bb6d140SJoel Stanley 
4189bb6d140SJoel Stanley         aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot;
4199bb6d140SJoel Stanley         aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary;
4209bb6d140SJoel Stanley         aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE;
4219bb6d140SJoel Stanley     }
4229bb6d140SJoel Stanley 
4236e504a98SPaolo Bonzini     aspeed_board_binfo.ram_size = machine->ram_size;
424347df6f8SEduardo Habkost     aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM];
425b033271fSCédric Le Goater 
426baa4732bSCédric Le Goater     if (amc->i2c_init) {
427baa4732bSCédric Le Goater         amc->i2c_init(bmc);
4282cf6cb50SCédric Le Goater     }
4292cf6cb50SCédric Le Goater 
430*3c392e87SPhilippe Mathieu-Daudé     for (i = 0; i < bmc->soc->sdhci.num_slots; i++) {
431*3c392e87SPhilippe Mathieu-Daudé         sdhci_attach_drive(&bmc->soc->sdhci.slots[i],
4328ec239f2SMarkus Armbruster                            drive_get(IF_SD, 0, i));
433a29e3e12SAndrew Jeffery     }
4342bea128cSEddie James 
435*3c392e87SPhilippe Mathieu-Daudé     if (bmc->soc->emmc.num_slots) {
436*3c392e87SPhilippe Mathieu-Daudé         sdhci_attach_drive(&bmc->soc->emmc.slots[0],
437*3c392e87SPhilippe Mathieu-Daudé                            drive_get(IF_SD, 0, bmc->soc->sdhci.num_slots));
4382bea128cSEddie James     }
4392bea128cSEddie James 
4408b744a6aSCédric Le Goater     if (!bmc->mmio_exec) {
441*3c392e87SPhilippe Mathieu-Daudé         DeviceState *dev = ssi_get_cs(bmc->soc->fmc.spi, 0);
4428285490bSCédric Le Goater         BlockBackend *fmc0 = dev ? m25p80_get_blk(dev) : NULL;
4438b744a6aSCédric Le Goater 
4448285490bSCédric Le Goater         if (fmc0) {
445*3c392e87SPhilippe Mathieu-Daudé             uint64_t rom_size = memory_region_size(&bmc->soc->spi_boot);
4468285490bSCédric Le Goater             aspeed_install_boot_rom(bmc, fmc0, rom_size);
4478b744a6aSCédric Le Goater         }
4488b744a6aSCédric Le Goater     }
4498b744a6aSCédric Le Goater 
4502744ece8STao Xu     arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo);
451327d8e4eSAndrew Jeffery }
452327d8e4eSAndrew Jeffery 
453612b219aSPhilippe Mathieu-Daudé static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
4542cf6cb50SCédric Le Goater {
455*3c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
456a87e81b9SCédric Le Goater     DeviceState *dev;
4573d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
4582cf6cb50SCédric Le Goater 
4592cf6cb50SCédric Le Goater     /* The palmetto platform expects a ds3231 RTC but a ds1338 is
4602cf6cb50SCédric Le Goater      * enough to provide basic RTC features. Alarms will be missing */
4611373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
462a87e81b9SCédric Le Goater 
4637a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
4643d165f12SCédric Le Goater                           eeprom_buf);
4653d165f12SCédric Le Goater 
466a87e81b9SCédric Le Goater     /* add a TMP423 temperature sensor */
4671373b15bSPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
4681373b15bSPhilippe Mathieu-Daudé                                          "tmp423", 0x4c));
4695325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
4705325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
4715325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
4725325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort);
4732cf6cb50SCédric Le Goater }
4742cf6cb50SCédric Le Goater 
4759cccb912SPatrick Venture static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc)
4769cccb912SPatrick Venture {
477*3c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
4789cccb912SPatrick Venture 
4799cccb912SPatrick Venture     /*
4809cccb912SPatrick Venture      * The quanta-q71l platform expects tmp75s which are compatible with
4819cccb912SPatrick Venture      * tmp105s.
4829cccb912SPatrick Venture      */
4839cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c);
4849cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e);
4859cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f);
4869cccb912SPatrick Venture 
4879cccb912SPatrick Venture     /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */
4889cccb912SPatrick Venture     /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */
4899cccb912SPatrick Venture     /* TODO: Add Memory Riser i2c mux and eeproms. */
4909cccb912SPatrick Venture 
4913ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74);
4923ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77);
4933ec75e39SPatrick Venture 
4949cccb912SPatrick Venture     /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */
4953ec75e39SPatrick Venture 
4963ec75e39SPatrick Venture     /* i2c-7 */
4973ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70);
4989cccb912SPatrick Venture     /*        - i2c@0: pmbus@59 */
4999cccb912SPatrick Venture     /*        - i2c@1: pmbus@58 */
5009cccb912SPatrick Venture     /*        - i2c@2: pmbus@58 */
5019cccb912SPatrick Venture     /*        - i2c@3: pmbus@59 */
5023ec75e39SPatrick Venture 
5039cccb912SPatrick Venture     /* TODO: i2c-7: Add PDB FRU eeprom@52 */
5049cccb912SPatrick Venture     /* TODO: i2c-8: Add BMC FRU eeprom@50 */
5059cccb912SPatrick Venture }
5069cccb912SPatrick Venture 
507612b219aSPhilippe Mathieu-Daudé static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
5082cf6cb50SCédric Le Goater {
509*3c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
5103d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
5113d165f12SCédric Le Goater 
5127a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50,
5133d165f12SCédric Le Goater                           eeprom_buf);
5142cf6cb50SCédric Le Goater 
5152cf6cb50SCédric Le Goater     /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
5161373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
517044475f3SPhilippe Mathieu-Daudé                      TYPE_TMP105, 0x4d);
5182cf6cb50SCédric Le Goater }
5192cf6cb50SCédric Le Goater 
520612b219aSPhilippe Mathieu-Daudé static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
521ccc2c418SCédric Le Goater {
522*3c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
52352bcd997SHoward Chiu     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
52452bcd997SHoward Chiu 
52552bcd997SHoward Chiu     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50,
52652bcd997SHoward Chiu                           eeprom_buf);
52752bcd997SHoward Chiu 
52852bcd997SHoward Chiu     /* LM75 is compatible with TMP105 driver */
52952bcd997SHoward Chiu     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
53052bcd997SHoward Chiu                      TYPE_TMP105, 0x4d);
531ccc2c418SCédric Le Goater }
532ccc2c418SCédric Le Goater 
53334f73a81SKarthikeyan Pasupathi static void yosemitev2_bmc_i2c_init(AspeedMachineState *bmc)
53434f73a81SKarthikeyan Pasupathi {
535*3c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
53634f73a81SKarthikeyan Pasupathi 
53734f73a81SKarthikeyan Pasupathi     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x51, 128 * KiB);
53834f73a81SKarthikeyan Pasupathi     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 128 * KiB,
53934f73a81SKarthikeyan Pasupathi                           yosemitev2_bmc_fruid, yosemitev2_bmc_fruid_len);
5400a1f86baSKarthikeyan Pasupathi     /* TMP421 */
5410a1f86baSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "tmp421", 0x1f);
5420a1f86baSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4e);
5430a1f86baSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4f);
5440a1f86baSKarthikeyan Pasupathi 
54534f73a81SKarthikeyan Pasupathi }
54634f73a81SKarthikeyan Pasupathi 
547612b219aSPhilippe Mathieu-Daudé static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
5486c4567c7SCédric Le Goater {
549*3c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
5506c4567c7SCédric Le Goater 
5516c4567c7SCédric Le Goater     /* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
5526c4567c7SCédric Le Goater      * good enough */
5531373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
5546c4567c7SCédric Le Goater }
5556c4567c7SCédric Le Goater 
5566c323abaSKarthikeyan Pasupathi static void tiogapass_bmc_i2c_init(AspeedMachineState *bmc)
5576c323abaSKarthikeyan Pasupathi {
558*3c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
5596c323abaSKarthikeyan Pasupathi 
5606c323abaSKarthikeyan Pasupathi     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 128 * KiB);
5616c323abaSKarthikeyan Pasupathi     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 6), 0x54, 128 * KiB,
5626c323abaSKarthikeyan Pasupathi                           tiogapass_bmc_fruid, tiogapass_bmc_fruid_len);
563a09d357dSKarthikeyan Pasupathi     /* TMP421 */
564a09d357dSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "tmp421", 0x1f);
565a09d357dSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4f);
566a09d357dSKarthikeyan Pasupathi     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4e);
5676c323abaSKarthikeyan Pasupathi }
5686c323abaSKarthikeyan Pasupathi 
569f4aec252SCédric Le Goater static void create_pca9552(AspeedSoCState *soc, int bus_id, int addr)
570f4aec252SCédric Le Goater {
571f4aec252SCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, bus_id),
572f4aec252SCédric Le Goater                             TYPE_PCA9552, addr);
573f4aec252SCédric Le Goater }
574f4aec252SCédric Le Goater 
575612b219aSPhilippe Mathieu-Daudé static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc)
576143b040fSPatrick Williams {
577*3c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
578143b040fSPatrick Williams 
579143b040fSPatrick Williams     /* bus 2 : */
5801373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48);
5811373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49);
582143b040fSPatrick Williams     /* bus 2 : pca9546 @ 0x73 */
583143b040fSPatrick Williams 
584143b040fSPatrick Williams     /* bus 3 : pca9548 @ 0x70 */
585143b040fSPatrick Williams 
586143b040fSPatrick Williams     /* bus 4 : */
587143b040fSPatrick Williams     uint8_t *eeprom4_54 = g_malloc0(8 * 1024);
5887a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54,
589143b040fSPatrick Williams                           eeprom4_54);
590143b040fSPatrick Williams     /* PCA9539 @ 0x76, but PCA9552 is compatible */
591f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x76);
592143b040fSPatrick Williams     /* PCA9539 @ 0x77, but PCA9552 is compatible */
593f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x77);
594143b040fSPatrick Williams 
595143b040fSPatrick Williams     /* bus 6 : */
5961373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48);
5971373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49);
598143b040fSPatrick Williams     /* bus 6 : pca9546 @ 0x73 */
599143b040fSPatrick Williams 
600143b040fSPatrick Williams     /* bus 8 : */
601143b040fSPatrick Williams     uint8_t *eeprom8_56 = g_malloc0(8 * 1024);
6027a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56,
603143b040fSPatrick Williams                           eeprom8_56);
604f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x60);
605f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x61);
606143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1d */
607143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1f */
608143b040fSPatrick Williams 
609143b040fSPatrick Williams     /*
610143b040fSPatrick Williams      * bus 13 : pca9548 @ 0x71
611143b040fSPatrick Williams      *      - channel 3:
612143b040fSPatrick Williams      *          - tmm421 @ 0x4c
613143b040fSPatrick Williams      *          - tmp421 @ 0x4e
614143b040fSPatrick Williams      *          - tmp421 @ 0x4f
615143b040fSPatrick Williams      */
616143b040fSPatrick Williams 
617143b040fSPatrick Williams }
618143b040fSPatrick Williams 
619612b219aSPhilippe Mathieu-Daudé static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
62062c2c2ebSCédric Le Goater {
6217cfbde5eSPhilippe Mathieu-Daudé     static const struct {
6227cfbde5eSPhilippe Mathieu-Daudé         unsigned gpio_id;
6237cfbde5eSPhilippe Mathieu-Daudé         LEDColor color;
6247cfbde5eSPhilippe Mathieu-Daudé         const char *description;
6257cfbde5eSPhilippe Mathieu-Daudé         bool gpio_polarity;
6267cfbde5eSPhilippe Mathieu-Daudé     } pca1_leds[] = {
6277cfbde5eSPhilippe Mathieu-Daudé         {13, LED_COLOR_GREEN, "front-fault-4",  GPIO_POLARITY_ACTIVE_LOW},
6287cfbde5eSPhilippe Mathieu-Daudé         {14, LED_COLOR_GREEN, "front-power-3",  GPIO_POLARITY_ACTIVE_LOW},
6297cfbde5eSPhilippe Mathieu-Daudé         {15, LED_COLOR_GREEN, "front-id-5",     GPIO_POLARITY_ACTIVE_LOW},
6307cfbde5eSPhilippe Mathieu-Daudé     };
631*3c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
6323d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
63315ce12cfSPhilippe Mathieu-Daudé     DeviceState *dev;
6347cfbde5eSPhilippe Mathieu-Daudé     LEDState *led;
63562c2c2ebSCédric Le Goater 
63663ceb818SCédric Le Goater     /* Bus 3: TODO bmp280@77 */
637db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
63815ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca1");
6392616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
6402616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 3),
64115ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
6428c9a61d7SCédric Le Goater 
6437cfbde5eSPhilippe Mathieu-Daudé     for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) {
6447cfbde5eSPhilippe Mathieu-Daudé         led = led_create_simple(OBJECT(bmc),
6457cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].gpio_polarity,
6467cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].color,
6477cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].description);
6487cfbde5eSPhilippe Mathieu-Daudé         qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id,
6497cfbde5eSPhilippe Mathieu-Daudé                               qdev_get_gpio_in(DEVICE(led), 0));
6507cfbde5eSPhilippe Mathieu-Daudé     }
651b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76);
6522a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "max31785", 0x52);
6531373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c);
6541373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c);
65562c2c2ebSCédric Le Goater 
65662c2c2ebSCédric Le Goater     /* The Witherspoon expects a TMP275 but a TMP105 is compatible */
6571373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105,
658044475f3SPhilippe Mathieu-Daudé                      0x4a);
6596c4567c7SCédric Le Goater 
6606c4567c7SCédric Le Goater     /* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
6616c4567c7SCédric Le Goater      * good enough */
6621373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
6633d165f12SCédric Le Goater 
6647a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51,
6653d165f12SCédric Le Goater                           eeprom_buf);
666db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
66715ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca0");
6682616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
6692616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 11),
67015ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
67163ceb818SCédric Le Goater     /* Bus 11: TODO ucd90160@64 */
67262c2c2ebSCédric Le Goater }
67362c2c2ebSCédric Le Goater 
67495f068c8SJohn Wang static void g220a_bmc_i2c_init(AspeedMachineState *bmc)
67595f068c8SJohn Wang {
676*3c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
67795f068c8SJohn Wang     DeviceState *dev;
67895f068c8SJohn Wang 
67995f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3),
68095f068c8SJohn Wang                                          "emc1413", 0x4c));
68195f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
68295f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
68395f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
68495f068c8SJohn Wang 
68595f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12),
68695f068c8SJohn Wang                                          "emc1413", 0x4c));
68795f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
68895f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
68995f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
69095f068c8SJohn Wang 
69195f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13),
69295f068c8SJohn Wang                                          "emc1413", 0x4c));
69395f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
69495f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
69595f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
6966f5f6507SJohn Wang 
6976f5f6507SJohn Wang     static uint8_t eeprom_buf[2 * 1024] = {
6986f5f6507SJohn Wang             0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe,
6996f5f6507SJohn Wang             0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65,
7006f5f6507SJohn Wang             0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32,
7016f5f6507SJohn Wang             0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42,
7026f5f6507SJohn Wang             0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45,
7036f5f6507SJohn Wang             0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1,
7046f5f6507SJohn Wang             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7,
7056f5f6507SJohn Wang     };
7066f5f6507SJohn Wang     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57,
7076f5f6507SJohn Wang                           eeprom_buf);
70895f068c8SJohn Wang }
70995f068c8SJohn Wang 
71082b6a3f6SJohn Wang static void fp5280g2_bmc_i2c_init(AspeedMachineState *bmc)
71182b6a3f6SJohn Wang {
712*3c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
71382b6a3f6SJohn Wang     I2CSlave *i2c_mux;
71482b6a3f6SJohn Wang 
71582b6a3f6SJohn Wang     /* The at24c256 */
71682b6a3f6SJohn Wang     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 1), 0x50, 32768);
71782b6a3f6SJohn Wang 
71882b6a3f6SJohn Wang     /* The fp5280g2 expects a TMP112 but a TMP105 is compatible */
71982b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
72082b6a3f6SJohn Wang                      0x48);
72182b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
72282b6a3f6SJohn Wang                      0x49);
72382b6a3f6SJohn Wang 
72482b6a3f6SJohn Wang     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
72582b6a3f6SJohn Wang                      "pca9546", 0x70);
72682b6a3f6SJohn Wang     /* It expects a TMP112 but a TMP105 is compatible */
72782b6a3f6SJohn Wang     i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0), TYPE_TMP105,
72882b6a3f6SJohn Wang                      0x4a);
72982b6a3f6SJohn Wang 
73082b6a3f6SJohn Wang     /* It expects a ds3232 but a ds1338 is good enough */
73182b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "ds1338", 0x68);
73282b6a3f6SJohn Wang 
73382b6a3f6SJohn Wang     /* It expects a pca9555 but a pca9552 is compatible */
734f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x30);
73582b6a3f6SJohn Wang }
73682b6a3f6SJohn Wang 
73758e52bdbSCédric Le Goater static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
73858e52bdbSCédric Le Goater {
739*3c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
740fa6d98c0SJoel Stanley     I2CSlave *i2c_mux;
741fa6d98c0SJoel Stanley 
7429077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB);
74358e52bdbSCédric Le Goater 
744f4aec252SCédric Le Goater     create_pca9552(soc, 3, 0x61);
745bcb122f8SJoel Stanley 
74658e52bdbSCédric Le Goater     /* The rainier expects a TMP275 but a TMP105 is compatible */
74758e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
74858e52bdbSCédric Le Goater                      0x48);
74958e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
75058e52bdbSCédric Le Goater                      0x49);
75158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
75258e52bdbSCédric Le Goater                      0x4a);
753fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4),
754fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
7559077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
7569077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
7579077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB);
758f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x60);
75958e52bdbSCédric Le Goater 
76058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
76158e52bdbSCédric Le Goater                      0x48);
76258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
76358e52bdbSCédric Le Goater                      0x49);
764f4aec252SCédric Le Goater     create_pca9552(soc, 5, 0x60);
765f4aec252SCédric Le Goater     create_pca9552(soc, 5, 0x61);
766fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5),
767fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
7689077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
7699077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
77058e52bdbSCédric Le Goater 
77158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
77258e52bdbSCédric Le Goater                      0x48);
77358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
77458e52bdbSCédric Le Goater                      0x4a);
77558e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
77658e52bdbSCédric Le Goater                      0x4b);
777fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6),
778fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
7799077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
7809077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
7819077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB);
7829077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB);
78358e52bdbSCédric Le Goater 
784f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x30);
785f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x31);
786f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x32);
787f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x33);
788f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x60);
789f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x61);
790b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76);
79158e52bdbSCédric Le Goater     /* Bus 7: TODO si7021-a20@20 */
79258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105,
79358e52bdbSCédric Le Goater                      0x48);
7942a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "max31785", 0x52);
7959077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB);
7969077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB);
79758e52bdbSCédric Le Goater 
79858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
79958e52bdbSCédric Le Goater                      0x48);
80058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
80158e52bdbSCédric Le Goater                      0x4a);
802be85508fSNinad Palsule     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50,
803be85508fSNinad Palsule                           64 * KiB, rainier_bb_fruid, rainier_bb_fruid_len);
804be85508fSNinad Palsule     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51,
805be85508fSNinad Palsule                           64 * KiB, rainier_bmc_fruid, rainier_bmc_fruid_len);
806f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x60);
807f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x61);
80858e52bdbSCédric Le Goater     /* Bus 8: ucd90320@11 */
80958e52bdbSCédric Le Goater     /* Bus 8: ucd90320@b */
81058e52bdbSCédric Le Goater     /* Bus 8: ucd90320@c */
81158e52bdbSCédric Le Goater 
81258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c);
81358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d);
8149077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB);
81558e52bdbSCédric Le Goater 
81658e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c);
81758e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d);
8189077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB);
81958e52bdbSCédric Le Goater 
82058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
82158e52bdbSCédric Le Goater                      0x48);
82258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
82358e52bdbSCédric Le Goater                      0x49);
824fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11),
825fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
8269077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
8279077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
828f4aec252SCédric Le Goater     create_pca9552(soc, 11, 0x60);
829fa6d98c0SJoel Stanley 
830fa6d98c0SJoel Stanley 
8319077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB);
832f4aec252SCédric Le Goater     create_pca9552(soc, 13, 0x60);
833fa6d98c0SJoel Stanley 
8349077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB);
835f4aec252SCédric Le Goater     create_pca9552(soc, 14, 0x60);
836fa6d98c0SJoel Stanley 
8379077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB);
838f4aec252SCédric Le Goater     create_pca9552(soc, 15, 0x60);
83958e52bdbSCédric Le Goater }
84058e52bdbSCédric Le Goater 
841febbe308SPeter Delevoryas static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr,
842febbe308SPeter Delevoryas                                  I2CBus **channels)
843febbe308SPeter Delevoryas {
844febbe308SPeter Delevoryas     I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr);
845febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
846febbe308SPeter Delevoryas         channels[i] = pca954x_i2c_get_bus(mux, i);
847febbe308SPeter Delevoryas     }
848febbe308SPeter Delevoryas }
849febbe308SPeter Delevoryas 
850febbe308SPeter Delevoryas #define TYPE_LM75 TYPE_TMP105
851febbe308SPeter Delevoryas #define TYPE_TMP75 TYPE_TMP105
852febbe308SPeter Delevoryas #define TYPE_TMP422 "tmp422"
853febbe308SPeter Delevoryas 
854febbe308SPeter Delevoryas static void fuji_bmc_i2c_init(AspeedMachineState *bmc)
855febbe308SPeter Delevoryas {
856*3c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
857febbe308SPeter Delevoryas     I2CBus *i2c[144] = {};
858febbe308SPeter Delevoryas 
859febbe308SPeter Delevoryas     for (int i = 0; i < 16; i++) {
860febbe308SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
861febbe308SPeter Delevoryas     }
862febbe308SPeter Delevoryas     I2CBus *i2c180 = i2c[2];
863febbe308SPeter Delevoryas     I2CBus *i2c480 = i2c[8];
864febbe308SPeter Delevoryas     I2CBus *i2c600 = i2c[11];
865febbe308SPeter Delevoryas 
866febbe308SPeter Delevoryas     get_pca9548_channels(i2c180, 0x70, &i2c[16]);
867febbe308SPeter Delevoryas     get_pca9548_channels(i2c480, 0x70, &i2c[24]);
868febbe308SPeter Delevoryas     /* NOTE: The device tree skips [32, 40) in the alias numbering */
869febbe308SPeter Delevoryas     get_pca9548_channels(i2c600, 0x77, &i2c[40]);
870febbe308SPeter Delevoryas     get_pca9548_channels(i2c[24], 0x71, &i2c[48]);
871febbe308SPeter Delevoryas     get_pca9548_channels(i2c[25], 0x72, &i2c[56]);
872febbe308SPeter Delevoryas     get_pca9548_channels(i2c[26], 0x76, &i2c[64]);
873febbe308SPeter Delevoryas     get_pca9548_channels(i2c[27], 0x76, &i2c[72]);
874febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
875febbe308SPeter Delevoryas         get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]);
876febbe308SPeter Delevoryas     }
877febbe308SPeter Delevoryas 
878febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c);
879febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d);
880febbe308SPeter Delevoryas 
881ef0eb67eSSittisak Sinprem     /*
882ef0eb67eSSittisak Sinprem      * EEPROM 24c64 size is 64Kbits or 8 Kbytes
883ef0eb67eSSittisak Sinprem      *        24c02 size is 2Kbits or 256 bytes
884ef0eb67eSSittisak Sinprem      */
885ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[19], 0x52, 8 * KiB);
886ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[20], 0x50, 256);
887ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[22], 0x52, 256);
888febbe308SPeter Delevoryas 
889febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x48);
890febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x49);
891febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x4a);
892febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_TMP422, 0x4c);
893febbe308SPeter Delevoryas 
894ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[8], 0x51, 8 * KiB);
895febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a);
896febbe308SPeter Delevoryas 
897febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[50], TYPE_LM75, 0x4c);
898ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[50], 0x52, 8 * KiB);
899febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[51], TYPE_TMP75, 0x48);
900febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[52], TYPE_TMP75, 0x49);
901febbe308SPeter Delevoryas 
902febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[59], TYPE_TMP75, 0x48);
903febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[60], TYPE_TMP75, 0x49);
904febbe308SPeter Delevoryas 
905ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[65], 0x53, 8 * KiB);
906febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x49);
907febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x48);
908ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[68], 0x52, 8 * KiB);
909ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[69], 0x52, 8 * KiB);
910ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[70], 0x52, 8 * KiB);
911ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[71], 0x52, 8 * KiB);
912febbe308SPeter Delevoryas 
913ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[73], 0x53, 8 * KiB);
914febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x49);
915febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x48);
916ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[76], 0x52, 8 * KiB);
917ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[77], 0x52, 8 * KiB);
918ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[78], 0x52, 8 * KiB);
919ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[79], 0x52, 8 * KiB);
920ef0eb67eSSittisak Sinprem     at24c_eeprom_init(i2c[28], 0x50, 256);
921febbe308SPeter Delevoryas 
922febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
9239077e09aSPeter Delevoryas         at24c_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB);
924febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[82 + i * 8], TYPE_TMP75, 0x48);
925febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[83 + i * 8], TYPE_TMP75, 0x4b);
926febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[84 + i * 8], TYPE_TMP75, 0x4a);
927febbe308SPeter Delevoryas     }
928febbe308SPeter Delevoryas }
929febbe308SPeter Delevoryas 
930a20c54b1SPatrick Williams #define TYPE_TMP421 "tmp421"
931a20c54b1SPatrick Williams 
932a20c54b1SPatrick Williams static void bletchley_bmc_i2c_init(AspeedMachineState *bmc)
933a20c54b1SPatrick Williams {
934*3c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
935a20c54b1SPatrick Williams     I2CBus *i2c[13] = {};
936a20c54b1SPatrick Williams     for (int i = 0; i < 13; i++) {
937a20c54b1SPatrick Williams         if ((i == 8) || (i == 11)) {
938a20c54b1SPatrick Williams             continue;
939a20c54b1SPatrick Williams         }
940a20c54b1SPatrick Williams         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
941a20c54b1SPatrick Williams     }
942a20c54b1SPatrick Williams 
943a20c54b1SPatrick Williams     /* Bus 0 - 5 all have the same config. */
944a20c54b1SPatrick Williams     for (int i = 0; i < 6; i++) {
945a20c54b1SPatrick Williams         /* Missing model: ti,ina230 @ 0x45 */
946a20c54b1SPatrick Williams         /* Missing model: mps,mp5023 @ 0x40 */
947a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_TMP421, 0x4f);
948a20c54b1SPatrick Williams         /* Missing model: nxp,pca9539 @ 0x76, but PCA9552 works enough */
949a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x76);
950a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x67);
951a20c54b1SPatrick Williams         /* Missing model: fsc,fusb302 @ 0x22 */
952a20c54b1SPatrick Williams     }
953a20c54b1SPatrick Williams 
954a20c54b1SPatrick Williams     /* Bus 6 */
955a20c54b1SPatrick Williams     at24c_eeprom_init(i2c[6], 0x56, 65536);
956a20c54b1SPatrick Williams     /* Missing model: nxp,pcf85263 @ 0x51 , but ds1338 works enough */
957a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[6], "ds1338", 0x51);
958a20c54b1SPatrick Williams 
959a20c54b1SPatrick Williams 
960a20c54b1SPatrick Williams     /* Bus 7 */
961a20c54b1SPatrick Williams     at24c_eeprom_init(i2c[7], 0x54, 65536);
962a20c54b1SPatrick Williams 
963a20c54b1SPatrick Williams     /* Bus 9 */
964a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[9], TYPE_TMP421, 0x4f);
965a20c54b1SPatrick Williams 
966a20c54b1SPatrick Williams     /* Bus 10 */
967a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[10], TYPE_TMP421, 0x4f);
968a20c54b1SPatrick Williams     /* Missing model: ti,hdc1080 @ 0x40 */
969a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[10], TYPE_PCA9552, 0x67);
970a20c54b1SPatrick Williams 
971a20c54b1SPatrick Williams     /* Bus 12 */
972a20c54b1SPatrick Williams     /* Missing model: adi,adm1278 @ 0x11 */
973a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4c);
974a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4d);
975a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_PCA9552, 0x67);
976a20c54b1SPatrick Williams }
977a20c54b1SPatrick Williams 
978fa699e80SPeter Delevoryas static void fby35_i2c_init(AspeedMachineState *bmc)
979fa699e80SPeter Delevoryas {
980*3c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
981fa699e80SPeter Delevoryas     I2CBus *i2c[16];
982fa699e80SPeter Delevoryas 
983fa699e80SPeter Delevoryas     for (int i = 0; i < 16; i++) {
984fa699e80SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
985fa699e80SPeter Delevoryas     }
986fa699e80SPeter Delevoryas 
987fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[2], TYPE_LM75, 0x4f);
988fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_TMP421, 0x1f);
989fa699e80SPeter Delevoryas     /* Hotswap controller is actually supposed to be mp5920 or ltc4282. */
990fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[11], "adm1272", 0x44);
991fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4e);
992fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4f);
993fa699e80SPeter Delevoryas 
9949077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[4], 0x51, 128 * KiB);
9959077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[6], 0x51, 128 * KiB);
996c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[8], 0x50, 32 * KiB, fby35_nic_fruid,
997c0216b94SPeter Delevoryas                           fby35_nic_fruid_len);
998c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[11], 0x51, 128 * KiB, fby35_bb_fruid,
999c0216b94SPeter Delevoryas                           fby35_bb_fruid_len);
1000c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[11], 0x54, 128 * KiB, fby35_bmc_fruid,
1001c0216b94SPeter Delevoryas                           fby35_bmc_fruid_len);
1002fa699e80SPeter Delevoryas 
1003fa699e80SPeter Delevoryas     /*
1004fa699e80SPeter Delevoryas      * TODO: There is a multi-master i2c connection to an AST1030 MiniBMC on
1005fa699e80SPeter Delevoryas      * buses 0, 1, 2, 3, and 9. Source address 0x10, target address 0x20 on
1006fa699e80SPeter Delevoryas      * each.
1007fa699e80SPeter Delevoryas      */
1008fa699e80SPeter Delevoryas }
1009fa699e80SPeter Delevoryas 
1010fb6b3c8dSJae Hyun Yoo static void qcom_dc_scm_bmc_i2c_init(AspeedMachineState *bmc)
1011fb6b3c8dSJae Hyun Yoo {
1012*3c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
1013fb6b3c8dSJae Hyun Yoo 
1014fb6b3c8dSJae Hyun Yoo     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 15), "tmp105", 0x4d);
1015fb6b3c8dSJae Hyun Yoo }
1016fb6b3c8dSJae Hyun Yoo 
1017ece4cccdSGraeme Gregory static void qcom_dc_scm_firework_i2c_init(AspeedMachineState *bmc)
1018ece4cccdSGraeme Gregory {
1019*3c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
10202a7a5d5cSJae Hyun Yoo     I2CSlave *therm_mux, *cpuvr_mux;
1021ece4cccdSGraeme Gregory 
1022ece4cccdSGraeme Gregory     /* Create the generic DC-SCM hardware */
1023ece4cccdSGraeme Gregory     qcom_dc_scm_bmc_i2c_init(bmc);
1024ece4cccdSGraeme Gregory 
1025ece4cccdSGraeme Gregory     /* Now create the Firework specific hardware */
10262a75e8c3SMaheswara Kurapati 
10272a7a5d5cSJae Hyun Yoo     /* I2C7 CPUVR MUX */
10282a7a5d5cSJae Hyun Yoo     cpuvr_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
10292a7a5d5cSJae Hyun Yoo                                         "pca9546", 0x70);
10302a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 0), "pca9548", 0x72);
10312a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 1), "pca9548", 0x72);
10322a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 2), "pca9548", 0x72);
10332a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 3), "pca9548", 0x72);
10342a7a5d5cSJae Hyun Yoo 
1035cfc68f16SMaheswara Kurapati     /* I2C8 Thermal Diodes*/
1036cfc68f16SMaheswara Kurapati     therm_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
1037cfc68f16SMaheswara Kurapati                                         "pca9548", 0x70);
1038cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 0), TYPE_LM75, 0x4C);
1039cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 1), TYPE_LM75, 0x4C);
1040cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 2), TYPE_LM75, 0x48);
1041cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 3), TYPE_LM75, 0x48);
1042cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 4), TYPE_LM75, 0x48);
1043cfc68f16SMaheswara Kurapati 
10442a75e8c3SMaheswara Kurapati     /* I2C9 Fan Controller (MAX31785) */
10452a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x52);
10462a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x54);
1047ece4cccdSGraeme Gregory }
1048ece4cccdSGraeme Gregory 
10491a15311aSCédric Le Goater static bool aspeed_get_mmio_exec(Object *obj, Error **errp)
10501a15311aSCédric Le Goater {
10511a15311aSCédric Le Goater     return ASPEED_MACHINE(obj)->mmio_exec;
10521a15311aSCédric Le Goater }
10531a15311aSCédric Le Goater 
10541a15311aSCédric Le Goater static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp)
10551a15311aSCédric Le Goater {
10561a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = value;
10571a15311aSCédric Le Goater }
10581a15311aSCédric Le Goater 
10591a15311aSCédric Le Goater static void aspeed_machine_instance_init(Object *obj)
10601a15311aSCédric Le Goater {
10611a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = false;
10621a15311aSCédric Le Goater }
10631a15311aSCédric Le Goater 
10649820e52fSCédric Le Goater static char *aspeed_get_fmc_model(Object *obj, Error **errp)
10659820e52fSCédric Le Goater {
10669820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10679820e52fSCédric Le Goater     return g_strdup(bmc->fmc_model);
10689820e52fSCédric Le Goater }
10699820e52fSCédric Le Goater 
10709820e52fSCédric Le Goater static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp)
10719820e52fSCédric Le Goater {
10729820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10739820e52fSCédric Le Goater 
10749820e52fSCédric Le Goater     g_free(bmc->fmc_model);
10759820e52fSCédric Le Goater     bmc->fmc_model = g_strdup(value);
10769820e52fSCédric Le Goater }
10779820e52fSCédric Le Goater 
10789820e52fSCédric Le Goater static char *aspeed_get_spi_model(Object *obj, Error **errp)
10799820e52fSCédric Le Goater {
10809820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10819820e52fSCédric Le Goater     return g_strdup(bmc->spi_model);
10829820e52fSCédric Le Goater }
10839820e52fSCédric Le Goater 
10849820e52fSCédric Le Goater static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp)
10859820e52fSCédric Le Goater {
10869820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10879820e52fSCédric Le Goater 
10889820e52fSCédric Le Goater     g_free(bmc->spi_model);
10899820e52fSCédric Le Goater     bmc->spi_model = g_strdup(value);
10909820e52fSCédric Le Goater }
10919820e52fSCédric Le Goater 
1092f65f6ad5SCédric Le Goater static char *aspeed_get_bmc_console(Object *obj, Error **errp)
1093f65f6ad5SCédric Le Goater {
1094f65f6ad5SCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1095f65f6ad5SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
1096f65f6ad5SCédric Le Goater     int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default;
1097f65f6ad5SCédric Le Goater 
1098f65f6ad5SCédric Le Goater     return g_strdup_printf("uart%d", uart_chosen - ASPEED_DEV_UART1 + 1);
1099f65f6ad5SCédric Le Goater }
1100f65f6ad5SCédric Le Goater 
1101f65f6ad5SCédric Le Goater static void aspeed_set_bmc_console(Object *obj, const char *value, Error **errp)
1102f65f6ad5SCédric Le Goater {
1103f65f6ad5SCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
1104f65f6ad5SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
1105f65f6ad5SCédric Le Goater     AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(amc->soc_name));
1106f65f6ad5SCédric Le Goater     int val;
1107f65f6ad5SCédric Le Goater 
1108f65f6ad5SCédric Le Goater     if (sscanf(value, "uart%u", &val) != 1) {
1109f65f6ad5SCédric Le Goater         error_setg(errp, "Bad value for \"uart\" property");
1110f65f6ad5SCédric Le Goater         return;
1111f65f6ad5SCédric Le Goater     }
1112f65f6ad5SCédric Le Goater 
1113f65f6ad5SCédric Le Goater     /* The number of UART depends on the SoC */
1114f65f6ad5SCédric Le Goater     if (val < 1 || val > sc->uarts_num) {
1115f65f6ad5SCédric Le Goater         error_setg(errp, "\"uart\" should be in range [1 - %d]", sc->uarts_num);
1116f65f6ad5SCédric Le Goater         return;
1117f65f6ad5SCédric Le Goater     }
1118f65f6ad5SCédric Le Goater     bmc->uart_chosen = ASPEED_DEV_UART1 + val - 1;
1119f65f6ad5SCédric Le Goater }
1120f65f6ad5SCédric Le Goater 
11211a15311aSCédric Le Goater static void aspeed_machine_class_props_init(ObjectClass *oc)
11221a15311aSCédric Le Goater {
11231a15311aSCédric Le Goater     object_class_property_add_bool(oc, "execute-in-place",
11241a15311aSCédric Le Goater                                    aspeed_get_mmio_exec,
1125d2623129SMarkus Armbruster                                    aspeed_set_mmio_exec);
11261a15311aSCédric Le Goater     object_class_property_set_description(oc, "execute-in-place",
11277eecec7dSMarkus Armbruster                            "boot directly from CE0 flash device");
11289820e52fSCédric Le Goater 
1129f65f6ad5SCédric Le Goater     object_class_property_add_str(oc, "bmc-console", aspeed_get_bmc_console,
1130f65f6ad5SCédric Le Goater                                   aspeed_set_bmc_console);
1131f65f6ad5SCédric Le Goater     object_class_property_set_description(oc, "bmc-console",
1132f65f6ad5SCédric Le Goater                            "Change the default UART to \"uartX\"");
1133f65f6ad5SCédric Le Goater 
11349820e52fSCédric Le Goater     object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model,
11359820e52fSCédric Le Goater                                    aspeed_set_fmc_model);
11369820e52fSCédric Le Goater     object_class_property_set_description(oc, "fmc-model",
11379820e52fSCédric Le Goater                                           "Change the FMC Flash model");
11389820e52fSCédric Le Goater     object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model,
11399820e52fSCédric Le Goater                                    aspeed_set_spi_model);
11409820e52fSCédric Le Goater     object_class_property_set_description(oc, "spi-model",
11419820e52fSCédric Le Goater                                           "Change the SPI Flash model");
11421a15311aSCédric Le Goater }
11431a15311aSCédric Le Goater 
1144b7f1a0cbSCédric Le Goater static int aspeed_soc_num_cpus(const char *soc_name)
1145b7f1a0cbSCédric Le Goater {
1146b7f1a0cbSCédric Le Goater    AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(soc_name));
1147b7f1a0cbSCédric Le Goater    return sc->num_cpus;
1148b7f1a0cbSCédric Le Goater }
1149b7f1a0cbSCédric Le Goater 
1150fca9ca1bSCédric Le Goater static void aspeed_machine_class_init(ObjectClass *oc, void *data)
115162c2c2ebSCédric Le Goater {
115262c2c2ebSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1153d3bad7e7SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
115462c2c2ebSCédric Le Goater 
1155fca9ca1bSCédric Le Goater     mc->init = aspeed_machine_init;
115662c2c2ebSCédric Le Goater     mc->no_floppy = 1;
115762c2c2ebSCédric Le Goater     mc->no_cdrom = 1;
115862c2c2ebSCédric Le Goater     mc->no_parallel = 1;
1159afcbaed6SIgor Mammedov     mc->default_ram_id = "ram";
1160d3bad7e7SCédric Le Goater     amc->macs_mask = ASPEED_MAC0_ON;
11615d63d0c7SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART5;
11621a15311aSCédric Le Goater 
11631a15311aSCédric Le Goater     aspeed_machine_class_props_init(oc);
116462c2c2ebSCédric Le Goater }
116562c2c2ebSCédric Le Goater 
1166baa4732bSCédric Le Goater static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
1167baa4732bSCédric Le Goater {
1168baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1169baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1170baa4732bSCédric Le Goater 
1171baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Palmetto BMC (ARM926EJ-S)";
1172baa4732bSCédric Le Goater     amc->soc_name  = "ast2400-a1";
1173baa4732bSCédric Le Goater     amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1;
1174baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
117570322913SCédric Le Goater     amc->spi_model = "mx25l25635f";
1176baa4732bSCédric Le Goater     amc->num_cs    = 1;
1177baa4732bSCédric Le Goater     amc->i2c_init  = palmetto_bmc_i2c_init;
1178baa4732bSCédric Le Goater     mc->default_ram_size       = 256 * MiB;
1179b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1180b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1181baa4732bSCédric Le Goater };
1182baa4732bSCédric Le Goater 
11839cccb912SPatrick Venture static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data)
11849cccb912SPatrick Venture {
11859cccb912SPatrick Venture     MachineClass *mc = MACHINE_CLASS(oc);
11869cccb912SPatrick Venture     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
11879cccb912SPatrick Venture 
11889cccb912SPatrick Venture     mc->desc       = "Quanta-Q71l BMC (ARM926EJ-S)";
11899cccb912SPatrick Venture     amc->soc_name  = "ast2400-a1";
11909cccb912SPatrick Venture     amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1;
11919cccb912SPatrick Venture     amc->fmc_model = "n25q256a";
11929cccb912SPatrick Venture     amc->spi_model = "mx25l25635e";
11939cccb912SPatrick Venture     amc->num_cs    = 1;
11949cccb912SPatrick Venture     amc->i2c_init  = quanta_q71l_bmc_i2c_init;
11959cccb912SPatrick Venture     mc->default_ram_size       = 128 * MiB;
11969cccb912SPatrick Venture     mc->default_cpus = mc->min_cpus = mc->max_cpus =
11979cccb912SPatrick Venture         aspeed_soc_num_cpus(amc->soc_name);
11989cccb912SPatrick Venture }
11999cccb912SPatrick Venture 
120040a38df5SErik Smit static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc,
120140a38df5SErik Smit                                                         void *data)
120240a38df5SErik Smit {
120340a38df5SErik Smit     MachineClass *mc = MACHINE_CLASS(oc);
120440a38df5SErik Smit     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
120540a38df5SErik Smit 
120640a38df5SErik Smit     mc->desc       = "Supermicro X11 BMC (ARM926EJ-S)";
120740a38df5SErik Smit     amc->soc_name  = "ast2400-a1";
120840a38df5SErik Smit     amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1;
120940a38df5SErik Smit     amc->fmc_model = "mx25l25635e";
121040a38df5SErik Smit     amc->spi_model = "mx25l25635e";
121140a38df5SErik Smit     amc->num_cs    = 1;
121240a38df5SErik Smit     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
121340a38df5SErik Smit     amc->i2c_init  = palmetto_bmc_i2c_init;
121440a38df5SErik Smit     mc->default_ram_size = 256 * MiB;
121540a38df5SErik Smit }
121640a38df5SErik Smit 
121747936597SGuenter Roeck static void aspeed_machine_supermicro_x11spi_bmc_class_init(ObjectClass *oc,
121847936597SGuenter Roeck                                                             void *data)
121947936597SGuenter Roeck {
122047936597SGuenter Roeck     MachineClass *mc = MACHINE_CLASS(oc);
122147936597SGuenter Roeck     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
122247936597SGuenter Roeck 
122347936597SGuenter Roeck     mc->desc       = "Supermicro X11 SPI BMC (ARM1176)";
122447936597SGuenter Roeck     amc->soc_name  = "ast2500-a1";
122547936597SGuenter Roeck     amc->hw_strap1 = SUPERMICRO_X11SPI_BMC_HW_STRAP1;
122647936597SGuenter Roeck     amc->fmc_model = "mx25l25635e";
122747936597SGuenter Roeck     amc->spi_model = "mx25l25635e";
122847936597SGuenter Roeck     amc->num_cs    = 1;
122947936597SGuenter Roeck     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
123047936597SGuenter Roeck     amc->i2c_init  = palmetto_bmc_i2c_init;
123147936597SGuenter Roeck     mc->default_ram_size = 512 * MiB;
123247936597SGuenter Roeck     mc->default_cpus = mc->min_cpus = mc->max_cpus =
123347936597SGuenter Roeck         aspeed_soc_num_cpus(amc->soc_name);
123447936597SGuenter Roeck }
123547936597SGuenter Roeck 
1236baa4732bSCédric Le Goater static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data)
1237baa4732bSCédric Le Goater {
1238baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1239baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1240baa4732bSCédric Le Goater 
1241baa4732bSCédric Le Goater     mc->desc       = "Aspeed AST2500 EVB (ARM1176)";
1242baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1243baa4732bSCédric Le Goater     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
1244753abfc4SJae Hyun Yoo     amc->fmc_model = "mx25l25635e";
124570322913SCédric Le Goater     amc->spi_model = "mx25l25635f";
1246baa4732bSCédric Le Goater     amc->num_cs    = 1;
1247baa4732bSCédric Le Goater     amc->i2c_init  = ast2500_evb_i2c_init;
1248baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
1249b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1250b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1251baa4732bSCédric Le Goater };
1252baa4732bSCédric Le Goater 
125334f73a81SKarthikeyan Pasupathi static void aspeed_machine_yosemitev2_class_init(ObjectClass *oc, void *data)
125434f73a81SKarthikeyan Pasupathi {
125534f73a81SKarthikeyan Pasupathi     MachineClass *mc = MACHINE_CLASS(oc);
125634f73a81SKarthikeyan Pasupathi     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
125734f73a81SKarthikeyan Pasupathi 
125834f73a81SKarthikeyan Pasupathi     mc->desc       = "Facebook YosemiteV2 BMC (ARM1176)";
125934f73a81SKarthikeyan Pasupathi     amc->soc_name  = "ast2500-a1";
126034f73a81SKarthikeyan Pasupathi     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
126134f73a81SKarthikeyan Pasupathi     amc->hw_strap2 = 0;
126234f73a81SKarthikeyan Pasupathi     amc->fmc_model = "n25q256a";
126334f73a81SKarthikeyan Pasupathi     amc->spi_model = "mx25l25635e";
126434f73a81SKarthikeyan Pasupathi     amc->num_cs    = 2;
126534f73a81SKarthikeyan Pasupathi     amc->i2c_init  = yosemitev2_bmc_i2c_init;
126634f73a81SKarthikeyan Pasupathi     mc->default_ram_size       = 512 * MiB;
126734f73a81SKarthikeyan Pasupathi     mc->default_cpus = mc->min_cpus = mc->max_cpus =
126834f73a81SKarthikeyan Pasupathi         aspeed_soc_num_cpus(amc->soc_name);
126934f73a81SKarthikeyan Pasupathi };
127034f73a81SKarthikeyan Pasupathi 
1271baa4732bSCédric Le Goater static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data)
1272baa4732bSCédric Le Goater {
1273baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1274baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1275baa4732bSCédric Le Goater 
1276baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Romulus BMC (ARM1176)";
1277baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1278baa4732bSCédric Le Goater     amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1;
1279baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
1280baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1281baa4732bSCédric Le Goater     amc->num_cs    = 2;
1282baa4732bSCédric Le Goater     amc->i2c_init  = romulus_bmc_i2c_init;
1283baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
1284b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1285b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1286baa4732bSCédric Le Goater };
1287baa4732bSCédric Le Goater 
12886c323abaSKarthikeyan Pasupathi static void aspeed_machine_tiogapass_class_init(ObjectClass *oc, void *data)
12896c323abaSKarthikeyan Pasupathi {
12906c323abaSKarthikeyan Pasupathi     MachineClass *mc = MACHINE_CLASS(oc);
12916c323abaSKarthikeyan Pasupathi     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
12926c323abaSKarthikeyan Pasupathi 
12936c323abaSKarthikeyan Pasupathi     mc->desc       = "Facebook Tiogapass BMC (ARM1176)";
12946c323abaSKarthikeyan Pasupathi     amc->soc_name  = "ast2500-a1";
12956c323abaSKarthikeyan Pasupathi     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
12966c323abaSKarthikeyan Pasupathi     amc->hw_strap2 = 0;
12976c323abaSKarthikeyan Pasupathi     amc->fmc_model = "n25q256a";
12986c323abaSKarthikeyan Pasupathi     amc->spi_model = "mx25l25635e";
12996c323abaSKarthikeyan Pasupathi     amc->num_cs    = 2;
13006c323abaSKarthikeyan Pasupathi     amc->i2c_init  = tiogapass_bmc_i2c_init;
13016c323abaSKarthikeyan Pasupathi     mc->default_ram_size       = 1 * GiB;
13026c323abaSKarthikeyan Pasupathi     mc->default_cpus = mc->min_cpus = mc->max_cpus =
13036c323abaSKarthikeyan Pasupathi         aspeed_soc_num_cpus(amc->soc_name);
13046c323abaSKarthikeyan Pasupathi         aspeed_soc_num_cpus(amc->soc_name);
13056c323abaSKarthikeyan Pasupathi };
13066c323abaSKarthikeyan Pasupathi 
1307143b040fSPatrick Williams static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data)
1308143b040fSPatrick Williams {
1309143b040fSPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1310143b040fSPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1311143b040fSPatrick Williams 
1312143b040fSPatrick Williams     mc->desc       = "OCP SonoraPass BMC (ARM1176)";
1313143b040fSPatrick Williams     amc->soc_name  = "ast2500-a1";
1314143b040fSPatrick Williams     amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1;
1315143b040fSPatrick Williams     amc->fmc_model = "mx66l1g45g";
1316143b040fSPatrick Williams     amc->spi_model = "mx66l1g45g";
1317143b040fSPatrick Williams     amc->num_cs    = 2;
1318143b040fSPatrick Williams     amc->i2c_init  = sonorapass_bmc_i2c_init;
1319143b040fSPatrick Williams     mc->default_ram_size       = 512 * MiB;
1320b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1321b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1322143b040fSPatrick Williams };
1323143b040fSPatrick Williams 
1324baa4732bSCédric Le Goater static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data)
1325baa4732bSCédric Le Goater {
1326baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1327baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1328baa4732bSCédric Le Goater 
1329baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Witherspoon BMC (ARM1176)";
1330baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1331baa4732bSCédric Le Goater     amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1;
133270322913SCédric Le Goater     amc->fmc_model = "mx25l25635f";
1333baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1334baa4732bSCédric Le Goater     amc->num_cs    = 2;
1335baa4732bSCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init;
1336baa4732bSCédric Le Goater     mc->default_ram_size = 512 * MiB;
1337b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1338b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1339baa4732bSCédric Le Goater };
1340baa4732bSCédric Le Goater 
1341baa4732bSCédric Le Goater static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
1342baa4732bSCédric Le Goater {
1343baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1344baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1345baa4732bSCédric Le Goater 
1346f548f201SPeter Maydell     mc->desc       = "Aspeed AST2600 EVB (Cortex-A7)";
1347c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
1348baa4732bSCédric Le Goater     amc->hw_strap1 = AST2600_EVB_HW_STRAP1;
1349baa4732bSCédric Le Goater     amc->hw_strap2 = AST2600_EVB_HW_STRAP2;
1350753abfc4SJae Hyun Yoo     amc->fmc_model = "mx66u51235f";
1351baa4732bSCédric Le Goater     amc->spi_model = "mx66u51235f";
1352baa4732bSCédric Le Goater     amc->num_cs    = 1;
135329193286SGuenter Roeck     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON |
135429193286SGuenter Roeck                      ASPEED_MAC3_ON;
1355baa4732bSCédric Le Goater     amc->i2c_init  = ast2600_evb_i2c_init;
1356baa4732bSCédric Le Goater     mc->default_ram_size = 1 * GiB;
1357b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1358b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1359baa4732bSCédric Le Goater };
1360baa4732bSCédric Le Goater 
136163ceb818SCédric Le Goater static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data)
136263ceb818SCédric Le Goater {
136363ceb818SCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
136463ceb818SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
136563ceb818SCédric Le Goater 
1366f548f201SPeter Maydell     mc->desc       = "OpenPOWER Tacoma BMC (Cortex-A7)";
1367c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
136863ceb818SCédric Le Goater     amc->hw_strap1 = TACOMA_BMC_HW_STRAP1;
136963ceb818SCédric Le Goater     amc->hw_strap2 = TACOMA_BMC_HW_STRAP2;
137063ceb818SCédric Le Goater     amc->fmc_model = "mx66l1g45g";
137163ceb818SCédric Le Goater     amc->spi_model = "mx66l1g45g";
137263ceb818SCédric Le Goater     amc->num_cs    = 2;
1373d3bad7e7SCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON;
137463ceb818SCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init; /* Same board layout */
137563ceb818SCédric Le Goater     mc->default_ram_size = 1 * GiB;
1376b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1377b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
137863ceb818SCédric Le Goater };
137963ceb818SCédric Le Goater 
138095f068c8SJohn Wang static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data)
138195f068c8SJohn Wang {
138295f068c8SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
138395f068c8SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
138495f068c8SJohn Wang 
138595f068c8SJohn Wang     mc->desc       = "Bytedance G220A BMC (ARM1176)";
138695f068c8SJohn Wang     amc->soc_name  = "ast2500-a1";
138795f068c8SJohn Wang     amc->hw_strap1 = G220A_BMC_HW_STRAP1;
138895f068c8SJohn Wang     amc->fmc_model = "n25q512a";
138995f068c8SJohn Wang     amc->spi_model = "mx25l25635e";
139095f068c8SJohn Wang     amc->num_cs    = 2;
13915bb825c8SGuenter Roeck     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
139295f068c8SJohn Wang     amc->i2c_init  = g220a_bmc_i2c_init;
139395f068c8SJohn Wang     mc->default_ram_size = 1024 * MiB;
139495f068c8SJohn Wang     mc->default_cpus = mc->min_cpus = mc->max_cpus =
139595f068c8SJohn Wang         aspeed_soc_num_cpus(amc->soc_name);
139695f068c8SJohn Wang };
139795f068c8SJohn Wang 
139882b6a3f6SJohn Wang static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc, void *data)
139982b6a3f6SJohn Wang {
140082b6a3f6SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
140182b6a3f6SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
140282b6a3f6SJohn Wang 
140382b6a3f6SJohn Wang     mc->desc       = "Inspur FP5280G2 BMC (ARM1176)";
140482b6a3f6SJohn Wang     amc->soc_name  = "ast2500-a1";
140582b6a3f6SJohn Wang     amc->hw_strap1 = FP5280G2_BMC_HW_STRAP1;
140682b6a3f6SJohn Wang     amc->fmc_model = "n25q512a";
140782b6a3f6SJohn Wang     amc->spi_model = "mx25l25635e";
140882b6a3f6SJohn Wang     amc->num_cs    = 2;
140982b6a3f6SJohn Wang     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
141082b6a3f6SJohn Wang     amc->i2c_init  = fp5280g2_bmc_i2c_init;
141182b6a3f6SJohn Wang     mc->default_ram_size = 512 * MiB;
141282b6a3f6SJohn Wang     mc->default_cpus = mc->min_cpus = mc->max_cpus =
141382b6a3f6SJohn Wang         aspeed_soc_num_cpus(amc->soc_name);
141482b6a3f6SJohn Wang };
141582b6a3f6SJohn Wang 
141658e52bdbSCédric Le Goater static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data)
141758e52bdbSCédric Le Goater {
141858e52bdbSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
141958e52bdbSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
142058e52bdbSCédric Le Goater 
1421f548f201SPeter Maydell     mc->desc       = "IBM Rainier BMC (Cortex-A7)";
1422c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
142358e52bdbSCédric Le Goater     amc->hw_strap1 = RAINIER_BMC_HW_STRAP1;
142458e52bdbSCédric Le Goater     amc->hw_strap2 = RAINIER_BMC_HW_STRAP2;
142558e52bdbSCédric Le Goater     amc->fmc_model = "mx66l1g45g";
142658e52bdbSCédric Le Goater     amc->spi_model = "mx66l1g45g";
142758e52bdbSCédric Le Goater     amc->num_cs    = 2;
142858e52bdbSCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
142958e52bdbSCédric Le Goater     amc->i2c_init  = rainier_bmc_i2c_init;
143058e52bdbSCédric Le Goater     mc->default_ram_size = 1 * GiB;
143158e52bdbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
143258e52bdbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
143358e52bdbSCédric Le Goater };
143458e52bdbSCédric Le Goater 
14351e2c22c9SCédric Le Goater #define FUJI_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB)
1436febbe308SPeter Delevoryas 
1437febbe308SPeter Delevoryas static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data)
1438febbe308SPeter Delevoryas {
1439febbe308SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1440febbe308SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1441febbe308SPeter Delevoryas 
1442febbe308SPeter Delevoryas     mc->desc = "Facebook Fuji BMC (Cortex-A7)";
1443febbe308SPeter Delevoryas     amc->soc_name = "ast2600-a3";
1444febbe308SPeter Delevoryas     amc->hw_strap1 = FUJI_BMC_HW_STRAP1;
1445febbe308SPeter Delevoryas     amc->hw_strap2 = FUJI_BMC_HW_STRAP2;
1446febbe308SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1447febbe308SPeter Delevoryas     amc->spi_model = "mx66l1g45g";
1448febbe308SPeter Delevoryas     amc->num_cs = 2;
1449febbe308SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1450febbe308SPeter Delevoryas     amc->i2c_init = fuji_bmc_i2c_init;
1451febbe308SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART1;
1452febbe308SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
1453febbe308SPeter Delevoryas     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1454febbe308SPeter Delevoryas         aspeed_soc_num_cpus(amc->soc_name);
1455febbe308SPeter Delevoryas };
1456febbe308SPeter Delevoryas 
14571e2c22c9SCédric Le Goater #define BLETCHLEY_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB)
1458104bdaffSPatrick Williams 
1459a20c54b1SPatrick Williams static void aspeed_machine_bletchley_class_init(ObjectClass *oc, void *data)
1460a20c54b1SPatrick Williams {
1461a20c54b1SPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1462a20c54b1SPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1463a20c54b1SPatrick Williams 
1464a20c54b1SPatrick Williams     mc->desc       = "Facebook Bletchley BMC (Cortex-A7)";
1465a20c54b1SPatrick Williams     amc->soc_name  = "ast2600-a3";
1466a20c54b1SPatrick Williams     amc->hw_strap1 = BLETCHLEY_BMC_HW_STRAP1;
1467a20c54b1SPatrick Williams     amc->hw_strap2 = BLETCHLEY_BMC_HW_STRAP2;
1468a20c54b1SPatrick Williams     amc->fmc_model = "w25q01jvq";
1469a20c54b1SPatrick Williams     amc->spi_model = NULL;
1470a20c54b1SPatrick Williams     amc->num_cs    = 2;
1471a20c54b1SPatrick Williams     amc->macs_mask = ASPEED_MAC2_ON;
1472a20c54b1SPatrick Williams     amc->i2c_init  = bletchley_bmc_i2c_init;
1473104bdaffSPatrick Williams     mc->default_ram_size = BLETCHLEY_BMC_RAM_SIZE;
1474a20c54b1SPatrick Williams     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1475a20c54b1SPatrick Williams         aspeed_soc_num_cpus(amc->soc_name);
1476a20c54b1SPatrick Williams }
1477a20c54b1SPatrick Williams 
14787966d70fSJason A. Donenfeld static void fby35_reset(MachineState *state, ShutdownCause reason)
1479fa699e80SPeter Delevoryas {
1480fa699e80SPeter Delevoryas     AspeedMachineState *bmc = ASPEED_MACHINE(state);
1481*3c392e87SPhilippe Mathieu-Daudé     AspeedGPIOState *gpio = &bmc->soc->gpio;
1482fa699e80SPeter Delevoryas 
14837966d70fSJason A. Donenfeld     qemu_devices_reset(reason);
1484fa699e80SPeter Delevoryas 
1485f0418558SPeter Delevoryas     /* Board ID: 7 (Class-1, 4 slots) */
1486fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV4", true, &error_fatal);
1487fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV5", true, &error_fatal);
1488fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV6", true, &error_fatal);
1489fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV7", false, &error_fatal);
1490f0418558SPeter Delevoryas 
1491f0418558SPeter Delevoryas     /* Slot presence pins, inverse polarity. (False means present) */
1492f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH4", false, &error_fatal);
1493f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH5", true, &error_fatal);
1494f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH6", true, &error_fatal);
1495f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH7", true, &error_fatal);
1496f0418558SPeter Delevoryas 
1497f0418558SPeter Delevoryas     /* Slot 12v power pins, normal polarity. (True means powered-on) */
1498f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB2", true, &error_fatal);
1499f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB3", false, &error_fatal);
1500f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB4", false, &error_fatal);
1501f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB5", false, &error_fatal);
1502fa699e80SPeter Delevoryas }
1503fa699e80SPeter Delevoryas 
1504fa699e80SPeter Delevoryas static void aspeed_machine_fby35_class_init(ObjectClass *oc, void *data)
1505fa699e80SPeter Delevoryas {
1506fa699e80SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1507fa699e80SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1508fa699e80SPeter Delevoryas 
1509fa699e80SPeter Delevoryas     mc->desc       = "Facebook fby35 BMC (Cortex-A7)";
1510fa699e80SPeter Delevoryas     mc->reset      = fby35_reset;
1511fa699e80SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1512fa699e80SPeter Delevoryas     amc->num_cs    = 2;
1513fa699e80SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1514fa699e80SPeter Delevoryas     amc->i2c_init  = fby35_i2c_init;
1515fa699e80SPeter Delevoryas     /* FIXME: Replace this macro with something more general */
1516fa699e80SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
1517fa699e80SPeter Delevoryas }
1518fa699e80SPeter Delevoryas 
151966c895b8SJamin Lin #define AST1030_INTERNAL_FLASH_SIZE (1024 * 1024)
152066c895b8SJamin Lin /* Main SYSCLK frequency in Hz (200MHz) */
152166c895b8SJamin Lin #define SYSCLK_FRQ 200000000ULL
152266c895b8SJamin Lin 
152366c895b8SJamin Lin static void aspeed_minibmc_machine_init(MachineState *machine)
152466c895b8SJamin Lin {
152566c895b8SJamin Lin     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
152666c895b8SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
152766c895b8SJamin Lin     Clock *sysclk;
152866c895b8SJamin Lin 
152966c895b8SJamin Lin     sysclk = clock_new(OBJECT(machine), "SYSCLK");
153066c895b8SJamin Lin     clock_set_hz(sysclk, SYSCLK_FRQ);
153166c895b8SJamin Lin 
1532*3c392e87SPhilippe Mathieu-Daudé     bmc->soc = ASPEED_SOC(object_new(amc->soc_name));
1533*3c392e87SPhilippe Mathieu-Daudé     object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc));
1534*3c392e87SPhilippe Mathieu-Daudé     object_unref(OBJECT(bmc->soc));
1535*3c392e87SPhilippe Mathieu-Daudé     qdev_connect_clock_in(DEVICE(bmc->soc), "sysclk", sysclk);
153666c895b8SJamin Lin 
1537*3c392e87SPhilippe Mathieu-Daudé     object_property_set_link(OBJECT(bmc->soc), "memory",
15384dd9d554SPeter Delevoryas                              OBJECT(get_system_memory()), &error_abort);
1539d2b3eaefSPeter Delevoryas     connect_serial_hds_to_uarts(bmc);
1540*3c392e87SPhilippe Mathieu-Daudé     qdev_realize(DEVICE(bmc->soc), NULL, &error_abort);
154166c895b8SJamin Lin 
1542*3c392e87SPhilippe Mathieu-Daudé     aspeed_board_init_flashes(&bmc->soc->fmc,
154366c895b8SJamin Lin                               bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
154466c895b8SJamin Lin                               amc->num_cs,
154566c895b8SJamin Lin                               0);
154666c895b8SJamin Lin 
1547*3c392e87SPhilippe Mathieu-Daudé     aspeed_board_init_flashes(&bmc->soc->spi[0],
154866c895b8SJamin Lin                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
154966c895b8SJamin Lin                               amc->num_cs, amc->num_cs);
155066c895b8SJamin Lin 
1551*3c392e87SPhilippe Mathieu-Daudé     aspeed_board_init_flashes(&bmc->soc->spi[1],
155266c895b8SJamin Lin                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
155366c895b8SJamin Lin                               amc->num_cs, (amc->num_cs * 2));
155466c895b8SJamin Lin 
155566c895b8SJamin Lin     if (amc->i2c_init) {
155666c895b8SJamin Lin         amc->i2c_init(bmc);
155766c895b8SJamin Lin     }
155866c895b8SJamin Lin 
155966c895b8SJamin Lin     armv7m_load_kernel(ARM_CPU(first_cpu),
156066c895b8SJamin Lin                        machine->kernel_filename,
1561761c532aSPeter Maydell                        0,
156266c895b8SJamin Lin                        AST1030_INTERNAL_FLASH_SIZE);
156366c895b8SJamin Lin }
156466c895b8SJamin Lin 
15654c70ab16STroy Lee static void ast1030_evb_i2c_init(AspeedMachineState *bmc)
15664c70ab16STroy Lee {
1567*3c392e87SPhilippe Mathieu-Daudé     AspeedSoCState *soc = bmc->soc;
15684c70ab16STroy Lee 
1569673d8215SMichael Tokarev     /* U10 24C08 connects to SDA/SCL Group 1 by default */
15704c70ab16STroy Lee     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
15714c70ab16STroy Lee     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, eeprom_buf);
15724c70ab16STroy Lee 
15734c70ab16STroy Lee     /* U11 LM75 connects to SDA/SCL Group 2 by default */
15744c70ab16STroy Lee     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d);
15754c70ab16STroy Lee }
15764c70ab16STroy Lee 
157766c895b8SJamin Lin static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc,
157866c895b8SJamin Lin                                                           void *data)
157966c895b8SJamin Lin {
158066c895b8SJamin Lin     MachineClass *mc = MACHINE_CLASS(oc);
158166c895b8SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
158266c895b8SJamin Lin 
158366c895b8SJamin Lin     mc->desc = "Aspeed AST1030 MiniBMC (Cortex-M4)";
158466c895b8SJamin Lin     amc->soc_name = "ast1030-a1";
158566c895b8SJamin Lin     amc->hw_strap1 = 0;
158666c895b8SJamin Lin     amc->hw_strap2 = 0;
158766c895b8SJamin Lin     mc->init = aspeed_minibmc_machine_init;
15884c70ab16STroy Lee     amc->i2c_init = ast1030_evb_i2c_init;
158966c895b8SJamin Lin     mc->default_ram_size = 0;
159066c895b8SJamin Lin     mc->default_cpus = mc->min_cpus = mc->max_cpus = 1;
159166c895b8SJamin Lin     amc->fmc_model = "sst25vf032b";
159266c895b8SJamin Lin     amc->spi_model = "sst25vf032b";
159366c895b8SJamin Lin     amc->num_cs = 2;
159466c895b8SJamin Lin     amc->macs_mask = 0;
159566c895b8SJamin Lin }
159666c895b8SJamin Lin 
1597fb6b3c8dSJae Hyun Yoo static void aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass *oc,
1598fb6b3c8dSJae Hyun Yoo                                                      void *data)
1599fb6b3c8dSJae Hyun Yoo {
1600fb6b3c8dSJae Hyun Yoo     MachineClass *mc = MACHINE_CLASS(oc);
1601fb6b3c8dSJae Hyun Yoo     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1602fb6b3c8dSJae Hyun Yoo 
1603fb6b3c8dSJae Hyun Yoo     mc->desc       = "Qualcomm DC-SCM V1 BMC (Cortex A7)";
1604fb6b3c8dSJae Hyun Yoo     amc->soc_name  = "ast2600-a3";
1605fb6b3c8dSJae Hyun Yoo     amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1606fb6b3c8dSJae Hyun Yoo     amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1607fb6b3c8dSJae Hyun Yoo     amc->fmc_model = "n25q512a";
1608fb6b3c8dSJae Hyun Yoo     amc->spi_model = "n25q512a";
1609fb6b3c8dSJae Hyun Yoo     amc->num_cs    = 2;
1610fb6b3c8dSJae Hyun Yoo     amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1611fb6b3c8dSJae Hyun Yoo     amc->i2c_init  = qcom_dc_scm_bmc_i2c_init;
1612fb6b3c8dSJae Hyun Yoo     mc->default_ram_size = 1 * GiB;
1613fb6b3c8dSJae Hyun Yoo     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1614fb6b3c8dSJae Hyun Yoo         aspeed_soc_num_cpus(amc->soc_name);
1615fb6b3c8dSJae Hyun Yoo };
1616fb6b3c8dSJae Hyun Yoo 
1617ece4cccdSGraeme Gregory static void aspeed_machine_qcom_firework_class_init(ObjectClass *oc,
1618ece4cccdSGraeme Gregory                                                     void *data)
1619ece4cccdSGraeme Gregory {
1620ece4cccdSGraeme Gregory     MachineClass *mc = MACHINE_CLASS(oc);
1621ece4cccdSGraeme Gregory     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1622ece4cccdSGraeme Gregory 
1623ece4cccdSGraeme Gregory     mc->desc       = "Qualcomm DC-SCM V1/Firework BMC (Cortex A7)";
1624ece4cccdSGraeme Gregory     amc->soc_name  = "ast2600-a3";
1625ece4cccdSGraeme Gregory     amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1626ece4cccdSGraeme Gregory     amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1627ece4cccdSGraeme Gregory     amc->fmc_model = "n25q512a";
1628ece4cccdSGraeme Gregory     amc->spi_model = "n25q512a";
1629ece4cccdSGraeme Gregory     amc->num_cs    = 2;
1630ece4cccdSGraeme Gregory     amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1631ece4cccdSGraeme Gregory     amc->i2c_init  = qcom_dc_scm_firework_i2c_init;
1632ece4cccdSGraeme Gregory     mc->default_ram_size = 1 * GiB;
1633ece4cccdSGraeme Gregory     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1634ece4cccdSGraeme Gregory         aspeed_soc_num_cpus(amc->soc_name);
1635ece4cccdSGraeme Gregory };
1636ece4cccdSGraeme Gregory 
1637baa4732bSCédric Le Goater static const TypeInfo aspeed_machine_types[] = {
1638baa4732bSCédric Le Goater     {
1639baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("palmetto-bmc"),
1640baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1641baa4732bSCédric Le Goater         .class_init    = aspeed_machine_palmetto_class_init,
1642baa4732bSCédric Le Goater     }, {
164340a38df5SErik Smit         .name          = MACHINE_TYPE_NAME("supermicrox11-bmc"),
164440a38df5SErik Smit         .parent        = TYPE_ASPEED_MACHINE,
164540a38df5SErik Smit         .class_init    = aspeed_machine_supermicrox11_bmc_class_init,
164640a38df5SErik Smit     }, {
164747936597SGuenter Roeck         .name          = MACHINE_TYPE_NAME("supermicro-x11spi-bmc"),
164847936597SGuenter Roeck         .parent        = TYPE_ASPEED_MACHINE,
164947936597SGuenter Roeck         .class_init    = aspeed_machine_supermicro_x11spi_bmc_class_init,
165047936597SGuenter Roeck     }, {
1651baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2500-evb"),
1652baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1653baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2500_evb_class_init,
1654baa4732bSCédric Le Goater     }, {
1655baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("romulus-bmc"),
1656baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1657baa4732bSCédric Le Goater         .class_init    = aspeed_machine_romulus_class_init,
1658baa4732bSCédric Le Goater     }, {
1659143b040fSPatrick Williams         .name          = MACHINE_TYPE_NAME("sonorapass-bmc"),
1660143b040fSPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1661143b040fSPatrick Williams         .class_init    = aspeed_machine_sonorapass_class_init,
1662143b040fSPatrick Williams     }, {
1663baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("witherspoon-bmc"),
1664baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1665baa4732bSCédric Le Goater         .class_init    = aspeed_machine_witherspoon_class_init,
1666baa4732bSCédric Le Goater     }, {
1667baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2600-evb"),
1668baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1669baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2600_evb_class_init,
1670baa4732bSCédric Le Goater     }, {
167134f73a81SKarthikeyan Pasupathi         .name          = MACHINE_TYPE_NAME("yosemitev2-bmc"),
167234f73a81SKarthikeyan Pasupathi         .parent        = TYPE_ASPEED_MACHINE,
167334f73a81SKarthikeyan Pasupathi         .class_init    = aspeed_machine_yosemitev2_class_init,
167434f73a81SKarthikeyan Pasupathi     }, {
167563ceb818SCédric Le Goater         .name          = MACHINE_TYPE_NAME("tacoma-bmc"),
167663ceb818SCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
167763ceb818SCédric Le Goater         .class_init    = aspeed_machine_tacoma_class_init,
167863ceb818SCédric Le Goater     }, {
16796c323abaSKarthikeyan Pasupathi         .name          = MACHINE_TYPE_NAME("tiogapass-bmc"),
16806c323abaSKarthikeyan Pasupathi         .parent        = TYPE_ASPEED_MACHINE,
16816c323abaSKarthikeyan Pasupathi         .class_init    = aspeed_machine_tiogapass_class_init,
16826c323abaSKarthikeyan Pasupathi     }, {
168395f068c8SJohn Wang         .name          = MACHINE_TYPE_NAME("g220a-bmc"),
168495f068c8SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
168595f068c8SJohn Wang         .class_init    = aspeed_machine_g220a_class_init,
168695f068c8SJohn Wang     }, {
1687fb6b3c8dSJae Hyun Yoo         .name          = MACHINE_TYPE_NAME("qcom-dc-scm-v1-bmc"),
1688fb6b3c8dSJae Hyun Yoo         .parent        = TYPE_ASPEED_MACHINE,
1689fb6b3c8dSJae Hyun Yoo         .class_init    = aspeed_machine_qcom_dc_scm_v1_class_init,
1690fb6b3c8dSJae Hyun Yoo     }, {
1691ece4cccdSGraeme Gregory         .name          = MACHINE_TYPE_NAME("qcom-firework-bmc"),
1692ece4cccdSGraeme Gregory         .parent        = TYPE_ASPEED_MACHINE,
1693ece4cccdSGraeme Gregory         .class_init    = aspeed_machine_qcom_firework_class_init,
1694ece4cccdSGraeme Gregory     }, {
169582b6a3f6SJohn Wang         .name          = MACHINE_TYPE_NAME("fp5280g2-bmc"),
169682b6a3f6SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
169782b6a3f6SJohn Wang         .class_init    = aspeed_machine_fp5280g2_class_init,
169882b6a3f6SJohn Wang     }, {
16999cccb912SPatrick Venture         .name          = MACHINE_TYPE_NAME("quanta-q71l-bmc"),
17009cccb912SPatrick Venture         .parent        = TYPE_ASPEED_MACHINE,
17019cccb912SPatrick Venture         .class_init    = aspeed_machine_quanta_q71l_class_init,
17029cccb912SPatrick Venture     }, {
170358e52bdbSCédric Le Goater         .name          = MACHINE_TYPE_NAME("rainier-bmc"),
170458e52bdbSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
170558e52bdbSCédric Le Goater         .class_init    = aspeed_machine_rainier_class_init,
170658e52bdbSCédric Le Goater     }, {
1707febbe308SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fuji-bmc"),
1708febbe308SPeter Delevoryas         .parent        = TYPE_ASPEED_MACHINE,
1709febbe308SPeter Delevoryas         .class_init    = aspeed_machine_fuji_class_init,
1710febbe308SPeter Delevoryas     }, {
1711a20c54b1SPatrick Williams         .name          = MACHINE_TYPE_NAME("bletchley-bmc"),
1712a20c54b1SPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1713a20c54b1SPatrick Williams         .class_init    = aspeed_machine_bletchley_class_init,
1714a20c54b1SPatrick Williams     }, {
1715fa699e80SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fby35-bmc"),
1716fa699e80SPeter Delevoryas         .parent        = MACHINE_TYPE_NAME("ast2600-evb"),
1717fa699e80SPeter Delevoryas         .class_init    = aspeed_machine_fby35_class_init,
1718fa699e80SPeter Delevoryas     }, {
171966c895b8SJamin Lin         .name           = MACHINE_TYPE_NAME("ast1030-evb"),
172066c895b8SJamin Lin         .parent         = TYPE_ASPEED_MACHINE,
172166c895b8SJamin Lin         .class_init     = aspeed_minibmc_machine_ast1030_evb_class_init,
172266c895b8SJamin Lin     }, {
1723fca9ca1bSCédric Le Goater         .name          = TYPE_ASPEED_MACHINE,
172462c2c2ebSCédric Le Goater         .parent        = TYPE_MACHINE,
1725888b2b03SPhilippe Mathieu-Daudé         .instance_size = sizeof(AspeedMachineState),
17261a15311aSCédric Le Goater         .instance_init = aspeed_machine_instance_init,
1727fca9ca1bSCédric Le Goater         .class_size    = sizeof(AspeedMachineClass),
1728fca9ca1bSCédric Le Goater         .class_init    = aspeed_machine_class_init,
1729baa4732bSCédric Le Goater         .abstract      = true,
1730baa4732bSCédric Le Goater     }
1731fca9ca1bSCédric Le Goater };
173274fb1f38SCédric Le Goater 
1733baa4732bSCédric Le Goater DEFINE_TYPES(aspeed_machine_types)
1734