xref: /qemu/hw/arm/aspeed.c (revision 9077e09a13755b4774a4e640ed3ac1a92db11839)
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"
173ec75e39SPatrick Venture #include "hw/i2c/i2c_mux_pca954x.h"
1893198b6cSCorey Minyard #include "hw/i2c/smbus_eeprom.h"
19044475f3SPhilippe Mathieu-Daudé #include "hw/misc/pca9552.h"
209618ebaeSPeter Delevoryas #include "hw/nvram/eeprom_at24c.h"
215e9ae4b1SCorey Minyard #include "hw/sensor/tmp105.h"
227cfbde5eSPhilippe Mathieu-Daudé #include "hw/misc/led.h"
23a27bd6c7SMarkus Armbruster #include "hw/qdev-properties.h"
24e1ad9bc4SCédric Le Goater #include "sysemu/block-backend.h"
25fa699e80SPeter Delevoryas #include "sysemu/reset.h"
26d769a1daSCédric Le Goater #include "hw/loader.h"
27d769a1daSCédric Le Goater #include "qemu/error-report.h"
28a9df9622SJoel Stanley #include "qemu/units.h"
2966c895b8SJamin Lin #include "hw/qdev-clock.h"
30d2b3eaefSPeter Delevoryas #include "sysemu/sysemu.h"
31327d8e4eSAndrew Jeffery 
3274fb1f38SCédric Le Goater static struct arm_boot_info aspeed_board_binfo = {
33b033271fSCédric Le Goater     .board_id = -1, /* device-tree-only board */
34327d8e4eSAndrew Jeffery };
35327d8e4eSAndrew Jeffery 
36612b219aSPhilippe Mathieu-Daudé struct AspeedMachineState {
37888b2b03SPhilippe Mathieu-Daudé     /* Private */
38888b2b03SPhilippe Mathieu-Daudé     MachineState parent_obj;
39888b2b03SPhilippe Mathieu-Daudé     /* Public */
40888b2b03SPhilippe Mathieu-Daudé 
41ff90606fSCédric Le Goater     AspeedSoCState soc;
42888b2b03SPhilippe Mathieu-Daudé     bool mmio_exec;
439820e52fSCédric Le Goater     char *fmc_model;
449820e52fSCédric Le Goater     char *spi_model;
45ea066d39SThomas Huth };
46327d8e4eSAndrew Jeffery 
47ef17f836SCédric Le Goater /* Palmetto hardware value: 0x120CE416 */
488da33ef7SCédric Le Goater #define PALMETTO_BMC_HW_STRAP1 (                                        \
498da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_256MB) |               \
508da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2 /* DDR3 with CL=6, CWL=5 */) | \
518da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
528da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) |       \
538da33ef7SCédric Le Goater         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
548da33ef7SCédric Le Goater         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
558da33ef7SCédric Le Goater         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) |                \
568da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
578da33ef7SCédric Le Goater         SCU_HW_STRAP_SPI_WIDTH |                                        \
588da33ef7SCédric Le Goater         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
598da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
608da33ef7SCédric Le Goater 
6140a38df5SErik Smit /* TODO: Find the actual hardware value */
6240a38df5SErik Smit #define SUPERMICROX11_BMC_HW_STRAP1 (                                   \
6340a38df5SErik Smit         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) |               \
6440a38df5SErik Smit         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2) |                           \
6540a38df5SErik Smit         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
6640a38df5SErik Smit         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) |       \
6740a38df5SErik Smit         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
6840a38df5SErik Smit         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
6940a38df5SErik Smit         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) |                \
7040a38df5SErik Smit         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
7140a38df5SErik Smit         SCU_HW_STRAP_SPI_WIDTH |                                        \
7240a38df5SErik Smit         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
7340a38df5SErik Smit         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
7440a38df5SErik Smit 
7547936597SGuenter Roeck /* TODO: Find the actual hardware value */
7647936597SGuenter Roeck #define SUPERMICRO_X11SPI_BMC_HW_STRAP1 (                               \
7747936597SGuenter Roeck         AST2500_HW_STRAP1_DEFAULTS |                                    \
7847936597SGuenter Roeck         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
7947936597SGuenter Roeck         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
8047936597SGuenter Roeck         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
8147936597SGuenter Roeck         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
8247936597SGuenter Roeck         SCU_HW_STRAP_SPI_WIDTH |                                        \
8347936597SGuenter Roeck         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN))
8447936597SGuenter Roeck 
85ef17f836SCédric Le Goater /* AST2500 evb hardware value: 0xF100C2E6 */
869a7c1750SCédric Le Goater #define AST2500_EVB_HW_STRAP1 ((                                        \
879a7c1750SCédric Le Goater         AST2500_HW_STRAP1_DEFAULTS |                                    \
889a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
899a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
909a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
919a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
929a7c1750SCédric Le Goater         SCU_HW_STRAP_MAC1_RGMII |                                       \
939a7c1750SCédric Le Goater         SCU_HW_STRAP_MAC0_RGMII) &                                      \
949a7c1750SCédric Le Goater         ~SCU_HW_STRAP_2ND_BOOT_WDT)
959a7c1750SCédric Le Goater 
96ef17f836SCédric Le Goater /* Romulus hardware value: 0xF10AD206 */
97ef17f836SCédric Le Goater #define ROMULUS_BMC_HW_STRAP1 (                                         \
98ef17f836SCédric Le Goater         AST2500_HW_STRAP1_DEFAULTS |                                    \
99ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
100ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
101ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
102ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
103ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_ACPI_ENABLE |                              \
104ef17f836SCédric Le Goater         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER))
105ef17f836SCédric Le Goater 
106143b040fSPatrick Williams /* Sonorapass hardware value: 0xF100D216 */
107143b040fSPatrick Williams #define SONORAPASS_BMC_HW_STRAP1 (                                      \
108143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
109143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
110143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
111143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
112143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
113143b040fSPatrick Williams         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
114143b040fSPatrick Williams         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
115143b040fSPatrick Williams         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
116143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
117143b040fSPatrick Williams         SCU_HW_STRAP_VGA_BIOS_ROM |                                     \
118143b040fSPatrick Williams         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
119143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_RESERVED1)
120143b040fSPatrick Williams 
12195f068c8SJohn Wang #define G220A_BMC_HW_STRAP1 (                                      \
12295f068c8SJohn Wang         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
12395f068c8SJohn Wang         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
12495f068c8SJohn Wang         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
12595f068c8SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
12695f068c8SJohn Wang         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
12795f068c8SJohn Wang         SCU_HW_STRAP_2ND_BOOT_WDT |                                     \
12895f068c8SJohn Wang         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
12995f068c8SJohn Wang         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
13095f068c8SJohn Wang         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
13195f068c8SJohn Wang         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
13295f068c8SJohn Wang         SCU_HW_STRAP_VGA_SIZE_SET(VGA_64M_DRAM) |                       \
13395f068c8SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED1)
13495f068c8SJohn Wang 
13582b6a3f6SJohn Wang /* FP5280G2 hardware value: 0XF100D286 */
13682b6a3f6SJohn Wang #define FP5280G2_BMC_HW_STRAP1 (                                      \
13782b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
13882b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
13982b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
14082b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
14182b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
14282b6a3f6SJohn Wang         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
14382b6a3f6SJohn Wang         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
14482b6a3f6SJohn Wang         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
14582b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
14682b6a3f6SJohn Wang         SCU_HW_STRAP_MAC1_RGMII |                                       \
14782b6a3f6SJohn Wang         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
14882b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED1)
14982b6a3f6SJohn Wang 
15062c2c2ebSCédric Le Goater /* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */
15162c2c2ebSCédric Le Goater #define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1
15262c2c2ebSCédric Le Goater 
1539cccb912SPatrick Venture /* Quanta-Q71l hardware value */
1549cccb912SPatrick Venture #define QUANTA_Q71L_BMC_HW_STRAP1 (                                     \
1559cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) |               \
1569cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2/* DDR3 with CL=6, CWL=5 */) | \
1579cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
1589cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_24M_IN) |       \
1599cccb912SPatrick Venture         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
1609cccb912SPatrick Venture         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_PASS_THROUGH) |          \
1619cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
1629cccb912SPatrick Venture         SCU_HW_STRAP_SPI_WIDTH |                                        \
1639cccb912SPatrick Venture         SCU_HW_STRAP_VGA_SIZE_SET(VGA_8M_DRAM) |                        \
1649cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
1659cccb912SPatrick Venture 
166ccc2c418SCédric Le Goater /* AST2600 evb hardware value */
167ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP1 0x000000C0
168ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP2 0x00000003
169ccc2c418SCédric Le Goater 
17063ceb818SCédric Le Goater /* Tacoma hardware value */
17163ceb818SCédric Le Goater #define TACOMA_BMC_HW_STRAP1  0x00000000
1727582591aSJoel Stanley #define TACOMA_BMC_HW_STRAP2  0x00000040
17363ceb818SCédric Le Goater 
17458e52bdbSCédric Le Goater /* Rainier hardware value: (QEMU prototype) */
175b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP1 0x00422016
176b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP2 0x80000848
17758e52bdbSCédric Le Goater 
178febbe308SPeter Delevoryas /* Fuji hardware value */
179febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP1    0x00000000
180febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP2    0x00000000
181febbe308SPeter Delevoryas 
182a20c54b1SPatrick Williams /* Bletchley hardware value */
183a20c54b1SPatrick Williams /* TODO: Leave same as EVB for now. */
184a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP1 AST2600_EVB_HW_STRAP1
185a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP2 AST2600_EVB_HW_STRAP2
186a20c54b1SPatrick Williams 
187fb6b3c8dSJae Hyun Yoo /* Qualcomm DC-SCM hardware value */
188fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP1  0x00000000
189fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP2  0x00000041
190fb6b3c8dSJae Hyun Yoo 
1919bb6d140SJoel Stanley #define AST_SMP_MAILBOX_BASE            0x1e6e2180
1929bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_ENTRY        (AST_SMP_MAILBOX_BASE + 0x0)
1939bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_GOSIGN       (AST_SMP_MAILBOX_BASE + 0x4)
1949bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_READY        (AST_SMP_MAILBOX_BASE + 0x8)
1959bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_POLLINSN     (AST_SMP_MAILBOX_BASE + 0xc)
1969bb6d140SJoel Stanley #define AST_SMP_MBOX_CODE               (AST_SMP_MAILBOX_BASE + 0x10)
1979bb6d140SJoel Stanley #define AST_SMP_MBOX_GOSIGN             0xabbaab00
1989bb6d140SJoel Stanley 
1999bb6d140SJoel Stanley static void aspeed_write_smpboot(ARMCPU *cpu,
2009bb6d140SJoel Stanley                                  const struct arm_boot_info *info)
2019bb6d140SJoel Stanley {
2029bb6d140SJoel Stanley     static const uint32_t poll_mailbox_ready[] = {
2039bb6d140SJoel Stanley         /*
2049bb6d140SJoel Stanley          * r2 = per-cpu go sign value
2059bb6d140SJoel Stanley          * r1 = AST_SMP_MBOX_FIELD_ENTRY
2069bb6d140SJoel Stanley          * r0 = AST_SMP_MBOX_FIELD_GOSIGN
2079bb6d140SJoel Stanley          */
2089bb6d140SJoel Stanley         0xee100fb0,  /* mrc     p15, 0, r0, c0, c0, 5 */
2099bb6d140SJoel Stanley         0xe21000ff,  /* ands    r0, r0, #255          */
2109bb6d140SJoel Stanley         0xe59f201c,  /* ldr     r2, [pc, #28]         */
2119bb6d140SJoel Stanley         0xe1822000,  /* orr     r2, r2, r0            */
2129bb6d140SJoel Stanley 
2139bb6d140SJoel Stanley         0xe59f1018,  /* ldr     r1, [pc, #24]         */
2149bb6d140SJoel Stanley         0xe59f0018,  /* ldr     r0, [pc, #24]         */
2159bb6d140SJoel Stanley 
2169bb6d140SJoel Stanley         0xe320f002,  /* wfe                           */
2179bb6d140SJoel Stanley         0xe5904000,  /* ldr     r4, [r0]              */
2189bb6d140SJoel Stanley         0xe1520004,  /* cmp     r2, r4                */
2199bb6d140SJoel Stanley         0x1afffffb,  /* bne     <wfe>                 */
2209bb6d140SJoel Stanley         0xe591f000,  /* ldr     pc, [r1]              */
2219bb6d140SJoel Stanley         AST_SMP_MBOX_GOSIGN,
2229bb6d140SJoel Stanley         AST_SMP_MBOX_FIELD_ENTRY,
2239bb6d140SJoel Stanley         AST_SMP_MBOX_FIELD_GOSIGN,
2249bb6d140SJoel Stanley     };
2259bb6d140SJoel Stanley 
2269bb6d140SJoel Stanley     rom_add_blob_fixed("aspeed.smpboot", poll_mailbox_ready,
2279bb6d140SJoel Stanley                        sizeof(poll_mailbox_ready),
2289bb6d140SJoel Stanley                        info->smp_loader_start);
2299bb6d140SJoel Stanley }
2309bb6d140SJoel Stanley 
2319bb6d140SJoel Stanley static void aspeed_reset_secondary(ARMCPU *cpu,
2329bb6d140SJoel Stanley                                    const struct arm_boot_info *info)
2339bb6d140SJoel Stanley {
2349bb6d140SJoel Stanley     AddressSpace *as = arm_boot_address_space(cpu, info);
2359bb6d140SJoel Stanley     CPUState *cs = CPU(cpu);
2369bb6d140SJoel Stanley 
2379bb6d140SJoel Stanley     /* info->smp_bootreg_addr */
2389bb6d140SJoel Stanley     address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0,
2399bb6d140SJoel Stanley                                MEMTXATTRS_UNSPECIFIED, NULL);
2409bb6d140SJoel Stanley     cpu_set_pc(cs, info->smp_loader_start);
2419bb6d140SJoel Stanley }
2429bb6d140SJoel Stanley 
243d769a1daSCédric Le Goater #define FIRMWARE_ADDR 0x0
244d769a1daSCédric Le Goater 
245d769a1daSCédric Le Goater static void write_boot_rom(DriveInfo *dinfo, hwaddr addr, size_t rom_size,
246d769a1daSCédric Le Goater                            Error **errp)
247d769a1daSCédric Le Goater {
248d769a1daSCédric Le Goater     BlockBackend *blk = blk_by_legacy_dinfo(dinfo);
24905e6e40aSWentao_Liang     g_autofree void *storage = NULL;
2500c7209beSCédric Le Goater     int64_t size;
251d769a1daSCédric Le Goater 
2520c7209beSCédric Le Goater     /* The block backend size should have already been 'validated' by
2530c7209beSCédric Le Goater      * the creation of the m25p80 object.
2540c7209beSCédric Le Goater      */
2550c7209beSCédric Le Goater     size = blk_getlength(blk);
2560c7209beSCédric Le Goater     if (size <= 0) {
2570c7209beSCédric Le Goater         error_setg(errp, "failed to get flash size");
2580c7209beSCédric Le Goater         return;
2590c7209beSCédric Le Goater     }
2600c7209beSCédric Le Goater 
2610c7209beSCédric Le Goater     if (rom_size > size) {
2620c7209beSCédric Le Goater         rom_size = size;
263d769a1daSCédric Le Goater     }
264d769a1daSCédric Le Goater 
26505e6e40aSWentao_Liang     storage = g_malloc0(rom_size);
266a9262f55SAlberto Faria     if (blk_pread(blk, 0, rom_size, storage, 0) < 0) {
267d769a1daSCédric Le Goater         error_setg(errp, "failed to read the initial flash content");
268d769a1daSCédric Le Goater         return;
269d769a1daSCédric Le Goater     }
270d769a1daSCédric Le Goater 
271d769a1daSCédric Le Goater     rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr);
272d769a1daSCédric Le Goater }
273d769a1daSCédric Le Goater 
2741099ad10SPeter Delevoryas void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
2759bd4ac61SCédric Le Goater                                       unsigned int count, int unit0)
276e1ad9bc4SCédric Le Goater {
277e1ad9bc4SCédric Le Goater     int i;
278179b2058SPatrick Williams 
279179b2058SPatrick Williams     if (!flashtype) {
280179b2058SPatrick Williams         return;
281179b2058SPatrick Williams     }
282e1ad9bc4SCédric Le Goater 
2839bd4ac61SCédric Le Goater     for (i = 0; i < count; ++i) {
2848ec239f2SMarkus Armbruster         DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i);
285e1ad9bc4SCédric Le Goater         qemu_irq cs_line;
286a7d78befSCédric Le Goater         DeviceState *dev;
287e1ad9bc4SCédric Le Goater 
288a7d78befSCédric Le Goater         dev = qdev_new(flashtype);
289e1ad9bc4SCédric Le Goater         if (dinfo) {
290a7d78befSCédric Le Goater             qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo));
291e1ad9bc4SCédric Le Goater         }
292a7d78befSCédric Le Goater         qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal);
293e1ad9bc4SCédric Le Goater 
294a7d78befSCédric Le Goater         cs_line = qdev_get_gpio_in_named(dev, SSI_GPIO_CS, 0);
295e1ad9bc4SCédric Le Goater         sysbus_connect_irq(SYS_BUS_DEVICE(s), i + 1, cs_line);
296e1ad9bc4SCédric Le Goater     }
297e1ad9bc4SCédric Le Goater }
298e1ad9bc4SCédric Le Goater 
299a29e3e12SAndrew Jeffery static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo)
300a29e3e12SAndrew Jeffery {
301a29e3e12SAndrew Jeffery         DeviceState *card;
302a29e3e12SAndrew Jeffery 
303756f739bSPhilippe Mathieu-Daudé         if (!dinfo) {
304756f739bSPhilippe Mathieu-Daudé             return;
305756f739bSPhilippe Mathieu-Daudé         }
3063e80f690SMarkus Armbruster         card = qdev_new(TYPE_SD_CARD);
307934df912SMarkus Armbruster         qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
308a29e3e12SAndrew Jeffery                                 &error_fatal);
3093e80f690SMarkus Armbruster         qdev_realize_and_unref(card,
3103e80f690SMarkus Armbruster                                qdev_get_child_bus(DEVICE(sdhci), "sd-bus"),
3113e80f690SMarkus Armbruster                                &error_fatal);
312a29e3e12SAndrew Jeffery }
313a29e3e12SAndrew Jeffery 
314d2b3eaefSPeter Delevoryas static void connect_serial_hds_to_uarts(AspeedMachineState *bmc)
315d2b3eaefSPeter Delevoryas {
316d2b3eaefSPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
317d2b3eaefSPeter Delevoryas     AspeedSoCState *s = &bmc->soc;
318d2b3eaefSPeter Delevoryas     AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
319d2b3eaefSPeter Delevoryas 
320d2b3eaefSPeter Delevoryas     aspeed_soc_uart_set_chr(s, amc->uart_default, serial_hd(0));
321d2b3eaefSPeter Delevoryas     for (int i = 1, uart = ASPEED_DEV_UART1; i < sc->uarts_num; i++, uart++) {
322d2b3eaefSPeter Delevoryas         if (uart == amc->uart_default) {
323d2b3eaefSPeter Delevoryas             continue;
324d2b3eaefSPeter Delevoryas         }
325d2b3eaefSPeter Delevoryas         aspeed_soc_uart_set_chr(s, uart, serial_hd(i));
326d2b3eaefSPeter Delevoryas     }
327d2b3eaefSPeter Delevoryas }
328d2b3eaefSPeter Delevoryas 
329baa4732bSCédric Le Goater static void aspeed_machine_init(MachineState *machine)
330327d8e4eSAndrew Jeffery {
331888b2b03SPhilippe Mathieu-Daudé     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
332baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
333b033271fSCédric Le Goater     AspeedSoCClass *sc;
334d769a1daSCédric Le Goater     DriveInfo *drive0 = drive_get(IF_MTD, 0, 0);
3352bea128cSEddie James     int i;
336d3bad7e7SCédric Le Goater     NICInfo *nd = &nd_table[0];
337327d8e4eSAndrew Jeffery 
3389fc7fc4dSMarkus Armbruster     object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
339327d8e4eSAndrew Jeffery 
340b033271fSCédric Le Goater     sc = ASPEED_SOC_GET_CLASS(&bmc->soc);
341b033271fSCédric Le Goater 
342533eb415SIgor Mammedov     /*
343346160cbSCédric Le Goater      * This will error out if the RAM size is not supported by the
344346160cbSCédric Le Goater      * memory controller of the SoC.
345533eb415SIgor Mammedov      */
3466e504a98SPaolo Bonzini     object_property_set_uint(OBJECT(&bmc->soc), "ram-size", machine->ram_size,
347533eb415SIgor Mammedov                              &error_fatal);
348533eb415SIgor Mammedov 
349d3bad7e7SCédric Le Goater     for (i = 0; i < sc->macs_num; i++) {
350d3bad7e7SCédric Le Goater         if ((amc->macs_mask & (1 << i)) && nd->used) {
351d3bad7e7SCédric Le Goater             qemu_check_nic_model(nd, TYPE_FTGMAC100);
352d3bad7e7SCédric Le Goater             qdev_set_nic_properties(DEVICE(&bmc->soc.ftgmac100[i]), nd);
353d3bad7e7SCédric Le Goater             nd++;
354d3bad7e7SCédric Le Goater         }
355d3bad7e7SCédric Le Goater     }
356d3bad7e7SCédric Le Goater 
3575325cc34SMarkus Armbruster     object_property_set_int(OBJECT(&bmc->soc), "hw-strap1", amc->hw_strap1,
35887e79af0SAndrew Jeffery                             &error_abort);
3595325cc34SMarkus Armbruster     object_property_set_int(OBJECT(&bmc->soc), "hw-strap2", amc->hw_strap2,
360ccc2c418SCédric Le Goater                             &error_abort);
3614dd9d554SPeter Delevoryas     object_property_set_link(OBJECT(&bmc->soc), "memory",
3624dd9d554SPeter Delevoryas                              OBJECT(get_system_memory()), &error_abort);
3635325cc34SMarkus Armbruster     object_property_set_link(OBJECT(&bmc->soc), "dram",
3640df2d9a6SCédric Le Goater                              OBJECT(machine->ram), &error_abort);
365b6e70d1dSJoel Stanley     if (machine->kernel_filename) {
366b6e70d1dSJoel Stanley         /*
367b6e70d1dSJoel Stanley          * When booting with a -kernel command line there is no u-boot
368b6e70d1dSJoel Stanley          * that runs to unlock the SCU. In this case set the default to
369b6e70d1dSJoel Stanley          * be unlocked as the kernel expects
370b6e70d1dSJoel Stanley          */
3715325cc34SMarkus Armbruster         object_property_set_int(OBJECT(&bmc->soc), "hw-prot-key",
3725325cc34SMarkus Armbruster                                 ASPEED_SCU_PROT_KEY, &error_abort);
373b6e70d1dSJoel Stanley     }
374d2b3eaefSPeter Delevoryas     connect_serial_hds_to_uarts(bmc);
375ce189ab2SMarkus Armbruster     qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
376327d8e4eSAndrew Jeffery 
3778ec239f2SMarkus Armbruster     aspeed_board_init_flashes(&bmc->soc.fmc,
3788ec239f2SMarkus Armbruster                               bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
3799bd4ac61SCédric Le Goater                               amc->num_cs, 0);
3808ec239f2SMarkus Armbruster     aspeed_board_init_flashes(&bmc->soc.spi[0],
3818ec239f2SMarkus Armbruster                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
3829bd4ac61SCédric Le Goater                               1, amc->num_cs);
383e1ad9bc4SCédric Le Goater 
384d769a1daSCédric Le Goater     /* Install first FMC flash content as a boot rom. */
385d769a1daSCédric Le Goater     if (drive0) {
386d769a1daSCédric Le Goater         AspeedSMCFlash *fl = &bmc->soc.fmc.flashes[0];
387d769a1daSCédric Le Goater         MemoryRegion *boot_rom = g_new(MemoryRegion, 1);
3886bb55e79SCédric Le Goater         uint64_t size = memory_region_size(&fl->mmio);
389d769a1daSCédric Le Goater 
390d769a1daSCédric Le Goater         /*
391d769a1daSCédric Le Goater          * create a ROM region using the default mapping window size of
39293bf276dSCédric Le Goater          * the flash module. The window size is 64MB for the AST2400
39393bf276dSCédric Le Goater          * SoC and 128MB for the AST2500 SoC, which is twice as big as
39493bf276dSCédric Le Goater          * needed by the flash modules of the Aspeed machines.
395d769a1daSCédric Le Goater          */
3961a15311aSCédric Le Goater         if (ASPEED_MACHINE(machine)->mmio_exec) {
397f489960dSPhilippe Mathieu-Daudé             memory_region_init_alias(boot_rom, NULL, "aspeed.boot_rom",
3986bb55e79SCédric Le Goater                                      &fl->mmio, 0, size);
3991a15311aSCédric Le Goater             memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
4001a15311aSCédric Le Goater                                         boot_rom);
4011a15311aSCédric Le Goater         } else {
402f489960dSPhilippe Mathieu-Daudé             memory_region_init_rom(boot_rom, NULL, "aspeed.boot_rom",
4036bb55e79SCédric Le Goater                                    size, &error_abort);
404d769a1daSCédric Le Goater             memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
405d769a1daSCédric Le Goater                                         boot_rom);
4066bb55e79SCédric Le Goater             write_boot_rom(drive0, FIRMWARE_ADDR, size, &error_abort);
407d769a1daSCédric Le Goater         }
4081a15311aSCédric Le Goater     }
409d769a1daSCédric Le Goater 
410b7f1a0cbSCédric Le Goater     if (machine->kernel_filename && sc->num_cpus > 1) {
4119bb6d140SJoel Stanley         /* With no u-boot we must set up a boot stub for the secondary CPU */
4129bb6d140SJoel Stanley         MemoryRegion *smpboot = g_new(MemoryRegion, 1);
413f489960dSPhilippe Mathieu-Daudé         memory_region_init_ram(smpboot, NULL, "aspeed.smpboot",
4149bb6d140SJoel Stanley                                0x80, &error_abort);
4159bb6d140SJoel Stanley         memory_region_add_subregion(get_system_memory(),
4169bb6d140SJoel Stanley                                     AST_SMP_MAILBOX_BASE, smpboot);
4179bb6d140SJoel Stanley 
4189bb6d140SJoel Stanley         aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot;
4199bb6d140SJoel Stanley         aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary;
4209bb6d140SJoel Stanley         aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE;
4219bb6d140SJoel Stanley     }
4229bb6d140SJoel Stanley 
4236e504a98SPaolo Bonzini     aspeed_board_binfo.ram_size = machine->ram_size;
424347df6f8SEduardo Habkost     aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM];
425b033271fSCédric Le Goater 
426baa4732bSCédric Le Goater     if (amc->i2c_init) {
427baa4732bSCédric Le Goater         amc->i2c_init(bmc);
4282cf6cb50SCédric Le Goater     }
4292cf6cb50SCédric Le Goater 
4300e2c24c6SAndrew Jeffery     for (i = 0; i < bmc->soc.sdhci.num_slots; i++) {
4318ec239f2SMarkus Armbruster         sdhci_attach_drive(&bmc->soc.sdhci.slots[i],
4328ec239f2SMarkus Armbruster                            drive_get(IF_SD, 0, i));
433a29e3e12SAndrew Jeffery     }
4342bea128cSEddie James 
435a29e3e12SAndrew Jeffery     if (bmc->soc.emmc.num_slots) {
4368ec239f2SMarkus Armbruster         sdhci_attach_drive(&bmc->soc.emmc.slots[0],
4378ec239f2SMarkus Armbruster                            drive_get(IF_SD, 0, bmc->soc.sdhci.num_slots));
4382bea128cSEddie James     }
4392bea128cSEddie James 
4402744ece8STao Xu     arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo);
441327d8e4eSAndrew Jeffery }
442327d8e4eSAndrew Jeffery 
443612b219aSPhilippe Mathieu-Daudé static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
4442cf6cb50SCédric Le Goater {
4452cf6cb50SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
446a87e81b9SCédric Le Goater     DeviceState *dev;
4473d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
4482cf6cb50SCédric Le Goater 
4492cf6cb50SCédric Le Goater     /* The palmetto platform expects a ds3231 RTC but a ds1338 is
4502cf6cb50SCédric Le Goater      * enough to provide basic RTC features. Alarms will be missing */
4511373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
452a87e81b9SCédric Le Goater 
4537a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
4543d165f12SCédric Le Goater                           eeprom_buf);
4553d165f12SCédric Le Goater 
456a87e81b9SCédric Le Goater     /* add a TMP423 temperature sensor */
4571373b15bSPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
4581373b15bSPhilippe Mathieu-Daudé                                          "tmp423", 0x4c));
4595325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
4605325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
4615325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
4625325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort);
4632cf6cb50SCédric Le Goater }
4642cf6cb50SCédric Le Goater 
4659cccb912SPatrick Venture static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc)
4669cccb912SPatrick Venture {
4679cccb912SPatrick Venture     AspeedSoCState *soc = &bmc->soc;
4689cccb912SPatrick Venture 
4699cccb912SPatrick Venture     /*
4709cccb912SPatrick Venture      * The quanta-q71l platform expects tmp75s which are compatible with
4719cccb912SPatrick Venture      * tmp105s.
4729cccb912SPatrick Venture      */
4739cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c);
4749cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e);
4759cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f);
4769cccb912SPatrick Venture 
4779cccb912SPatrick Venture     /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */
4789cccb912SPatrick Venture     /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */
4799cccb912SPatrick Venture     /* TODO: Add Memory Riser i2c mux and eeproms. */
4809cccb912SPatrick Venture 
4813ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74);
4823ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77);
4833ec75e39SPatrick Venture 
4849cccb912SPatrick Venture     /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */
4853ec75e39SPatrick Venture 
4863ec75e39SPatrick Venture     /* i2c-7 */
4873ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70);
4889cccb912SPatrick Venture     /*        - i2c@0: pmbus@59 */
4899cccb912SPatrick Venture     /*        - i2c@1: pmbus@58 */
4909cccb912SPatrick Venture     /*        - i2c@2: pmbus@58 */
4919cccb912SPatrick Venture     /*        - i2c@3: pmbus@59 */
4923ec75e39SPatrick Venture 
4939cccb912SPatrick Venture     /* TODO: i2c-7: Add PDB FRU eeprom@52 */
4949cccb912SPatrick Venture     /* TODO: i2c-8: Add BMC FRU eeprom@50 */
4959cccb912SPatrick Venture }
4969cccb912SPatrick Venture 
497612b219aSPhilippe Mathieu-Daudé static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
4982cf6cb50SCédric Le Goater {
4992cf6cb50SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
5003d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
5013d165f12SCédric Le Goater 
5027a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50,
5033d165f12SCédric Le Goater                           eeprom_buf);
5042cf6cb50SCédric Le Goater 
5052cf6cb50SCédric Le Goater     /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
5061373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
507044475f3SPhilippe Mathieu-Daudé                      TYPE_TMP105, 0x4d);
5082cf6cb50SCédric Le Goater }
5092cf6cb50SCédric Le Goater 
510612b219aSPhilippe Mathieu-Daudé static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
511ccc2c418SCédric Le Goater {
51252bcd997SHoward Chiu     AspeedSoCState *soc = &bmc->soc;
51352bcd997SHoward Chiu     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
51452bcd997SHoward Chiu 
51552bcd997SHoward Chiu     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50,
51652bcd997SHoward Chiu                           eeprom_buf);
51752bcd997SHoward Chiu 
51852bcd997SHoward Chiu     /* LM75 is compatible with TMP105 driver */
51952bcd997SHoward Chiu     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
52052bcd997SHoward Chiu                      TYPE_TMP105, 0x4d);
521ccc2c418SCédric Le Goater }
522ccc2c418SCédric Le Goater 
523612b219aSPhilippe Mathieu-Daudé static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
5246c4567c7SCédric Le Goater {
5256c4567c7SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
5266c4567c7SCédric Le Goater 
5276c4567c7SCédric Le Goater     /* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
5286c4567c7SCédric Le Goater      * good enough */
5291373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
5306c4567c7SCédric Le Goater }
5316c4567c7SCédric Le Goater 
532f4aec252SCédric Le Goater static void create_pca9552(AspeedSoCState *soc, int bus_id, int addr)
533f4aec252SCédric Le Goater {
534f4aec252SCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, bus_id),
535f4aec252SCédric Le Goater                             TYPE_PCA9552, addr);
536f4aec252SCédric Le Goater }
537f4aec252SCédric Le Goater 
538612b219aSPhilippe Mathieu-Daudé static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc)
539143b040fSPatrick Williams {
540143b040fSPatrick Williams     AspeedSoCState *soc = &bmc->soc;
541143b040fSPatrick Williams 
542143b040fSPatrick Williams     /* bus 2 : */
5431373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48);
5441373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49);
545143b040fSPatrick Williams     /* bus 2 : pca9546 @ 0x73 */
546143b040fSPatrick Williams 
547143b040fSPatrick Williams     /* bus 3 : pca9548 @ 0x70 */
548143b040fSPatrick Williams 
549143b040fSPatrick Williams     /* bus 4 : */
550143b040fSPatrick Williams     uint8_t *eeprom4_54 = g_malloc0(8 * 1024);
5517a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54,
552143b040fSPatrick Williams                           eeprom4_54);
553143b040fSPatrick Williams     /* PCA9539 @ 0x76, but PCA9552 is compatible */
554f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x76);
555143b040fSPatrick Williams     /* PCA9539 @ 0x77, but PCA9552 is compatible */
556f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x77);
557143b040fSPatrick Williams 
558143b040fSPatrick Williams     /* bus 6 : */
5591373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48);
5601373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49);
561143b040fSPatrick Williams     /* bus 6 : pca9546 @ 0x73 */
562143b040fSPatrick Williams 
563143b040fSPatrick Williams     /* bus 8 : */
564143b040fSPatrick Williams     uint8_t *eeprom8_56 = g_malloc0(8 * 1024);
5657a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56,
566143b040fSPatrick Williams                           eeprom8_56);
567f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x60);
568f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x61);
569143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1d */
570143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1f */
571143b040fSPatrick Williams 
572143b040fSPatrick Williams     /*
573143b040fSPatrick Williams      * bus 13 : pca9548 @ 0x71
574143b040fSPatrick Williams      *      - channel 3:
575143b040fSPatrick Williams      *          - tmm421 @ 0x4c
576143b040fSPatrick Williams      *          - tmp421 @ 0x4e
577143b040fSPatrick Williams      *          - tmp421 @ 0x4f
578143b040fSPatrick Williams      */
579143b040fSPatrick Williams 
580143b040fSPatrick Williams }
581143b040fSPatrick Williams 
582612b219aSPhilippe Mathieu-Daudé static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
58362c2c2ebSCédric Le Goater {
5847cfbde5eSPhilippe Mathieu-Daudé     static const struct {
5857cfbde5eSPhilippe Mathieu-Daudé         unsigned gpio_id;
5867cfbde5eSPhilippe Mathieu-Daudé         LEDColor color;
5877cfbde5eSPhilippe Mathieu-Daudé         const char *description;
5887cfbde5eSPhilippe Mathieu-Daudé         bool gpio_polarity;
5897cfbde5eSPhilippe Mathieu-Daudé     } pca1_leds[] = {
5907cfbde5eSPhilippe Mathieu-Daudé         {13, LED_COLOR_GREEN, "front-fault-4",  GPIO_POLARITY_ACTIVE_LOW},
5917cfbde5eSPhilippe Mathieu-Daudé         {14, LED_COLOR_GREEN, "front-power-3",  GPIO_POLARITY_ACTIVE_LOW},
5927cfbde5eSPhilippe Mathieu-Daudé         {15, LED_COLOR_GREEN, "front-id-5",     GPIO_POLARITY_ACTIVE_LOW},
5937cfbde5eSPhilippe Mathieu-Daudé     };
59462c2c2ebSCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
5953d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
59615ce12cfSPhilippe Mathieu-Daudé     DeviceState *dev;
5977cfbde5eSPhilippe Mathieu-Daudé     LEDState *led;
59862c2c2ebSCédric Le Goater 
59963ceb818SCédric Le Goater     /* Bus 3: TODO bmp280@77 */
600db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
60115ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca1");
6022616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
6032616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 3),
60415ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
6058c9a61d7SCédric Le Goater 
6067cfbde5eSPhilippe Mathieu-Daudé     for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) {
6077cfbde5eSPhilippe Mathieu-Daudé         led = led_create_simple(OBJECT(bmc),
6087cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].gpio_polarity,
6097cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].color,
6107cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].description);
6117cfbde5eSPhilippe Mathieu-Daudé         qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id,
6127cfbde5eSPhilippe Mathieu-Daudé                               qdev_get_gpio_in(DEVICE(led), 0));
6137cfbde5eSPhilippe Mathieu-Daudé     }
614b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76);
6152a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "max31785", 0x52);
6161373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c);
6171373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c);
61862c2c2ebSCédric Le Goater 
61962c2c2ebSCédric Le Goater     /* The Witherspoon expects a TMP275 but a TMP105 is compatible */
6201373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105,
621044475f3SPhilippe Mathieu-Daudé                      0x4a);
6226c4567c7SCédric Le Goater 
6236c4567c7SCédric Le Goater     /* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
6246c4567c7SCédric Le Goater      * good enough */
6251373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
6263d165f12SCédric Le Goater 
6277a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51,
6283d165f12SCédric Le Goater                           eeprom_buf);
629db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
63015ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca0");
6312616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
6322616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 11),
63315ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
63463ceb818SCédric Le Goater     /* Bus 11: TODO ucd90160@64 */
63562c2c2ebSCédric Le Goater }
63662c2c2ebSCédric Le Goater 
63795f068c8SJohn Wang static void g220a_bmc_i2c_init(AspeedMachineState *bmc)
63895f068c8SJohn Wang {
63995f068c8SJohn Wang     AspeedSoCState *soc = &bmc->soc;
64095f068c8SJohn Wang     DeviceState *dev;
64195f068c8SJohn Wang 
64295f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3),
64395f068c8SJohn Wang                                          "emc1413", 0x4c));
64495f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
64595f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
64695f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
64795f068c8SJohn Wang 
64895f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12),
64995f068c8SJohn Wang                                          "emc1413", 0x4c));
65095f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
65195f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
65295f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
65395f068c8SJohn Wang 
65495f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13),
65595f068c8SJohn Wang                                          "emc1413", 0x4c));
65695f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
65795f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
65895f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
6596f5f6507SJohn Wang 
6606f5f6507SJohn Wang     static uint8_t eeprom_buf[2 * 1024] = {
6616f5f6507SJohn Wang             0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe,
6626f5f6507SJohn Wang             0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65,
6636f5f6507SJohn Wang             0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32,
6646f5f6507SJohn Wang             0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42,
6656f5f6507SJohn Wang             0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45,
6666f5f6507SJohn Wang             0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1,
6676f5f6507SJohn Wang             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7,
6686f5f6507SJohn Wang     };
6696f5f6507SJohn Wang     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57,
6706f5f6507SJohn Wang                           eeprom_buf);
67195f068c8SJohn Wang }
67295f068c8SJohn Wang 
67382b6a3f6SJohn Wang static void fp5280g2_bmc_i2c_init(AspeedMachineState *bmc)
67482b6a3f6SJohn Wang {
67582b6a3f6SJohn Wang     AspeedSoCState *soc = &bmc->soc;
67682b6a3f6SJohn Wang     I2CSlave *i2c_mux;
67782b6a3f6SJohn Wang 
67882b6a3f6SJohn Wang     /* The at24c256 */
67982b6a3f6SJohn Wang     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 1), 0x50, 32768);
68082b6a3f6SJohn Wang 
68182b6a3f6SJohn Wang     /* The fp5280g2 expects a TMP112 but a TMP105 is compatible */
68282b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
68382b6a3f6SJohn Wang                      0x48);
68482b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
68582b6a3f6SJohn Wang                      0x49);
68682b6a3f6SJohn Wang 
68782b6a3f6SJohn Wang     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
68882b6a3f6SJohn Wang                      "pca9546", 0x70);
68982b6a3f6SJohn Wang     /* It expects a TMP112 but a TMP105 is compatible */
69082b6a3f6SJohn Wang     i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0), TYPE_TMP105,
69182b6a3f6SJohn Wang                      0x4a);
69282b6a3f6SJohn Wang 
69382b6a3f6SJohn Wang     /* It expects a ds3232 but a ds1338 is good enough */
69482b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "ds1338", 0x68);
69582b6a3f6SJohn Wang 
69682b6a3f6SJohn Wang     /* It expects a pca9555 but a pca9552 is compatible */
697f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x30);
69882b6a3f6SJohn Wang }
69982b6a3f6SJohn Wang 
70058e52bdbSCédric Le Goater static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
70158e52bdbSCédric Le Goater {
70258e52bdbSCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
703fa6d98c0SJoel Stanley     I2CSlave *i2c_mux;
704fa6d98c0SJoel Stanley 
705*9077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB);
70658e52bdbSCédric Le Goater 
707f4aec252SCédric Le Goater     create_pca9552(soc, 3, 0x61);
708bcb122f8SJoel Stanley 
70958e52bdbSCédric Le Goater     /* The rainier expects a TMP275 but a TMP105 is compatible */
71058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
71158e52bdbSCédric Le Goater                      0x48);
71258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
71358e52bdbSCédric Le Goater                      0x49);
71458e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
71558e52bdbSCédric Le Goater                      0x4a);
716fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4),
717fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
718*9077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
719*9077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
720*9077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB);
721f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x60);
72258e52bdbSCédric Le Goater 
72358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
72458e52bdbSCédric Le Goater                      0x48);
72558e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
72658e52bdbSCédric Le Goater                      0x49);
727f4aec252SCédric Le Goater     create_pca9552(soc, 5, 0x60);
728f4aec252SCédric Le Goater     create_pca9552(soc, 5, 0x61);
729fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5),
730fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
731*9077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
732*9077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
73358e52bdbSCédric Le Goater 
73458e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
73558e52bdbSCédric Le Goater                      0x48);
73658e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
73758e52bdbSCédric Le Goater                      0x4a);
73858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
73958e52bdbSCédric Le Goater                      0x4b);
740fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6),
741fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
742*9077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
743*9077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
744*9077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB);
745*9077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB);
74658e52bdbSCédric Le Goater 
747f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x30);
748f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x31);
749f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x32);
750f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x33);
751f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x60);
752f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x61);
753b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76);
75458e52bdbSCédric Le Goater     /* Bus 7: TODO si7021-a20@20 */
75558e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105,
75658e52bdbSCédric Le Goater                      0x48);
7572a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "max31785", 0x52);
758*9077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB);
759*9077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB);
76058e52bdbSCédric Le Goater 
76158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
76258e52bdbSCédric Le Goater                      0x48);
76358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
76458e52bdbSCédric Le Goater                      0x4a);
765*9077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50, 64 * KiB);
766*9077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 64 * KiB);
767f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x60);
768f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x61);
76958e52bdbSCédric Le Goater     /* Bus 8: ucd90320@11 */
77058e52bdbSCédric Le Goater     /* Bus 8: ucd90320@b */
77158e52bdbSCédric Le Goater     /* Bus 8: ucd90320@c */
77258e52bdbSCédric Le Goater 
77358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c);
77458e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d);
775*9077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB);
77658e52bdbSCédric Le Goater 
77758e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c);
77858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d);
779*9077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB);
78058e52bdbSCédric Le Goater 
78158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
78258e52bdbSCédric Le Goater                      0x48);
78358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
78458e52bdbSCédric Le Goater                      0x49);
785fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11),
786fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
787*9077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
788*9077e09aSPeter Delevoryas     at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
789f4aec252SCédric Le Goater     create_pca9552(soc, 11, 0x60);
790fa6d98c0SJoel Stanley 
791fa6d98c0SJoel Stanley 
792*9077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB);
793f4aec252SCédric Le Goater     create_pca9552(soc, 13, 0x60);
794fa6d98c0SJoel Stanley 
795*9077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB);
796f4aec252SCédric Le Goater     create_pca9552(soc, 14, 0x60);
797fa6d98c0SJoel Stanley 
798*9077e09aSPeter Delevoryas     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB);
799f4aec252SCédric Le Goater     create_pca9552(soc, 15, 0x60);
80058e52bdbSCédric Le Goater }
80158e52bdbSCédric Le Goater 
802febbe308SPeter Delevoryas static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr,
803febbe308SPeter Delevoryas                                  I2CBus **channels)
804febbe308SPeter Delevoryas {
805febbe308SPeter Delevoryas     I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr);
806febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
807febbe308SPeter Delevoryas         channels[i] = pca954x_i2c_get_bus(mux, i);
808febbe308SPeter Delevoryas     }
809febbe308SPeter Delevoryas }
810febbe308SPeter Delevoryas 
811febbe308SPeter Delevoryas #define TYPE_LM75 TYPE_TMP105
812febbe308SPeter Delevoryas #define TYPE_TMP75 TYPE_TMP105
813febbe308SPeter Delevoryas #define TYPE_TMP422 "tmp422"
814febbe308SPeter Delevoryas 
815febbe308SPeter Delevoryas static void fuji_bmc_i2c_init(AspeedMachineState *bmc)
816febbe308SPeter Delevoryas {
817febbe308SPeter Delevoryas     AspeedSoCState *soc = &bmc->soc;
818febbe308SPeter Delevoryas     I2CBus *i2c[144] = {};
819febbe308SPeter Delevoryas 
820febbe308SPeter Delevoryas     for (int i = 0; i < 16; i++) {
821febbe308SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
822febbe308SPeter Delevoryas     }
823febbe308SPeter Delevoryas     I2CBus *i2c180 = i2c[2];
824febbe308SPeter Delevoryas     I2CBus *i2c480 = i2c[8];
825febbe308SPeter Delevoryas     I2CBus *i2c600 = i2c[11];
826febbe308SPeter Delevoryas 
827febbe308SPeter Delevoryas     get_pca9548_channels(i2c180, 0x70, &i2c[16]);
828febbe308SPeter Delevoryas     get_pca9548_channels(i2c480, 0x70, &i2c[24]);
829febbe308SPeter Delevoryas     /* NOTE: The device tree skips [32, 40) in the alias numbering */
830febbe308SPeter Delevoryas     get_pca9548_channels(i2c600, 0x77, &i2c[40]);
831febbe308SPeter Delevoryas     get_pca9548_channels(i2c[24], 0x71, &i2c[48]);
832febbe308SPeter Delevoryas     get_pca9548_channels(i2c[25], 0x72, &i2c[56]);
833febbe308SPeter Delevoryas     get_pca9548_channels(i2c[26], 0x76, &i2c[64]);
834febbe308SPeter Delevoryas     get_pca9548_channels(i2c[27], 0x76, &i2c[72]);
835febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
836febbe308SPeter Delevoryas         get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]);
837febbe308SPeter Delevoryas     }
838febbe308SPeter Delevoryas 
839febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c);
840febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d);
841febbe308SPeter Delevoryas 
842*9077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[19], 0x52, 64 * KiB);
843*9077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[20], 0x50, 2 * KiB);
844*9077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[22], 0x52, 2 * KiB);
845febbe308SPeter Delevoryas 
846febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x48);
847febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x49);
848febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x4a);
849febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_TMP422, 0x4c);
850febbe308SPeter Delevoryas 
851*9077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[8], 0x51, 64 * KiB);
852febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a);
853febbe308SPeter Delevoryas 
854febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[50], TYPE_LM75, 0x4c);
855*9077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[50], 0x52, 64 * KiB);
856febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[51], TYPE_TMP75, 0x48);
857febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[52], TYPE_TMP75, 0x49);
858febbe308SPeter Delevoryas 
859febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[59], TYPE_TMP75, 0x48);
860febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[60], TYPE_TMP75, 0x49);
861febbe308SPeter Delevoryas 
862*9077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[65], 0x53, 64 * KiB);
863febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x49);
864febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x48);
865*9077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[68], 0x52, 64 * KiB);
866*9077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[69], 0x52, 64 * KiB);
867*9077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[70], 0x52, 64 * KiB);
868*9077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[71], 0x52, 64 * KiB);
869febbe308SPeter Delevoryas 
870*9077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[73], 0x53, 64 * KiB);
871febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x49);
872febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x48);
873*9077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[76], 0x52, 64 * KiB);
874*9077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[77], 0x52, 64 * KiB);
875*9077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[78], 0x52, 64 * KiB);
876*9077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[79], 0x52, 64 * KiB);
877*9077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[28], 0x50, 2 * KiB);
878febbe308SPeter Delevoryas 
879febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
880*9077e09aSPeter Delevoryas         at24c_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB);
881febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[82 + i * 8], TYPE_TMP75, 0x48);
882febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[83 + i * 8], TYPE_TMP75, 0x4b);
883febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[84 + i * 8], TYPE_TMP75, 0x4a);
884febbe308SPeter Delevoryas     }
885febbe308SPeter Delevoryas }
886febbe308SPeter Delevoryas 
887a20c54b1SPatrick Williams #define TYPE_TMP421 "tmp421"
888a20c54b1SPatrick Williams 
889a20c54b1SPatrick Williams static void bletchley_bmc_i2c_init(AspeedMachineState *bmc)
890a20c54b1SPatrick Williams {
891a20c54b1SPatrick Williams     AspeedSoCState *soc = &bmc->soc;
892a20c54b1SPatrick Williams     I2CBus *i2c[13] = {};
893a20c54b1SPatrick Williams     for (int i = 0; i < 13; i++) {
894a20c54b1SPatrick Williams         if ((i == 8) || (i == 11)) {
895a20c54b1SPatrick Williams             continue;
896a20c54b1SPatrick Williams         }
897a20c54b1SPatrick Williams         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
898a20c54b1SPatrick Williams     }
899a20c54b1SPatrick Williams 
900a20c54b1SPatrick Williams     /* Bus 0 - 5 all have the same config. */
901a20c54b1SPatrick Williams     for (int i = 0; i < 6; i++) {
902a20c54b1SPatrick Williams         /* Missing model: ti,ina230 @ 0x45 */
903a20c54b1SPatrick Williams         /* Missing model: mps,mp5023 @ 0x40 */
904a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_TMP421, 0x4f);
905a20c54b1SPatrick Williams         /* Missing model: nxp,pca9539 @ 0x76, but PCA9552 works enough */
906a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x76);
907a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x67);
908a20c54b1SPatrick Williams         /* Missing model: fsc,fusb302 @ 0x22 */
909a20c54b1SPatrick Williams     }
910a20c54b1SPatrick Williams 
911a20c54b1SPatrick Williams     /* Bus 6 */
912a20c54b1SPatrick Williams     at24c_eeprom_init(i2c[6], 0x56, 65536);
913a20c54b1SPatrick Williams     /* Missing model: nxp,pcf85263 @ 0x51 , but ds1338 works enough */
914a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[6], "ds1338", 0x51);
915a20c54b1SPatrick Williams 
916a20c54b1SPatrick Williams 
917a20c54b1SPatrick Williams     /* Bus 7 */
918a20c54b1SPatrick Williams     at24c_eeprom_init(i2c[7], 0x54, 65536);
919a20c54b1SPatrick Williams 
920a20c54b1SPatrick Williams     /* Bus 9 */
921a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[9], TYPE_TMP421, 0x4f);
922a20c54b1SPatrick Williams 
923a20c54b1SPatrick Williams     /* Bus 10 */
924a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[10], TYPE_TMP421, 0x4f);
925a20c54b1SPatrick Williams     /* Missing model: ti,hdc1080 @ 0x40 */
926a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[10], TYPE_PCA9552, 0x67);
927a20c54b1SPatrick Williams 
928a20c54b1SPatrick Williams     /* Bus 12 */
929a20c54b1SPatrick Williams     /* Missing model: adi,adm1278 @ 0x11 */
930a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4c);
931a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4d);
932a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_PCA9552, 0x67);
933a20c54b1SPatrick Williams }
934a20c54b1SPatrick Williams 
935fa699e80SPeter Delevoryas static void fby35_i2c_init(AspeedMachineState *bmc)
936fa699e80SPeter Delevoryas {
937fa699e80SPeter Delevoryas     AspeedSoCState *soc = &bmc->soc;
938fa699e80SPeter Delevoryas     I2CBus *i2c[16];
939fa699e80SPeter Delevoryas 
940fa699e80SPeter Delevoryas     for (int i = 0; i < 16; i++) {
941fa699e80SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
942fa699e80SPeter Delevoryas     }
943fa699e80SPeter Delevoryas 
944fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[2], TYPE_LM75, 0x4f);
945fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_TMP421, 0x1f);
946fa699e80SPeter Delevoryas     /* Hotswap controller is actually supposed to be mp5920 or ltc4282. */
947fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[11], "adm1272", 0x44);
948fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4e);
949fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4f);
950fa699e80SPeter Delevoryas 
951*9077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[4], 0x51, 128 * KiB);
952*9077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[6], 0x51, 128 * KiB);
953*9077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[8], 0x50, 32 * KiB);
954*9077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[11], 0x51, 128 * KiB);
955*9077e09aSPeter Delevoryas     at24c_eeprom_init(i2c[11], 0x54, 128 * KiB);
956fa699e80SPeter Delevoryas 
957fa699e80SPeter Delevoryas     /*
958fa699e80SPeter Delevoryas      * TODO: There is a multi-master i2c connection to an AST1030 MiniBMC on
959fa699e80SPeter Delevoryas      * buses 0, 1, 2, 3, and 9. Source address 0x10, target address 0x20 on
960fa699e80SPeter Delevoryas      * each.
961fa699e80SPeter Delevoryas      */
962fa699e80SPeter Delevoryas }
963fa699e80SPeter Delevoryas 
964fb6b3c8dSJae Hyun Yoo static void qcom_dc_scm_bmc_i2c_init(AspeedMachineState *bmc)
965fb6b3c8dSJae Hyun Yoo {
966fb6b3c8dSJae Hyun Yoo     AspeedSoCState *soc = &bmc->soc;
967fb6b3c8dSJae Hyun Yoo 
968fb6b3c8dSJae Hyun Yoo     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 15), "tmp105", 0x4d);
969fb6b3c8dSJae Hyun Yoo }
970fb6b3c8dSJae Hyun Yoo 
971ece4cccdSGraeme Gregory static void qcom_dc_scm_firework_i2c_init(AspeedMachineState *bmc)
972ece4cccdSGraeme Gregory {
973ece4cccdSGraeme Gregory     AspeedSoCState *soc = &bmc->soc;
9742a7a5d5cSJae Hyun Yoo     I2CSlave *therm_mux, *cpuvr_mux;
975ece4cccdSGraeme Gregory 
976ece4cccdSGraeme Gregory     /* Create the generic DC-SCM hardware */
977ece4cccdSGraeme Gregory     qcom_dc_scm_bmc_i2c_init(bmc);
978ece4cccdSGraeme Gregory 
979ece4cccdSGraeme Gregory     /* Now create the Firework specific hardware */
9802a75e8c3SMaheswara Kurapati 
9812a7a5d5cSJae Hyun Yoo     /* I2C7 CPUVR MUX */
9822a7a5d5cSJae Hyun Yoo     cpuvr_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
9832a7a5d5cSJae Hyun Yoo                                         "pca9546", 0x70);
9842a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 0), "pca9548", 0x72);
9852a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 1), "pca9548", 0x72);
9862a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 2), "pca9548", 0x72);
9872a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 3), "pca9548", 0x72);
9882a7a5d5cSJae Hyun Yoo 
989cfc68f16SMaheswara Kurapati     /* I2C8 Thermal Diodes*/
990cfc68f16SMaheswara Kurapati     therm_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
991cfc68f16SMaheswara Kurapati                                         "pca9548", 0x70);
992cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 0), TYPE_LM75, 0x4C);
993cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 1), TYPE_LM75, 0x4C);
994cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 2), TYPE_LM75, 0x48);
995cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 3), TYPE_LM75, 0x48);
996cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 4), TYPE_LM75, 0x48);
997cfc68f16SMaheswara Kurapati 
9982a75e8c3SMaheswara Kurapati     /* I2C9 Fan Controller (MAX31785) */
9992a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x52);
10002a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x54);
1001ece4cccdSGraeme Gregory }
1002ece4cccdSGraeme Gregory 
10031a15311aSCédric Le Goater static bool aspeed_get_mmio_exec(Object *obj, Error **errp)
10041a15311aSCédric Le Goater {
10051a15311aSCédric Le Goater     return ASPEED_MACHINE(obj)->mmio_exec;
10061a15311aSCédric Le Goater }
10071a15311aSCédric Le Goater 
10081a15311aSCédric Le Goater static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp)
10091a15311aSCédric Le Goater {
10101a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = value;
10111a15311aSCédric Le Goater }
10121a15311aSCédric Le Goater 
10131a15311aSCédric Le Goater static void aspeed_machine_instance_init(Object *obj)
10141a15311aSCédric Le Goater {
10151a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = false;
10161a15311aSCédric Le Goater }
10171a15311aSCédric Le Goater 
10189820e52fSCédric Le Goater static char *aspeed_get_fmc_model(Object *obj, Error **errp)
10199820e52fSCédric Le Goater {
10209820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10219820e52fSCédric Le Goater     return g_strdup(bmc->fmc_model);
10229820e52fSCédric Le Goater }
10239820e52fSCédric Le Goater 
10249820e52fSCédric Le Goater static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp)
10259820e52fSCédric Le Goater {
10269820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10279820e52fSCédric Le Goater 
10289820e52fSCédric Le Goater     g_free(bmc->fmc_model);
10299820e52fSCédric Le Goater     bmc->fmc_model = g_strdup(value);
10309820e52fSCédric Le Goater }
10319820e52fSCédric Le Goater 
10329820e52fSCédric Le Goater static char *aspeed_get_spi_model(Object *obj, Error **errp)
10339820e52fSCédric Le Goater {
10349820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10359820e52fSCédric Le Goater     return g_strdup(bmc->spi_model);
10369820e52fSCédric Le Goater }
10379820e52fSCédric Le Goater 
10389820e52fSCédric Le Goater static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp)
10399820e52fSCédric Le Goater {
10409820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10419820e52fSCédric Le Goater 
10429820e52fSCédric Le Goater     g_free(bmc->spi_model);
10439820e52fSCédric Le Goater     bmc->spi_model = g_strdup(value);
10449820e52fSCédric Le Goater }
10459820e52fSCédric Le Goater 
10461a15311aSCédric Le Goater static void aspeed_machine_class_props_init(ObjectClass *oc)
10471a15311aSCédric Le Goater {
10481a15311aSCédric Le Goater     object_class_property_add_bool(oc, "execute-in-place",
10491a15311aSCédric Le Goater                                    aspeed_get_mmio_exec,
1050d2623129SMarkus Armbruster                                    aspeed_set_mmio_exec);
10511a15311aSCédric Le Goater     object_class_property_set_description(oc, "execute-in-place",
10527eecec7dSMarkus Armbruster                            "boot directly from CE0 flash device");
10539820e52fSCédric Le Goater 
10549820e52fSCédric Le Goater     object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model,
10559820e52fSCédric Le Goater                                    aspeed_set_fmc_model);
10569820e52fSCédric Le Goater     object_class_property_set_description(oc, "fmc-model",
10579820e52fSCédric Le Goater                                           "Change the FMC Flash model");
10589820e52fSCédric Le Goater     object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model,
10599820e52fSCédric Le Goater                                    aspeed_set_spi_model);
10609820e52fSCédric Le Goater     object_class_property_set_description(oc, "spi-model",
10619820e52fSCédric Le Goater                                           "Change the SPI Flash model");
10621a15311aSCédric Le Goater }
10631a15311aSCédric Le Goater 
1064b7f1a0cbSCédric Le Goater static int aspeed_soc_num_cpus(const char *soc_name)
1065b7f1a0cbSCédric Le Goater {
1066b7f1a0cbSCédric Le Goater    AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(soc_name));
1067b7f1a0cbSCédric Le Goater    return sc->num_cpus;
1068b7f1a0cbSCédric Le Goater }
1069b7f1a0cbSCédric Le Goater 
1070fca9ca1bSCédric Le Goater static void aspeed_machine_class_init(ObjectClass *oc, void *data)
107162c2c2ebSCédric Le Goater {
107262c2c2ebSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1073d3bad7e7SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
107462c2c2ebSCédric Le Goater 
1075fca9ca1bSCédric Le Goater     mc->init = aspeed_machine_init;
107662c2c2ebSCédric Le Goater     mc->no_floppy = 1;
107762c2c2ebSCédric Le Goater     mc->no_cdrom = 1;
107862c2c2ebSCédric Le Goater     mc->no_parallel = 1;
1079afcbaed6SIgor Mammedov     mc->default_ram_id = "ram";
1080d3bad7e7SCédric Le Goater     amc->macs_mask = ASPEED_MAC0_ON;
10815d63d0c7SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART5;
10821a15311aSCédric Le Goater 
10831a15311aSCédric Le Goater     aspeed_machine_class_props_init(oc);
108462c2c2ebSCédric Le Goater }
108562c2c2ebSCédric Le Goater 
1086baa4732bSCédric Le Goater static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
1087baa4732bSCédric Le Goater {
1088baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1089baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1090baa4732bSCédric Le Goater 
1091baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Palmetto BMC (ARM926EJ-S)";
1092baa4732bSCédric Le Goater     amc->soc_name  = "ast2400-a1";
1093baa4732bSCédric Le Goater     amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1;
1094baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
109570322913SCédric Le Goater     amc->spi_model = "mx25l25635f";
1096baa4732bSCédric Le Goater     amc->num_cs    = 1;
1097baa4732bSCédric Le Goater     amc->i2c_init  = palmetto_bmc_i2c_init;
1098baa4732bSCédric Le Goater     mc->default_ram_size       = 256 * MiB;
1099b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1100b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1101baa4732bSCédric Le Goater };
1102baa4732bSCédric Le Goater 
11039cccb912SPatrick Venture static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data)
11049cccb912SPatrick Venture {
11059cccb912SPatrick Venture     MachineClass *mc = MACHINE_CLASS(oc);
11069cccb912SPatrick Venture     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
11079cccb912SPatrick Venture 
11089cccb912SPatrick Venture     mc->desc       = "Quanta-Q71l BMC (ARM926EJ-S)";
11099cccb912SPatrick Venture     amc->soc_name  = "ast2400-a1";
11109cccb912SPatrick Venture     amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1;
11119cccb912SPatrick Venture     amc->fmc_model = "n25q256a";
11129cccb912SPatrick Venture     amc->spi_model = "mx25l25635e";
11139cccb912SPatrick Venture     amc->num_cs    = 1;
11149cccb912SPatrick Venture     amc->i2c_init  = quanta_q71l_bmc_i2c_init;
11159cccb912SPatrick Venture     mc->default_ram_size       = 128 * MiB;
11169cccb912SPatrick Venture     mc->default_cpus = mc->min_cpus = mc->max_cpus =
11179cccb912SPatrick Venture         aspeed_soc_num_cpus(amc->soc_name);
11189cccb912SPatrick Venture }
11199cccb912SPatrick Venture 
112040a38df5SErik Smit static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc,
112140a38df5SErik Smit                                                         void *data)
112240a38df5SErik Smit {
112340a38df5SErik Smit     MachineClass *mc = MACHINE_CLASS(oc);
112440a38df5SErik Smit     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
112540a38df5SErik Smit 
112640a38df5SErik Smit     mc->desc       = "Supermicro X11 BMC (ARM926EJ-S)";
112740a38df5SErik Smit     amc->soc_name  = "ast2400-a1";
112840a38df5SErik Smit     amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1;
112940a38df5SErik Smit     amc->fmc_model = "mx25l25635e";
113040a38df5SErik Smit     amc->spi_model = "mx25l25635e";
113140a38df5SErik Smit     amc->num_cs    = 1;
113240a38df5SErik Smit     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
113340a38df5SErik Smit     amc->i2c_init  = palmetto_bmc_i2c_init;
113440a38df5SErik Smit     mc->default_ram_size = 256 * MiB;
113540a38df5SErik Smit }
113640a38df5SErik Smit 
113747936597SGuenter Roeck static void aspeed_machine_supermicro_x11spi_bmc_class_init(ObjectClass *oc,
113847936597SGuenter Roeck                                                             void *data)
113947936597SGuenter Roeck {
114047936597SGuenter Roeck     MachineClass *mc = MACHINE_CLASS(oc);
114147936597SGuenter Roeck     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
114247936597SGuenter Roeck 
114347936597SGuenter Roeck     mc->desc       = "Supermicro X11 SPI BMC (ARM1176)";
114447936597SGuenter Roeck     amc->soc_name  = "ast2500-a1";
114547936597SGuenter Roeck     amc->hw_strap1 = SUPERMICRO_X11SPI_BMC_HW_STRAP1;
114647936597SGuenter Roeck     amc->fmc_model = "mx25l25635e";
114747936597SGuenter Roeck     amc->spi_model = "mx25l25635e";
114847936597SGuenter Roeck     amc->num_cs    = 1;
114947936597SGuenter Roeck     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
115047936597SGuenter Roeck     amc->i2c_init  = palmetto_bmc_i2c_init;
115147936597SGuenter Roeck     mc->default_ram_size = 512 * MiB;
115247936597SGuenter Roeck     mc->default_cpus = mc->min_cpus = mc->max_cpus =
115347936597SGuenter Roeck         aspeed_soc_num_cpus(amc->soc_name);
115447936597SGuenter Roeck }
115547936597SGuenter Roeck 
1156baa4732bSCédric Le Goater static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data)
1157baa4732bSCédric Le Goater {
1158baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1159baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1160baa4732bSCédric Le Goater 
1161baa4732bSCédric Le Goater     mc->desc       = "Aspeed AST2500 EVB (ARM1176)";
1162baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1163baa4732bSCédric Le Goater     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
1164753abfc4SJae Hyun Yoo     amc->fmc_model = "mx25l25635e";
116570322913SCédric Le Goater     amc->spi_model = "mx25l25635f";
1166baa4732bSCédric Le Goater     amc->num_cs    = 1;
1167baa4732bSCédric Le Goater     amc->i2c_init  = ast2500_evb_i2c_init;
1168baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
1169b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1170b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1171baa4732bSCédric Le Goater };
1172baa4732bSCédric Le Goater 
1173baa4732bSCédric Le Goater static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data)
1174baa4732bSCédric Le Goater {
1175baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1176baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1177baa4732bSCédric Le Goater 
1178baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Romulus BMC (ARM1176)";
1179baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1180baa4732bSCédric Le Goater     amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1;
1181baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
1182baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1183baa4732bSCédric Le Goater     amc->num_cs    = 2;
1184baa4732bSCédric Le Goater     amc->i2c_init  = romulus_bmc_i2c_init;
1185baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
1186b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1187b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1188baa4732bSCédric Le Goater };
1189baa4732bSCédric Le Goater 
1190143b040fSPatrick Williams static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data)
1191143b040fSPatrick Williams {
1192143b040fSPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1193143b040fSPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1194143b040fSPatrick Williams 
1195143b040fSPatrick Williams     mc->desc       = "OCP SonoraPass BMC (ARM1176)";
1196143b040fSPatrick Williams     amc->soc_name  = "ast2500-a1";
1197143b040fSPatrick Williams     amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1;
1198143b040fSPatrick Williams     amc->fmc_model = "mx66l1g45g";
1199143b040fSPatrick Williams     amc->spi_model = "mx66l1g45g";
1200143b040fSPatrick Williams     amc->num_cs    = 2;
1201143b040fSPatrick Williams     amc->i2c_init  = sonorapass_bmc_i2c_init;
1202143b040fSPatrick Williams     mc->default_ram_size       = 512 * MiB;
1203b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1204b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1205143b040fSPatrick Williams };
1206143b040fSPatrick Williams 
1207baa4732bSCédric Le Goater static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data)
1208baa4732bSCédric Le Goater {
1209baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1210baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1211baa4732bSCédric Le Goater 
1212baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Witherspoon BMC (ARM1176)";
1213baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1214baa4732bSCédric Le Goater     amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1;
121570322913SCédric Le Goater     amc->fmc_model = "mx25l25635f";
1216baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1217baa4732bSCédric Le Goater     amc->num_cs    = 2;
1218baa4732bSCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init;
1219baa4732bSCédric Le Goater     mc->default_ram_size = 512 * MiB;
1220b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1221b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1222baa4732bSCédric Le Goater };
1223baa4732bSCédric Le Goater 
1224baa4732bSCédric Le Goater static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
1225baa4732bSCédric Le Goater {
1226baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1227baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1228baa4732bSCédric Le Goater 
1229f548f201SPeter Maydell     mc->desc       = "Aspeed AST2600 EVB (Cortex-A7)";
1230c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
1231baa4732bSCédric Le Goater     amc->hw_strap1 = AST2600_EVB_HW_STRAP1;
1232baa4732bSCédric Le Goater     amc->hw_strap2 = AST2600_EVB_HW_STRAP2;
1233753abfc4SJae Hyun Yoo     amc->fmc_model = "mx66u51235f";
1234baa4732bSCédric Le Goater     amc->spi_model = "mx66u51235f";
1235baa4732bSCédric Le Goater     amc->num_cs    = 1;
123629193286SGuenter Roeck     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON |
123729193286SGuenter Roeck                      ASPEED_MAC3_ON;
1238baa4732bSCédric Le Goater     amc->i2c_init  = ast2600_evb_i2c_init;
1239baa4732bSCédric Le Goater     mc->default_ram_size = 1 * GiB;
1240b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1241b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1242baa4732bSCédric Le Goater };
1243baa4732bSCédric Le Goater 
124463ceb818SCédric Le Goater static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data)
124563ceb818SCédric Le Goater {
124663ceb818SCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
124763ceb818SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
124863ceb818SCédric Le Goater 
1249f548f201SPeter Maydell     mc->desc       = "OpenPOWER Tacoma BMC (Cortex-A7)";
1250c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
125163ceb818SCédric Le Goater     amc->hw_strap1 = TACOMA_BMC_HW_STRAP1;
125263ceb818SCédric Le Goater     amc->hw_strap2 = TACOMA_BMC_HW_STRAP2;
125363ceb818SCédric Le Goater     amc->fmc_model = "mx66l1g45g";
125463ceb818SCédric Le Goater     amc->spi_model = "mx66l1g45g";
125563ceb818SCédric Le Goater     amc->num_cs    = 2;
1256d3bad7e7SCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON;
125763ceb818SCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init; /* Same board layout */
125863ceb818SCédric Le Goater     mc->default_ram_size = 1 * GiB;
1259b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1260b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
126163ceb818SCédric Le Goater };
126263ceb818SCédric Le Goater 
126395f068c8SJohn Wang static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data)
126495f068c8SJohn Wang {
126595f068c8SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
126695f068c8SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
126795f068c8SJohn Wang 
126895f068c8SJohn Wang     mc->desc       = "Bytedance G220A BMC (ARM1176)";
126995f068c8SJohn Wang     amc->soc_name  = "ast2500-a1";
127095f068c8SJohn Wang     amc->hw_strap1 = G220A_BMC_HW_STRAP1;
127195f068c8SJohn Wang     amc->fmc_model = "n25q512a";
127295f068c8SJohn Wang     amc->spi_model = "mx25l25635e";
127395f068c8SJohn Wang     amc->num_cs    = 2;
12745bb825c8SGuenter Roeck     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
127595f068c8SJohn Wang     amc->i2c_init  = g220a_bmc_i2c_init;
127695f068c8SJohn Wang     mc->default_ram_size = 1024 * MiB;
127795f068c8SJohn Wang     mc->default_cpus = mc->min_cpus = mc->max_cpus =
127895f068c8SJohn Wang         aspeed_soc_num_cpus(amc->soc_name);
127995f068c8SJohn Wang };
128095f068c8SJohn Wang 
128182b6a3f6SJohn Wang static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc, void *data)
128282b6a3f6SJohn Wang {
128382b6a3f6SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
128482b6a3f6SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
128582b6a3f6SJohn Wang 
128682b6a3f6SJohn Wang     mc->desc       = "Inspur FP5280G2 BMC (ARM1176)";
128782b6a3f6SJohn Wang     amc->soc_name  = "ast2500-a1";
128882b6a3f6SJohn Wang     amc->hw_strap1 = FP5280G2_BMC_HW_STRAP1;
128982b6a3f6SJohn Wang     amc->fmc_model = "n25q512a";
129082b6a3f6SJohn Wang     amc->spi_model = "mx25l25635e";
129182b6a3f6SJohn Wang     amc->num_cs    = 2;
129282b6a3f6SJohn Wang     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
129382b6a3f6SJohn Wang     amc->i2c_init  = fp5280g2_bmc_i2c_init;
129482b6a3f6SJohn Wang     mc->default_ram_size = 512 * MiB;
129582b6a3f6SJohn Wang     mc->default_cpus = mc->min_cpus = mc->max_cpus =
129682b6a3f6SJohn Wang         aspeed_soc_num_cpus(amc->soc_name);
129782b6a3f6SJohn Wang };
129882b6a3f6SJohn Wang 
129958e52bdbSCédric Le Goater static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data)
130058e52bdbSCédric Le Goater {
130158e52bdbSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
130258e52bdbSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
130358e52bdbSCédric Le Goater 
1304f548f201SPeter Maydell     mc->desc       = "IBM Rainier BMC (Cortex-A7)";
1305c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
130658e52bdbSCédric Le Goater     amc->hw_strap1 = RAINIER_BMC_HW_STRAP1;
130758e52bdbSCédric Le Goater     amc->hw_strap2 = RAINIER_BMC_HW_STRAP2;
130858e52bdbSCédric Le Goater     amc->fmc_model = "mx66l1g45g";
130958e52bdbSCédric Le Goater     amc->spi_model = "mx66l1g45g";
131058e52bdbSCédric Le Goater     amc->num_cs    = 2;
131158e52bdbSCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
131258e52bdbSCédric Le Goater     amc->i2c_init  = rainier_bmc_i2c_init;
131358e52bdbSCédric Le Goater     mc->default_ram_size = 1 * GiB;
131458e52bdbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
131558e52bdbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
131658e52bdbSCédric Le Goater };
131758e52bdbSCédric Le Goater 
1318febbe308SPeter Delevoryas /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */
1319febbe308SPeter Delevoryas #if HOST_LONG_BITS == 32
1320febbe308SPeter Delevoryas #define FUJI_BMC_RAM_SIZE (1 * GiB)
1321febbe308SPeter Delevoryas #else
1322febbe308SPeter Delevoryas #define FUJI_BMC_RAM_SIZE (2 * GiB)
1323febbe308SPeter Delevoryas #endif
1324febbe308SPeter Delevoryas 
1325febbe308SPeter Delevoryas static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data)
1326febbe308SPeter Delevoryas {
1327febbe308SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1328febbe308SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1329febbe308SPeter Delevoryas 
1330febbe308SPeter Delevoryas     mc->desc = "Facebook Fuji BMC (Cortex-A7)";
1331febbe308SPeter Delevoryas     amc->soc_name = "ast2600-a3";
1332febbe308SPeter Delevoryas     amc->hw_strap1 = FUJI_BMC_HW_STRAP1;
1333febbe308SPeter Delevoryas     amc->hw_strap2 = FUJI_BMC_HW_STRAP2;
1334febbe308SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1335febbe308SPeter Delevoryas     amc->spi_model = "mx66l1g45g";
1336febbe308SPeter Delevoryas     amc->num_cs = 2;
1337febbe308SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1338febbe308SPeter Delevoryas     amc->i2c_init = fuji_bmc_i2c_init;
1339febbe308SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART1;
1340febbe308SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
1341febbe308SPeter Delevoryas     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1342febbe308SPeter Delevoryas         aspeed_soc_num_cpus(amc->soc_name);
1343febbe308SPeter Delevoryas };
1344febbe308SPeter Delevoryas 
1345104bdaffSPatrick Williams /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */
1346104bdaffSPatrick Williams #if HOST_LONG_BITS == 32
1347104bdaffSPatrick Williams #define BLETCHLEY_BMC_RAM_SIZE (1 * GiB)
1348104bdaffSPatrick Williams #else
1349104bdaffSPatrick Williams #define BLETCHLEY_BMC_RAM_SIZE (2 * GiB)
1350104bdaffSPatrick Williams #endif
1351104bdaffSPatrick Williams 
1352a20c54b1SPatrick Williams static void aspeed_machine_bletchley_class_init(ObjectClass *oc, void *data)
1353a20c54b1SPatrick Williams {
1354a20c54b1SPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1355a20c54b1SPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1356a20c54b1SPatrick Williams 
1357a20c54b1SPatrick Williams     mc->desc       = "Facebook Bletchley BMC (Cortex-A7)";
1358a20c54b1SPatrick Williams     amc->soc_name  = "ast2600-a3";
1359a20c54b1SPatrick Williams     amc->hw_strap1 = BLETCHLEY_BMC_HW_STRAP1;
1360a20c54b1SPatrick Williams     amc->hw_strap2 = BLETCHLEY_BMC_HW_STRAP2;
1361a20c54b1SPatrick Williams     amc->fmc_model = "w25q01jvq";
1362a20c54b1SPatrick Williams     amc->spi_model = NULL;
1363a20c54b1SPatrick Williams     amc->num_cs    = 2;
1364a20c54b1SPatrick Williams     amc->macs_mask = ASPEED_MAC2_ON;
1365a20c54b1SPatrick Williams     amc->i2c_init  = bletchley_bmc_i2c_init;
1366104bdaffSPatrick Williams     mc->default_ram_size = BLETCHLEY_BMC_RAM_SIZE;
1367a20c54b1SPatrick Williams     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1368a20c54b1SPatrick Williams         aspeed_soc_num_cpus(amc->soc_name);
1369a20c54b1SPatrick Williams }
1370a20c54b1SPatrick Williams 
13717966d70fSJason A. Donenfeld static void fby35_reset(MachineState *state, ShutdownCause reason)
1372fa699e80SPeter Delevoryas {
1373fa699e80SPeter Delevoryas     AspeedMachineState *bmc = ASPEED_MACHINE(state);
1374fa699e80SPeter Delevoryas     AspeedGPIOState *gpio = &bmc->soc.gpio;
1375fa699e80SPeter Delevoryas 
13767966d70fSJason A. Donenfeld     qemu_devices_reset(reason);
1377fa699e80SPeter Delevoryas 
1378f0418558SPeter Delevoryas     /* Board ID: 7 (Class-1, 4 slots) */
1379fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV4", true, &error_fatal);
1380fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV5", true, &error_fatal);
1381fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV6", true, &error_fatal);
1382fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV7", false, &error_fatal);
1383f0418558SPeter Delevoryas 
1384f0418558SPeter Delevoryas     /* Slot presence pins, inverse polarity. (False means present) */
1385f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH4", false, &error_fatal);
1386f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH5", true, &error_fatal);
1387f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH6", true, &error_fatal);
1388f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH7", true, &error_fatal);
1389f0418558SPeter Delevoryas 
1390f0418558SPeter Delevoryas     /* Slot 12v power pins, normal polarity. (True means powered-on) */
1391f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB2", true, &error_fatal);
1392f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB3", false, &error_fatal);
1393f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB4", false, &error_fatal);
1394f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB5", false, &error_fatal);
1395fa699e80SPeter Delevoryas }
1396fa699e80SPeter Delevoryas 
1397fa699e80SPeter Delevoryas static void aspeed_machine_fby35_class_init(ObjectClass *oc, void *data)
1398fa699e80SPeter Delevoryas {
1399fa699e80SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1400fa699e80SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1401fa699e80SPeter Delevoryas 
1402fa699e80SPeter Delevoryas     mc->desc       = "Facebook fby35 BMC (Cortex-A7)";
1403fa699e80SPeter Delevoryas     mc->reset      = fby35_reset;
1404fa699e80SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1405fa699e80SPeter Delevoryas     amc->num_cs    = 2;
1406fa699e80SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1407fa699e80SPeter Delevoryas     amc->i2c_init  = fby35_i2c_init;
1408fa699e80SPeter Delevoryas     /* FIXME: Replace this macro with something more general */
1409fa699e80SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
1410fa699e80SPeter Delevoryas }
1411fa699e80SPeter Delevoryas 
141266c895b8SJamin Lin #define AST1030_INTERNAL_FLASH_SIZE (1024 * 1024)
141366c895b8SJamin Lin /* Main SYSCLK frequency in Hz (200MHz) */
141466c895b8SJamin Lin #define SYSCLK_FRQ 200000000ULL
141566c895b8SJamin Lin 
141666c895b8SJamin Lin static void aspeed_minibmc_machine_init(MachineState *machine)
141766c895b8SJamin Lin {
141866c895b8SJamin Lin     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
141966c895b8SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
142066c895b8SJamin Lin     Clock *sysclk;
142166c895b8SJamin Lin 
142266c895b8SJamin Lin     sysclk = clock_new(OBJECT(machine), "SYSCLK");
142366c895b8SJamin Lin     clock_set_hz(sysclk, SYSCLK_FRQ);
142466c895b8SJamin Lin 
142566c895b8SJamin Lin     object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
142666c895b8SJamin Lin     qdev_connect_clock_in(DEVICE(&bmc->soc), "sysclk", sysclk);
142766c895b8SJamin Lin 
14284dd9d554SPeter Delevoryas     object_property_set_link(OBJECT(&bmc->soc), "memory",
14294dd9d554SPeter Delevoryas                              OBJECT(get_system_memory()), &error_abort);
1430d2b3eaefSPeter Delevoryas     connect_serial_hds_to_uarts(bmc);
143166c895b8SJamin Lin     qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
143266c895b8SJamin Lin 
143366c895b8SJamin Lin     aspeed_board_init_flashes(&bmc->soc.fmc,
143466c895b8SJamin Lin                               bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
143566c895b8SJamin Lin                               amc->num_cs,
143666c895b8SJamin Lin                               0);
143766c895b8SJamin Lin 
143866c895b8SJamin Lin     aspeed_board_init_flashes(&bmc->soc.spi[0],
143966c895b8SJamin Lin                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
144066c895b8SJamin Lin                               amc->num_cs, amc->num_cs);
144166c895b8SJamin Lin 
144266c895b8SJamin Lin     aspeed_board_init_flashes(&bmc->soc.spi[1],
144366c895b8SJamin Lin                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
144466c895b8SJamin Lin                               amc->num_cs, (amc->num_cs * 2));
144566c895b8SJamin Lin 
144666c895b8SJamin Lin     if (amc->i2c_init) {
144766c895b8SJamin Lin         amc->i2c_init(bmc);
144866c895b8SJamin Lin     }
144966c895b8SJamin Lin 
145066c895b8SJamin Lin     armv7m_load_kernel(ARM_CPU(first_cpu),
145166c895b8SJamin Lin                        machine->kernel_filename,
1452761c532aSPeter Maydell                        0,
145366c895b8SJamin Lin                        AST1030_INTERNAL_FLASH_SIZE);
145466c895b8SJamin Lin }
145566c895b8SJamin Lin 
14564c70ab16STroy Lee static void ast1030_evb_i2c_init(AspeedMachineState *bmc)
14574c70ab16STroy Lee {
14584c70ab16STroy Lee     AspeedSoCState *soc = &bmc->soc;
14594c70ab16STroy Lee 
14604c70ab16STroy Lee     /* U10 24C08 connects to SDA/SCL Groupt 1 by default */
14614c70ab16STroy Lee     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
14624c70ab16STroy Lee     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, eeprom_buf);
14634c70ab16STroy Lee 
14644c70ab16STroy Lee     /* U11 LM75 connects to SDA/SCL Group 2 by default */
14654c70ab16STroy Lee     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d);
14664c70ab16STroy Lee }
14674c70ab16STroy Lee 
146866c895b8SJamin Lin static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc,
146966c895b8SJamin Lin                                                           void *data)
147066c895b8SJamin Lin {
147166c895b8SJamin Lin     MachineClass *mc = MACHINE_CLASS(oc);
147266c895b8SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
147366c895b8SJamin Lin 
147466c895b8SJamin Lin     mc->desc = "Aspeed AST1030 MiniBMC (Cortex-M4)";
147566c895b8SJamin Lin     amc->soc_name = "ast1030-a1";
147666c895b8SJamin Lin     amc->hw_strap1 = 0;
147766c895b8SJamin Lin     amc->hw_strap2 = 0;
147866c895b8SJamin Lin     mc->init = aspeed_minibmc_machine_init;
14794c70ab16STroy Lee     amc->i2c_init = ast1030_evb_i2c_init;
148066c895b8SJamin Lin     mc->default_ram_size = 0;
148166c895b8SJamin Lin     mc->default_cpus = mc->min_cpus = mc->max_cpus = 1;
148266c895b8SJamin Lin     amc->fmc_model = "sst25vf032b";
148366c895b8SJamin Lin     amc->spi_model = "sst25vf032b";
148466c895b8SJamin Lin     amc->num_cs = 2;
148566c895b8SJamin Lin     amc->macs_mask = 0;
148666c895b8SJamin Lin }
148766c895b8SJamin Lin 
1488fb6b3c8dSJae Hyun Yoo static void aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass *oc,
1489fb6b3c8dSJae Hyun Yoo                                                      void *data)
1490fb6b3c8dSJae Hyun Yoo {
1491fb6b3c8dSJae Hyun Yoo     MachineClass *mc = MACHINE_CLASS(oc);
1492fb6b3c8dSJae Hyun Yoo     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1493fb6b3c8dSJae Hyun Yoo 
1494fb6b3c8dSJae Hyun Yoo     mc->desc       = "Qualcomm DC-SCM V1 BMC (Cortex A7)";
1495fb6b3c8dSJae Hyun Yoo     amc->soc_name  = "ast2600-a3";
1496fb6b3c8dSJae Hyun Yoo     amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1497fb6b3c8dSJae Hyun Yoo     amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1498fb6b3c8dSJae Hyun Yoo     amc->fmc_model = "n25q512a";
1499fb6b3c8dSJae Hyun Yoo     amc->spi_model = "n25q512a";
1500fb6b3c8dSJae Hyun Yoo     amc->num_cs    = 2;
1501fb6b3c8dSJae Hyun Yoo     amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1502fb6b3c8dSJae Hyun Yoo     amc->i2c_init  = qcom_dc_scm_bmc_i2c_init;
1503fb6b3c8dSJae Hyun Yoo     mc->default_ram_size = 1 * GiB;
1504fb6b3c8dSJae Hyun Yoo     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1505fb6b3c8dSJae Hyun Yoo         aspeed_soc_num_cpus(amc->soc_name);
1506fb6b3c8dSJae Hyun Yoo };
1507fb6b3c8dSJae Hyun Yoo 
1508ece4cccdSGraeme Gregory static void aspeed_machine_qcom_firework_class_init(ObjectClass *oc,
1509ece4cccdSGraeme Gregory                                                     void *data)
1510ece4cccdSGraeme Gregory {
1511ece4cccdSGraeme Gregory     MachineClass *mc = MACHINE_CLASS(oc);
1512ece4cccdSGraeme Gregory     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1513ece4cccdSGraeme Gregory 
1514ece4cccdSGraeme Gregory     mc->desc       = "Qualcomm DC-SCM V1/Firework BMC (Cortex A7)";
1515ece4cccdSGraeme Gregory     amc->soc_name  = "ast2600-a3";
1516ece4cccdSGraeme Gregory     amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1517ece4cccdSGraeme Gregory     amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1518ece4cccdSGraeme Gregory     amc->fmc_model = "n25q512a";
1519ece4cccdSGraeme Gregory     amc->spi_model = "n25q512a";
1520ece4cccdSGraeme Gregory     amc->num_cs    = 2;
1521ece4cccdSGraeme Gregory     amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1522ece4cccdSGraeme Gregory     amc->i2c_init  = qcom_dc_scm_firework_i2c_init;
1523ece4cccdSGraeme Gregory     mc->default_ram_size = 1 * GiB;
1524ece4cccdSGraeme Gregory     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1525ece4cccdSGraeme Gregory         aspeed_soc_num_cpus(amc->soc_name);
1526ece4cccdSGraeme Gregory };
1527ece4cccdSGraeme Gregory 
1528baa4732bSCédric Le Goater static const TypeInfo aspeed_machine_types[] = {
1529baa4732bSCédric Le Goater     {
1530baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("palmetto-bmc"),
1531baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1532baa4732bSCédric Le Goater         .class_init    = aspeed_machine_palmetto_class_init,
1533baa4732bSCédric Le Goater     }, {
153440a38df5SErik Smit         .name          = MACHINE_TYPE_NAME("supermicrox11-bmc"),
153540a38df5SErik Smit         .parent        = TYPE_ASPEED_MACHINE,
153640a38df5SErik Smit         .class_init    = aspeed_machine_supermicrox11_bmc_class_init,
153740a38df5SErik Smit     }, {
153847936597SGuenter Roeck         .name          = MACHINE_TYPE_NAME("supermicro-x11spi-bmc"),
153947936597SGuenter Roeck         .parent        = TYPE_ASPEED_MACHINE,
154047936597SGuenter Roeck         .class_init    = aspeed_machine_supermicro_x11spi_bmc_class_init,
154147936597SGuenter Roeck     }, {
1542baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2500-evb"),
1543baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1544baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2500_evb_class_init,
1545baa4732bSCédric Le Goater     }, {
1546baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("romulus-bmc"),
1547baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1548baa4732bSCédric Le Goater         .class_init    = aspeed_machine_romulus_class_init,
1549baa4732bSCédric Le Goater     }, {
1550143b040fSPatrick Williams         .name          = MACHINE_TYPE_NAME("sonorapass-bmc"),
1551143b040fSPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1552143b040fSPatrick Williams         .class_init    = aspeed_machine_sonorapass_class_init,
1553143b040fSPatrick Williams     }, {
1554baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("witherspoon-bmc"),
1555baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1556baa4732bSCédric Le Goater         .class_init    = aspeed_machine_witherspoon_class_init,
1557baa4732bSCédric Le Goater     }, {
1558baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2600-evb"),
1559baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1560baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2600_evb_class_init,
1561baa4732bSCédric Le Goater     }, {
156263ceb818SCédric Le Goater         .name          = MACHINE_TYPE_NAME("tacoma-bmc"),
156363ceb818SCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
156463ceb818SCédric Le Goater         .class_init    = aspeed_machine_tacoma_class_init,
156563ceb818SCédric Le Goater     }, {
156695f068c8SJohn Wang         .name          = MACHINE_TYPE_NAME("g220a-bmc"),
156795f068c8SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
156895f068c8SJohn Wang         .class_init    = aspeed_machine_g220a_class_init,
156995f068c8SJohn Wang     }, {
1570fb6b3c8dSJae Hyun Yoo         .name          = MACHINE_TYPE_NAME("qcom-dc-scm-v1-bmc"),
1571fb6b3c8dSJae Hyun Yoo         .parent        = TYPE_ASPEED_MACHINE,
1572fb6b3c8dSJae Hyun Yoo         .class_init    = aspeed_machine_qcom_dc_scm_v1_class_init,
1573fb6b3c8dSJae Hyun Yoo     }, {
1574ece4cccdSGraeme Gregory         .name          = MACHINE_TYPE_NAME("qcom-firework-bmc"),
1575ece4cccdSGraeme Gregory         .parent        = TYPE_ASPEED_MACHINE,
1576ece4cccdSGraeme Gregory         .class_init    = aspeed_machine_qcom_firework_class_init,
1577ece4cccdSGraeme Gregory     }, {
157882b6a3f6SJohn Wang         .name          = MACHINE_TYPE_NAME("fp5280g2-bmc"),
157982b6a3f6SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
158082b6a3f6SJohn Wang         .class_init    = aspeed_machine_fp5280g2_class_init,
158182b6a3f6SJohn Wang     }, {
15829cccb912SPatrick Venture         .name          = MACHINE_TYPE_NAME("quanta-q71l-bmc"),
15839cccb912SPatrick Venture         .parent        = TYPE_ASPEED_MACHINE,
15849cccb912SPatrick Venture         .class_init    = aspeed_machine_quanta_q71l_class_init,
15859cccb912SPatrick Venture     }, {
158658e52bdbSCédric Le Goater         .name          = MACHINE_TYPE_NAME("rainier-bmc"),
158758e52bdbSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
158858e52bdbSCédric Le Goater         .class_init    = aspeed_machine_rainier_class_init,
158958e52bdbSCédric Le Goater     }, {
1590febbe308SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fuji-bmc"),
1591febbe308SPeter Delevoryas         .parent        = TYPE_ASPEED_MACHINE,
1592febbe308SPeter Delevoryas         .class_init    = aspeed_machine_fuji_class_init,
1593febbe308SPeter Delevoryas     }, {
1594a20c54b1SPatrick Williams         .name          = MACHINE_TYPE_NAME("bletchley-bmc"),
1595a20c54b1SPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1596a20c54b1SPatrick Williams         .class_init    = aspeed_machine_bletchley_class_init,
1597a20c54b1SPatrick Williams     }, {
1598fa699e80SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fby35-bmc"),
1599fa699e80SPeter Delevoryas         .parent        = MACHINE_TYPE_NAME("ast2600-evb"),
1600fa699e80SPeter Delevoryas         .class_init    = aspeed_machine_fby35_class_init,
1601fa699e80SPeter Delevoryas     }, {
160266c895b8SJamin Lin         .name           = MACHINE_TYPE_NAME("ast1030-evb"),
160366c895b8SJamin Lin         .parent         = TYPE_ASPEED_MACHINE,
160466c895b8SJamin Lin         .class_init     = aspeed_minibmc_machine_ast1030_evb_class_init,
160566c895b8SJamin Lin     }, {
1606fca9ca1bSCédric Le Goater         .name          = TYPE_ASPEED_MACHINE,
160762c2c2ebSCédric Le Goater         .parent        = TYPE_MACHINE,
1608888b2b03SPhilippe Mathieu-Daudé         .instance_size = sizeof(AspeedMachineState),
16091a15311aSCédric Le Goater         .instance_init = aspeed_machine_instance_init,
1610fca9ca1bSCédric Le Goater         .class_size    = sizeof(AspeedMachineClass),
1611fca9ca1bSCédric Le Goater         .class_init    = aspeed_machine_class_init,
1612baa4732bSCédric Le Goater         .abstract      = true,
1613baa4732bSCédric Le Goater     }
1614fca9ca1bSCédric Le Goater };
161574fb1f38SCédric Le Goater 
1616baa4732bSCédric Le Goater DEFINE_TYPES(aspeed_machine_types)
1617