xref: /qemu/hw/arm/aspeed.c (revision 703229132bb05327044368fc6d19f6acf7dde848)
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"
205e9ae4b1SCorey Minyard #include "hw/sensor/tmp105.h"
217cfbde5eSPhilippe Mathieu-Daudé #include "hw/misc/led.h"
22a27bd6c7SMarkus Armbruster #include "hw/qdev-properties.h"
23e1ad9bc4SCédric Le Goater #include "sysemu/block-backend.h"
24fa699e80SPeter Delevoryas #include "sysemu/reset.h"
25d769a1daSCédric Le Goater #include "hw/loader.h"
26d769a1daSCédric Le Goater #include "qemu/error-report.h"
27a9df9622SJoel Stanley #include "qemu/units.h"
2866c895b8SJamin Lin #include "hw/qdev-clock.h"
29d2b3eaefSPeter Delevoryas #include "sysemu/sysemu.h"
30327d8e4eSAndrew Jeffery 
3174fb1f38SCédric Le Goater static struct arm_boot_info aspeed_board_binfo = {
32b033271fSCédric Le Goater     .board_id = -1, /* device-tree-only board */
33327d8e4eSAndrew Jeffery };
34327d8e4eSAndrew Jeffery 
35612b219aSPhilippe Mathieu-Daudé struct AspeedMachineState {
36888b2b03SPhilippe Mathieu-Daudé     /* Private */
37888b2b03SPhilippe Mathieu-Daudé     MachineState parent_obj;
38888b2b03SPhilippe Mathieu-Daudé     /* Public */
39888b2b03SPhilippe Mathieu-Daudé 
40ff90606fSCédric Le Goater     AspeedSoCState soc;
41888b2b03SPhilippe Mathieu-Daudé     bool mmio_exec;
429820e52fSCédric Le Goater     char *fmc_model;
439820e52fSCédric Le Goater     char *spi_model;
44ea066d39SThomas Huth };
45327d8e4eSAndrew Jeffery 
46ef17f836SCédric Le Goater /* Palmetto hardware value: 0x120CE416 */
478da33ef7SCédric Le Goater #define PALMETTO_BMC_HW_STRAP1 (                                        \
488da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_256MB) |               \
498da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2 /* DDR3 with CL=6, CWL=5 */) | \
508da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
518da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) |       \
528da33ef7SCédric Le Goater         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
538da33ef7SCédric Le Goater         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
548da33ef7SCédric Le Goater         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) |                \
558da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
568da33ef7SCédric Le Goater         SCU_HW_STRAP_SPI_WIDTH |                                        \
578da33ef7SCédric Le Goater         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
588da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
598da33ef7SCédric Le Goater 
6040a38df5SErik Smit /* TODO: Find the actual hardware value */
6140a38df5SErik Smit #define SUPERMICROX11_BMC_HW_STRAP1 (                                   \
6240a38df5SErik Smit         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) |               \
6340a38df5SErik Smit         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2) |                           \
6440a38df5SErik Smit         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
6540a38df5SErik Smit         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) |       \
6640a38df5SErik Smit         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
6740a38df5SErik Smit         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
6840a38df5SErik Smit         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) |                \
6940a38df5SErik Smit         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
7040a38df5SErik Smit         SCU_HW_STRAP_SPI_WIDTH |                                        \
7140a38df5SErik Smit         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
7240a38df5SErik Smit         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
7340a38df5SErik Smit 
74ef17f836SCédric Le Goater /* AST2500 evb hardware value: 0xF100C2E6 */
759a7c1750SCédric Le Goater #define AST2500_EVB_HW_STRAP1 ((                                        \
769a7c1750SCédric Le Goater         AST2500_HW_STRAP1_DEFAULTS |                                    \
779a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
789a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
799a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
809a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
819a7c1750SCédric Le Goater         SCU_HW_STRAP_MAC1_RGMII |                                       \
829a7c1750SCédric Le Goater         SCU_HW_STRAP_MAC0_RGMII) &                                      \
839a7c1750SCédric Le Goater         ~SCU_HW_STRAP_2ND_BOOT_WDT)
849a7c1750SCédric Le Goater 
85ef17f836SCédric Le Goater /* Romulus hardware value: 0xF10AD206 */
86ef17f836SCédric Le Goater #define ROMULUS_BMC_HW_STRAP1 (                                         \
87ef17f836SCédric Le Goater         AST2500_HW_STRAP1_DEFAULTS |                                    \
88ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
89ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
90ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
91ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
92ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_ACPI_ENABLE |                              \
93ef17f836SCédric Le Goater         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER))
94ef17f836SCédric Le Goater 
95143b040fSPatrick Williams /* Sonorapass hardware value: 0xF100D216 */
96143b040fSPatrick Williams #define SONORAPASS_BMC_HW_STRAP1 (                                      \
97143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
98143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
99143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
100143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
101143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
102143b040fSPatrick Williams         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
103143b040fSPatrick Williams         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
104143b040fSPatrick Williams         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
105143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
106143b040fSPatrick Williams         SCU_HW_STRAP_VGA_BIOS_ROM |                                     \
107143b040fSPatrick Williams         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
108143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_RESERVED1)
109143b040fSPatrick Williams 
11095f068c8SJohn Wang #define G220A_BMC_HW_STRAP1 (                                      \
11195f068c8SJohn Wang         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
11295f068c8SJohn Wang         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
11395f068c8SJohn Wang         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
11495f068c8SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
11595f068c8SJohn Wang         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
11695f068c8SJohn Wang         SCU_HW_STRAP_2ND_BOOT_WDT |                                     \
11795f068c8SJohn Wang         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
11895f068c8SJohn Wang         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
11995f068c8SJohn Wang         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
12095f068c8SJohn Wang         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
12195f068c8SJohn Wang         SCU_HW_STRAP_VGA_SIZE_SET(VGA_64M_DRAM) |                       \
12295f068c8SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED1)
12395f068c8SJohn Wang 
12482b6a3f6SJohn Wang /* FP5280G2 hardware value: 0XF100D286 */
12582b6a3f6SJohn Wang #define FP5280G2_BMC_HW_STRAP1 (                                      \
12682b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
12782b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
12882b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
12982b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
13082b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
13182b6a3f6SJohn Wang         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
13282b6a3f6SJohn Wang         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
13382b6a3f6SJohn Wang         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
13482b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
13582b6a3f6SJohn Wang         SCU_HW_STRAP_MAC1_RGMII |                                       \
13682b6a3f6SJohn Wang         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
13782b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED1)
13882b6a3f6SJohn Wang 
13962c2c2ebSCédric Le Goater /* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */
14062c2c2ebSCédric Le Goater #define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1
14162c2c2ebSCédric Le Goater 
1429cccb912SPatrick Venture /* Quanta-Q71l hardware value */
1439cccb912SPatrick Venture #define QUANTA_Q71L_BMC_HW_STRAP1 (                                     \
1449cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) |               \
1459cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2/* DDR3 with CL=6, CWL=5 */) | \
1469cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
1479cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_24M_IN) |       \
1489cccb912SPatrick Venture         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
1499cccb912SPatrick Venture         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_PASS_THROUGH) |          \
1509cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
1519cccb912SPatrick Venture         SCU_HW_STRAP_SPI_WIDTH |                                        \
1529cccb912SPatrick Venture         SCU_HW_STRAP_VGA_SIZE_SET(VGA_8M_DRAM) |                        \
1539cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
1549cccb912SPatrick Venture 
155ccc2c418SCédric Le Goater /* AST2600 evb hardware value */
156ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP1 0x000000C0
157ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP2 0x00000003
158ccc2c418SCédric Le Goater 
15963ceb818SCédric Le Goater /* Tacoma hardware value */
16063ceb818SCédric Le Goater #define TACOMA_BMC_HW_STRAP1  0x00000000
1617582591aSJoel Stanley #define TACOMA_BMC_HW_STRAP2  0x00000040
16263ceb818SCédric Le Goater 
16358e52bdbSCédric Le Goater /* Rainier hardware value: (QEMU prototype) */
164b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP1 0x00422016
165b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP2 0x80000848
16658e52bdbSCédric Le Goater 
167febbe308SPeter Delevoryas /* Fuji hardware value */
168febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP1    0x00000000
169febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP2    0x00000000
170febbe308SPeter Delevoryas 
171a20c54b1SPatrick Williams /* Bletchley hardware value */
172a20c54b1SPatrick Williams /* TODO: Leave same as EVB for now. */
173a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP1 AST2600_EVB_HW_STRAP1
174a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP2 AST2600_EVB_HW_STRAP2
175a20c54b1SPatrick Williams 
176fb6b3c8dSJae Hyun Yoo /* Qualcomm DC-SCM hardware value */
177fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP1  0x00000000
178fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP2  0x00000041
179fb6b3c8dSJae Hyun Yoo 
1809bb6d140SJoel Stanley #define AST_SMP_MAILBOX_BASE            0x1e6e2180
1819bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_ENTRY        (AST_SMP_MAILBOX_BASE + 0x0)
1829bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_GOSIGN       (AST_SMP_MAILBOX_BASE + 0x4)
1839bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_READY        (AST_SMP_MAILBOX_BASE + 0x8)
1849bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_POLLINSN     (AST_SMP_MAILBOX_BASE + 0xc)
1859bb6d140SJoel Stanley #define AST_SMP_MBOX_CODE               (AST_SMP_MAILBOX_BASE + 0x10)
1869bb6d140SJoel Stanley #define AST_SMP_MBOX_GOSIGN             0xabbaab00
1879bb6d140SJoel Stanley 
1889bb6d140SJoel Stanley static void aspeed_write_smpboot(ARMCPU *cpu,
1899bb6d140SJoel Stanley                                  const struct arm_boot_info *info)
1909bb6d140SJoel Stanley {
1919bb6d140SJoel Stanley     static const uint32_t poll_mailbox_ready[] = {
1929bb6d140SJoel Stanley         /*
1939bb6d140SJoel Stanley          * r2 = per-cpu go sign value
1949bb6d140SJoel Stanley          * r1 = AST_SMP_MBOX_FIELD_ENTRY
1959bb6d140SJoel Stanley          * r0 = AST_SMP_MBOX_FIELD_GOSIGN
1969bb6d140SJoel Stanley          */
1979bb6d140SJoel Stanley         0xee100fb0,  /* mrc     p15, 0, r0, c0, c0, 5 */
1989bb6d140SJoel Stanley         0xe21000ff,  /* ands    r0, r0, #255          */
1999bb6d140SJoel Stanley         0xe59f201c,  /* ldr     r2, [pc, #28]         */
2009bb6d140SJoel Stanley         0xe1822000,  /* orr     r2, r2, r0            */
2019bb6d140SJoel Stanley 
2029bb6d140SJoel Stanley         0xe59f1018,  /* ldr     r1, [pc, #24]         */
2039bb6d140SJoel Stanley         0xe59f0018,  /* ldr     r0, [pc, #24]         */
2049bb6d140SJoel Stanley 
2059bb6d140SJoel Stanley         0xe320f002,  /* wfe                           */
2069bb6d140SJoel Stanley         0xe5904000,  /* ldr     r4, [r0]              */
2079bb6d140SJoel Stanley         0xe1520004,  /* cmp     r2, r4                */
2089bb6d140SJoel Stanley         0x1afffffb,  /* bne     <wfe>                 */
2099bb6d140SJoel Stanley         0xe591f000,  /* ldr     pc, [r1]              */
2109bb6d140SJoel Stanley         AST_SMP_MBOX_GOSIGN,
2119bb6d140SJoel Stanley         AST_SMP_MBOX_FIELD_ENTRY,
2129bb6d140SJoel Stanley         AST_SMP_MBOX_FIELD_GOSIGN,
2139bb6d140SJoel Stanley     };
2149bb6d140SJoel Stanley 
2159bb6d140SJoel Stanley     rom_add_blob_fixed("aspeed.smpboot", poll_mailbox_ready,
2169bb6d140SJoel Stanley                        sizeof(poll_mailbox_ready),
2179bb6d140SJoel Stanley                        info->smp_loader_start);
2189bb6d140SJoel Stanley }
2199bb6d140SJoel Stanley 
2209bb6d140SJoel Stanley static void aspeed_reset_secondary(ARMCPU *cpu,
2219bb6d140SJoel Stanley                                    const struct arm_boot_info *info)
2229bb6d140SJoel Stanley {
2239bb6d140SJoel Stanley     AddressSpace *as = arm_boot_address_space(cpu, info);
2249bb6d140SJoel Stanley     CPUState *cs = CPU(cpu);
2259bb6d140SJoel Stanley 
2269bb6d140SJoel Stanley     /* info->smp_bootreg_addr */
2279bb6d140SJoel Stanley     address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0,
2289bb6d140SJoel Stanley                                MEMTXATTRS_UNSPECIFIED, NULL);
2299bb6d140SJoel Stanley     cpu_set_pc(cs, info->smp_loader_start);
2309bb6d140SJoel Stanley }
2319bb6d140SJoel Stanley 
232d769a1daSCédric Le Goater #define FIRMWARE_ADDR 0x0
233d769a1daSCédric Le Goater 
234d769a1daSCédric Le Goater static void write_boot_rom(DriveInfo *dinfo, hwaddr addr, size_t rom_size,
235d769a1daSCédric Le Goater                            Error **errp)
236d769a1daSCédric Le Goater {
237d769a1daSCédric Le Goater     BlockBackend *blk = blk_by_legacy_dinfo(dinfo);
23805e6e40aSWentao_Liang     g_autofree void *storage = NULL;
2390c7209beSCédric Le Goater     int64_t size;
240d769a1daSCédric Le Goater 
2410c7209beSCédric Le Goater     /* The block backend size should have already been 'validated' by
2420c7209beSCédric Le Goater      * the creation of the m25p80 object.
2430c7209beSCédric Le Goater      */
2440c7209beSCédric Le Goater     size = blk_getlength(blk);
2450c7209beSCédric Le Goater     if (size <= 0) {
2460c7209beSCédric Le Goater         error_setg(errp, "failed to get flash size");
2470c7209beSCédric Le Goater         return;
2480c7209beSCédric Le Goater     }
2490c7209beSCédric Le Goater 
2500c7209beSCédric Le Goater     if (rom_size > size) {
2510c7209beSCédric Le Goater         rom_size = size;
252d769a1daSCédric Le Goater     }
253d769a1daSCédric Le Goater 
25405e6e40aSWentao_Liang     storage = g_malloc0(rom_size);
255a9262f55SAlberto Faria     if (blk_pread(blk, 0, rom_size, storage, 0) < 0) {
256d769a1daSCédric Le Goater         error_setg(errp, "failed to read the initial flash content");
257d769a1daSCédric Le Goater         return;
258d769a1daSCédric Le Goater     }
259d769a1daSCédric Le Goater 
260d769a1daSCédric Le Goater     rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr);
261d769a1daSCédric Le Goater }
262d769a1daSCédric Le Goater 
2631099ad10SPeter Delevoryas void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
2649bd4ac61SCédric Le Goater                                       unsigned int count, int unit0)
265e1ad9bc4SCédric Le Goater {
266e1ad9bc4SCédric Le Goater     int i;
267179b2058SPatrick Williams 
268179b2058SPatrick Williams     if (!flashtype) {
269179b2058SPatrick Williams         return;
270179b2058SPatrick Williams     }
271e1ad9bc4SCédric Le Goater 
2729bd4ac61SCédric Le Goater     for (i = 0; i < count; ++i) {
2738ec239f2SMarkus Armbruster         DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i);
274e1ad9bc4SCédric Le Goater         qemu_irq cs_line;
275a7d78befSCédric Le Goater         DeviceState *dev;
276e1ad9bc4SCédric Le Goater 
277a7d78befSCédric Le Goater         dev = qdev_new(flashtype);
278e1ad9bc4SCédric Le Goater         if (dinfo) {
279a7d78befSCédric Le Goater             qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo));
280e1ad9bc4SCédric Le Goater         }
281a7d78befSCédric Le Goater         qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal);
282e1ad9bc4SCédric Le Goater 
283a7d78befSCédric Le Goater         cs_line = qdev_get_gpio_in_named(dev, SSI_GPIO_CS, 0);
284e1ad9bc4SCédric Le Goater         sysbus_connect_irq(SYS_BUS_DEVICE(s), i + 1, cs_line);
285e1ad9bc4SCédric Le Goater     }
286e1ad9bc4SCédric Le Goater }
287e1ad9bc4SCédric Le Goater 
288a29e3e12SAndrew Jeffery static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo)
289a29e3e12SAndrew Jeffery {
290a29e3e12SAndrew Jeffery         DeviceState *card;
291a29e3e12SAndrew Jeffery 
292756f739bSPhilippe Mathieu-Daudé         if (!dinfo) {
293756f739bSPhilippe Mathieu-Daudé             return;
294756f739bSPhilippe Mathieu-Daudé         }
2953e80f690SMarkus Armbruster         card = qdev_new(TYPE_SD_CARD);
296934df912SMarkus Armbruster         qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
297a29e3e12SAndrew Jeffery                                 &error_fatal);
2983e80f690SMarkus Armbruster         qdev_realize_and_unref(card,
2993e80f690SMarkus Armbruster                                qdev_get_child_bus(DEVICE(sdhci), "sd-bus"),
3003e80f690SMarkus Armbruster                                &error_fatal);
301a29e3e12SAndrew Jeffery }
302a29e3e12SAndrew Jeffery 
303d2b3eaefSPeter Delevoryas static void connect_serial_hds_to_uarts(AspeedMachineState *bmc)
304d2b3eaefSPeter Delevoryas {
305d2b3eaefSPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
306d2b3eaefSPeter Delevoryas     AspeedSoCState *s = &bmc->soc;
307d2b3eaefSPeter Delevoryas     AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
308d2b3eaefSPeter Delevoryas 
309d2b3eaefSPeter Delevoryas     aspeed_soc_uart_set_chr(s, amc->uart_default, serial_hd(0));
310d2b3eaefSPeter Delevoryas     for (int i = 1, uart = ASPEED_DEV_UART1; i < sc->uarts_num; i++, uart++) {
311d2b3eaefSPeter Delevoryas         if (uart == amc->uart_default) {
312d2b3eaefSPeter Delevoryas             continue;
313d2b3eaefSPeter Delevoryas         }
314d2b3eaefSPeter Delevoryas         aspeed_soc_uart_set_chr(s, uart, serial_hd(i));
315d2b3eaefSPeter Delevoryas     }
316d2b3eaefSPeter Delevoryas }
317d2b3eaefSPeter Delevoryas 
318baa4732bSCédric Le Goater static void aspeed_machine_init(MachineState *machine)
319327d8e4eSAndrew Jeffery {
320888b2b03SPhilippe Mathieu-Daudé     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
321baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
322b033271fSCédric Le Goater     AspeedSoCClass *sc;
323d769a1daSCédric Le Goater     DriveInfo *drive0 = drive_get(IF_MTD, 0, 0);
3242bea128cSEddie James     int i;
325d3bad7e7SCédric Le Goater     NICInfo *nd = &nd_table[0];
326327d8e4eSAndrew Jeffery 
3279fc7fc4dSMarkus Armbruster     object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
328327d8e4eSAndrew Jeffery 
329b033271fSCédric Le Goater     sc = ASPEED_SOC_GET_CLASS(&bmc->soc);
330b033271fSCédric Le Goater 
331533eb415SIgor Mammedov     /*
332346160cbSCédric Le Goater      * This will error out if the RAM size is not supported by the
333346160cbSCédric Le Goater      * memory controller of the SoC.
334533eb415SIgor Mammedov      */
3356e504a98SPaolo Bonzini     object_property_set_uint(OBJECT(&bmc->soc), "ram-size", machine->ram_size,
336533eb415SIgor Mammedov                              &error_fatal);
337533eb415SIgor Mammedov 
338d3bad7e7SCédric Le Goater     for (i = 0; i < sc->macs_num; i++) {
339d3bad7e7SCédric Le Goater         if ((amc->macs_mask & (1 << i)) && nd->used) {
340d3bad7e7SCédric Le Goater             qemu_check_nic_model(nd, TYPE_FTGMAC100);
341d3bad7e7SCédric Le Goater             qdev_set_nic_properties(DEVICE(&bmc->soc.ftgmac100[i]), nd);
342d3bad7e7SCédric Le Goater             nd++;
343d3bad7e7SCédric Le Goater         }
344d3bad7e7SCédric Le Goater     }
345d3bad7e7SCédric Le Goater 
3465325cc34SMarkus Armbruster     object_property_set_int(OBJECT(&bmc->soc), "hw-strap1", amc->hw_strap1,
34787e79af0SAndrew Jeffery                             &error_abort);
3485325cc34SMarkus Armbruster     object_property_set_int(OBJECT(&bmc->soc), "hw-strap2", amc->hw_strap2,
349ccc2c418SCédric Le Goater                             &error_abort);
3504dd9d554SPeter Delevoryas     object_property_set_link(OBJECT(&bmc->soc), "memory",
3514dd9d554SPeter Delevoryas                              OBJECT(get_system_memory()), &error_abort);
3525325cc34SMarkus Armbruster     object_property_set_link(OBJECT(&bmc->soc), "dram",
3530df2d9a6SCédric Le Goater                              OBJECT(machine->ram), &error_abort);
354b6e70d1dSJoel Stanley     if (machine->kernel_filename) {
355b6e70d1dSJoel Stanley         /*
356b6e70d1dSJoel Stanley          * When booting with a -kernel command line there is no u-boot
357b6e70d1dSJoel Stanley          * that runs to unlock the SCU. In this case set the default to
358b6e70d1dSJoel Stanley          * be unlocked as the kernel expects
359b6e70d1dSJoel Stanley          */
3605325cc34SMarkus Armbruster         object_property_set_int(OBJECT(&bmc->soc), "hw-prot-key",
3615325cc34SMarkus Armbruster                                 ASPEED_SCU_PROT_KEY, &error_abort);
362b6e70d1dSJoel Stanley     }
363d2b3eaefSPeter Delevoryas     connect_serial_hds_to_uarts(bmc);
364ce189ab2SMarkus Armbruster     qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
365327d8e4eSAndrew Jeffery 
3668ec239f2SMarkus Armbruster     aspeed_board_init_flashes(&bmc->soc.fmc,
3678ec239f2SMarkus Armbruster                               bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
3689bd4ac61SCédric Le Goater                               amc->num_cs, 0);
3698ec239f2SMarkus Armbruster     aspeed_board_init_flashes(&bmc->soc.spi[0],
3708ec239f2SMarkus Armbruster                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
3719bd4ac61SCédric Le Goater                               1, amc->num_cs);
372e1ad9bc4SCédric Le Goater 
373d769a1daSCédric Le Goater     /* Install first FMC flash content as a boot rom. */
374d769a1daSCédric Le Goater     if (drive0) {
375d769a1daSCédric Le Goater         AspeedSMCFlash *fl = &bmc->soc.fmc.flashes[0];
376d769a1daSCédric Le Goater         MemoryRegion *boot_rom = g_new(MemoryRegion, 1);
3776bb55e79SCédric Le Goater         uint64_t size = memory_region_size(&fl->mmio);
378d769a1daSCédric Le Goater 
379d769a1daSCédric Le Goater         /*
380d769a1daSCédric Le Goater          * create a ROM region using the default mapping window size of
38193bf276dSCédric Le Goater          * the flash module. The window size is 64MB for the AST2400
38293bf276dSCédric Le Goater          * SoC and 128MB for the AST2500 SoC, which is twice as big as
38393bf276dSCédric Le Goater          * needed by the flash modules of the Aspeed machines.
384d769a1daSCédric Le Goater          */
3851a15311aSCédric Le Goater         if (ASPEED_MACHINE(machine)->mmio_exec) {
386f489960dSPhilippe Mathieu-Daudé             memory_region_init_alias(boot_rom, NULL, "aspeed.boot_rom",
3876bb55e79SCédric Le Goater                                      &fl->mmio, 0, size);
3881a15311aSCédric Le Goater             memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
3891a15311aSCédric Le Goater                                         boot_rom);
3901a15311aSCédric Le Goater         } else {
391f489960dSPhilippe Mathieu-Daudé             memory_region_init_rom(boot_rom, NULL, "aspeed.boot_rom",
3926bb55e79SCédric Le Goater                                    size, &error_abort);
393d769a1daSCédric Le Goater             memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
394d769a1daSCédric Le Goater                                         boot_rom);
3956bb55e79SCédric Le Goater             write_boot_rom(drive0, FIRMWARE_ADDR, size, &error_abort);
396d769a1daSCédric Le Goater         }
3971a15311aSCédric Le Goater     }
398d769a1daSCédric Le Goater 
399b7f1a0cbSCédric Le Goater     if (machine->kernel_filename && sc->num_cpus > 1) {
4009bb6d140SJoel Stanley         /* With no u-boot we must set up a boot stub for the secondary CPU */
4019bb6d140SJoel Stanley         MemoryRegion *smpboot = g_new(MemoryRegion, 1);
402f489960dSPhilippe Mathieu-Daudé         memory_region_init_ram(smpboot, NULL, "aspeed.smpboot",
4039bb6d140SJoel Stanley                                0x80, &error_abort);
4049bb6d140SJoel Stanley         memory_region_add_subregion(get_system_memory(),
4059bb6d140SJoel Stanley                                     AST_SMP_MAILBOX_BASE, smpboot);
4069bb6d140SJoel Stanley 
4079bb6d140SJoel Stanley         aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot;
4089bb6d140SJoel Stanley         aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary;
4099bb6d140SJoel Stanley         aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE;
4109bb6d140SJoel Stanley     }
4119bb6d140SJoel Stanley 
4126e504a98SPaolo Bonzini     aspeed_board_binfo.ram_size = machine->ram_size;
413347df6f8SEduardo Habkost     aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM];
414b033271fSCédric Le Goater 
415baa4732bSCédric Le Goater     if (amc->i2c_init) {
416baa4732bSCédric Le Goater         amc->i2c_init(bmc);
4172cf6cb50SCédric Le Goater     }
4182cf6cb50SCédric Le Goater 
4190e2c24c6SAndrew Jeffery     for (i = 0; i < bmc->soc.sdhci.num_slots; i++) {
4208ec239f2SMarkus Armbruster         sdhci_attach_drive(&bmc->soc.sdhci.slots[i],
4218ec239f2SMarkus Armbruster                            drive_get(IF_SD, 0, i));
422a29e3e12SAndrew Jeffery     }
4232bea128cSEddie James 
424a29e3e12SAndrew Jeffery     if (bmc->soc.emmc.num_slots) {
4258ec239f2SMarkus Armbruster         sdhci_attach_drive(&bmc->soc.emmc.slots[0],
4268ec239f2SMarkus Armbruster                            drive_get(IF_SD, 0, bmc->soc.sdhci.num_slots));
4272bea128cSEddie James     }
4282bea128cSEddie James 
4292744ece8STao Xu     arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo);
430327d8e4eSAndrew Jeffery }
431327d8e4eSAndrew Jeffery 
43282b6a3f6SJohn Wang static void at24c_eeprom_init(I2CBus *bus, uint8_t addr, uint32_t rsize)
43382b6a3f6SJohn Wang {
43482b6a3f6SJohn Wang     I2CSlave *i2c_dev = i2c_slave_new("at24c-eeprom", addr);
43582b6a3f6SJohn Wang     DeviceState *dev = DEVICE(i2c_dev);
43682b6a3f6SJohn Wang 
43782b6a3f6SJohn Wang     qdev_prop_set_uint32(dev, "rom-size", rsize);
43882b6a3f6SJohn Wang     i2c_slave_realize_and_unref(i2c_dev, bus, &error_abort);
43982b6a3f6SJohn Wang }
44082b6a3f6SJohn Wang 
441612b219aSPhilippe Mathieu-Daudé static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
4422cf6cb50SCédric Le Goater {
4432cf6cb50SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
444a87e81b9SCédric Le Goater     DeviceState *dev;
4453d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
4462cf6cb50SCédric Le Goater 
4472cf6cb50SCédric Le Goater     /* The palmetto platform expects a ds3231 RTC but a ds1338 is
4482cf6cb50SCédric Le Goater      * enough to provide basic RTC features. Alarms will be missing */
4491373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
450a87e81b9SCédric Le Goater 
4517a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
4523d165f12SCédric Le Goater                           eeprom_buf);
4533d165f12SCédric Le Goater 
454a87e81b9SCédric Le Goater     /* add a TMP423 temperature sensor */
4551373b15bSPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
4561373b15bSPhilippe Mathieu-Daudé                                          "tmp423", 0x4c));
4575325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
4585325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
4595325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
4605325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort);
4612cf6cb50SCédric Le Goater }
4622cf6cb50SCédric Le Goater 
4639cccb912SPatrick Venture static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc)
4649cccb912SPatrick Venture {
4659cccb912SPatrick Venture     AspeedSoCState *soc = &bmc->soc;
4669cccb912SPatrick Venture 
4679cccb912SPatrick Venture     /*
4689cccb912SPatrick Venture      * The quanta-q71l platform expects tmp75s which are compatible with
4699cccb912SPatrick Venture      * tmp105s.
4709cccb912SPatrick Venture      */
4719cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c);
4729cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e);
4739cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f);
4749cccb912SPatrick Venture 
4759cccb912SPatrick Venture     /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */
4769cccb912SPatrick Venture     /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */
4779cccb912SPatrick Venture     /* TODO: Add Memory Riser i2c mux and eeproms. */
4789cccb912SPatrick Venture 
4793ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74);
4803ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77);
4813ec75e39SPatrick Venture 
4829cccb912SPatrick Venture     /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */
4833ec75e39SPatrick Venture 
4843ec75e39SPatrick Venture     /* i2c-7 */
4853ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70);
4869cccb912SPatrick Venture     /*        - i2c@0: pmbus@59 */
4879cccb912SPatrick Venture     /*        - i2c@1: pmbus@58 */
4889cccb912SPatrick Venture     /*        - i2c@2: pmbus@58 */
4899cccb912SPatrick Venture     /*        - i2c@3: pmbus@59 */
4903ec75e39SPatrick Venture 
4919cccb912SPatrick Venture     /* TODO: i2c-7: Add PDB FRU eeprom@52 */
4929cccb912SPatrick Venture     /* TODO: i2c-8: Add BMC FRU eeprom@50 */
4939cccb912SPatrick Venture }
4949cccb912SPatrick Venture 
495612b219aSPhilippe Mathieu-Daudé static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
4962cf6cb50SCédric Le Goater {
4972cf6cb50SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
4983d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
4993d165f12SCédric Le Goater 
5007a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50,
5013d165f12SCédric Le Goater                           eeprom_buf);
5022cf6cb50SCédric Le Goater 
5032cf6cb50SCédric Le Goater     /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
5041373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
505044475f3SPhilippe Mathieu-Daudé                      TYPE_TMP105, 0x4d);
5062cf6cb50SCédric Le Goater }
5072cf6cb50SCédric Le Goater 
508612b219aSPhilippe Mathieu-Daudé static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
509ccc2c418SCédric Le Goater {
51052bcd997SHoward Chiu     AspeedSoCState *soc = &bmc->soc;
51152bcd997SHoward Chiu     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
51252bcd997SHoward Chiu 
51352bcd997SHoward Chiu     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50,
51452bcd997SHoward Chiu                           eeprom_buf);
51552bcd997SHoward Chiu 
51652bcd997SHoward Chiu     /* LM75 is compatible with TMP105 driver */
51752bcd997SHoward Chiu     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
51852bcd997SHoward Chiu                      TYPE_TMP105, 0x4d);
519ccc2c418SCédric Le Goater }
520ccc2c418SCédric Le Goater 
521612b219aSPhilippe Mathieu-Daudé static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
5226c4567c7SCédric Le Goater {
5236c4567c7SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
5246c4567c7SCédric Le Goater 
5256c4567c7SCédric Le Goater     /* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
5266c4567c7SCédric Le Goater      * good enough */
5271373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
5286c4567c7SCédric Le Goater }
5296c4567c7SCédric Le Goater 
530f4aec252SCédric Le Goater static void create_pca9552(AspeedSoCState *soc, int bus_id, int addr)
531f4aec252SCédric Le Goater {
532f4aec252SCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, bus_id),
533f4aec252SCédric Le Goater                             TYPE_PCA9552, addr);
534f4aec252SCédric Le Goater }
535f4aec252SCédric Le Goater 
536612b219aSPhilippe Mathieu-Daudé static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc)
537143b040fSPatrick Williams {
538143b040fSPatrick Williams     AspeedSoCState *soc = &bmc->soc;
539143b040fSPatrick Williams 
540143b040fSPatrick Williams     /* bus 2 : */
5411373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48);
5421373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49);
543143b040fSPatrick Williams     /* bus 2 : pca9546 @ 0x73 */
544143b040fSPatrick Williams 
545143b040fSPatrick Williams     /* bus 3 : pca9548 @ 0x70 */
546143b040fSPatrick Williams 
547143b040fSPatrick Williams     /* bus 4 : */
548143b040fSPatrick Williams     uint8_t *eeprom4_54 = g_malloc0(8 * 1024);
5497a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54,
550143b040fSPatrick Williams                           eeprom4_54);
551143b040fSPatrick Williams     /* PCA9539 @ 0x76, but PCA9552 is compatible */
552f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x76);
553143b040fSPatrick Williams     /* PCA9539 @ 0x77, but PCA9552 is compatible */
554f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x77);
555143b040fSPatrick Williams 
556143b040fSPatrick Williams     /* bus 6 : */
5571373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48);
5581373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49);
559143b040fSPatrick Williams     /* bus 6 : pca9546 @ 0x73 */
560143b040fSPatrick Williams 
561143b040fSPatrick Williams     /* bus 8 : */
562143b040fSPatrick Williams     uint8_t *eeprom8_56 = g_malloc0(8 * 1024);
5637a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56,
564143b040fSPatrick Williams                           eeprom8_56);
565f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x60);
566f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x61);
567143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1d */
568143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1f */
569143b040fSPatrick Williams 
570143b040fSPatrick Williams     /*
571143b040fSPatrick Williams      * bus 13 : pca9548 @ 0x71
572143b040fSPatrick Williams      *      - channel 3:
573143b040fSPatrick Williams      *          - tmm421 @ 0x4c
574143b040fSPatrick Williams      *          - tmp421 @ 0x4e
575143b040fSPatrick Williams      *          - tmp421 @ 0x4f
576143b040fSPatrick Williams      */
577143b040fSPatrick Williams 
578143b040fSPatrick Williams }
579143b040fSPatrick Williams 
580612b219aSPhilippe Mathieu-Daudé static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
58162c2c2ebSCédric Le Goater {
5827cfbde5eSPhilippe Mathieu-Daudé     static const struct {
5837cfbde5eSPhilippe Mathieu-Daudé         unsigned gpio_id;
5847cfbde5eSPhilippe Mathieu-Daudé         LEDColor color;
5857cfbde5eSPhilippe Mathieu-Daudé         const char *description;
5867cfbde5eSPhilippe Mathieu-Daudé         bool gpio_polarity;
5877cfbde5eSPhilippe Mathieu-Daudé     } pca1_leds[] = {
5887cfbde5eSPhilippe Mathieu-Daudé         {13, LED_COLOR_GREEN, "front-fault-4",  GPIO_POLARITY_ACTIVE_LOW},
5897cfbde5eSPhilippe Mathieu-Daudé         {14, LED_COLOR_GREEN, "front-power-3",  GPIO_POLARITY_ACTIVE_LOW},
5907cfbde5eSPhilippe Mathieu-Daudé         {15, LED_COLOR_GREEN, "front-id-5",     GPIO_POLARITY_ACTIVE_LOW},
5917cfbde5eSPhilippe Mathieu-Daudé     };
59262c2c2ebSCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
5933d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
59415ce12cfSPhilippe Mathieu-Daudé     DeviceState *dev;
5957cfbde5eSPhilippe Mathieu-Daudé     LEDState *led;
59662c2c2ebSCédric Le Goater 
59763ceb818SCédric Le Goater     /* Bus 3: TODO bmp280@77 */
598db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
59915ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca1");
6002616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
6012616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 3),
60215ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
6038c9a61d7SCédric Le Goater 
6047cfbde5eSPhilippe Mathieu-Daudé     for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) {
6057cfbde5eSPhilippe Mathieu-Daudé         led = led_create_simple(OBJECT(bmc),
6067cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].gpio_polarity,
6077cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].color,
6087cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].description);
6097cfbde5eSPhilippe Mathieu-Daudé         qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id,
6107cfbde5eSPhilippe Mathieu-Daudé                               qdev_get_gpio_in(DEVICE(led), 0));
6117cfbde5eSPhilippe Mathieu-Daudé     }
612b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76);
6132a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "max31785", 0x52);
6141373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c);
6151373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c);
61662c2c2ebSCédric Le Goater 
61762c2c2ebSCédric Le Goater     /* The Witherspoon expects a TMP275 but a TMP105 is compatible */
6181373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105,
619044475f3SPhilippe Mathieu-Daudé                      0x4a);
6206c4567c7SCédric Le Goater 
6216c4567c7SCédric Le Goater     /* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
6226c4567c7SCédric Le Goater      * good enough */
6231373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
6243d165f12SCédric Le Goater 
6257a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51,
6263d165f12SCédric Le Goater                           eeprom_buf);
627db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
62815ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca0");
6292616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
6302616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 11),
63115ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
63263ceb818SCédric Le Goater     /* Bus 11: TODO ucd90160@64 */
63362c2c2ebSCédric Le Goater }
63462c2c2ebSCédric Le Goater 
63595f068c8SJohn Wang static void g220a_bmc_i2c_init(AspeedMachineState *bmc)
63695f068c8SJohn Wang {
63795f068c8SJohn Wang     AspeedSoCState *soc = &bmc->soc;
63895f068c8SJohn Wang     DeviceState *dev;
63995f068c8SJohn Wang 
64095f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3),
64195f068c8SJohn Wang                                          "emc1413", 0x4c));
64295f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
64395f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
64495f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
64595f068c8SJohn Wang 
64695f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12),
64795f068c8SJohn Wang                                          "emc1413", 0x4c));
64895f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
64995f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
65095f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
65195f068c8SJohn Wang 
65295f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13),
65395f068c8SJohn Wang                                          "emc1413", 0x4c));
65495f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
65595f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
65695f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
6576f5f6507SJohn Wang 
6586f5f6507SJohn Wang     static uint8_t eeprom_buf[2 * 1024] = {
6596f5f6507SJohn Wang             0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe,
6606f5f6507SJohn Wang             0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65,
6616f5f6507SJohn Wang             0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32,
6626f5f6507SJohn Wang             0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42,
6636f5f6507SJohn Wang             0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45,
6646f5f6507SJohn Wang             0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1,
6656f5f6507SJohn Wang             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7,
6666f5f6507SJohn Wang     };
6676f5f6507SJohn Wang     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57,
6686f5f6507SJohn Wang                           eeprom_buf);
66995f068c8SJohn Wang }
67095f068c8SJohn Wang 
671fa6d98c0SJoel Stanley static void aspeed_eeprom_init(I2CBus *bus, uint8_t addr, uint32_t rsize)
672fa6d98c0SJoel Stanley {
673fa6d98c0SJoel Stanley     I2CSlave *i2c_dev = i2c_slave_new("at24c-eeprom", addr);
674fa6d98c0SJoel Stanley     DeviceState *dev = DEVICE(i2c_dev);
675fa6d98c0SJoel Stanley 
676fa6d98c0SJoel Stanley     qdev_prop_set_uint32(dev, "rom-size", rsize);
677fa6d98c0SJoel Stanley     i2c_slave_realize_and_unref(i2c_dev, bus, &error_abort);
678fa6d98c0SJoel Stanley }
679fa6d98c0SJoel Stanley 
68082b6a3f6SJohn Wang static void fp5280g2_bmc_i2c_init(AspeedMachineState *bmc)
68182b6a3f6SJohn Wang {
68282b6a3f6SJohn Wang     AspeedSoCState *soc = &bmc->soc;
68382b6a3f6SJohn Wang     I2CSlave *i2c_mux;
68482b6a3f6SJohn Wang 
68582b6a3f6SJohn Wang     /* The at24c256 */
68682b6a3f6SJohn Wang     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 1), 0x50, 32768);
68782b6a3f6SJohn Wang 
68882b6a3f6SJohn Wang     /* The fp5280g2 expects a TMP112 but a TMP105 is compatible */
68982b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
69082b6a3f6SJohn Wang                      0x48);
69182b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
69282b6a3f6SJohn Wang                      0x49);
69382b6a3f6SJohn Wang 
69482b6a3f6SJohn Wang     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
69582b6a3f6SJohn Wang                      "pca9546", 0x70);
69682b6a3f6SJohn Wang     /* It expects a TMP112 but a TMP105 is compatible */
69782b6a3f6SJohn Wang     i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0), TYPE_TMP105,
69882b6a3f6SJohn Wang                      0x4a);
69982b6a3f6SJohn Wang 
70082b6a3f6SJohn Wang     /* It expects a ds3232 but a ds1338 is good enough */
70182b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "ds1338", 0x68);
70282b6a3f6SJohn Wang 
70382b6a3f6SJohn Wang     /* It expects a pca9555 but a pca9552 is compatible */
704f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x30);
70582b6a3f6SJohn Wang }
70682b6a3f6SJohn Wang 
70758e52bdbSCédric Le Goater static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
70858e52bdbSCédric Le Goater {
70958e52bdbSCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
710fa6d98c0SJoel Stanley     I2CSlave *i2c_mux;
711fa6d98c0SJoel Stanley 
712fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB);
71358e52bdbSCédric Le Goater 
714f4aec252SCédric Le Goater     create_pca9552(soc, 3, 0x61);
715bcb122f8SJoel Stanley 
71658e52bdbSCédric Le Goater     /* The rainier expects a TMP275 but a TMP105 is compatible */
71758e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
71858e52bdbSCédric Le Goater                      0x48);
71958e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
72058e52bdbSCédric Le Goater                      0x49);
72158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
72258e52bdbSCédric Le Goater                      0x4a);
723fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4),
724fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
725fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
726fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
727fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB);
728f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x60);
72958e52bdbSCédric Le Goater 
73058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
73158e52bdbSCédric Le Goater                      0x48);
73258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
73358e52bdbSCédric Le Goater                      0x49);
734f4aec252SCédric Le Goater     create_pca9552(soc, 5, 0x60);
735f4aec252SCédric Le Goater     create_pca9552(soc, 5, 0x61);
736fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5),
737fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
738fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
739fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
74058e52bdbSCédric Le Goater 
74158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
74258e52bdbSCédric Le Goater                      0x48);
74358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
74458e52bdbSCédric Le Goater                      0x4a);
74558e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
74658e52bdbSCédric Le Goater                      0x4b);
747fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6),
748fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
749fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
750fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
751fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB);
752fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB);
75358e52bdbSCédric Le Goater 
754f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x30);
755f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x31);
756f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x32);
757f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x33);
758f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x60);
759f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x61);
760b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76);
76158e52bdbSCédric Le Goater     /* Bus 7: TODO si7021-a20@20 */
76258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105,
76358e52bdbSCédric Le Goater                      0x48);
7642a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "max31785", 0x52);
765fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB);
766fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB);
76758e52bdbSCédric Le Goater 
76858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
76958e52bdbSCédric Le Goater                      0x48);
77058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
77158e52bdbSCédric Le Goater                      0x4a);
772fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50, 64 * KiB);
773fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 64 * KiB);
774f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x60);
775f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x61);
77658e52bdbSCédric Le Goater     /* Bus 8: ucd90320@11 */
77758e52bdbSCédric Le Goater     /* Bus 8: ucd90320@b */
77858e52bdbSCédric Le Goater     /* Bus 8: ucd90320@c */
77958e52bdbSCédric Le Goater 
78058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c);
78158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d);
782fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB);
78358e52bdbSCédric Le Goater 
78458e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c);
78558e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d);
786fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB);
78758e52bdbSCédric Le Goater 
78858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
78958e52bdbSCédric Le Goater                      0x48);
79058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
79158e52bdbSCédric Le Goater                      0x49);
792fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11),
793fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
794fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
795fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
796f4aec252SCédric Le Goater     create_pca9552(soc, 11, 0x60);
797fa6d98c0SJoel Stanley 
798fa6d98c0SJoel Stanley 
799fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB);
800f4aec252SCédric Le Goater     create_pca9552(soc, 13, 0x60);
801fa6d98c0SJoel Stanley 
802fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB);
803f4aec252SCédric Le Goater     create_pca9552(soc, 14, 0x60);
804fa6d98c0SJoel Stanley 
805fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB);
806f4aec252SCédric Le Goater     create_pca9552(soc, 15, 0x60);
80758e52bdbSCédric Le Goater }
80858e52bdbSCédric Le Goater 
809febbe308SPeter Delevoryas static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr,
810febbe308SPeter Delevoryas                                  I2CBus **channels)
811febbe308SPeter Delevoryas {
812febbe308SPeter Delevoryas     I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr);
813febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
814febbe308SPeter Delevoryas         channels[i] = pca954x_i2c_get_bus(mux, i);
815febbe308SPeter Delevoryas     }
816febbe308SPeter Delevoryas }
817febbe308SPeter Delevoryas 
818febbe308SPeter Delevoryas #define TYPE_LM75 TYPE_TMP105
819febbe308SPeter Delevoryas #define TYPE_TMP75 TYPE_TMP105
820febbe308SPeter Delevoryas #define TYPE_TMP422 "tmp422"
821febbe308SPeter Delevoryas 
822febbe308SPeter Delevoryas static void fuji_bmc_i2c_init(AspeedMachineState *bmc)
823febbe308SPeter Delevoryas {
824febbe308SPeter Delevoryas     AspeedSoCState *soc = &bmc->soc;
825febbe308SPeter Delevoryas     I2CBus *i2c[144] = {};
826febbe308SPeter Delevoryas 
827febbe308SPeter Delevoryas     for (int i = 0; i < 16; i++) {
828febbe308SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
829febbe308SPeter Delevoryas     }
830febbe308SPeter Delevoryas     I2CBus *i2c180 = i2c[2];
831febbe308SPeter Delevoryas     I2CBus *i2c480 = i2c[8];
832febbe308SPeter Delevoryas     I2CBus *i2c600 = i2c[11];
833febbe308SPeter Delevoryas 
834febbe308SPeter Delevoryas     get_pca9548_channels(i2c180, 0x70, &i2c[16]);
835febbe308SPeter Delevoryas     get_pca9548_channels(i2c480, 0x70, &i2c[24]);
836febbe308SPeter Delevoryas     /* NOTE: The device tree skips [32, 40) in the alias numbering */
837febbe308SPeter Delevoryas     get_pca9548_channels(i2c600, 0x77, &i2c[40]);
838febbe308SPeter Delevoryas     get_pca9548_channels(i2c[24], 0x71, &i2c[48]);
839febbe308SPeter Delevoryas     get_pca9548_channels(i2c[25], 0x72, &i2c[56]);
840febbe308SPeter Delevoryas     get_pca9548_channels(i2c[26], 0x76, &i2c[64]);
841febbe308SPeter Delevoryas     get_pca9548_channels(i2c[27], 0x76, &i2c[72]);
842febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
843febbe308SPeter Delevoryas         get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]);
844febbe308SPeter Delevoryas     }
845febbe308SPeter Delevoryas 
846febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c);
847febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d);
848febbe308SPeter Delevoryas 
849febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[19], 0x52, 64 * KiB);
850febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[20], 0x50, 2 * KiB);
851febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[22], 0x52, 2 * KiB);
852febbe308SPeter Delevoryas 
853febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x48);
854febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x49);
855febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x4a);
856febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_TMP422, 0x4c);
857febbe308SPeter Delevoryas 
858febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[8], 0x51, 64 * KiB);
859febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a);
860febbe308SPeter Delevoryas 
861febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[50], TYPE_LM75, 0x4c);
862febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[50], 0x52, 64 * KiB);
863febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[51], TYPE_TMP75, 0x48);
864febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[52], TYPE_TMP75, 0x49);
865febbe308SPeter Delevoryas 
866febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[59], TYPE_TMP75, 0x48);
867febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[60], TYPE_TMP75, 0x49);
868febbe308SPeter Delevoryas 
869febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[65], 0x53, 64 * KiB);
870febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x49);
871febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x48);
872febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[68], 0x52, 64 * KiB);
873febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[69], 0x52, 64 * KiB);
874febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[70], 0x52, 64 * KiB);
875febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[71], 0x52, 64 * KiB);
876febbe308SPeter Delevoryas 
877febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[73], 0x53, 64 * KiB);
878febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x49);
879febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x48);
880febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[76], 0x52, 64 * KiB);
881febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[77], 0x52, 64 * KiB);
882febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[78], 0x52, 64 * KiB);
883febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[79], 0x52, 64 * KiB);
884febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[28], 0x50, 2 * KiB);
885febbe308SPeter Delevoryas 
886febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
887febbe308SPeter Delevoryas         aspeed_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB);
888febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[82 + i * 8], TYPE_TMP75, 0x48);
889febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[83 + i * 8], TYPE_TMP75, 0x4b);
890febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[84 + i * 8], TYPE_TMP75, 0x4a);
891febbe308SPeter Delevoryas     }
892febbe308SPeter Delevoryas }
893febbe308SPeter Delevoryas 
894a20c54b1SPatrick Williams #define TYPE_TMP421 "tmp421"
895a20c54b1SPatrick Williams 
896a20c54b1SPatrick Williams static void bletchley_bmc_i2c_init(AspeedMachineState *bmc)
897a20c54b1SPatrick Williams {
898a20c54b1SPatrick Williams     AspeedSoCState *soc = &bmc->soc;
899a20c54b1SPatrick Williams     I2CBus *i2c[13] = {};
900a20c54b1SPatrick Williams     for (int i = 0; i < 13; i++) {
901a20c54b1SPatrick Williams         if ((i == 8) || (i == 11)) {
902a20c54b1SPatrick Williams             continue;
903a20c54b1SPatrick Williams         }
904a20c54b1SPatrick Williams         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
905a20c54b1SPatrick Williams     }
906a20c54b1SPatrick Williams 
907a20c54b1SPatrick Williams     /* Bus 0 - 5 all have the same config. */
908a20c54b1SPatrick Williams     for (int i = 0; i < 6; i++) {
909a20c54b1SPatrick Williams         /* Missing model: ti,ina230 @ 0x45 */
910a20c54b1SPatrick Williams         /* Missing model: mps,mp5023 @ 0x40 */
911a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_TMP421, 0x4f);
912a20c54b1SPatrick Williams         /* Missing model: nxp,pca9539 @ 0x76, but PCA9552 works enough */
913a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x76);
914a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x67);
915a20c54b1SPatrick Williams         /* Missing model: fsc,fusb302 @ 0x22 */
916a20c54b1SPatrick Williams     }
917a20c54b1SPatrick Williams 
918a20c54b1SPatrick Williams     /* Bus 6 */
919a20c54b1SPatrick Williams     at24c_eeprom_init(i2c[6], 0x56, 65536);
920a20c54b1SPatrick Williams     /* Missing model: nxp,pcf85263 @ 0x51 , but ds1338 works enough */
921a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[6], "ds1338", 0x51);
922a20c54b1SPatrick Williams 
923a20c54b1SPatrick Williams 
924a20c54b1SPatrick Williams     /* Bus 7 */
925a20c54b1SPatrick Williams     at24c_eeprom_init(i2c[7], 0x54, 65536);
926a20c54b1SPatrick Williams 
927a20c54b1SPatrick Williams     /* Bus 9 */
928a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[9], TYPE_TMP421, 0x4f);
929a20c54b1SPatrick Williams 
930a20c54b1SPatrick Williams     /* Bus 10 */
931a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[10], TYPE_TMP421, 0x4f);
932a20c54b1SPatrick Williams     /* Missing model: ti,hdc1080 @ 0x40 */
933a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[10], TYPE_PCA9552, 0x67);
934a20c54b1SPatrick Williams 
935a20c54b1SPatrick Williams     /* Bus 12 */
936a20c54b1SPatrick Williams     /* Missing model: adi,adm1278 @ 0x11 */
937a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4c);
938a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4d);
939a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_PCA9552, 0x67);
940a20c54b1SPatrick Williams }
941a20c54b1SPatrick Williams 
942fa699e80SPeter Delevoryas static void fby35_i2c_init(AspeedMachineState *bmc)
943fa699e80SPeter Delevoryas {
944fa699e80SPeter Delevoryas     AspeedSoCState *soc = &bmc->soc;
945fa699e80SPeter Delevoryas     I2CBus *i2c[16];
946fa699e80SPeter Delevoryas 
947fa699e80SPeter Delevoryas     for (int i = 0; i < 16; i++) {
948fa699e80SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
949fa699e80SPeter Delevoryas     }
950fa699e80SPeter Delevoryas 
951fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[2], TYPE_LM75, 0x4f);
952fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_TMP421, 0x1f);
953fa699e80SPeter Delevoryas     /* Hotswap controller is actually supposed to be mp5920 or ltc4282. */
954fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[11], "adm1272", 0x44);
955fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4e);
956fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4f);
957fa699e80SPeter Delevoryas 
958fa699e80SPeter Delevoryas     aspeed_eeprom_init(i2c[4], 0x51, 128 * KiB);
959fa699e80SPeter Delevoryas     aspeed_eeprom_init(i2c[6], 0x51, 128 * KiB);
960fa699e80SPeter Delevoryas     aspeed_eeprom_init(i2c[8], 0x50, 32 * KiB);
961fa699e80SPeter Delevoryas     aspeed_eeprom_init(i2c[11], 0x51, 128 * KiB);
962fa699e80SPeter Delevoryas     aspeed_eeprom_init(i2c[11], 0x54, 128 * KiB);
963fa699e80SPeter Delevoryas 
964fa699e80SPeter Delevoryas     /*
965fa699e80SPeter Delevoryas      * TODO: There is a multi-master i2c connection to an AST1030 MiniBMC on
966fa699e80SPeter Delevoryas      * buses 0, 1, 2, 3, and 9. Source address 0x10, target address 0x20 on
967fa699e80SPeter Delevoryas      * each.
968fa699e80SPeter Delevoryas      */
969fa699e80SPeter Delevoryas }
970fa699e80SPeter Delevoryas 
971fb6b3c8dSJae Hyun Yoo static void qcom_dc_scm_bmc_i2c_init(AspeedMachineState *bmc)
972fb6b3c8dSJae Hyun Yoo {
973fb6b3c8dSJae Hyun Yoo     AspeedSoCState *soc = &bmc->soc;
974fb6b3c8dSJae Hyun Yoo 
975fb6b3c8dSJae Hyun Yoo     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 15), "tmp105", 0x4d);
976fb6b3c8dSJae Hyun Yoo }
977fb6b3c8dSJae Hyun Yoo 
978ece4cccdSGraeme Gregory static void qcom_dc_scm_firework_i2c_init(AspeedMachineState *bmc)
979ece4cccdSGraeme Gregory {
980ece4cccdSGraeme Gregory     AspeedSoCState *soc = &bmc->soc;
9812a7a5d5cSJae Hyun Yoo     I2CSlave *therm_mux, *cpuvr_mux;
982ece4cccdSGraeme Gregory 
983ece4cccdSGraeme Gregory     /* Create the generic DC-SCM hardware */
984ece4cccdSGraeme Gregory     qcom_dc_scm_bmc_i2c_init(bmc);
985ece4cccdSGraeme Gregory 
986ece4cccdSGraeme Gregory     /* Now create the Firework specific hardware */
9872a75e8c3SMaheswara Kurapati 
9882a7a5d5cSJae Hyun Yoo     /* I2C7 CPUVR MUX */
9892a7a5d5cSJae Hyun Yoo     cpuvr_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
9902a7a5d5cSJae Hyun Yoo                                         "pca9546", 0x70);
9912a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 0), "pca9548", 0x72);
9922a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 1), "pca9548", 0x72);
9932a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 2), "pca9548", 0x72);
9942a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 3), "pca9548", 0x72);
9952a7a5d5cSJae Hyun Yoo 
996cfc68f16SMaheswara Kurapati     /* I2C8 Thermal Diodes*/
997cfc68f16SMaheswara Kurapati     therm_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
998cfc68f16SMaheswara Kurapati                                         "pca9548", 0x70);
999cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 0), TYPE_LM75, 0x4C);
1000cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 1), TYPE_LM75, 0x4C);
1001cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 2), TYPE_LM75, 0x48);
1002cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 3), TYPE_LM75, 0x48);
1003cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 4), TYPE_LM75, 0x48);
1004cfc68f16SMaheswara Kurapati 
10052a75e8c3SMaheswara Kurapati     /* I2C9 Fan Controller (MAX31785) */
10062a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x52);
10072a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x54);
1008ece4cccdSGraeme Gregory }
1009ece4cccdSGraeme Gregory 
10101a15311aSCédric Le Goater static bool aspeed_get_mmio_exec(Object *obj, Error **errp)
10111a15311aSCédric Le Goater {
10121a15311aSCédric Le Goater     return ASPEED_MACHINE(obj)->mmio_exec;
10131a15311aSCédric Le Goater }
10141a15311aSCédric Le Goater 
10151a15311aSCédric Le Goater static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp)
10161a15311aSCédric Le Goater {
10171a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = value;
10181a15311aSCédric Le Goater }
10191a15311aSCédric Le Goater 
10201a15311aSCédric Le Goater static void aspeed_machine_instance_init(Object *obj)
10211a15311aSCédric Le Goater {
10221a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = false;
10231a15311aSCédric Le Goater }
10241a15311aSCédric Le Goater 
10259820e52fSCédric Le Goater static char *aspeed_get_fmc_model(Object *obj, Error **errp)
10269820e52fSCédric Le Goater {
10279820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10289820e52fSCédric Le Goater     return g_strdup(bmc->fmc_model);
10299820e52fSCédric Le Goater }
10309820e52fSCédric Le Goater 
10319820e52fSCédric Le Goater static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp)
10329820e52fSCédric Le Goater {
10339820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10349820e52fSCédric Le Goater 
10359820e52fSCédric Le Goater     g_free(bmc->fmc_model);
10369820e52fSCédric Le Goater     bmc->fmc_model = g_strdup(value);
10379820e52fSCédric Le Goater }
10389820e52fSCédric Le Goater 
10399820e52fSCédric Le Goater static char *aspeed_get_spi_model(Object *obj, Error **errp)
10409820e52fSCédric Le Goater {
10419820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10429820e52fSCédric Le Goater     return g_strdup(bmc->spi_model);
10439820e52fSCédric Le Goater }
10449820e52fSCédric Le Goater 
10459820e52fSCédric Le Goater static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp)
10469820e52fSCédric Le Goater {
10479820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10489820e52fSCédric Le Goater 
10499820e52fSCédric Le Goater     g_free(bmc->spi_model);
10509820e52fSCédric Le Goater     bmc->spi_model = g_strdup(value);
10519820e52fSCédric Le Goater }
10529820e52fSCédric Le Goater 
10531a15311aSCédric Le Goater static void aspeed_machine_class_props_init(ObjectClass *oc)
10541a15311aSCédric Le Goater {
10551a15311aSCédric Le Goater     object_class_property_add_bool(oc, "execute-in-place",
10561a15311aSCédric Le Goater                                    aspeed_get_mmio_exec,
1057d2623129SMarkus Armbruster                                    aspeed_set_mmio_exec);
10581a15311aSCédric Le Goater     object_class_property_set_description(oc, "execute-in-place",
10597eecec7dSMarkus Armbruster                            "boot directly from CE0 flash device");
10609820e52fSCédric Le Goater 
10619820e52fSCédric Le Goater     object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model,
10629820e52fSCédric Le Goater                                    aspeed_set_fmc_model);
10639820e52fSCédric Le Goater     object_class_property_set_description(oc, "fmc-model",
10649820e52fSCédric Le Goater                                           "Change the FMC Flash model");
10659820e52fSCédric Le Goater     object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model,
10669820e52fSCédric Le Goater                                    aspeed_set_spi_model);
10679820e52fSCédric Le Goater     object_class_property_set_description(oc, "spi-model",
10689820e52fSCédric Le Goater                                           "Change the SPI Flash model");
10691a15311aSCédric Le Goater }
10701a15311aSCédric Le Goater 
1071b7f1a0cbSCédric Le Goater static int aspeed_soc_num_cpus(const char *soc_name)
1072b7f1a0cbSCédric Le Goater {
1073b7f1a0cbSCédric Le Goater    AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(soc_name));
1074b7f1a0cbSCédric Le Goater    return sc->num_cpus;
1075b7f1a0cbSCédric Le Goater }
1076b7f1a0cbSCédric Le Goater 
1077fca9ca1bSCédric Le Goater static void aspeed_machine_class_init(ObjectClass *oc, void *data)
107862c2c2ebSCédric Le Goater {
107962c2c2ebSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1080d3bad7e7SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
108162c2c2ebSCédric Le Goater 
1082fca9ca1bSCédric Le Goater     mc->init = aspeed_machine_init;
108362c2c2ebSCédric Le Goater     mc->no_floppy = 1;
108462c2c2ebSCédric Le Goater     mc->no_cdrom = 1;
108562c2c2ebSCédric Le Goater     mc->no_parallel = 1;
1086afcbaed6SIgor Mammedov     mc->default_ram_id = "ram";
1087d3bad7e7SCédric Le Goater     amc->macs_mask = ASPEED_MAC0_ON;
10885d63d0c7SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART5;
10891a15311aSCédric Le Goater 
10901a15311aSCédric Le Goater     aspeed_machine_class_props_init(oc);
109162c2c2ebSCédric Le Goater }
109262c2c2ebSCédric Le Goater 
1093baa4732bSCédric Le Goater static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
1094baa4732bSCédric Le Goater {
1095baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1096baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1097baa4732bSCédric Le Goater 
1098baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Palmetto BMC (ARM926EJ-S)";
1099baa4732bSCédric Le Goater     amc->soc_name  = "ast2400-a1";
1100baa4732bSCédric Le Goater     amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1;
1101baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
1102*70322913SCédric Le Goater     amc->spi_model = "mx25l25635f";
1103baa4732bSCédric Le Goater     amc->num_cs    = 1;
1104baa4732bSCédric Le Goater     amc->i2c_init  = palmetto_bmc_i2c_init;
1105baa4732bSCédric Le Goater     mc->default_ram_size       = 256 * MiB;
1106b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1107b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1108baa4732bSCédric Le Goater };
1109baa4732bSCédric Le Goater 
11109cccb912SPatrick Venture static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data)
11119cccb912SPatrick Venture {
11129cccb912SPatrick Venture     MachineClass *mc = MACHINE_CLASS(oc);
11139cccb912SPatrick Venture     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
11149cccb912SPatrick Venture 
11159cccb912SPatrick Venture     mc->desc       = "Quanta-Q71l BMC (ARM926EJ-S)";
11169cccb912SPatrick Venture     amc->soc_name  = "ast2400-a1";
11179cccb912SPatrick Venture     amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1;
11189cccb912SPatrick Venture     amc->fmc_model = "n25q256a";
11199cccb912SPatrick Venture     amc->spi_model = "mx25l25635e";
11209cccb912SPatrick Venture     amc->num_cs    = 1;
11219cccb912SPatrick Venture     amc->i2c_init  = quanta_q71l_bmc_i2c_init;
11229cccb912SPatrick Venture     mc->default_ram_size       = 128 * MiB;
11239cccb912SPatrick Venture     mc->default_cpus = mc->min_cpus = mc->max_cpus =
11249cccb912SPatrick Venture         aspeed_soc_num_cpus(amc->soc_name);
11259cccb912SPatrick Venture }
11269cccb912SPatrick Venture 
112740a38df5SErik Smit static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc,
112840a38df5SErik Smit                                                         void *data)
112940a38df5SErik Smit {
113040a38df5SErik Smit     MachineClass *mc = MACHINE_CLASS(oc);
113140a38df5SErik Smit     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
113240a38df5SErik Smit 
113340a38df5SErik Smit     mc->desc       = "Supermicro X11 BMC (ARM926EJ-S)";
113440a38df5SErik Smit     amc->soc_name  = "ast2400-a1";
113540a38df5SErik Smit     amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1;
113640a38df5SErik Smit     amc->fmc_model = "mx25l25635e";
113740a38df5SErik Smit     amc->spi_model = "mx25l25635e";
113840a38df5SErik Smit     amc->num_cs    = 1;
113940a38df5SErik Smit     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
114040a38df5SErik Smit     amc->i2c_init  = palmetto_bmc_i2c_init;
114140a38df5SErik Smit     mc->default_ram_size = 256 * MiB;
114240a38df5SErik Smit }
114340a38df5SErik Smit 
1144baa4732bSCédric Le Goater static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data)
1145baa4732bSCédric Le Goater {
1146baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1147baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1148baa4732bSCédric Le Goater 
1149baa4732bSCédric Le Goater     mc->desc       = "Aspeed AST2500 EVB (ARM1176)";
1150baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1151baa4732bSCédric Le Goater     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
1152753abfc4SJae Hyun Yoo     amc->fmc_model = "mx25l25635e";
1153*70322913SCédric Le Goater     amc->spi_model = "mx25l25635f";
1154baa4732bSCédric Le Goater     amc->num_cs    = 1;
1155baa4732bSCédric Le Goater     amc->i2c_init  = ast2500_evb_i2c_init;
1156baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
1157b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1158b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1159baa4732bSCédric Le Goater };
1160baa4732bSCédric Le Goater 
1161baa4732bSCédric Le Goater static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data)
1162baa4732bSCédric Le Goater {
1163baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1164baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1165baa4732bSCédric Le Goater 
1166baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Romulus BMC (ARM1176)";
1167baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1168baa4732bSCédric Le Goater     amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1;
1169baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
1170baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1171baa4732bSCédric Le Goater     amc->num_cs    = 2;
1172baa4732bSCédric Le Goater     amc->i2c_init  = romulus_bmc_i2c_init;
1173baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
1174b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1175b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1176baa4732bSCédric Le Goater };
1177baa4732bSCédric Le Goater 
1178143b040fSPatrick Williams static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data)
1179143b040fSPatrick Williams {
1180143b040fSPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1181143b040fSPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1182143b040fSPatrick Williams 
1183143b040fSPatrick Williams     mc->desc       = "OCP SonoraPass BMC (ARM1176)";
1184143b040fSPatrick Williams     amc->soc_name  = "ast2500-a1";
1185143b040fSPatrick Williams     amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1;
1186143b040fSPatrick Williams     amc->fmc_model = "mx66l1g45g";
1187143b040fSPatrick Williams     amc->spi_model = "mx66l1g45g";
1188143b040fSPatrick Williams     amc->num_cs    = 2;
1189143b040fSPatrick Williams     amc->i2c_init  = sonorapass_bmc_i2c_init;
1190143b040fSPatrick Williams     mc->default_ram_size       = 512 * MiB;
1191b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1192b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1193143b040fSPatrick Williams };
1194143b040fSPatrick Williams 
1195baa4732bSCédric Le Goater static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data)
1196baa4732bSCédric Le Goater {
1197baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1198baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1199baa4732bSCédric Le Goater 
1200baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Witherspoon BMC (ARM1176)";
1201baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1202baa4732bSCédric Le Goater     amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1;
1203*70322913SCédric Le Goater     amc->fmc_model = "mx25l25635f";
1204baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1205baa4732bSCédric Le Goater     amc->num_cs    = 2;
1206baa4732bSCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init;
1207baa4732bSCédric Le Goater     mc->default_ram_size = 512 * MiB;
1208b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1209b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1210baa4732bSCédric Le Goater };
1211baa4732bSCédric Le Goater 
1212baa4732bSCédric Le Goater static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
1213baa4732bSCédric Le Goater {
1214baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1215baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1216baa4732bSCédric Le Goater 
1217f548f201SPeter Maydell     mc->desc       = "Aspeed AST2600 EVB (Cortex-A7)";
1218c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
1219baa4732bSCédric Le Goater     amc->hw_strap1 = AST2600_EVB_HW_STRAP1;
1220baa4732bSCédric Le Goater     amc->hw_strap2 = AST2600_EVB_HW_STRAP2;
1221753abfc4SJae Hyun Yoo     amc->fmc_model = "mx66u51235f";
1222baa4732bSCédric Le Goater     amc->spi_model = "mx66u51235f";
1223baa4732bSCédric Le Goater     amc->num_cs    = 1;
122429193286SGuenter Roeck     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON |
122529193286SGuenter Roeck                      ASPEED_MAC3_ON;
1226baa4732bSCédric Le Goater     amc->i2c_init  = ast2600_evb_i2c_init;
1227baa4732bSCédric Le Goater     mc->default_ram_size = 1 * GiB;
1228b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1229b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1230baa4732bSCédric Le Goater };
1231baa4732bSCédric Le Goater 
123263ceb818SCédric Le Goater static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data)
123363ceb818SCédric Le Goater {
123463ceb818SCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
123563ceb818SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
123663ceb818SCédric Le Goater 
1237f548f201SPeter Maydell     mc->desc       = "OpenPOWER Tacoma BMC (Cortex-A7)";
1238c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
123963ceb818SCédric Le Goater     amc->hw_strap1 = TACOMA_BMC_HW_STRAP1;
124063ceb818SCédric Le Goater     amc->hw_strap2 = TACOMA_BMC_HW_STRAP2;
124163ceb818SCédric Le Goater     amc->fmc_model = "mx66l1g45g";
124263ceb818SCédric Le Goater     amc->spi_model = "mx66l1g45g";
124363ceb818SCédric Le Goater     amc->num_cs    = 2;
1244d3bad7e7SCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON;
124563ceb818SCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init; /* Same board layout */
124663ceb818SCédric Le Goater     mc->default_ram_size = 1 * GiB;
1247b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1248b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
124963ceb818SCédric Le Goater };
125063ceb818SCédric Le Goater 
125195f068c8SJohn Wang static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data)
125295f068c8SJohn Wang {
125395f068c8SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
125495f068c8SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
125595f068c8SJohn Wang 
125695f068c8SJohn Wang     mc->desc       = "Bytedance G220A BMC (ARM1176)";
125795f068c8SJohn Wang     amc->soc_name  = "ast2500-a1";
125895f068c8SJohn Wang     amc->hw_strap1 = G220A_BMC_HW_STRAP1;
125995f068c8SJohn Wang     amc->fmc_model = "n25q512a";
126095f068c8SJohn Wang     amc->spi_model = "mx25l25635e";
126195f068c8SJohn Wang     amc->num_cs    = 2;
12625bb825c8SGuenter Roeck     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
126395f068c8SJohn Wang     amc->i2c_init  = g220a_bmc_i2c_init;
126495f068c8SJohn Wang     mc->default_ram_size = 1024 * MiB;
126595f068c8SJohn Wang     mc->default_cpus = mc->min_cpus = mc->max_cpus =
126695f068c8SJohn Wang         aspeed_soc_num_cpus(amc->soc_name);
126795f068c8SJohn Wang };
126895f068c8SJohn Wang 
126982b6a3f6SJohn Wang static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc, void *data)
127082b6a3f6SJohn Wang {
127182b6a3f6SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
127282b6a3f6SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
127382b6a3f6SJohn Wang 
127482b6a3f6SJohn Wang     mc->desc       = "Inspur FP5280G2 BMC (ARM1176)";
127582b6a3f6SJohn Wang     amc->soc_name  = "ast2500-a1";
127682b6a3f6SJohn Wang     amc->hw_strap1 = FP5280G2_BMC_HW_STRAP1;
127782b6a3f6SJohn Wang     amc->fmc_model = "n25q512a";
127882b6a3f6SJohn Wang     amc->spi_model = "mx25l25635e";
127982b6a3f6SJohn Wang     amc->num_cs    = 2;
128082b6a3f6SJohn Wang     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
128182b6a3f6SJohn Wang     amc->i2c_init  = fp5280g2_bmc_i2c_init;
128282b6a3f6SJohn Wang     mc->default_ram_size = 512 * MiB;
128382b6a3f6SJohn Wang     mc->default_cpus = mc->min_cpus = mc->max_cpus =
128482b6a3f6SJohn Wang         aspeed_soc_num_cpus(amc->soc_name);
128582b6a3f6SJohn Wang };
128682b6a3f6SJohn Wang 
128758e52bdbSCédric Le Goater static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data)
128858e52bdbSCédric Le Goater {
128958e52bdbSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
129058e52bdbSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
129158e52bdbSCédric Le Goater 
1292f548f201SPeter Maydell     mc->desc       = "IBM Rainier BMC (Cortex-A7)";
1293c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
129458e52bdbSCédric Le Goater     amc->hw_strap1 = RAINIER_BMC_HW_STRAP1;
129558e52bdbSCédric Le Goater     amc->hw_strap2 = RAINIER_BMC_HW_STRAP2;
129658e52bdbSCédric Le Goater     amc->fmc_model = "mx66l1g45g";
129758e52bdbSCédric Le Goater     amc->spi_model = "mx66l1g45g";
129858e52bdbSCédric Le Goater     amc->num_cs    = 2;
129958e52bdbSCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
130058e52bdbSCédric Le Goater     amc->i2c_init  = rainier_bmc_i2c_init;
130158e52bdbSCédric Le Goater     mc->default_ram_size = 1 * GiB;
130258e52bdbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
130358e52bdbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
130458e52bdbSCédric Le Goater };
130558e52bdbSCédric Le Goater 
1306febbe308SPeter Delevoryas /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */
1307febbe308SPeter Delevoryas #if HOST_LONG_BITS == 32
1308febbe308SPeter Delevoryas #define FUJI_BMC_RAM_SIZE (1 * GiB)
1309febbe308SPeter Delevoryas #else
1310febbe308SPeter Delevoryas #define FUJI_BMC_RAM_SIZE (2 * GiB)
1311febbe308SPeter Delevoryas #endif
1312febbe308SPeter Delevoryas 
1313febbe308SPeter Delevoryas static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data)
1314febbe308SPeter Delevoryas {
1315febbe308SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1316febbe308SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1317febbe308SPeter Delevoryas 
1318febbe308SPeter Delevoryas     mc->desc = "Facebook Fuji BMC (Cortex-A7)";
1319febbe308SPeter Delevoryas     amc->soc_name = "ast2600-a3";
1320febbe308SPeter Delevoryas     amc->hw_strap1 = FUJI_BMC_HW_STRAP1;
1321febbe308SPeter Delevoryas     amc->hw_strap2 = FUJI_BMC_HW_STRAP2;
1322febbe308SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1323febbe308SPeter Delevoryas     amc->spi_model = "mx66l1g45g";
1324febbe308SPeter Delevoryas     amc->num_cs = 2;
1325febbe308SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1326febbe308SPeter Delevoryas     amc->i2c_init = fuji_bmc_i2c_init;
1327febbe308SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART1;
1328febbe308SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
1329febbe308SPeter Delevoryas     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1330febbe308SPeter Delevoryas         aspeed_soc_num_cpus(amc->soc_name);
1331febbe308SPeter Delevoryas };
1332febbe308SPeter Delevoryas 
1333104bdaffSPatrick Williams /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */
1334104bdaffSPatrick Williams #if HOST_LONG_BITS == 32
1335104bdaffSPatrick Williams #define BLETCHLEY_BMC_RAM_SIZE (1 * GiB)
1336104bdaffSPatrick Williams #else
1337104bdaffSPatrick Williams #define BLETCHLEY_BMC_RAM_SIZE (2 * GiB)
1338104bdaffSPatrick Williams #endif
1339104bdaffSPatrick Williams 
1340a20c54b1SPatrick Williams static void aspeed_machine_bletchley_class_init(ObjectClass *oc, void *data)
1341a20c54b1SPatrick Williams {
1342a20c54b1SPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1343a20c54b1SPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1344a20c54b1SPatrick Williams 
1345a20c54b1SPatrick Williams     mc->desc       = "Facebook Bletchley BMC (Cortex-A7)";
1346a20c54b1SPatrick Williams     amc->soc_name  = "ast2600-a3";
1347a20c54b1SPatrick Williams     amc->hw_strap1 = BLETCHLEY_BMC_HW_STRAP1;
1348a20c54b1SPatrick Williams     amc->hw_strap2 = BLETCHLEY_BMC_HW_STRAP2;
1349a20c54b1SPatrick Williams     amc->fmc_model = "w25q01jvq";
1350a20c54b1SPatrick Williams     amc->spi_model = NULL;
1351a20c54b1SPatrick Williams     amc->num_cs    = 2;
1352a20c54b1SPatrick Williams     amc->macs_mask = ASPEED_MAC2_ON;
1353a20c54b1SPatrick Williams     amc->i2c_init  = bletchley_bmc_i2c_init;
1354104bdaffSPatrick Williams     mc->default_ram_size = BLETCHLEY_BMC_RAM_SIZE;
1355a20c54b1SPatrick Williams     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1356a20c54b1SPatrick Williams         aspeed_soc_num_cpus(amc->soc_name);
1357a20c54b1SPatrick Williams }
1358a20c54b1SPatrick Williams 
1359fa699e80SPeter Delevoryas static void fby35_reset(MachineState *state)
1360fa699e80SPeter Delevoryas {
1361fa699e80SPeter Delevoryas     AspeedMachineState *bmc = ASPEED_MACHINE(state);
1362fa699e80SPeter Delevoryas     AspeedGPIOState *gpio = &bmc->soc.gpio;
1363fa699e80SPeter Delevoryas 
1364fa699e80SPeter Delevoryas     qemu_devices_reset();
1365fa699e80SPeter Delevoryas 
1366f0418558SPeter Delevoryas     /* Board ID: 7 (Class-1, 4 slots) */
1367fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV4", true, &error_fatal);
1368fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV5", true, &error_fatal);
1369fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV6", true, &error_fatal);
1370fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV7", false, &error_fatal);
1371f0418558SPeter Delevoryas 
1372f0418558SPeter Delevoryas     /* Slot presence pins, inverse polarity. (False means present) */
1373f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH4", false, &error_fatal);
1374f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH5", true, &error_fatal);
1375f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH6", true, &error_fatal);
1376f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioH7", true, &error_fatal);
1377f0418558SPeter Delevoryas 
1378f0418558SPeter Delevoryas     /* Slot 12v power pins, normal polarity. (True means powered-on) */
1379f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB2", true, &error_fatal);
1380f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB3", false, &error_fatal);
1381f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB4", false, &error_fatal);
1382f0418558SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioB5", false, &error_fatal);
1383fa699e80SPeter Delevoryas }
1384fa699e80SPeter Delevoryas 
1385fa699e80SPeter Delevoryas static void aspeed_machine_fby35_class_init(ObjectClass *oc, void *data)
1386fa699e80SPeter Delevoryas {
1387fa699e80SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1388fa699e80SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1389fa699e80SPeter Delevoryas 
1390fa699e80SPeter Delevoryas     mc->desc       = "Facebook fby35 BMC (Cortex-A7)";
1391fa699e80SPeter Delevoryas     mc->reset      = fby35_reset;
1392fa699e80SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1393fa699e80SPeter Delevoryas     amc->num_cs    = 2;
1394fa699e80SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1395fa699e80SPeter Delevoryas     amc->i2c_init  = fby35_i2c_init;
1396fa699e80SPeter Delevoryas     /* FIXME: Replace this macro with something more general */
1397fa699e80SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
1398fa699e80SPeter Delevoryas }
1399fa699e80SPeter Delevoryas 
140066c895b8SJamin Lin #define AST1030_INTERNAL_FLASH_SIZE (1024 * 1024)
140166c895b8SJamin Lin /* Main SYSCLK frequency in Hz (200MHz) */
140266c895b8SJamin Lin #define SYSCLK_FRQ 200000000ULL
140366c895b8SJamin Lin 
140466c895b8SJamin Lin static void aspeed_minibmc_machine_init(MachineState *machine)
140566c895b8SJamin Lin {
140666c895b8SJamin Lin     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
140766c895b8SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
140866c895b8SJamin Lin     Clock *sysclk;
140966c895b8SJamin Lin 
141066c895b8SJamin Lin     sysclk = clock_new(OBJECT(machine), "SYSCLK");
141166c895b8SJamin Lin     clock_set_hz(sysclk, SYSCLK_FRQ);
141266c895b8SJamin Lin 
141366c895b8SJamin Lin     object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
141466c895b8SJamin Lin     qdev_connect_clock_in(DEVICE(&bmc->soc), "sysclk", sysclk);
141566c895b8SJamin Lin 
14164dd9d554SPeter Delevoryas     object_property_set_link(OBJECT(&bmc->soc), "memory",
14174dd9d554SPeter Delevoryas                              OBJECT(get_system_memory()), &error_abort);
1418d2b3eaefSPeter Delevoryas     connect_serial_hds_to_uarts(bmc);
141966c895b8SJamin Lin     qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
142066c895b8SJamin Lin 
142166c895b8SJamin Lin     aspeed_board_init_flashes(&bmc->soc.fmc,
142266c895b8SJamin Lin                               bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
142366c895b8SJamin Lin                               amc->num_cs,
142466c895b8SJamin Lin                               0);
142566c895b8SJamin Lin 
142666c895b8SJamin Lin     aspeed_board_init_flashes(&bmc->soc.spi[0],
142766c895b8SJamin Lin                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
142866c895b8SJamin Lin                               amc->num_cs, amc->num_cs);
142966c895b8SJamin Lin 
143066c895b8SJamin Lin     aspeed_board_init_flashes(&bmc->soc.spi[1],
143166c895b8SJamin Lin                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
143266c895b8SJamin Lin                               amc->num_cs, (amc->num_cs * 2));
143366c895b8SJamin Lin 
143466c895b8SJamin Lin     if (amc->i2c_init) {
143566c895b8SJamin Lin         amc->i2c_init(bmc);
143666c895b8SJamin Lin     }
143766c895b8SJamin Lin 
143866c895b8SJamin Lin     armv7m_load_kernel(ARM_CPU(first_cpu),
143966c895b8SJamin Lin                        machine->kernel_filename,
1440761c532aSPeter Maydell                        0,
144166c895b8SJamin Lin                        AST1030_INTERNAL_FLASH_SIZE);
144266c895b8SJamin Lin }
144366c895b8SJamin Lin 
14444c70ab16STroy Lee static void ast1030_evb_i2c_init(AspeedMachineState *bmc)
14454c70ab16STroy Lee {
14464c70ab16STroy Lee     AspeedSoCState *soc = &bmc->soc;
14474c70ab16STroy Lee 
14484c70ab16STroy Lee     /* U10 24C08 connects to SDA/SCL Groupt 1 by default */
14494c70ab16STroy Lee     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
14504c70ab16STroy Lee     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, eeprom_buf);
14514c70ab16STroy Lee 
14524c70ab16STroy Lee     /* U11 LM75 connects to SDA/SCL Group 2 by default */
14534c70ab16STroy Lee     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d);
14544c70ab16STroy Lee }
14554c70ab16STroy Lee 
145666c895b8SJamin Lin static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc,
145766c895b8SJamin Lin                                                           void *data)
145866c895b8SJamin Lin {
145966c895b8SJamin Lin     MachineClass *mc = MACHINE_CLASS(oc);
146066c895b8SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
146166c895b8SJamin Lin 
146266c895b8SJamin Lin     mc->desc = "Aspeed AST1030 MiniBMC (Cortex-M4)";
146366c895b8SJamin Lin     amc->soc_name = "ast1030-a1";
146466c895b8SJamin Lin     amc->hw_strap1 = 0;
146566c895b8SJamin Lin     amc->hw_strap2 = 0;
146666c895b8SJamin Lin     mc->init = aspeed_minibmc_machine_init;
14674c70ab16STroy Lee     amc->i2c_init = ast1030_evb_i2c_init;
146866c895b8SJamin Lin     mc->default_ram_size = 0;
146966c895b8SJamin Lin     mc->default_cpus = mc->min_cpus = mc->max_cpus = 1;
147066c895b8SJamin Lin     amc->fmc_model = "sst25vf032b";
147166c895b8SJamin Lin     amc->spi_model = "sst25vf032b";
147266c895b8SJamin Lin     amc->num_cs = 2;
147366c895b8SJamin Lin     amc->macs_mask = 0;
147466c895b8SJamin Lin }
147566c895b8SJamin Lin 
1476fb6b3c8dSJae Hyun Yoo static void aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass *oc,
1477fb6b3c8dSJae Hyun Yoo                                                      void *data)
1478fb6b3c8dSJae Hyun Yoo {
1479fb6b3c8dSJae Hyun Yoo     MachineClass *mc = MACHINE_CLASS(oc);
1480fb6b3c8dSJae Hyun Yoo     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1481fb6b3c8dSJae Hyun Yoo 
1482fb6b3c8dSJae Hyun Yoo     mc->desc       = "Qualcomm DC-SCM V1 BMC (Cortex A7)";
1483fb6b3c8dSJae Hyun Yoo     amc->soc_name  = "ast2600-a3";
1484fb6b3c8dSJae Hyun Yoo     amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1485fb6b3c8dSJae Hyun Yoo     amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1486fb6b3c8dSJae Hyun Yoo     amc->fmc_model = "n25q512a";
1487fb6b3c8dSJae Hyun Yoo     amc->spi_model = "n25q512a";
1488fb6b3c8dSJae Hyun Yoo     amc->num_cs    = 2;
1489fb6b3c8dSJae Hyun Yoo     amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1490fb6b3c8dSJae Hyun Yoo     amc->i2c_init  = qcom_dc_scm_bmc_i2c_init;
1491fb6b3c8dSJae Hyun Yoo     mc->default_ram_size = 1 * GiB;
1492fb6b3c8dSJae Hyun Yoo     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1493fb6b3c8dSJae Hyun Yoo         aspeed_soc_num_cpus(amc->soc_name);
1494fb6b3c8dSJae Hyun Yoo };
1495fb6b3c8dSJae Hyun Yoo 
1496ece4cccdSGraeme Gregory static void aspeed_machine_qcom_firework_class_init(ObjectClass *oc,
1497ece4cccdSGraeme Gregory                                                     void *data)
1498ece4cccdSGraeme Gregory {
1499ece4cccdSGraeme Gregory     MachineClass *mc = MACHINE_CLASS(oc);
1500ece4cccdSGraeme Gregory     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1501ece4cccdSGraeme Gregory 
1502ece4cccdSGraeme Gregory     mc->desc       = "Qualcomm DC-SCM V1/Firework BMC (Cortex A7)";
1503ece4cccdSGraeme Gregory     amc->soc_name  = "ast2600-a3";
1504ece4cccdSGraeme Gregory     amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1505ece4cccdSGraeme Gregory     amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1506ece4cccdSGraeme Gregory     amc->fmc_model = "n25q512a";
1507ece4cccdSGraeme Gregory     amc->spi_model = "n25q512a";
1508ece4cccdSGraeme Gregory     amc->num_cs    = 2;
1509ece4cccdSGraeme Gregory     amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1510ece4cccdSGraeme Gregory     amc->i2c_init  = qcom_dc_scm_firework_i2c_init;
1511ece4cccdSGraeme Gregory     mc->default_ram_size = 1 * GiB;
1512ece4cccdSGraeme Gregory     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1513ece4cccdSGraeme Gregory         aspeed_soc_num_cpus(amc->soc_name);
1514ece4cccdSGraeme Gregory };
1515ece4cccdSGraeme Gregory 
1516baa4732bSCédric Le Goater static const TypeInfo aspeed_machine_types[] = {
1517baa4732bSCédric Le Goater     {
1518baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("palmetto-bmc"),
1519baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1520baa4732bSCédric Le Goater         .class_init    = aspeed_machine_palmetto_class_init,
1521baa4732bSCédric Le Goater     }, {
152240a38df5SErik Smit         .name          = MACHINE_TYPE_NAME("supermicrox11-bmc"),
152340a38df5SErik Smit         .parent        = TYPE_ASPEED_MACHINE,
152440a38df5SErik Smit         .class_init    = aspeed_machine_supermicrox11_bmc_class_init,
152540a38df5SErik Smit     }, {
1526baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2500-evb"),
1527baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1528baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2500_evb_class_init,
1529baa4732bSCédric Le Goater     }, {
1530baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("romulus-bmc"),
1531baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1532baa4732bSCédric Le Goater         .class_init    = aspeed_machine_romulus_class_init,
1533baa4732bSCédric Le Goater     }, {
1534143b040fSPatrick Williams         .name          = MACHINE_TYPE_NAME("sonorapass-bmc"),
1535143b040fSPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1536143b040fSPatrick Williams         .class_init    = aspeed_machine_sonorapass_class_init,
1537143b040fSPatrick Williams     }, {
1538baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("witherspoon-bmc"),
1539baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1540baa4732bSCédric Le Goater         .class_init    = aspeed_machine_witherspoon_class_init,
1541baa4732bSCédric Le Goater     }, {
1542baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2600-evb"),
1543baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1544baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2600_evb_class_init,
1545baa4732bSCédric Le Goater     }, {
154663ceb818SCédric Le Goater         .name          = MACHINE_TYPE_NAME("tacoma-bmc"),
154763ceb818SCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
154863ceb818SCédric Le Goater         .class_init    = aspeed_machine_tacoma_class_init,
154963ceb818SCédric Le Goater     }, {
155095f068c8SJohn Wang         .name          = MACHINE_TYPE_NAME("g220a-bmc"),
155195f068c8SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
155295f068c8SJohn Wang         .class_init    = aspeed_machine_g220a_class_init,
155395f068c8SJohn Wang     }, {
1554fb6b3c8dSJae Hyun Yoo         .name          = MACHINE_TYPE_NAME("qcom-dc-scm-v1-bmc"),
1555fb6b3c8dSJae Hyun Yoo         .parent        = TYPE_ASPEED_MACHINE,
1556fb6b3c8dSJae Hyun Yoo         .class_init    = aspeed_machine_qcom_dc_scm_v1_class_init,
1557fb6b3c8dSJae Hyun Yoo     }, {
1558ece4cccdSGraeme Gregory         .name          = MACHINE_TYPE_NAME("qcom-firework-bmc"),
1559ece4cccdSGraeme Gregory         .parent        = TYPE_ASPEED_MACHINE,
1560ece4cccdSGraeme Gregory         .class_init    = aspeed_machine_qcom_firework_class_init,
1561ece4cccdSGraeme Gregory     }, {
156282b6a3f6SJohn Wang         .name          = MACHINE_TYPE_NAME("fp5280g2-bmc"),
156382b6a3f6SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
156482b6a3f6SJohn Wang         .class_init    = aspeed_machine_fp5280g2_class_init,
156582b6a3f6SJohn Wang     }, {
15669cccb912SPatrick Venture         .name          = MACHINE_TYPE_NAME("quanta-q71l-bmc"),
15679cccb912SPatrick Venture         .parent        = TYPE_ASPEED_MACHINE,
15689cccb912SPatrick Venture         .class_init    = aspeed_machine_quanta_q71l_class_init,
15699cccb912SPatrick Venture     }, {
157058e52bdbSCédric Le Goater         .name          = MACHINE_TYPE_NAME("rainier-bmc"),
157158e52bdbSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
157258e52bdbSCédric Le Goater         .class_init    = aspeed_machine_rainier_class_init,
157358e52bdbSCédric Le Goater     }, {
1574febbe308SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fuji-bmc"),
1575febbe308SPeter Delevoryas         .parent        = TYPE_ASPEED_MACHINE,
1576febbe308SPeter Delevoryas         .class_init    = aspeed_machine_fuji_class_init,
1577febbe308SPeter Delevoryas     }, {
1578a20c54b1SPatrick Williams         .name          = MACHINE_TYPE_NAME("bletchley-bmc"),
1579a20c54b1SPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1580a20c54b1SPatrick Williams         .class_init    = aspeed_machine_bletchley_class_init,
1581a20c54b1SPatrick Williams     }, {
1582fa699e80SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fby35-bmc"),
1583fa699e80SPeter Delevoryas         .parent        = MACHINE_TYPE_NAME("ast2600-evb"),
1584fa699e80SPeter Delevoryas         .class_init    = aspeed_machine_fby35_class_init,
1585fa699e80SPeter Delevoryas     }, {
158666c895b8SJamin Lin         .name           = MACHINE_TYPE_NAME("ast1030-evb"),
158766c895b8SJamin Lin         .parent         = TYPE_ASPEED_MACHINE,
158866c895b8SJamin Lin         .class_init     = aspeed_minibmc_machine_ast1030_evb_class_init,
158966c895b8SJamin Lin     }, {
1590fca9ca1bSCédric Le Goater         .name          = TYPE_ASPEED_MACHINE,
159162c2c2ebSCédric Le Goater         .parent        = TYPE_MACHINE,
1592888b2b03SPhilippe Mathieu-Daudé         .instance_size = sizeof(AspeedMachineState),
15931a15311aSCédric Le Goater         .instance_init = aspeed_machine_instance_init,
1594fca9ca1bSCédric Le Goater         .class_size    = sizeof(AspeedMachineClass),
1595fca9ca1bSCédric Le Goater         .class_init    = aspeed_machine_class_init,
1596baa4732bSCédric Le Goater         .abstract      = true,
1597baa4732bSCédric Le Goater     }
1598fca9ca1bSCédric Le Goater };
159974fb1f38SCédric Le Goater 
1600baa4732bSCédric Le Goater DEFINE_TYPES(aspeed_machine_types)
1601