xref: /qemu/hw/arm/aspeed.c (revision 34f73a81e6cb84b2f7fca740887d59504173d2a0)
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"
183ec75e39SPatrick Venture #include "hw/i2c/i2c_mux_pca954x.h"
1993198b6cSCorey Minyard #include "hw/i2c/smbus_eeprom.h"
20044475f3SPhilippe Mathieu-Daudé #include "hw/misc/pca9552.h"
219618ebaeSPeter Delevoryas #include "hw/nvram/eeprom_at24c.h"
225e9ae4b1SCorey Minyard #include "hw/sensor/tmp105.h"
237cfbde5eSPhilippe Mathieu-Daudé #include "hw/misc/led.h"
24a27bd6c7SMarkus Armbruster #include "hw/qdev-properties.h"
25e1ad9bc4SCédric Le Goater #include "sysemu/block-backend.h"
26fa699e80SPeter Delevoryas #include "sysemu/reset.h"
27d769a1daSCédric Le Goater #include "hw/loader.h"
28d769a1daSCédric Le Goater #include "qemu/error-report.h"
29a9df9622SJoel Stanley #include "qemu/units.h"
3066c895b8SJamin Lin #include "hw/qdev-clock.h"
31d2b3eaefSPeter Delevoryas #include "sysemu/sysemu.h"
32327d8e4eSAndrew Jeffery 
3374fb1f38SCédric Le Goater static struct arm_boot_info aspeed_board_binfo = {
34b033271fSCédric Le Goater     .board_id = -1, /* device-tree-only board */
35327d8e4eSAndrew Jeffery };
36327d8e4eSAndrew Jeffery 
37612b219aSPhilippe Mathieu-Daudé struct AspeedMachineState {
38888b2b03SPhilippe Mathieu-Daudé     /* Private */
39888b2b03SPhilippe Mathieu-Daudé     MachineState parent_obj;
40888b2b03SPhilippe Mathieu-Daudé     /* Public */
41888b2b03SPhilippe Mathieu-Daudé 
42ff90606fSCédric Le Goater     AspeedSoCState soc;
43888b2b03SPhilippe Mathieu-Daudé     bool mmio_exec;
449820e52fSCédric Le Goater     char *fmc_model;
459820e52fSCédric Le Goater     char *spi_model;
46ea066d39SThomas Huth };
47327d8e4eSAndrew Jeffery 
48ef17f836SCédric Le Goater /* Palmetto hardware value: 0x120CE416 */
498da33ef7SCédric Le Goater #define PALMETTO_BMC_HW_STRAP1 (                                        \
508da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_256MB) |               \
518da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2 /* DDR3 with CL=6, CWL=5 */) | \
528da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
538da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) |       \
548da33ef7SCédric Le Goater         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
558da33ef7SCédric Le Goater         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
568da33ef7SCédric Le Goater         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) |                \
578da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
588da33ef7SCédric Le Goater         SCU_HW_STRAP_SPI_WIDTH |                                        \
598da33ef7SCédric Le Goater         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
608da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
618da33ef7SCédric Le Goater 
6240a38df5SErik Smit /* TODO: Find the actual hardware value */
6340a38df5SErik Smit #define SUPERMICROX11_BMC_HW_STRAP1 (                                   \
6440a38df5SErik Smit         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) |               \
6540a38df5SErik Smit         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2) |                           \
6640a38df5SErik Smit         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
6740a38df5SErik Smit         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) |       \
6840a38df5SErik Smit         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
6940a38df5SErik Smit         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
7040a38df5SErik Smit         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) |                \
7140a38df5SErik Smit         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
7240a38df5SErik Smit         SCU_HW_STRAP_SPI_WIDTH |                                        \
7340a38df5SErik Smit         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
7440a38df5SErik Smit         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
7540a38df5SErik Smit 
7647936597SGuenter Roeck /* TODO: Find the actual hardware value */
7747936597SGuenter Roeck #define SUPERMICRO_X11SPI_BMC_HW_STRAP1 (                               \
7847936597SGuenter Roeck         AST2500_HW_STRAP1_DEFAULTS |                                    \
7947936597SGuenter Roeck         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
8047936597SGuenter Roeck         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
8147936597SGuenter Roeck         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
8247936597SGuenter Roeck         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
8347936597SGuenter Roeck         SCU_HW_STRAP_SPI_WIDTH |                                        \
8447936597SGuenter Roeck         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN))
8547936597SGuenter Roeck 
86ef17f836SCédric Le Goater /* AST2500 evb hardware value: 0xF100C2E6 */
879a7c1750SCédric Le Goater #define AST2500_EVB_HW_STRAP1 ((                                        \
889a7c1750SCédric Le Goater         AST2500_HW_STRAP1_DEFAULTS |                                    \
899a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
909a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
919a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
929a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
939a7c1750SCédric Le Goater         SCU_HW_STRAP_MAC1_RGMII |                                       \
949a7c1750SCédric Le Goater         SCU_HW_STRAP_MAC0_RGMII) &                                      \
959a7c1750SCédric Le Goater         ~SCU_HW_STRAP_2ND_BOOT_WDT)
969a7c1750SCédric Le Goater 
97ef17f836SCédric Le Goater /* Romulus hardware value: 0xF10AD206 */
98ef17f836SCédric Le Goater #define ROMULUS_BMC_HW_STRAP1 (                                         \
99ef17f836SCédric Le Goater         AST2500_HW_STRAP1_DEFAULTS |                                    \
100ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
101ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
102ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
103ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
104ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_ACPI_ENABLE |                              \
105ef17f836SCédric Le Goater         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER))
106ef17f836SCédric Le Goater 
107143b040fSPatrick Williams /* Sonorapass hardware value: 0xF100D216 */
108143b040fSPatrick Williams #define SONORAPASS_BMC_HW_STRAP1 (                                      \
109143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
110143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
111143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
112143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
113143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
114143b040fSPatrick Williams         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
115143b040fSPatrick Williams         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
116143b040fSPatrick Williams         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
117143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
118143b040fSPatrick Williams         SCU_HW_STRAP_VGA_BIOS_ROM |                                     \
119143b040fSPatrick Williams         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
120143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_RESERVED1)
121143b040fSPatrick Williams 
12295f068c8SJohn Wang #define G220A_BMC_HW_STRAP1 (                                      \
12395f068c8SJohn Wang         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
12495f068c8SJohn Wang         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
12595f068c8SJohn Wang         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
12695f068c8SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
12795f068c8SJohn Wang         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
12895f068c8SJohn Wang         SCU_HW_STRAP_2ND_BOOT_WDT |                                     \
12995f068c8SJohn Wang         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
13095f068c8SJohn Wang         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
13195f068c8SJohn Wang         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
13295f068c8SJohn Wang         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
13395f068c8SJohn Wang         SCU_HW_STRAP_VGA_SIZE_SET(VGA_64M_DRAM) |                       \
13495f068c8SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED1)
13595f068c8SJohn Wang 
13682b6a3f6SJohn Wang /* FP5280G2 hardware value: 0XF100D286 */
13782b6a3f6SJohn Wang #define FP5280G2_BMC_HW_STRAP1 (                                      \
13882b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
13982b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
14082b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
14182b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
14282b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
14382b6a3f6SJohn Wang         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
14482b6a3f6SJohn Wang         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
14582b6a3f6SJohn Wang         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
14682b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
14782b6a3f6SJohn Wang         SCU_HW_STRAP_MAC1_RGMII |                                       \
14882b6a3f6SJohn Wang         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
14982b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED1)
15082b6a3f6SJohn Wang 
15162c2c2ebSCédric Le Goater /* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */
15262c2c2ebSCédric Le Goater #define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1
15362c2c2ebSCédric Le Goater 
1549cccb912SPatrick Venture /* Quanta-Q71l hardware value */
1559cccb912SPatrick Venture #define QUANTA_Q71L_BMC_HW_STRAP1 (                                     \
1569cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) |               \
1579cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2/* DDR3 with CL=6, CWL=5 */) | \
1589cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
1599cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_24M_IN) |       \
1609cccb912SPatrick Venture         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
1619cccb912SPatrick Venture         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_PASS_THROUGH) |          \
1629cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
1639cccb912SPatrick Venture         SCU_HW_STRAP_SPI_WIDTH |                                        \
1649cccb912SPatrick Venture         SCU_HW_STRAP_VGA_SIZE_SET(VGA_8M_DRAM) |                        \
1659cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
1669cccb912SPatrick Venture 
167ccc2c418SCédric Le Goater /* AST2600 evb hardware value */
168ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP1 0x000000C0
169ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP2 0x00000003
170ccc2c418SCédric Le Goater 
17163ceb818SCédric Le Goater /* Tacoma hardware value */
17263ceb818SCédric Le Goater #define TACOMA_BMC_HW_STRAP1  0x00000000
1737582591aSJoel Stanley #define TACOMA_BMC_HW_STRAP2  0x00000040
17463ceb818SCédric Le Goater 
17558e52bdbSCédric Le Goater /* Rainier hardware value: (QEMU prototype) */
176b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP1 0x00422016
177b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP2 0x80000848
17858e52bdbSCédric Le Goater 
179febbe308SPeter Delevoryas /* Fuji hardware value */
180febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP1    0x00000000
181febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP2    0x00000000
182febbe308SPeter Delevoryas 
183a20c54b1SPatrick Williams /* Bletchley hardware value */
184a20c54b1SPatrick Williams /* TODO: Leave same as EVB for now. */
185a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP1 AST2600_EVB_HW_STRAP1
186a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP2 AST2600_EVB_HW_STRAP2
187a20c54b1SPatrick Williams 
188fb6b3c8dSJae Hyun Yoo /* Qualcomm DC-SCM hardware value */
189fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP1  0x00000000
190fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP2  0x00000041
191fb6b3c8dSJae Hyun Yoo 
1929bb6d140SJoel Stanley #define AST_SMP_MAILBOX_BASE            0x1e6e2180
1939bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_ENTRY        (AST_SMP_MAILBOX_BASE + 0x0)
1949bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_GOSIGN       (AST_SMP_MAILBOX_BASE + 0x4)
1959bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_READY        (AST_SMP_MAILBOX_BASE + 0x8)
1969bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_POLLINSN     (AST_SMP_MAILBOX_BASE + 0xc)
1979bb6d140SJoel Stanley #define AST_SMP_MBOX_CODE               (AST_SMP_MAILBOX_BASE + 0x10)
1989bb6d140SJoel Stanley #define AST_SMP_MBOX_GOSIGN             0xabbaab00
1999bb6d140SJoel Stanley 
2009bb6d140SJoel Stanley static void aspeed_write_smpboot(ARMCPU *cpu,
2019bb6d140SJoel Stanley                                  const struct arm_boot_info *info)
2029bb6d140SJoel Stanley {
2039bb6d140SJoel Stanley     static const uint32_t poll_mailbox_ready[] = {
2049bb6d140SJoel Stanley         /*
2059bb6d140SJoel Stanley          * r2 = per-cpu go sign value
2069bb6d140SJoel Stanley          * r1 = AST_SMP_MBOX_FIELD_ENTRY
2079bb6d140SJoel Stanley          * r0 = AST_SMP_MBOX_FIELD_GOSIGN
2089bb6d140SJoel Stanley          */
2099bb6d140SJoel Stanley         0xee100fb0,  /* mrc     p15, 0, r0, c0, c0, 5 */
2109bb6d140SJoel Stanley         0xe21000ff,  /* ands    r0, r0, #255          */
2119bb6d140SJoel Stanley         0xe59f201c,  /* ldr     r2, [pc, #28]         */
2129bb6d140SJoel Stanley         0xe1822000,  /* orr     r2, r2, r0            */
2139bb6d140SJoel Stanley 
2149bb6d140SJoel Stanley         0xe59f1018,  /* ldr     r1, [pc, #24]         */
2159bb6d140SJoel Stanley         0xe59f0018,  /* ldr     r0, [pc, #24]         */
2169bb6d140SJoel Stanley 
2179bb6d140SJoel Stanley         0xe320f002,  /* wfe                           */
2189bb6d140SJoel Stanley         0xe5904000,  /* ldr     r4, [r0]              */
2199bb6d140SJoel Stanley         0xe1520004,  /* cmp     r2, r4                */
2209bb6d140SJoel Stanley         0x1afffffb,  /* bne     <wfe>                 */
2219bb6d140SJoel Stanley         0xe591f000,  /* ldr     pc, [r1]              */
2229bb6d140SJoel Stanley         AST_SMP_MBOX_GOSIGN,
2239bb6d140SJoel Stanley         AST_SMP_MBOX_FIELD_ENTRY,
2249bb6d140SJoel Stanley         AST_SMP_MBOX_FIELD_GOSIGN,
2259bb6d140SJoel Stanley     };
2269bb6d140SJoel Stanley 
2279bb6d140SJoel Stanley     rom_add_blob_fixed("aspeed.smpboot", poll_mailbox_ready,
2289bb6d140SJoel Stanley                        sizeof(poll_mailbox_ready),
2299bb6d140SJoel Stanley                        info->smp_loader_start);
2309bb6d140SJoel Stanley }
2319bb6d140SJoel Stanley 
2329bb6d140SJoel Stanley static void aspeed_reset_secondary(ARMCPU *cpu,
2339bb6d140SJoel Stanley                                    const struct arm_boot_info *info)
2349bb6d140SJoel Stanley {
2359bb6d140SJoel Stanley     AddressSpace *as = arm_boot_address_space(cpu, info);
2369bb6d140SJoel Stanley     CPUState *cs = CPU(cpu);
2379bb6d140SJoel Stanley 
2389bb6d140SJoel Stanley     /* info->smp_bootreg_addr */
2399bb6d140SJoel Stanley     address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0,
2409bb6d140SJoel Stanley                                MEMTXATTRS_UNSPECIFIED, NULL);
2419bb6d140SJoel Stanley     cpu_set_pc(cs, info->smp_loader_start);
2429bb6d140SJoel Stanley }
2439bb6d140SJoel Stanley 
244d769a1daSCédric Le Goater #define FIRMWARE_ADDR 0x0
245d769a1daSCédric Le Goater 
246d769a1daSCédric Le Goater static void write_boot_rom(DriveInfo *dinfo, hwaddr addr, size_t rom_size,
247d769a1daSCédric Le Goater                            Error **errp)
248d769a1daSCédric Le Goater {
249d769a1daSCédric Le Goater     BlockBackend *blk = blk_by_legacy_dinfo(dinfo);
25005e6e40aSWentao_Liang     g_autofree void *storage = NULL;
2510c7209beSCédric Le Goater     int64_t size;
252d769a1daSCédric Le Goater 
2530c7209beSCédric Le Goater     /* The block backend size should have already been 'validated' by
2540c7209beSCédric Le Goater      * the creation of the m25p80 object.
2550c7209beSCédric Le Goater      */
2560c7209beSCédric Le Goater     size = blk_getlength(blk);
2570c7209beSCédric Le Goater     if (size <= 0) {
2580c7209beSCédric Le Goater         error_setg(errp, "failed to get flash size");
2590c7209beSCédric Le Goater         return;
2600c7209beSCédric Le Goater     }
2610c7209beSCédric Le Goater 
2620c7209beSCédric Le Goater     if (rom_size > size) {
2630c7209beSCédric Le Goater         rom_size = size;
264d769a1daSCédric Le Goater     }
265d769a1daSCédric Le Goater 
26605e6e40aSWentao_Liang     storage = g_malloc0(rom_size);
267a9262f55SAlberto Faria     if (blk_pread(blk, 0, rom_size, storage, 0) < 0) {
268d769a1daSCédric Le Goater         error_setg(errp, "failed to read the initial flash content");
269d769a1daSCédric Le Goater         return;
270d769a1daSCédric Le Goater     }
271d769a1daSCédric Le Goater 
272d769a1daSCédric Le Goater     rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr);
273d769a1daSCédric Le Goater }
274d769a1daSCédric Le Goater 
2751099ad10SPeter Delevoryas void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
2769bd4ac61SCédric Le Goater                                       unsigned int count, int unit0)
277e1ad9bc4SCédric Le Goater {
278e1ad9bc4SCédric Le Goater     int i;
279179b2058SPatrick Williams 
280179b2058SPatrick Williams     if (!flashtype) {
281179b2058SPatrick Williams         return;
282179b2058SPatrick Williams     }
283e1ad9bc4SCédric Le Goater 
2849bd4ac61SCédric Le Goater     for (i = 0; i < count; ++i) {
2858ec239f2SMarkus Armbruster         DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i);
286e1ad9bc4SCédric Le Goater         qemu_irq cs_line;
287a7d78befSCédric Le Goater         DeviceState *dev;
288e1ad9bc4SCédric Le Goater 
289a7d78befSCédric Le Goater         dev = qdev_new(flashtype);
290e1ad9bc4SCédric Le Goater         if (dinfo) {
291a7d78befSCédric Le Goater             qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo));
292e1ad9bc4SCédric Le Goater         }
293a7d78befSCédric Le Goater         qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal);
294e1ad9bc4SCédric Le Goater 
295a7d78befSCédric Le Goater         cs_line = qdev_get_gpio_in_named(dev, SSI_GPIO_CS, 0);
296e1ad9bc4SCédric Le Goater         sysbus_connect_irq(SYS_BUS_DEVICE(s), i + 1, cs_line);
297e1ad9bc4SCédric Le Goater     }
298e1ad9bc4SCédric Le Goater }
299e1ad9bc4SCédric Le Goater 
300a29e3e12SAndrew Jeffery static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo)
301a29e3e12SAndrew Jeffery {
302a29e3e12SAndrew Jeffery         DeviceState *card;
303a29e3e12SAndrew Jeffery 
304756f739bSPhilippe Mathieu-Daudé         if (!dinfo) {
305756f739bSPhilippe Mathieu-Daudé             return;
306756f739bSPhilippe Mathieu-Daudé         }
3073e80f690SMarkus Armbruster         card = qdev_new(TYPE_SD_CARD);
308934df912SMarkus Armbruster         qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
309a29e3e12SAndrew Jeffery                                 &error_fatal);
3103e80f690SMarkus Armbruster         qdev_realize_and_unref(card,
3113e80f690SMarkus Armbruster                                qdev_get_child_bus(DEVICE(sdhci), "sd-bus"),
3123e80f690SMarkus Armbruster                                &error_fatal);
313a29e3e12SAndrew Jeffery }
314a29e3e12SAndrew Jeffery 
315d2b3eaefSPeter Delevoryas static void connect_serial_hds_to_uarts(AspeedMachineState *bmc)
316d2b3eaefSPeter Delevoryas {
317d2b3eaefSPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
318d2b3eaefSPeter Delevoryas     AspeedSoCState *s = &bmc->soc;
319d2b3eaefSPeter Delevoryas     AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
320d2b3eaefSPeter Delevoryas 
321d2b3eaefSPeter Delevoryas     aspeed_soc_uart_set_chr(s, amc->uart_default, serial_hd(0));
322d2b3eaefSPeter Delevoryas     for (int i = 1, uart = ASPEED_DEV_UART1; i < sc->uarts_num; i++, uart++) {
323d2b3eaefSPeter Delevoryas         if (uart == amc->uart_default) {
324d2b3eaefSPeter Delevoryas             continue;
325d2b3eaefSPeter Delevoryas         }
326d2b3eaefSPeter Delevoryas         aspeed_soc_uart_set_chr(s, uart, serial_hd(i));
327d2b3eaefSPeter Delevoryas     }
328d2b3eaefSPeter Delevoryas }
329d2b3eaefSPeter Delevoryas 
330baa4732bSCédric Le Goater static void aspeed_machine_init(MachineState *machine)
331327d8e4eSAndrew Jeffery {
332888b2b03SPhilippe Mathieu-Daudé     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
333baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
334b033271fSCédric Le Goater     AspeedSoCClass *sc;
335d769a1daSCédric Le Goater     DriveInfo *drive0 = drive_get(IF_MTD, 0, 0);
3362bea128cSEddie James     int i;
337d3bad7e7SCédric Le Goater     NICInfo *nd = &nd_table[0];
338327d8e4eSAndrew Jeffery 
3399fc7fc4dSMarkus Armbruster     object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
340327d8e4eSAndrew Jeffery 
341b033271fSCédric Le Goater     sc = ASPEED_SOC_GET_CLASS(&bmc->soc);
342b033271fSCédric Le Goater 
343533eb415SIgor Mammedov     /*
344346160cbSCédric Le Goater      * This will error out if the RAM size is not supported by the
345346160cbSCédric Le Goater      * memory controller of the SoC.
346533eb415SIgor Mammedov      */
3476e504a98SPaolo Bonzini     object_property_set_uint(OBJECT(&bmc->soc), "ram-size", machine->ram_size,
348533eb415SIgor Mammedov                              &error_fatal);
349533eb415SIgor Mammedov 
350d3bad7e7SCédric Le Goater     for (i = 0; i < sc->macs_num; i++) {
351d3bad7e7SCédric Le Goater         if ((amc->macs_mask & (1 << i)) && nd->used) {
352d3bad7e7SCédric Le Goater             qemu_check_nic_model(nd, TYPE_FTGMAC100);
353d3bad7e7SCédric Le Goater             qdev_set_nic_properties(DEVICE(&bmc->soc.ftgmac100[i]), nd);
354d3bad7e7SCédric Le Goater             nd++;
355d3bad7e7SCédric Le Goater         }
356d3bad7e7SCédric Le Goater     }
357d3bad7e7SCédric Le Goater 
3585325cc34SMarkus Armbruster     object_property_set_int(OBJECT(&bmc->soc), "hw-strap1", amc->hw_strap1,
35987e79af0SAndrew Jeffery                             &error_abort);
3605325cc34SMarkus Armbruster     object_property_set_int(OBJECT(&bmc->soc), "hw-strap2", amc->hw_strap2,
361ccc2c418SCédric Le Goater                             &error_abort);
3624dd9d554SPeter Delevoryas     object_property_set_link(OBJECT(&bmc->soc), "memory",
3634dd9d554SPeter Delevoryas                              OBJECT(get_system_memory()), &error_abort);
3645325cc34SMarkus Armbruster     object_property_set_link(OBJECT(&bmc->soc), "dram",
3650df2d9a6SCédric Le Goater                              OBJECT(machine->ram), &error_abort);
366b6e70d1dSJoel Stanley     if (machine->kernel_filename) {
367b6e70d1dSJoel Stanley         /*
368b6e70d1dSJoel Stanley          * When booting with a -kernel command line there is no u-boot
369b6e70d1dSJoel Stanley          * that runs to unlock the SCU. In this case set the default to
370b6e70d1dSJoel Stanley          * be unlocked as the kernel expects
371b6e70d1dSJoel Stanley          */
3725325cc34SMarkus Armbruster         object_property_set_int(OBJECT(&bmc->soc), "hw-prot-key",
3735325cc34SMarkus Armbruster                                 ASPEED_SCU_PROT_KEY, &error_abort);
374b6e70d1dSJoel Stanley     }
375d2b3eaefSPeter Delevoryas     connect_serial_hds_to_uarts(bmc);
376ce189ab2SMarkus Armbruster     qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
377327d8e4eSAndrew Jeffery 
3788ec239f2SMarkus Armbruster     aspeed_board_init_flashes(&bmc->soc.fmc,
3798ec239f2SMarkus Armbruster                               bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
3809bd4ac61SCédric Le Goater                               amc->num_cs, 0);
3818ec239f2SMarkus Armbruster     aspeed_board_init_flashes(&bmc->soc.spi[0],
3828ec239f2SMarkus Armbruster                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
3839bd4ac61SCédric Le Goater                               1, amc->num_cs);
384e1ad9bc4SCédric Le Goater 
385d769a1daSCédric Le Goater     /* Install first FMC flash content as a boot rom. */
386d769a1daSCédric Le Goater     if (drive0) {
387d769a1daSCédric Le Goater         AspeedSMCFlash *fl = &bmc->soc.fmc.flashes[0];
388d769a1daSCédric Le Goater         MemoryRegion *boot_rom = g_new(MemoryRegion, 1);
3896bb55e79SCédric Le Goater         uint64_t size = memory_region_size(&fl->mmio);
390d769a1daSCédric Le Goater 
391d769a1daSCédric Le Goater         /*
392d769a1daSCédric Le Goater          * create a ROM region using the default mapping window size of
39393bf276dSCédric Le Goater          * the flash module. The window size is 64MB for the AST2400
39493bf276dSCédric Le Goater          * SoC and 128MB for the AST2500 SoC, which is twice as big as
39593bf276dSCédric Le Goater          * needed by the flash modules of the Aspeed machines.
396d769a1daSCédric Le Goater          */
3971a15311aSCédric Le Goater         if (ASPEED_MACHINE(machine)->mmio_exec) {
398f489960dSPhilippe Mathieu-Daudé             memory_region_init_alias(boot_rom, NULL, "aspeed.boot_rom",
3996bb55e79SCédric Le Goater                                      &fl->mmio, 0, size);
4001a15311aSCédric Le Goater             memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
4011a15311aSCédric Le Goater                                         boot_rom);
4021a15311aSCédric Le Goater         } else {
403f489960dSPhilippe Mathieu-Daudé             memory_region_init_rom(boot_rom, NULL, "aspeed.boot_rom",
4046bb55e79SCédric Le Goater                                    size, &error_abort);
405d769a1daSCédric Le Goater             memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
406d769a1daSCédric Le Goater                                         boot_rom);
4076bb55e79SCédric Le Goater             write_boot_rom(drive0, FIRMWARE_ADDR, size, &error_abort);
408d769a1daSCédric Le Goater         }
4091a15311aSCédric Le Goater     }
410d769a1daSCédric Le Goater 
411b7f1a0cbSCédric Le Goater     if (machine->kernel_filename && sc->num_cpus > 1) {
4129bb6d140SJoel Stanley         /* With no u-boot we must set up a boot stub for the secondary CPU */
4139bb6d140SJoel Stanley         MemoryRegion *smpboot = g_new(MemoryRegion, 1);
414f489960dSPhilippe Mathieu-Daudé         memory_region_init_ram(smpboot, NULL, "aspeed.smpboot",
4159bb6d140SJoel Stanley                                0x80, &error_abort);
4169bb6d140SJoel Stanley         memory_region_add_subregion(get_system_memory(),
4179bb6d140SJoel Stanley                                     AST_SMP_MAILBOX_BASE, smpboot);
4189bb6d140SJoel Stanley 
4199bb6d140SJoel Stanley         aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot;
4209bb6d140SJoel Stanley         aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary;
4219bb6d140SJoel Stanley         aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE;
4229bb6d140SJoel Stanley     }
4239bb6d140SJoel Stanley 
4246e504a98SPaolo Bonzini     aspeed_board_binfo.ram_size = machine->ram_size;
425347df6f8SEduardo Habkost     aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM];
426b033271fSCédric Le Goater 
427baa4732bSCédric Le Goater     if (amc->i2c_init) {
428baa4732bSCédric Le Goater         amc->i2c_init(bmc);
4292cf6cb50SCédric Le Goater     }
4302cf6cb50SCédric Le Goater 
4310e2c24c6SAndrew Jeffery     for (i = 0; i < bmc->soc.sdhci.num_slots; i++) {
4328ec239f2SMarkus Armbruster         sdhci_attach_drive(&bmc->soc.sdhci.slots[i],
4338ec239f2SMarkus Armbruster                            drive_get(IF_SD, 0, i));
434a29e3e12SAndrew Jeffery     }
4352bea128cSEddie James 
436a29e3e12SAndrew Jeffery     if (bmc->soc.emmc.num_slots) {
4378ec239f2SMarkus Armbruster         sdhci_attach_drive(&bmc->soc.emmc.slots[0],
4388ec239f2SMarkus Armbruster                            drive_get(IF_SD, 0, bmc->soc.sdhci.num_slots));
4392bea128cSEddie James     }
4402bea128cSEddie James 
4412744ece8STao Xu     arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo);
442327d8e4eSAndrew Jeffery }
443327d8e4eSAndrew Jeffery 
444612b219aSPhilippe Mathieu-Daudé static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
4452cf6cb50SCédric Le Goater {
4462cf6cb50SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
447a87e81b9SCédric Le Goater     DeviceState *dev;
4483d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
4492cf6cb50SCédric Le Goater 
4502cf6cb50SCédric Le Goater     /* The palmetto platform expects a ds3231 RTC but a ds1338 is
4512cf6cb50SCédric Le Goater      * enough to provide basic RTC features. Alarms will be missing */
4521373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
453a87e81b9SCédric Le Goater 
4547a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
4553d165f12SCédric Le Goater                           eeprom_buf);
4563d165f12SCédric Le Goater 
457a87e81b9SCédric Le Goater     /* add a TMP423 temperature sensor */
4581373b15bSPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
4591373b15bSPhilippe Mathieu-Daudé                                          "tmp423", 0x4c));
4605325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
4615325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
4625325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
4635325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort);
4642cf6cb50SCédric Le Goater }
4652cf6cb50SCédric Le Goater 
4669cccb912SPatrick Venture static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc)
4679cccb912SPatrick Venture {
4689cccb912SPatrick Venture     AspeedSoCState *soc = &bmc->soc;
4699cccb912SPatrick Venture 
4709cccb912SPatrick Venture     /*
4719cccb912SPatrick Venture      * The quanta-q71l platform expects tmp75s which are compatible with
4729cccb912SPatrick Venture      * tmp105s.
4739cccb912SPatrick Venture      */
4749cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c);
4759cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e);
4769cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f);
4779cccb912SPatrick Venture 
4789cccb912SPatrick Venture     /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */
4799cccb912SPatrick Venture     /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */
4809cccb912SPatrick Venture     /* TODO: Add Memory Riser i2c mux and eeproms. */
4819cccb912SPatrick Venture 
4823ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74);
4833ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77);
4843ec75e39SPatrick Venture 
4859cccb912SPatrick Venture     /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */
4863ec75e39SPatrick Venture 
4873ec75e39SPatrick Venture     /* i2c-7 */
4883ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70);
4899cccb912SPatrick Venture     /*        - i2c@0: pmbus@59 */
4909cccb912SPatrick Venture     /*        - i2c@1: pmbus@58 */
4919cccb912SPatrick Venture     /*        - i2c@2: pmbus@58 */
4929cccb912SPatrick Venture     /*        - i2c@3: pmbus@59 */
4933ec75e39SPatrick Venture 
4949cccb912SPatrick Venture     /* TODO: i2c-7: Add PDB FRU eeprom@52 */
4959cccb912SPatrick Venture     /* TODO: i2c-8: Add BMC FRU eeprom@50 */
4969cccb912SPatrick Venture }
4979cccb912SPatrick Venture 
498612b219aSPhilippe Mathieu-Daudé static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
4992cf6cb50SCédric Le Goater {
5002cf6cb50SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
5013d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
5023d165f12SCédric Le Goater 
5037a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50,
5043d165f12SCédric Le Goater                           eeprom_buf);
5052cf6cb50SCédric Le Goater 
5062cf6cb50SCédric Le Goater     /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
5071373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
508044475f3SPhilippe Mathieu-Daudé                      TYPE_TMP105, 0x4d);
5092cf6cb50SCédric Le Goater }
5102cf6cb50SCédric Le Goater 
511612b219aSPhilippe Mathieu-Daudé static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
512ccc2c418SCédric Le Goater {
51352bcd997SHoward Chiu     AspeedSoCState *soc = &bmc->soc;
51452bcd997SHoward Chiu     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
51552bcd997SHoward Chiu 
51652bcd997SHoward Chiu     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50,
51752bcd997SHoward Chiu                           eeprom_buf);
51852bcd997SHoward Chiu 
51952bcd997SHoward Chiu     /* LM75 is compatible with TMP105 driver */
52052bcd997SHoward Chiu     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
52152bcd997SHoward Chiu                      TYPE_TMP105, 0x4d);
522ccc2c418SCédric Le Goater }
523ccc2c418SCédric Le Goater 
524*34f73a81SKarthikeyan Pasupathi static void yosemitev2_bmc_i2c_init(AspeedMachineState *bmc)
525*34f73a81SKarthikeyan Pasupathi {
526*34f73a81SKarthikeyan Pasupathi     AspeedSoCState *soc = &bmc->soc;
527*34f73a81SKarthikeyan Pasupathi 
528*34f73a81SKarthikeyan Pasupathi     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x51, 128 * KiB);
529*34f73a81SKarthikeyan Pasupathi     at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 128 * KiB,
530*34f73a81SKarthikeyan Pasupathi                           yosemitev2_bmc_fruid, yosemitev2_bmc_fruid_len);
531*34f73a81SKarthikeyan Pasupathi }
532*34f73a81SKarthikeyan Pasupathi 
533612b219aSPhilippe Mathieu-Daudé static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
5346c4567c7SCédric Le Goater {
5356c4567c7SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
5366c4567c7SCédric Le Goater 
5376c4567c7SCédric Le Goater     /* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
5386c4567c7SCédric Le Goater      * good enough */
5391373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
5406c4567c7SCédric Le Goater }
5416c4567c7SCédric Le Goater 
542f4aec252SCédric Le Goater static void create_pca9552(AspeedSoCState *soc, int bus_id, int addr)
543f4aec252SCédric Le Goater {
544f4aec252SCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, bus_id),
545f4aec252SCédric Le Goater                             TYPE_PCA9552, addr);
546f4aec252SCédric Le Goater }
547f4aec252SCédric Le Goater 
548612b219aSPhilippe Mathieu-Daudé static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc)
549143b040fSPatrick Williams {
550143b040fSPatrick Williams     AspeedSoCState *soc = &bmc->soc;
551143b040fSPatrick Williams 
552143b040fSPatrick Williams     /* bus 2 : */
5531373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48);
5541373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49);
555143b040fSPatrick Williams     /* bus 2 : pca9546 @ 0x73 */
556143b040fSPatrick Williams 
557143b040fSPatrick Williams     /* bus 3 : pca9548 @ 0x70 */
558143b040fSPatrick Williams 
559143b040fSPatrick Williams     /* bus 4 : */
560143b040fSPatrick Williams     uint8_t *eeprom4_54 = g_malloc0(8 * 1024);
5617a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54,
562143b040fSPatrick Williams                           eeprom4_54);
563143b040fSPatrick Williams     /* PCA9539 @ 0x76, but PCA9552 is compatible */
564f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x76);
565143b040fSPatrick Williams     /* PCA9539 @ 0x77, but PCA9552 is compatible */
566f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x77);
567143b040fSPatrick Williams 
568143b040fSPatrick Williams     /* bus 6 : */
5691373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48);
5701373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49);
571143b040fSPatrick Williams     /* bus 6 : pca9546 @ 0x73 */
572143b040fSPatrick Williams 
573143b040fSPatrick Williams     /* bus 8 : */
574143b040fSPatrick Williams     uint8_t *eeprom8_56 = g_malloc0(8 * 1024);
5757a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56,
576143b040fSPatrick Williams                           eeprom8_56);
577f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x60);
578f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x61);
579143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1d */
580143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1f */
581143b040fSPatrick Williams 
582143b040fSPatrick Williams     /*
583143b040fSPatrick Williams      * bus 13 : pca9548 @ 0x71
584143b040fSPatrick Williams      *      - channel 3:
585143b040fSPatrick Williams      *          - tmm421 @ 0x4c
586143b040fSPatrick Williams      *          - tmp421 @ 0x4e
587143b040fSPatrick Williams      *          - tmp421 @ 0x4f
588143b040fSPatrick Williams      */
589143b040fSPatrick Williams 
590143b040fSPatrick Williams }
591143b040fSPatrick Williams 
592612b219aSPhilippe Mathieu-Daudé static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
59362c2c2ebSCédric Le Goater {
5947cfbde5eSPhilippe Mathieu-Daudé     static const struct {
5957cfbde5eSPhilippe Mathieu-Daudé         unsigned gpio_id;
5967cfbde5eSPhilippe Mathieu-Daudé         LEDColor color;
5977cfbde5eSPhilippe Mathieu-Daudé         const char *description;
5987cfbde5eSPhilippe Mathieu-Daudé         bool gpio_polarity;
5997cfbde5eSPhilippe Mathieu-Daudé     } pca1_leds[] = {
6007cfbde5eSPhilippe Mathieu-Daudé         {13, LED_COLOR_GREEN, "front-fault-4",  GPIO_POLARITY_ACTIVE_LOW},
6017cfbde5eSPhilippe Mathieu-Daudé         {14, LED_COLOR_GREEN, "front-power-3",  GPIO_POLARITY_ACTIVE_LOW},
6027cfbde5eSPhilippe Mathieu-Daudé         {15, LED_COLOR_GREEN, "front-id-5",     GPIO_POLARITY_ACTIVE_LOW},
6037cfbde5eSPhilippe Mathieu-Daudé     };
60462c2c2ebSCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
6053d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
60615ce12cfSPhilippe Mathieu-Daudé     DeviceState *dev;
6077cfbde5eSPhilippe Mathieu-Daudé     LEDState *led;
60862c2c2ebSCédric Le Goater 
60963ceb818SCédric Le Goater     /* Bus 3: TODO bmp280@77 */
610db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
61115ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca1");
6122616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
6132616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 3),
61415ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
6158c9a61d7SCédric Le Goater 
6167cfbde5eSPhilippe Mathieu-Daudé     for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) {
6177cfbde5eSPhilippe Mathieu-Daudé         led = led_create_simple(OBJECT(bmc),
6187cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].gpio_polarity,
6197cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].color,
6207cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].description);
6217cfbde5eSPhilippe Mathieu-Daudé         qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id,
6227cfbde5eSPhilippe Mathieu-Daudé                               qdev_get_gpio_in(DEVICE(led), 0));
6237cfbde5eSPhilippe Mathieu-Daudé     }
624b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76);
6252a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "max31785", 0x52);
6261373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c);
6271373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c);
62862c2c2ebSCédric Le Goater 
62962c2c2ebSCédric Le Goater     /* The Witherspoon expects a TMP275 but a TMP105 is compatible */
6301373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105,
631044475f3SPhilippe Mathieu-Daudé                      0x4a);
6326c4567c7SCédric Le Goater 
6336c4567c7SCédric Le Goater     /* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
6346c4567c7SCédric Le Goater      * good enough */
6351373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
6363d165f12SCédric Le Goater 
6377a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51,
6383d165f12SCédric Le Goater                           eeprom_buf);
639db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
64015ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca0");
6412616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
6422616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 11),
64315ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
64463ceb818SCédric Le Goater     /* Bus 11: TODO ucd90160@64 */
64562c2c2ebSCédric Le Goater }
64662c2c2ebSCédric Le Goater 
64795f068c8SJohn Wang static void g220a_bmc_i2c_init(AspeedMachineState *bmc)
64895f068c8SJohn Wang {
64995f068c8SJohn Wang     AspeedSoCState *soc = &bmc->soc;
65095f068c8SJohn Wang     DeviceState *dev;
65195f068c8SJohn Wang 
65295f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3),
65395f068c8SJohn Wang                                          "emc1413", 0x4c));
65495f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
65595f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
65695f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
65795f068c8SJohn Wang 
65895f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12),
65995f068c8SJohn Wang                                          "emc1413", 0x4c));
66095f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
66195f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
66295f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
66395f068c8SJohn Wang 
66495f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13),
66595f068c8SJohn Wang                                          "emc1413", 0x4c));
66695f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
66795f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
66895f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
6696f5f6507SJohn Wang 
6706f5f6507SJohn Wang     static uint8_t eeprom_buf[2 * 1024] = {
6716f5f6507SJohn Wang             0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe,
6726f5f6507SJohn Wang             0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65,
6736f5f6507SJohn Wang             0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32,
6746f5f6507SJohn Wang             0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42,
6756f5f6507SJohn Wang             0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45,
6766f5f6507SJohn Wang             0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1,
6776f5f6507SJohn Wang             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7,
6786f5f6507SJohn Wang     };
6796f5f6507SJohn Wang     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57,
6806f5f6507SJohn Wang                           eeprom_buf);
68195f068c8SJohn Wang }
68295f068c8SJohn Wang 
68382b6a3f6SJohn Wang static void fp5280g2_bmc_i2c_init(AspeedMachineState *bmc)
68482b6a3f6SJohn Wang {
68582b6a3f6SJohn Wang     AspeedSoCState *soc = &bmc->soc;
68682b6a3f6SJohn Wang     I2CSlave *i2c_mux;
68782b6a3f6SJohn Wang 
68882b6a3f6SJohn Wang     /* The at24c256 */
68982b6a3f6SJohn Wang     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 1), 0x50, 32768);
69082b6a3f6SJohn Wang 
69182b6a3f6SJohn Wang     /* The fp5280g2 expects a TMP112 but a TMP105 is compatible */
69282b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
69382b6a3f6SJohn Wang                      0x48);
69482b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
69582b6a3f6SJohn Wang                      0x49);
69682b6a3f6SJohn Wang 
69782b6a3f6SJohn Wang     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
69882b6a3f6SJohn Wang                      "pca9546", 0x70);
69982b6a3f6SJohn Wang     /* It expects a TMP112 but a TMP105 is compatible */
70082b6a3f6SJohn Wang     i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0), TYPE_TMP105,
70182b6a3f6SJohn Wang                      0x4a);
70282b6a3f6SJohn Wang 
70382b6a3f6SJohn Wang     /* It expects a ds3232 but a ds1338 is good enough */
70482b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "ds1338", 0x68);
70582b6a3f6SJohn Wang 
70682b6a3f6SJohn Wang     /* It expects a pca9555 but a pca9552 is compatible */
707f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x30);
70882b6a3f6SJohn Wang }
70982b6a3f6SJohn Wang 
71058e52bdbSCédric Le Goater static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
71158e52bdbSCédric Le Goater {
71258e52bdbSCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
713fa6d98c0SJoel Stanley     I2CSlave *i2c_mux;
714fa6d98c0SJoel Stanley 
7159077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB);
71658e52bdbSCédric Le Goater 
717f4aec252SCédric Le Goater     create_pca9552(soc, 3, 0x61);
718bcb122f8SJoel Stanley 
71958e52bdbSCédric Le Goater     /* The rainier expects a TMP275 but a TMP105 is compatible */
72058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
72158e52bdbSCédric Le Goater                      0x48);
72258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
72358e52bdbSCédric Le Goater                      0x49);
72458e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
72558e52bdbSCédric Le Goater                      0x4a);
726fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4),
727fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
7289077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
7299077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
7309077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB);
731f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x60);
73258e52bdbSCédric Le Goater 
73358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
73458e52bdbSCédric Le Goater                      0x48);
73558e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
73658e52bdbSCédric Le Goater                      0x49);
737f4aec252SCédric Le Goater     create_pca9552(soc, 5, 0x60);
738f4aec252SCédric Le Goater     create_pca9552(soc, 5, 0x61);
739fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5),
740fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
7419077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
7429077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
74358e52bdbSCédric Le Goater 
74458e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
74558e52bdbSCédric Le Goater                      0x48);
74658e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
74758e52bdbSCédric Le Goater                      0x4a);
74858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
74958e52bdbSCédric Le Goater                      0x4b);
750fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6),
751fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
7529077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
7539077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
7549077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB);
7559077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB);
75658e52bdbSCédric Le Goater 
757f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x30);
758f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x31);
759f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x32);
760f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x33);
761f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x60);
762f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x61);
763b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76);
76458e52bdbSCédric Le Goater     /* Bus 7: TODO si7021-a20@20 */
76558e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105,
76658e52bdbSCédric Le Goater                      0x48);
7672a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "max31785", 0x52);
7689077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB);
7699077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB);
77058e52bdbSCédric Le Goater 
77158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
77258e52bdbSCédric Le Goater                      0x48);
77358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
77458e52bdbSCédric Le Goater                      0x4a);
7759077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50, 64 * KiB);
7769077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 64 * KiB);
777f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x60);
778f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x61);
77958e52bdbSCédric Le Goater     /* Bus 8: ucd90320@11 */
78058e52bdbSCédric Le Goater     /* Bus 8: ucd90320@b */
78158e52bdbSCédric Le Goater     /* Bus 8: ucd90320@c */
78258e52bdbSCédric Le Goater 
78358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c);
78458e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d);
7859077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB);
78658e52bdbSCédric Le Goater 
78758e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c);
78858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d);
7899077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB);
79058e52bdbSCédric Le Goater 
79158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
79258e52bdbSCédric Le Goater                      0x48);
79358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
79458e52bdbSCédric Le Goater                      0x49);
795fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11),
796fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
7979077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
7989077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
799f4aec252SCédric Le Goater     create_pca9552(soc, 11, 0x60);
800fa6d98c0SJoel Stanley 
801fa6d98c0SJoel Stanley 
8029077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB);
803f4aec252SCédric Le Goater     create_pca9552(soc, 13, 0x60);
804fa6d98c0SJoel Stanley 
8059077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB);
806f4aec252SCédric Le Goater     create_pca9552(soc, 14, 0x60);
807fa6d98c0SJoel Stanley 
8089077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB);
809f4aec252SCédric Le Goater     create_pca9552(soc, 15, 0x60);
81058e52bdbSCédric Le Goater }
81158e52bdbSCédric Le Goater 
812febbe308SPeter Delevoryas static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr,
813febbe308SPeter Delevoryas                                  I2CBus **channels)
814febbe308SPeter Delevoryas {
815febbe308SPeter Delevoryas     I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr);
816febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
817febbe308SPeter Delevoryas         channels[i] = pca954x_i2c_get_bus(mux, i);
818febbe308SPeter Delevoryas     }
819febbe308SPeter Delevoryas }
820febbe308SPeter Delevoryas 
821febbe308SPeter Delevoryas #define TYPE_LM75 TYPE_TMP105
822febbe308SPeter Delevoryas #define TYPE_TMP75 TYPE_TMP105
823febbe308SPeter Delevoryas #define TYPE_TMP422 "tmp422"
824febbe308SPeter Delevoryas 
825febbe308SPeter Delevoryas static void fuji_bmc_i2c_init(AspeedMachineState *bmc)
826febbe308SPeter Delevoryas {
827febbe308SPeter Delevoryas     AspeedSoCState *soc = &bmc->soc;
828febbe308SPeter Delevoryas     I2CBus *i2c[144] = {};
829febbe308SPeter Delevoryas 
830febbe308SPeter Delevoryas     for (int i = 0; i < 16; i++) {
831febbe308SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
832febbe308SPeter Delevoryas     }
833febbe308SPeter Delevoryas     I2CBus *i2c180 = i2c[2];
834febbe308SPeter Delevoryas     I2CBus *i2c480 = i2c[8];
835febbe308SPeter Delevoryas     I2CBus *i2c600 = i2c[11];
836febbe308SPeter Delevoryas 
837febbe308SPeter Delevoryas     get_pca9548_channels(i2c180, 0x70, &i2c[16]);
838febbe308SPeter Delevoryas     get_pca9548_channels(i2c480, 0x70, &i2c[24]);
839febbe308SPeter Delevoryas     /* NOTE: The device tree skips [32, 40) in the alias numbering */
840febbe308SPeter Delevoryas     get_pca9548_channels(i2c600, 0x77, &i2c[40]);
841febbe308SPeter Delevoryas     get_pca9548_channels(i2c[24], 0x71, &i2c[48]);
842febbe308SPeter Delevoryas     get_pca9548_channels(i2c[25], 0x72, &i2c[56]);
843febbe308SPeter Delevoryas     get_pca9548_channels(i2c[26], 0x76, &i2c[64]);
844febbe308SPeter Delevoryas     get_pca9548_channels(i2c[27], 0x76, &i2c[72]);
845febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
846febbe308SPeter Delevoryas         get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]);
847febbe308SPeter Delevoryas     }
848febbe308SPeter Delevoryas 
849febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c);
850febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d);
851febbe308SPeter Delevoryas 
8529077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[19], 0x52, 64 * KiB);
8539077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[20], 0x50, 2 * KiB);
8549077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[22], 0x52, 2 * KiB);
855febbe308SPeter Delevoryas 
856febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x48);
857febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x49);
858febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x4a);
859febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_TMP422, 0x4c);
860febbe308SPeter Delevoryas 
8619077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[8], 0x51, 64 * KiB);
862febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a);
863febbe308SPeter Delevoryas 
864febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[50], TYPE_LM75, 0x4c);
8659077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[50], 0x52, 64 * KiB);
866febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[51], TYPE_TMP75, 0x48);
867febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[52], TYPE_TMP75, 0x49);
868febbe308SPeter Delevoryas 
869febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[59], TYPE_TMP75, 0x48);
870febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[60], TYPE_TMP75, 0x49);
871febbe308SPeter Delevoryas 
8729077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[65], 0x53, 64 * KiB);
873febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x49);
874febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x48);
8759077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[68], 0x52, 64 * KiB);
8769077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[69], 0x52, 64 * KiB);
8779077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[70], 0x52, 64 * KiB);
8789077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[71], 0x52, 64 * KiB);
879febbe308SPeter Delevoryas 
8809077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[73], 0x53, 64 * KiB);
881febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x49);
882febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x48);
8839077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[76], 0x52, 64 * KiB);
8849077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[77], 0x52, 64 * KiB);
8859077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[78], 0x52, 64 * KiB);
8869077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[79], 0x52, 64 * KiB);
8879077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[28], 0x50, 2 * KiB);
888febbe308SPeter Delevoryas 
889febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
8909077e09aSPeter Delevoryas         at24c_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB);
891febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[82 + i * 8], TYPE_TMP75, 0x48);
892febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[83 + i * 8], TYPE_TMP75, 0x4b);
893febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[84 + i * 8], TYPE_TMP75, 0x4a);
894febbe308SPeter Delevoryas     }
895febbe308SPeter Delevoryas }
896febbe308SPeter Delevoryas 
897a20c54b1SPatrick Williams #define TYPE_TMP421 "tmp421"
898a20c54b1SPatrick Williams 
899a20c54b1SPatrick Williams static void bletchley_bmc_i2c_init(AspeedMachineState *bmc)
900a20c54b1SPatrick Williams {
901a20c54b1SPatrick Williams     AspeedSoCState *soc = &bmc->soc;
902a20c54b1SPatrick Williams     I2CBus *i2c[13] = {};
903a20c54b1SPatrick Williams     for (int i = 0; i < 13; i++) {
904a20c54b1SPatrick Williams         if ((i == 8) || (i == 11)) {
905a20c54b1SPatrick Williams             continue;
906a20c54b1SPatrick Williams         }
907a20c54b1SPatrick Williams         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
908a20c54b1SPatrick Williams     }
909a20c54b1SPatrick Williams 
910a20c54b1SPatrick Williams     /* Bus 0 - 5 all have the same config. */
911a20c54b1SPatrick Williams     for (int i = 0; i < 6; i++) {
912a20c54b1SPatrick Williams         /* Missing model: ti,ina230 @ 0x45 */
913a20c54b1SPatrick Williams         /* Missing model: mps,mp5023 @ 0x40 */
914a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_TMP421, 0x4f);
915a20c54b1SPatrick Williams         /* Missing model: nxp,pca9539 @ 0x76, but PCA9552 works enough */
916a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x76);
917a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x67);
918a20c54b1SPatrick Williams         /* Missing model: fsc,fusb302 @ 0x22 */
919a20c54b1SPatrick Williams     }
920a20c54b1SPatrick Williams 
921a20c54b1SPatrick Williams     /* Bus 6 */
922a20c54b1SPatrick Williams     at24c_eeprom_init(i2c[6], 0x56, 65536);
923a20c54b1SPatrick Williams     /* Missing model: nxp,pcf85263 @ 0x51 , but ds1338 works enough */
924a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[6], "ds1338", 0x51);
925a20c54b1SPatrick Williams 
926a20c54b1SPatrick Williams 
927a20c54b1SPatrick Williams     /* Bus 7 */
928a20c54b1SPatrick Williams     at24c_eeprom_init(i2c[7], 0x54, 65536);
929a20c54b1SPatrick Williams 
930a20c54b1SPatrick Williams     /* Bus 9 */
931a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[9], TYPE_TMP421, 0x4f);
932a20c54b1SPatrick Williams 
933a20c54b1SPatrick Williams     /* Bus 10 */
934a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[10], TYPE_TMP421, 0x4f);
935a20c54b1SPatrick Williams     /* Missing model: ti,hdc1080 @ 0x40 */
936a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[10], TYPE_PCA9552, 0x67);
937a20c54b1SPatrick Williams 
938a20c54b1SPatrick Williams     /* Bus 12 */
939a20c54b1SPatrick Williams     /* Missing model: adi,adm1278 @ 0x11 */
940a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4c);
941a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4d);
942a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_PCA9552, 0x67);
943a20c54b1SPatrick Williams }
944a20c54b1SPatrick Williams 
945fa699e80SPeter Delevoryas static void fby35_i2c_init(AspeedMachineState *bmc)
946fa699e80SPeter Delevoryas {
947fa699e80SPeter Delevoryas     AspeedSoCState *soc = &bmc->soc;
948fa699e80SPeter Delevoryas     I2CBus *i2c[16];
949fa699e80SPeter Delevoryas 
950fa699e80SPeter Delevoryas     for (int i = 0; i < 16; i++) {
951fa699e80SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
952fa699e80SPeter Delevoryas     }
953fa699e80SPeter Delevoryas 
954fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[2], TYPE_LM75, 0x4f);
955fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_TMP421, 0x1f);
956fa699e80SPeter Delevoryas     /* Hotswap controller is actually supposed to be mp5920 or ltc4282. */
957fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[11], "adm1272", 0x44);
958fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4e);
959fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4f);
960fa699e80SPeter Delevoryas 
9619077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[4], 0x51, 128 * KiB);
9629077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[6], 0x51, 128 * KiB);
963c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[8], 0x50, 32 * KiB, fby35_nic_fruid,
964c0216b94SPeter Delevoryas                           fby35_nic_fruid_len);
965c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[11], 0x51, 128 * KiB, fby35_bb_fruid,
966c0216b94SPeter Delevoryas                           fby35_bb_fruid_len);
967c0216b94SPeter Delevoryas     at24c_eeprom_init_rom(i2c[11], 0x54, 128 * KiB, fby35_bmc_fruid,
968c0216b94SPeter Delevoryas                           fby35_bmc_fruid_len);
969fa699e80SPeter Delevoryas 
970fa699e80SPeter Delevoryas     /*
971fa699e80SPeter Delevoryas      * TODO: There is a multi-master i2c connection to an AST1030 MiniBMC on
972fa699e80SPeter Delevoryas      * buses 0, 1, 2, 3, and 9. Source address 0x10, target address 0x20 on
973fa699e80SPeter Delevoryas      * each.
974fa699e80SPeter Delevoryas      */
975fa699e80SPeter Delevoryas }
976fa699e80SPeter Delevoryas 
977fb6b3c8dSJae Hyun Yoo static void qcom_dc_scm_bmc_i2c_init(AspeedMachineState *bmc)
978fb6b3c8dSJae Hyun Yoo {
979fb6b3c8dSJae Hyun Yoo     AspeedSoCState *soc = &bmc->soc;
980fb6b3c8dSJae Hyun Yoo 
981fb6b3c8dSJae Hyun Yoo     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 15), "tmp105", 0x4d);
982fb6b3c8dSJae Hyun Yoo }
983fb6b3c8dSJae Hyun Yoo 
984ece4cccdSGraeme Gregory static void qcom_dc_scm_firework_i2c_init(AspeedMachineState *bmc)
985ece4cccdSGraeme Gregory {
986ece4cccdSGraeme Gregory     AspeedSoCState *soc = &bmc->soc;
9872a7a5d5cSJae Hyun Yoo     I2CSlave *therm_mux, *cpuvr_mux;
988ece4cccdSGraeme Gregory 
989ece4cccdSGraeme Gregory     /* Create the generic DC-SCM hardware */
990ece4cccdSGraeme Gregory     qcom_dc_scm_bmc_i2c_init(bmc);
991ece4cccdSGraeme Gregory 
992ece4cccdSGraeme Gregory     /* Now create the Firework specific hardware */
9932a75e8c3SMaheswara Kurapati 
9942a7a5d5cSJae Hyun Yoo     /* I2C7 CPUVR MUX */
9952a7a5d5cSJae Hyun Yoo     cpuvr_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
9962a7a5d5cSJae Hyun Yoo                                         "pca9546", 0x70);
9972a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 0), "pca9548", 0x72);
9982a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 1), "pca9548", 0x72);
9992a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 2), "pca9548", 0x72);
10002a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 3), "pca9548", 0x72);
10012a7a5d5cSJae Hyun Yoo 
1002cfc68f16SMaheswara Kurapati     /* I2C8 Thermal Diodes*/
1003cfc68f16SMaheswara Kurapati     therm_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
1004cfc68f16SMaheswara Kurapati                                         "pca9548", 0x70);
1005cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 0), TYPE_LM75, 0x4C);
1006cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 1), TYPE_LM75, 0x4C);
1007cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 2), TYPE_LM75, 0x48);
1008cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 3), TYPE_LM75, 0x48);
1009cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 4), TYPE_LM75, 0x48);
1010cfc68f16SMaheswara Kurapati 
10112a75e8c3SMaheswara Kurapati     /* I2C9 Fan Controller (MAX31785) */
10122a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x52);
10132a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x54);
1014ece4cccdSGraeme Gregory }
1015ece4cccdSGraeme Gregory 
10161a15311aSCédric Le Goater static bool aspeed_get_mmio_exec(Object *obj, Error **errp)
10171a15311aSCédric Le Goater {
10181a15311aSCédric Le Goater     return ASPEED_MACHINE(obj)->mmio_exec;
10191a15311aSCédric Le Goater }
10201a15311aSCédric Le Goater 
10211a15311aSCédric Le Goater static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp)
10221a15311aSCédric Le Goater {
10231a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = value;
10241a15311aSCédric Le Goater }
10251a15311aSCédric Le Goater 
10261a15311aSCédric Le Goater static void aspeed_machine_instance_init(Object *obj)
10271a15311aSCédric Le Goater {
10281a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = false;
10291a15311aSCédric Le Goater }
10301a15311aSCédric Le Goater 
10319820e52fSCédric Le Goater static char *aspeed_get_fmc_model(Object *obj, Error **errp)
10329820e52fSCédric Le Goater {
10339820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10349820e52fSCédric Le Goater     return g_strdup(bmc->fmc_model);
10359820e52fSCédric Le Goater }
10369820e52fSCédric Le Goater 
10379820e52fSCédric Le Goater static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp)
10389820e52fSCédric Le Goater {
10399820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10409820e52fSCédric Le Goater 
10419820e52fSCédric Le Goater     g_free(bmc->fmc_model);
10429820e52fSCédric Le Goater     bmc->fmc_model = g_strdup(value);
10439820e52fSCédric Le Goater }
10449820e52fSCédric Le Goater 
10459820e52fSCédric Le Goater static char *aspeed_get_spi_model(Object *obj, Error **errp)
10469820e52fSCédric Le Goater {
10479820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10489820e52fSCédric Le Goater     return g_strdup(bmc->spi_model);
10499820e52fSCédric Le Goater }
10509820e52fSCédric Le Goater 
10519820e52fSCédric Le Goater static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp)
10529820e52fSCédric Le Goater {
10539820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10549820e52fSCédric Le Goater 
10559820e52fSCédric Le Goater     g_free(bmc->spi_model);
10569820e52fSCédric Le Goater     bmc->spi_model = g_strdup(value);
10579820e52fSCédric Le Goater }
10589820e52fSCédric Le Goater 
10591a15311aSCédric Le Goater static void aspeed_machine_class_props_init(ObjectClass *oc)
10601a15311aSCédric Le Goater {
10611a15311aSCédric Le Goater     object_class_property_add_bool(oc, "execute-in-place",
10621a15311aSCédric Le Goater                                    aspeed_get_mmio_exec,
1063d2623129SMarkus Armbruster                                    aspeed_set_mmio_exec);
10641a15311aSCédric Le Goater     object_class_property_set_description(oc, "execute-in-place",
10657eecec7dSMarkus Armbruster                            "boot directly from CE0 flash device");
10669820e52fSCédric Le Goater 
10679820e52fSCédric Le Goater     object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model,
10689820e52fSCédric Le Goater                                    aspeed_set_fmc_model);
10699820e52fSCédric Le Goater     object_class_property_set_description(oc, "fmc-model",
10709820e52fSCédric Le Goater                                           "Change the FMC Flash model");
10719820e52fSCédric Le Goater     object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model,
10729820e52fSCédric Le Goater                                    aspeed_set_spi_model);
10739820e52fSCédric Le Goater     object_class_property_set_description(oc, "spi-model",
10749820e52fSCédric Le Goater                                           "Change the SPI Flash model");
10751a15311aSCédric Le Goater }
10761a15311aSCédric Le Goater 
1077b7f1a0cbSCédric Le Goater static int aspeed_soc_num_cpus(const char *soc_name)
1078b7f1a0cbSCédric Le Goater {
1079b7f1a0cbSCédric Le Goater    AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(soc_name));
1080b7f1a0cbSCédric Le Goater    return sc->num_cpus;
1081b7f1a0cbSCédric Le Goater }
1082b7f1a0cbSCédric Le Goater 
1083fca9ca1bSCédric Le Goater static void aspeed_machine_class_init(ObjectClass *oc, void *data)
108462c2c2ebSCédric Le Goater {
108562c2c2ebSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1086d3bad7e7SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
108762c2c2ebSCédric Le Goater 
1088fca9ca1bSCédric Le Goater     mc->init = aspeed_machine_init;
108962c2c2ebSCédric Le Goater     mc->no_floppy = 1;
109062c2c2ebSCédric Le Goater     mc->no_cdrom = 1;
109162c2c2ebSCédric Le Goater     mc->no_parallel = 1;
1092afcbaed6SIgor Mammedov     mc->default_ram_id = "ram";
1093d3bad7e7SCédric Le Goater     amc->macs_mask = ASPEED_MAC0_ON;
10945d63d0c7SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART5;
10951a15311aSCédric Le Goater 
10961a15311aSCédric Le Goater     aspeed_machine_class_props_init(oc);
109762c2c2ebSCédric Le Goater }
109862c2c2ebSCédric Le Goater 
1099baa4732bSCédric Le Goater static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
1100baa4732bSCédric Le Goater {
1101baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1102baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1103baa4732bSCédric Le Goater 
1104baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Palmetto BMC (ARM926EJ-S)";
1105baa4732bSCédric Le Goater     amc->soc_name  = "ast2400-a1";
1106baa4732bSCédric Le Goater     amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1;
1107baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
110870322913SCédric Le Goater     amc->spi_model = "mx25l25635f";
1109baa4732bSCédric Le Goater     amc->num_cs    = 1;
1110baa4732bSCédric Le Goater     amc->i2c_init  = palmetto_bmc_i2c_init;
1111baa4732bSCédric Le Goater     mc->default_ram_size       = 256 * MiB;
1112b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1113b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1114baa4732bSCédric Le Goater };
1115baa4732bSCédric Le Goater 
11169cccb912SPatrick Venture static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data)
11179cccb912SPatrick Venture {
11189cccb912SPatrick Venture     MachineClass *mc = MACHINE_CLASS(oc);
11199cccb912SPatrick Venture     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
11209cccb912SPatrick Venture 
11219cccb912SPatrick Venture     mc->desc       = "Quanta-Q71l BMC (ARM926EJ-S)";
11229cccb912SPatrick Venture     amc->soc_name  = "ast2400-a1";
11239cccb912SPatrick Venture     amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1;
11249cccb912SPatrick Venture     amc->fmc_model = "n25q256a";
11259cccb912SPatrick Venture     amc->spi_model = "mx25l25635e";
11269cccb912SPatrick Venture     amc->num_cs    = 1;
11279cccb912SPatrick Venture     amc->i2c_init  = quanta_q71l_bmc_i2c_init;
11289cccb912SPatrick Venture     mc->default_ram_size       = 128 * MiB;
11299cccb912SPatrick Venture     mc->default_cpus = mc->min_cpus = mc->max_cpus =
11309cccb912SPatrick Venture         aspeed_soc_num_cpus(amc->soc_name);
11319cccb912SPatrick Venture }
11329cccb912SPatrick Venture 
113340a38df5SErik Smit static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc,
113440a38df5SErik Smit                                                         void *data)
113540a38df5SErik Smit {
113640a38df5SErik Smit     MachineClass *mc = MACHINE_CLASS(oc);
113740a38df5SErik Smit     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
113840a38df5SErik Smit 
113940a38df5SErik Smit     mc->desc       = "Supermicro X11 BMC (ARM926EJ-S)";
114040a38df5SErik Smit     amc->soc_name  = "ast2400-a1";
114140a38df5SErik Smit     amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1;
114240a38df5SErik Smit     amc->fmc_model = "mx25l25635e";
114340a38df5SErik Smit     amc->spi_model = "mx25l25635e";
114440a38df5SErik Smit     amc->num_cs    = 1;
114540a38df5SErik Smit     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
114640a38df5SErik Smit     amc->i2c_init  = palmetto_bmc_i2c_init;
114740a38df5SErik Smit     mc->default_ram_size = 256 * MiB;
114840a38df5SErik Smit }
114940a38df5SErik Smit 
115047936597SGuenter Roeck static void aspeed_machine_supermicro_x11spi_bmc_class_init(ObjectClass *oc,
115147936597SGuenter Roeck                                                             void *data)
115247936597SGuenter Roeck {
115347936597SGuenter Roeck     MachineClass *mc = MACHINE_CLASS(oc);
115447936597SGuenter Roeck     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
115547936597SGuenter Roeck 
115647936597SGuenter Roeck     mc->desc       = "Supermicro X11 SPI BMC (ARM1176)";
115747936597SGuenter Roeck     amc->soc_name  = "ast2500-a1";
115847936597SGuenter Roeck     amc->hw_strap1 = SUPERMICRO_X11SPI_BMC_HW_STRAP1;
115947936597SGuenter Roeck     amc->fmc_model = "mx25l25635e";
116047936597SGuenter Roeck     amc->spi_model = "mx25l25635e";
116147936597SGuenter Roeck     amc->num_cs    = 1;
116247936597SGuenter Roeck     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
116347936597SGuenter Roeck     amc->i2c_init  = palmetto_bmc_i2c_init;
116447936597SGuenter Roeck     mc->default_ram_size = 512 * MiB;
116547936597SGuenter Roeck     mc->default_cpus = mc->min_cpus = mc->max_cpus =
116647936597SGuenter Roeck         aspeed_soc_num_cpus(amc->soc_name);
116747936597SGuenter Roeck }
116847936597SGuenter Roeck 
1169baa4732bSCédric Le Goater static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data)
1170baa4732bSCédric Le Goater {
1171baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1172baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1173baa4732bSCédric Le Goater 
1174baa4732bSCédric Le Goater     mc->desc       = "Aspeed AST2500 EVB (ARM1176)";
1175baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1176baa4732bSCédric Le Goater     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
1177753abfc4SJae Hyun Yoo     amc->fmc_model = "mx25l25635e";
117870322913SCédric Le Goater     amc->spi_model = "mx25l25635f";
1179baa4732bSCédric Le Goater     amc->num_cs    = 1;
1180baa4732bSCédric Le Goater     amc->i2c_init  = ast2500_evb_i2c_init;
1181baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
1182b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1183b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1184baa4732bSCédric Le Goater };
1185baa4732bSCédric Le Goater 
1186*34f73a81SKarthikeyan Pasupathi static void aspeed_machine_yosemitev2_class_init(ObjectClass *oc, void *data)
1187*34f73a81SKarthikeyan Pasupathi {
1188*34f73a81SKarthikeyan Pasupathi     MachineClass *mc = MACHINE_CLASS(oc);
1189*34f73a81SKarthikeyan Pasupathi     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1190*34f73a81SKarthikeyan Pasupathi 
1191*34f73a81SKarthikeyan Pasupathi     mc->desc       = "Facebook YosemiteV2 BMC (ARM1176)";
1192*34f73a81SKarthikeyan Pasupathi     amc->soc_name  = "ast2500-a1";
1193*34f73a81SKarthikeyan Pasupathi     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
1194*34f73a81SKarthikeyan Pasupathi     amc->hw_strap2 = 0;
1195*34f73a81SKarthikeyan Pasupathi     amc->fmc_model = "n25q256a";
1196*34f73a81SKarthikeyan Pasupathi     amc->spi_model = "mx25l25635e";
1197*34f73a81SKarthikeyan Pasupathi     amc->num_cs    = 2;
1198*34f73a81SKarthikeyan Pasupathi     amc->i2c_init  = yosemitev2_bmc_i2c_init;
1199*34f73a81SKarthikeyan Pasupathi     mc->default_ram_size       = 512 * MiB;
1200*34f73a81SKarthikeyan Pasupathi     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1201*34f73a81SKarthikeyan Pasupathi         aspeed_soc_num_cpus(amc->soc_name);
1202*34f73a81SKarthikeyan Pasupathi };
1203*34f73a81SKarthikeyan Pasupathi 
1204baa4732bSCédric Le Goater static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data)
1205baa4732bSCédric Le Goater {
1206baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1207baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1208baa4732bSCédric Le Goater 
1209baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Romulus BMC (ARM1176)";
1210baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1211baa4732bSCédric Le Goater     amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1;
1212baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
1213baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1214baa4732bSCédric Le Goater     amc->num_cs    = 2;
1215baa4732bSCédric Le Goater     amc->i2c_init  = romulus_bmc_i2c_init;
1216baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
1217b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1218b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1219baa4732bSCédric Le Goater };
1220baa4732bSCédric Le Goater 
1221143b040fSPatrick Williams static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data)
1222143b040fSPatrick Williams {
1223143b040fSPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1224143b040fSPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1225143b040fSPatrick Williams 
1226143b040fSPatrick Williams     mc->desc       = "OCP SonoraPass BMC (ARM1176)";
1227143b040fSPatrick Williams     amc->soc_name  = "ast2500-a1";
1228143b040fSPatrick Williams     amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1;
1229143b040fSPatrick Williams     amc->fmc_model = "mx66l1g45g";
1230143b040fSPatrick Williams     amc->spi_model = "mx66l1g45g";
1231143b040fSPatrick Williams     amc->num_cs    = 2;
1232143b040fSPatrick Williams     amc->i2c_init  = sonorapass_bmc_i2c_init;
1233143b040fSPatrick Williams     mc->default_ram_size       = 512 * MiB;
1234b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1235b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1236143b040fSPatrick Williams };
1237143b040fSPatrick Williams 
1238baa4732bSCédric Le Goater static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data)
1239baa4732bSCédric Le Goater {
1240baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1241baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1242baa4732bSCédric Le Goater 
1243baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Witherspoon BMC (ARM1176)";
1244baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1245baa4732bSCédric Le Goater     amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1;
124670322913SCédric Le Goater     amc->fmc_model = "mx25l25635f";
1247baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1248baa4732bSCédric Le Goater     amc->num_cs    = 2;
1249baa4732bSCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init;
1250baa4732bSCédric Le Goater     mc->default_ram_size = 512 * MiB;
1251b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1252b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1253baa4732bSCédric Le Goater };
1254baa4732bSCédric Le Goater 
1255baa4732bSCédric Le Goater static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
1256baa4732bSCédric Le Goater {
1257baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1258baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1259baa4732bSCédric Le Goater 
1260f548f201SPeter Maydell     mc->desc       = "Aspeed AST2600 EVB (Cortex-A7)";
1261c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
1262baa4732bSCédric Le Goater     amc->hw_strap1 = AST2600_EVB_HW_STRAP1;
1263baa4732bSCédric Le Goater     amc->hw_strap2 = AST2600_EVB_HW_STRAP2;
1264753abfc4SJae Hyun Yoo     amc->fmc_model = "mx66u51235f";
1265baa4732bSCédric Le Goater     amc->spi_model = "mx66u51235f";
1266baa4732bSCédric Le Goater     amc->num_cs    = 1;
126729193286SGuenter Roeck     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON |
126829193286SGuenter Roeck                      ASPEED_MAC3_ON;
1269baa4732bSCédric Le Goater     amc->i2c_init  = ast2600_evb_i2c_init;
1270baa4732bSCédric Le Goater     mc->default_ram_size = 1 * GiB;
1271b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1272b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1273baa4732bSCédric Le Goater };
1274baa4732bSCédric Le Goater 
127563ceb818SCédric Le Goater static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data)
127663ceb818SCédric Le Goater {
127763ceb818SCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
127863ceb818SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
127963ceb818SCédric Le Goater 
1280f548f201SPeter Maydell     mc->desc       = "OpenPOWER Tacoma BMC (Cortex-A7)";
1281c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
128263ceb818SCédric Le Goater     amc->hw_strap1 = TACOMA_BMC_HW_STRAP1;
128363ceb818SCédric Le Goater     amc->hw_strap2 = TACOMA_BMC_HW_STRAP2;
128463ceb818SCédric Le Goater     amc->fmc_model = "mx66l1g45g";
128563ceb818SCédric Le Goater     amc->spi_model = "mx66l1g45g";
128663ceb818SCédric Le Goater     amc->num_cs    = 2;
1287d3bad7e7SCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON;
128863ceb818SCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init; /* Same board layout */
128963ceb818SCédric Le Goater     mc->default_ram_size = 1 * GiB;
1290b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1291b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
129263ceb818SCédric Le Goater };
129363ceb818SCédric Le Goater 
129495f068c8SJohn Wang static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data)
129595f068c8SJohn Wang {
129695f068c8SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
129795f068c8SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
129895f068c8SJohn Wang 
129995f068c8SJohn Wang     mc->desc       = "Bytedance G220A BMC (ARM1176)";
130095f068c8SJohn Wang     amc->soc_name  = "ast2500-a1";
130195f068c8SJohn Wang     amc->hw_strap1 = G220A_BMC_HW_STRAP1;
130295f068c8SJohn Wang     amc->fmc_model = "n25q512a";
130395f068c8SJohn Wang     amc->spi_model = "mx25l25635e";
130495f068c8SJohn Wang     amc->num_cs    = 2;
13055bb825c8SGuenter Roeck     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
130695f068c8SJohn Wang     amc->i2c_init  = g220a_bmc_i2c_init;
130795f068c8SJohn Wang     mc->default_ram_size = 1024 * MiB;
130895f068c8SJohn Wang     mc->default_cpus = mc->min_cpus = mc->max_cpus =
130995f068c8SJohn Wang         aspeed_soc_num_cpus(amc->soc_name);
131095f068c8SJohn Wang };
131195f068c8SJohn Wang 
131282b6a3f6SJohn Wang static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc, void *data)
131382b6a3f6SJohn Wang {
131482b6a3f6SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
131582b6a3f6SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
131682b6a3f6SJohn Wang 
131782b6a3f6SJohn Wang     mc->desc       = "Inspur FP5280G2 BMC (ARM1176)";
131882b6a3f6SJohn Wang     amc->soc_name  = "ast2500-a1";
131982b6a3f6SJohn Wang     amc->hw_strap1 = FP5280G2_BMC_HW_STRAP1;
132082b6a3f6SJohn Wang     amc->fmc_model = "n25q512a";
132182b6a3f6SJohn Wang     amc->spi_model = "mx25l25635e";
132282b6a3f6SJohn Wang     amc->num_cs    = 2;
132382b6a3f6SJohn Wang     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
132482b6a3f6SJohn Wang     amc->i2c_init  = fp5280g2_bmc_i2c_init;
132582b6a3f6SJohn Wang     mc->default_ram_size = 512 * MiB;
132682b6a3f6SJohn Wang     mc->default_cpus = mc->min_cpus = mc->max_cpus =
132782b6a3f6SJohn Wang         aspeed_soc_num_cpus(amc->soc_name);
132882b6a3f6SJohn Wang };
132982b6a3f6SJohn Wang 
133058e52bdbSCédric Le Goater static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data)
133158e52bdbSCédric Le Goater {
133258e52bdbSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
133358e52bdbSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
133458e52bdbSCédric Le Goater 
1335f548f201SPeter Maydell     mc->desc       = "IBM Rainier BMC (Cortex-A7)";
1336c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
133758e52bdbSCédric Le Goater     amc->hw_strap1 = RAINIER_BMC_HW_STRAP1;
133858e52bdbSCédric Le Goater     amc->hw_strap2 = RAINIER_BMC_HW_STRAP2;
133958e52bdbSCédric Le Goater     amc->fmc_model = "mx66l1g45g";
134058e52bdbSCédric Le Goater     amc->spi_model = "mx66l1g45g";
134158e52bdbSCédric Le Goater     amc->num_cs    = 2;
134258e52bdbSCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
134358e52bdbSCédric Le Goater     amc->i2c_init  = rainier_bmc_i2c_init;
134458e52bdbSCédric Le Goater     mc->default_ram_size = 1 * GiB;
134558e52bdbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
134658e52bdbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
134758e52bdbSCédric Le Goater };
134858e52bdbSCédric Le Goater 
1349febbe308SPeter Delevoryas /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */
1350febbe308SPeter Delevoryas #if HOST_LONG_BITS == 32
1351febbe308SPeter Delevoryas #define FUJI_BMC_RAM_SIZE (1 * GiB)
1352febbe308SPeter Delevoryas #else
1353febbe308SPeter Delevoryas #define FUJI_BMC_RAM_SIZE (2 * GiB)
1354febbe308SPeter Delevoryas #endif
1355febbe308SPeter Delevoryas 
1356febbe308SPeter Delevoryas static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data)
1357febbe308SPeter Delevoryas {
1358febbe308SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1359febbe308SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1360febbe308SPeter Delevoryas 
1361febbe308SPeter Delevoryas     mc->desc = "Facebook Fuji BMC (Cortex-A7)";
1362febbe308SPeter Delevoryas     amc->soc_name = "ast2600-a3";
1363febbe308SPeter Delevoryas     amc->hw_strap1 = FUJI_BMC_HW_STRAP1;
1364febbe308SPeter Delevoryas     amc->hw_strap2 = FUJI_BMC_HW_STRAP2;
1365febbe308SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1366febbe308SPeter Delevoryas     amc->spi_model = "mx66l1g45g";
1367febbe308SPeter Delevoryas     amc->num_cs = 2;
1368febbe308SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1369febbe308SPeter Delevoryas     amc->i2c_init = fuji_bmc_i2c_init;
1370febbe308SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART1;
1371febbe308SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
1372febbe308SPeter Delevoryas     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1373febbe308SPeter Delevoryas         aspeed_soc_num_cpus(amc->soc_name);
1374febbe308SPeter Delevoryas };
1375febbe308SPeter Delevoryas 
1376104bdaffSPatrick Williams /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */
1377104bdaffSPatrick Williams #if HOST_LONG_BITS == 32
1378104bdaffSPatrick Williams #define BLETCHLEY_BMC_RAM_SIZE (1 * GiB)
1379104bdaffSPatrick Williams #else
1380104bdaffSPatrick Williams #define BLETCHLEY_BMC_RAM_SIZE (2 * GiB)
1381104bdaffSPatrick Williams #endif
1382104bdaffSPatrick Williams 
1383a20c54b1SPatrick Williams static void aspeed_machine_bletchley_class_init(ObjectClass *oc, void *data)
1384a20c54b1SPatrick Williams {
1385a20c54b1SPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1386a20c54b1SPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1387a20c54b1SPatrick Williams 
1388a20c54b1SPatrick Williams     mc->desc       = "Facebook Bletchley BMC (Cortex-A7)";
1389a20c54b1SPatrick Williams     amc->soc_name  = "ast2600-a3";
1390a20c54b1SPatrick Williams     amc->hw_strap1 = BLETCHLEY_BMC_HW_STRAP1;
1391a20c54b1SPatrick Williams     amc->hw_strap2 = BLETCHLEY_BMC_HW_STRAP2;
1392a20c54b1SPatrick Williams     amc->fmc_model = "w25q01jvq";
1393a20c54b1SPatrick Williams     amc->spi_model = NULL;
1394a20c54b1SPatrick Williams     amc->num_cs    = 2;
1395a20c54b1SPatrick Williams     amc->macs_mask = ASPEED_MAC2_ON;
1396a20c54b1SPatrick Williams     amc->i2c_init  = bletchley_bmc_i2c_init;
1397104bdaffSPatrick Williams     mc->default_ram_size = BLETCHLEY_BMC_RAM_SIZE;
1398a20c54b1SPatrick Williams     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1399a20c54b1SPatrick Williams         aspeed_soc_num_cpus(amc->soc_name);
1400a20c54b1SPatrick Williams }
1401a20c54b1SPatrick Williams 
14027966d70fSJason A. Donenfeld static void fby35_reset(MachineState *state, ShutdownCause reason)
1403fa699e80SPeter Delevoryas {
1404fa699e80SPeter Delevoryas     AspeedMachineState *bmc = ASPEED_MACHINE(state);
1405fa699e80SPeter Delevoryas     AspeedGPIOState *gpio = &bmc->soc.gpio;
1406fa699e80SPeter Delevoryas 
14077966d70fSJason A. Donenfeld     qemu_devices_reset(reason);
1408fa699e80SPeter Delevoryas 
1409f0418558SPeter Delevoryas     /* Board ID: 7 (Class-1, 4 slots) */
1410fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV4", true, &error_fatal);
1411fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV5", true, &error_fatal);
1412fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV6", true, &error_fatal);
1413fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV7", false, &error_fatal);
1414f0418558SPeter Delevoryas 
1415f0418558SPeter Delevoryas     /* Slot presence pins, inverse polarity. (False means present) */
1416f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH4", false, &error_fatal);
1417f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH5", true, &error_fatal);
1418f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH6", true, &error_fatal);
1419f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH7", true, &error_fatal);
1420f0418558SPeter Delevoryas 
1421f0418558SPeter Delevoryas     /* Slot 12v power pins, normal polarity. (True means powered-on) */
1422f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB2", true, &error_fatal);
1423f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB3", false, &error_fatal);
1424f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB4", false, &error_fatal);
1425f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB5", false, &error_fatal);
1426fa699e80SPeter Delevoryas }
1427fa699e80SPeter Delevoryas 
1428fa699e80SPeter Delevoryas static void aspeed_machine_fby35_class_init(ObjectClass *oc, void *data)
1429fa699e80SPeter Delevoryas {
1430fa699e80SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1431fa699e80SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1432fa699e80SPeter Delevoryas 
1433fa699e80SPeter Delevoryas     mc->desc       = "Facebook fby35 BMC (Cortex-A7)";
1434fa699e80SPeter Delevoryas     mc->reset      = fby35_reset;
1435fa699e80SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1436fa699e80SPeter Delevoryas     amc->num_cs    = 2;
1437fa699e80SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1438fa699e80SPeter Delevoryas     amc->i2c_init  = fby35_i2c_init;
1439fa699e80SPeter Delevoryas     /* FIXME: Replace this macro with something more general */
1440fa699e80SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
1441fa699e80SPeter Delevoryas }
1442fa699e80SPeter Delevoryas 
144366c895b8SJamin Lin #define AST1030_INTERNAL_FLASH_SIZE (1024 * 1024)
144466c895b8SJamin Lin /* Main SYSCLK frequency in Hz (200MHz) */
144566c895b8SJamin Lin #define SYSCLK_FRQ 200000000ULL
144666c895b8SJamin Lin 
144766c895b8SJamin Lin static void aspeed_minibmc_machine_init(MachineState *machine)
144866c895b8SJamin Lin {
144966c895b8SJamin Lin     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
145066c895b8SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
145166c895b8SJamin Lin     Clock *sysclk;
145266c895b8SJamin Lin 
145366c895b8SJamin Lin     sysclk = clock_new(OBJECT(machine), "SYSCLK");
145466c895b8SJamin Lin     clock_set_hz(sysclk, SYSCLK_FRQ);
145566c895b8SJamin Lin 
145666c895b8SJamin Lin     object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
145766c895b8SJamin Lin     qdev_connect_clock_in(DEVICE(&bmc->soc), "sysclk", sysclk);
145866c895b8SJamin Lin 
14594dd9d554SPeter Delevoryas     object_property_set_link(OBJECT(&bmc->soc), "memory",
14604dd9d554SPeter Delevoryas                              OBJECT(get_system_memory()), &error_abort);
1461d2b3eaefSPeter Delevoryas     connect_serial_hds_to_uarts(bmc);
146266c895b8SJamin Lin     qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
146366c895b8SJamin Lin 
146466c895b8SJamin Lin     aspeed_board_init_flashes(&bmc->soc.fmc,
146566c895b8SJamin Lin                               bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
146666c895b8SJamin Lin                               amc->num_cs,
146766c895b8SJamin Lin                               0);
146866c895b8SJamin Lin 
146966c895b8SJamin Lin     aspeed_board_init_flashes(&bmc->soc.spi[0],
147066c895b8SJamin Lin                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
147166c895b8SJamin Lin                               amc->num_cs, amc->num_cs);
147266c895b8SJamin Lin 
147366c895b8SJamin Lin     aspeed_board_init_flashes(&bmc->soc.spi[1],
147466c895b8SJamin Lin                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
147566c895b8SJamin Lin                               amc->num_cs, (amc->num_cs * 2));
147666c895b8SJamin Lin 
147766c895b8SJamin Lin     if (amc->i2c_init) {
147866c895b8SJamin Lin         amc->i2c_init(bmc);
147966c895b8SJamin Lin     }
148066c895b8SJamin Lin 
148166c895b8SJamin Lin     armv7m_load_kernel(ARM_CPU(first_cpu),
148266c895b8SJamin Lin                        machine->kernel_filename,
1483761c532aSPeter Maydell                        0,
148466c895b8SJamin Lin                        AST1030_INTERNAL_FLASH_SIZE);
148566c895b8SJamin Lin }
148666c895b8SJamin Lin 
14874c70ab16STroy Lee static void ast1030_evb_i2c_init(AspeedMachineState *bmc)
14884c70ab16STroy Lee {
14894c70ab16STroy Lee     AspeedSoCState *soc = &bmc->soc;
14904c70ab16STroy Lee 
14914c70ab16STroy Lee     /* U10 24C08 connects to SDA/SCL Groupt 1 by default */
14924c70ab16STroy Lee     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
14934c70ab16STroy Lee     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, eeprom_buf);
14944c70ab16STroy Lee 
14954c70ab16STroy Lee     /* U11 LM75 connects to SDA/SCL Group 2 by default */
14964c70ab16STroy Lee     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d);
14974c70ab16STroy Lee }
14984c70ab16STroy Lee 
149966c895b8SJamin Lin static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc,
150066c895b8SJamin Lin                                                           void *data)
150166c895b8SJamin Lin {
150266c895b8SJamin Lin     MachineClass *mc = MACHINE_CLASS(oc);
150366c895b8SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
150466c895b8SJamin Lin 
150566c895b8SJamin Lin     mc->desc = "Aspeed AST1030 MiniBMC (Cortex-M4)";
150666c895b8SJamin Lin     amc->soc_name = "ast1030-a1";
150766c895b8SJamin Lin     amc->hw_strap1 = 0;
150866c895b8SJamin Lin     amc->hw_strap2 = 0;
150966c895b8SJamin Lin     mc->init = aspeed_minibmc_machine_init;
15104c70ab16STroy Lee     amc->i2c_init = ast1030_evb_i2c_init;
151166c895b8SJamin Lin     mc->default_ram_size = 0;
151266c895b8SJamin Lin     mc->default_cpus = mc->min_cpus = mc->max_cpus = 1;
151366c895b8SJamin Lin     amc->fmc_model = "sst25vf032b";
151466c895b8SJamin Lin     amc->spi_model = "sst25vf032b";
151566c895b8SJamin Lin     amc->num_cs = 2;
151666c895b8SJamin Lin     amc->macs_mask = 0;
151766c895b8SJamin Lin }
151866c895b8SJamin Lin 
1519fb6b3c8dSJae Hyun Yoo static void aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass *oc,
1520fb6b3c8dSJae Hyun Yoo                                                      void *data)
1521fb6b3c8dSJae Hyun Yoo {
1522fb6b3c8dSJae Hyun Yoo     MachineClass *mc = MACHINE_CLASS(oc);
1523fb6b3c8dSJae Hyun Yoo     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1524fb6b3c8dSJae Hyun Yoo 
1525fb6b3c8dSJae Hyun Yoo     mc->desc       = "Qualcomm DC-SCM V1 BMC (Cortex A7)";
1526fb6b3c8dSJae Hyun Yoo     amc->soc_name  = "ast2600-a3";
1527fb6b3c8dSJae Hyun Yoo     amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1528fb6b3c8dSJae Hyun Yoo     amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1529fb6b3c8dSJae Hyun Yoo     amc->fmc_model = "n25q512a";
1530fb6b3c8dSJae Hyun Yoo     amc->spi_model = "n25q512a";
1531fb6b3c8dSJae Hyun Yoo     amc->num_cs    = 2;
1532fb6b3c8dSJae Hyun Yoo     amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1533fb6b3c8dSJae Hyun Yoo     amc->i2c_init  = qcom_dc_scm_bmc_i2c_init;
1534fb6b3c8dSJae Hyun Yoo     mc->default_ram_size = 1 * GiB;
1535fb6b3c8dSJae Hyun Yoo     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1536fb6b3c8dSJae Hyun Yoo         aspeed_soc_num_cpus(amc->soc_name);
1537fb6b3c8dSJae Hyun Yoo };
1538fb6b3c8dSJae Hyun Yoo 
1539ece4cccdSGraeme Gregory static void aspeed_machine_qcom_firework_class_init(ObjectClass *oc,
1540ece4cccdSGraeme Gregory                                                     void *data)
1541ece4cccdSGraeme Gregory {
1542ece4cccdSGraeme Gregory     MachineClass *mc = MACHINE_CLASS(oc);
1543ece4cccdSGraeme Gregory     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1544ece4cccdSGraeme Gregory 
1545ece4cccdSGraeme Gregory     mc->desc       = "Qualcomm DC-SCM V1/Firework BMC (Cortex A7)";
1546ece4cccdSGraeme Gregory     amc->soc_name  = "ast2600-a3";
1547ece4cccdSGraeme Gregory     amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1548ece4cccdSGraeme Gregory     amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1549ece4cccdSGraeme Gregory     amc->fmc_model = "n25q512a";
1550ece4cccdSGraeme Gregory     amc->spi_model = "n25q512a";
1551ece4cccdSGraeme Gregory     amc->num_cs    = 2;
1552ece4cccdSGraeme Gregory     amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1553ece4cccdSGraeme Gregory     amc->i2c_init  = qcom_dc_scm_firework_i2c_init;
1554ece4cccdSGraeme Gregory     mc->default_ram_size = 1 * GiB;
1555ece4cccdSGraeme Gregory     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1556ece4cccdSGraeme Gregory         aspeed_soc_num_cpus(amc->soc_name);
1557ece4cccdSGraeme Gregory };
1558ece4cccdSGraeme Gregory 
1559baa4732bSCédric Le Goater static const TypeInfo aspeed_machine_types[] = {
1560baa4732bSCédric Le Goater     {
1561baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("palmetto-bmc"),
1562baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1563baa4732bSCédric Le Goater         .class_init    = aspeed_machine_palmetto_class_init,
1564baa4732bSCédric Le Goater     }, {
156540a38df5SErik Smit         .name          = MACHINE_TYPE_NAME("supermicrox11-bmc"),
156640a38df5SErik Smit         .parent        = TYPE_ASPEED_MACHINE,
156740a38df5SErik Smit         .class_init    = aspeed_machine_supermicrox11_bmc_class_init,
156840a38df5SErik Smit     }, {
156947936597SGuenter Roeck         .name          = MACHINE_TYPE_NAME("supermicro-x11spi-bmc"),
157047936597SGuenter Roeck         .parent        = TYPE_ASPEED_MACHINE,
157147936597SGuenter Roeck         .class_init    = aspeed_machine_supermicro_x11spi_bmc_class_init,
157247936597SGuenter Roeck     }, {
1573baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2500-evb"),
1574baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1575baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2500_evb_class_init,
1576baa4732bSCédric Le Goater     }, {
1577baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("romulus-bmc"),
1578baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1579baa4732bSCédric Le Goater         .class_init    = aspeed_machine_romulus_class_init,
1580baa4732bSCédric Le Goater     }, {
1581143b040fSPatrick Williams         .name          = MACHINE_TYPE_NAME("sonorapass-bmc"),
1582143b040fSPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1583143b040fSPatrick Williams         .class_init    = aspeed_machine_sonorapass_class_init,
1584143b040fSPatrick Williams     }, {
1585baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("witherspoon-bmc"),
1586baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1587baa4732bSCédric Le Goater         .class_init    = aspeed_machine_witherspoon_class_init,
1588baa4732bSCédric Le Goater     }, {
1589baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2600-evb"),
1590baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1591baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2600_evb_class_init,
1592baa4732bSCédric Le Goater     }, {
1593*34f73a81SKarthikeyan Pasupathi         .name          = MACHINE_TYPE_NAME("yosemitev2-bmc"),
1594*34f73a81SKarthikeyan Pasupathi         .parent        = TYPE_ASPEED_MACHINE,
1595*34f73a81SKarthikeyan Pasupathi         .class_init    = aspeed_machine_yosemitev2_class_init,
1596*34f73a81SKarthikeyan Pasupathi     }, {
159763ceb818SCédric Le Goater         .name          = MACHINE_TYPE_NAME("tacoma-bmc"),
159863ceb818SCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
159963ceb818SCédric Le Goater         .class_init    = aspeed_machine_tacoma_class_init,
160063ceb818SCédric Le Goater     }, {
160195f068c8SJohn Wang         .name          = MACHINE_TYPE_NAME("g220a-bmc"),
160295f068c8SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
160395f068c8SJohn Wang         .class_init    = aspeed_machine_g220a_class_init,
160495f068c8SJohn Wang     }, {
1605fb6b3c8dSJae Hyun Yoo         .name          = MACHINE_TYPE_NAME("qcom-dc-scm-v1-bmc"),
1606fb6b3c8dSJae Hyun Yoo         .parent        = TYPE_ASPEED_MACHINE,
1607fb6b3c8dSJae Hyun Yoo         .class_init    = aspeed_machine_qcom_dc_scm_v1_class_init,
1608fb6b3c8dSJae Hyun Yoo     }, {
1609ece4cccdSGraeme Gregory         .name          = MACHINE_TYPE_NAME("qcom-firework-bmc"),
1610ece4cccdSGraeme Gregory         .parent        = TYPE_ASPEED_MACHINE,
1611ece4cccdSGraeme Gregory         .class_init    = aspeed_machine_qcom_firework_class_init,
1612ece4cccdSGraeme Gregory     }, {
161382b6a3f6SJohn Wang         .name          = MACHINE_TYPE_NAME("fp5280g2-bmc"),
161482b6a3f6SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
161582b6a3f6SJohn Wang         .class_init    = aspeed_machine_fp5280g2_class_init,
161682b6a3f6SJohn Wang     }, {
16179cccb912SPatrick Venture         .name          = MACHINE_TYPE_NAME("quanta-q71l-bmc"),
16189cccb912SPatrick Venture         .parent        = TYPE_ASPEED_MACHINE,
16199cccb912SPatrick Venture         .class_init    = aspeed_machine_quanta_q71l_class_init,
16209cccb912SPatrick Venture     }, {
162158e52bdbSCédric Le Goater         .name          = MACHINE_TYPE_NAME("rainier-bmc"),
162258e52bdbSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
162358e52bdbSCédric Le Goater         .class_init    = aspeed_machine_rainier_class_init,
162458e52bdbSCédric Le Goater     }, {
1625febbe308SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fuji-bmc"),
1626febbe308SPeter Delevoryas         .parent        = TYPE_ASPEED_MACHINE,
1627febbe308SPeter Delevoryas         .class_init    = aspeed_machine_fuji_class_init,
1628febbe308SPeter Delevoryas     }, {
1629a20c54b1SPatrick Williams         .name          = MACHINE_TYPE_NAME("bletchley-bmc"),
1630a20c54b1SPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1631a20c54b1SPatrick Williams         .class_init    = aspeed_machine_bletchley_class_init,
1632a20c54b1SPatrick Williams     }, {
1633fa699e80SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fby35-bmc"),
1634fa699e80SPeter Delevoryas         .parent        = MACHINE_TYPE_NAME("ast2600-evb"),
1635fa699e80SPeter Delevoryas         .class_init    = aspeed_machine_fby35_class_init,
1636fa699e80SPeter Delevoryas     }, {
163766c895b8SJamin Lin         .name           = MACHINE_TYPE_NAME("ast1030-evb"),
163866c895b8SJamin Lin         .parent         = TYPE_ASPEED_MACHINE,
163966c895b8SJamin Lin         .class_init     = aspeed_minibmc_machine_ast1030_evb_class_init,
164066c895b8SJamin Lin     }, {
1641fca9ca1bSCédric Le Goater         .name          = TYPE_ASPEED_MACHINE,
164262c2c2ebSCédric Le Goater         .parent        = TYPE_MACHINE,
1643888b2b03SPhilippe Mathieu-Daudé         .instance_size = sizeof(AspeedMachineState),
16441a15311aSCédric Le Goater         .instance_init = aspeed_machine_instance_init,
1645fca9ca1bSCédric Le Goater         .class_size    = sizeof(AspeedMachineClass),
1646fca9ca1bSCédric Le Goater         .class_init    = aspeed_machine_class_init,
1647baa4732bSCédric Le Goater         .abstract      = true,
1648baa4732bSCédric Le Goater     }
1649fca9ca1bSCédric Le Goater };
165074fb1f38SCédric Le Goater 
1651baa4732bSCédric Le Goater DEFINE_TYPES(aspeed_machine_types)
1652