xref: /qemu/hw/arm/aspeed.c (revision cfc68f163992fe175d9ea58c247d1a7210613a66)
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"
29327d8e4eSAndrew Jeffery 
3074fb1f38SCédric Le Goater static struct arm_boot_info aspeed_board_binfo = {
31b033271fSCédric Le Goater     .board_id = -1, /* device-tree-only board */
32327d8e4eSAndrew Jeffery };
33327d8e4eSAndrew Jeffery 
34612b219aSPhilippe Mathieu-Daudé struct AspeedMachineState {
35888b2b03SPhilippe Mathieu-Daudé     /* Private */
36888b2b03SPhilippe Mathieu-Daudé     MachineState parent_obj;
37888b2b03SPhilippe Mathieu-Daudé     /* Public */
38888b2b03SPhilippe Mathieu-Daudé 
39ff90606fSCédric Le Goater     AspeedSoCState soc;
40ad1a9782SCédric Le Goater     MemoryRegion ram_container;
41ebe31c0aSCédric Le Goater     MemoryRegion max_ram;
42888b2b03SPhilippe Mathieu-Daudé     bool mmio_exec;
439820e52fSCédric Le Goater     char *fmc_model;
449820e52fSCédric Le Goater     char *spi_model;
45ea066d39SThomas Huth };
46327d8e4eSAndrew Jeffery 
47ef17f836SCédric Le Goater /* Palmetto hardware value: 0x120CE416 */
488da33ef7SCédric Le Goater #define PALMETTO_BMC_HW_STRAP1 (                                        \
498da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_256MB) |               \
508da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2 /* DDR3 with CL=6, CWL=5 */) | \
518da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
528da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) |       \
538da33ef7SCédric Le Goater         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
548da33ef7SCédric Le Goater         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
558da33ef7SCédric Le Goater         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) |                \
568da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
578da33ef7SCédric Le Goater         SCU_HW_STRAP_SPI_WIDTH |                                        \
588da33ef7SCédric Le Goater         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
598da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
608da33ef7SCédric Le Goater 
6140a38df5SErik Smit /* TODO: Find the actual hardware value */
6240a38df5SErik Smit #define SUPERMICROX11_BMC_HW_STRAP1 (                                   \
6340a38df5SErik Smit         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) |               \
6440a38df5SErik Smit         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2) |                           \
6540a38df5SErik Smit         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
6640a38df5SErik Smit         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) |       \
6740a38df5SErik Smit         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
6840a38df5SErik Smit         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
6940a38df5SErik Smit         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) |                \
7040a38df5SErik Smit         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
7140a38df5SErik Smit         SCU_HW_STRAP_SPI_WIDTH |                                        \
7240a38df5SErik Smit         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
7340a38df5SErik Smit         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
7440a38df5SErik Smit 
75ef17f836SCédric Le Goater /* AST2500 evb hardware value: 0xF100C2E6 */
769a7c1750SCédric Le Goater #define AST2500_EVB_HW_STRAP1 ((                                        \
779a7c1750SCédric Le Goater         AST2500_HW_STRAP1_DEFAULTS |                                    \
789a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
799a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
809a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
819a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
829a7c1750SCédric Le Goater         SCU_HW_STRAP_MAC1_RGMII |                                       \
839a7c1750SCédric Le Goater         SCU_HW_STRAP_MAC0_RGMII) &                                      \
849a7c1750SCédric Le Goater         ~SCU_HW_STRAP_2ND_BOOT_WDT)
859a7c1750SCédric Le Goater 
86ef17f836SCédric Le Goater /* Romulus hardware value: 0xF10AD206 */
87ef17f836SCédric Le Goater #define ROMULUS_BMC_HW_STRAP1 (                                         \
88ef17f836SCédric Le Goater         AST2500_HW_STRAP1_DEFAULTS |                                    \
89ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
90ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
91ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
92ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
93ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_ACPI_ENABLE |                              \
94ef17f836SCédric Le Goater         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER))
95ef17f836SCédric Le Goater 
96143b040fSPatrick Williams /* Sonorapass hardware value: 0xF100D216 */
97143b040fSPatrick Williams #define SONORAPASS_BMC_HW_STRAP1 (                                      \
98143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
99143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
100143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
101143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
102143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
103143b040fSPatrick Williams         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
104143b040fSPatrick Williams         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
105143b040fSPatrick Williams         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
106143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
107143b040fSPatrick Williams         SCU_HW_STRAP_VGA_BIOS_ROM |                                     \
108143b040fSPatrick Williams         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
109143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_RESERVED1)
110143b040fSPatrick Williams 
11195f068c8SJohn Wang #define G220A_BMC_HW_STRAP1 (                                      \
11295f068c8SJohn Wang         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
11395f068c8SJohn Wang         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
11495f068c8SJohn Wang         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
11595f068c8SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
11695f068c8SJohn Wang         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
11795f068c8SJohn Wang         SCU_HW_STRAP_2ND_BOOT_WDT |                                     \
11895f068c8SJohn Wang         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
11995f068c8SJohn Wang         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
12095f068c8SJohn Wang         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
12195f068c8SJohn Wang         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
12295f068c8SJohn Wang         SCU_HW_STRAP_VGA_SIZE_SET(VGA_64M_DRAM) |                       \
12395f068c8SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED1)
12495f068c8SJohn Wang 
12582b6a3f6SJohn Wang /* FP5280G2 hardware value: 0XF100D286 */
12682b6a3f6SJohn Wang #define FP5280G2_BMC_HW_STRAP1 (                                      \
12782b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
12882b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
12982b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
13082b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
13182b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
13282b6a3f6SJohn Wang         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
13382b6a3f6SJohn Wang         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
13482b6a3f6SJohn Wang         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
13582b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
13682b6a3f6SJohn Wang         SCU_HW_STRAP_MAC1_RGMII |                                       \
13782b6a3f6SJohn Wang         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
13882b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED1)
13982b6a3f6SJohn Wang 
14062c2c2ebSCédric Le Goater /* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */
14162c2c2ebSCédric Le Goater #define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1
14262c2c2ebSCédric Le Goater 
1439cccb912SPatrick Venture /* Quanta-Q71l hardware value */
1449cccb912SPatrick Venture #define QUANTA_Q71L_BMC_HW_STRAP1 (                                     \
1459cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) |               \
1469cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2/* DDR3 with CL=6, CWL=5 */) | \
1479cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
1489cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_24M_IN) |       \
1499cccb912SPatrick Venture         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
1509cccb912SPatrick Venture         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_PASS_THROUGH) |          \
1519cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
1529cccb912SPatrick Venture         SCU_HW_STRAP_SPI_WIDTH |                                        \
1539cccb912SPatrick Venture         SCU_HW_STRAP_VGA_SIZE_SET(VGA_8M_DRAM) |                        \
1549cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
1559cccb912SPatrick Venture 
156ccc2c418SCédric Le Goater /* AST2600 evb hardware value */
157ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP1 0x000000C0
158ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP2 0x00000003
159ccc2c418SCédric Le Goater 
16063ceb818SCédric Le Goater /* Tacoma hardware value */
16163ceb818SCédric Le Goater #define TACOMA_BMC_HW_STRAP1  0x00000000
1627582591aSJoel Stanley #define TACOMA_BMC_HW_STRAP2  0x00000040
16363ceb818SCédric Le Goater 
16458e52bdbSCédric Le Goater /* Rainier hardware value: (QEMU prototype) */
165b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP1 0x00422016
166b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP2 0x80000848
16758e52bdbSCédric Le Goater 
168febbe308SPeter Delevoryas /* Fuji hardware value */
169febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP1    0x00000000
170febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP2    0x00000000
171febbe308SPeter Delevoryas 
172a20c54b1SPatrick Williams /* Bletchley hardware value */
173a20c54b1SPatrick Williams /* TODO: Leave same as EVB for now. */
174a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP1 AST2600_EVB_HW_STRAP1
175a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP2 AST2600_EVB_HW_STRAP2
176a20c54b1SPatrick Williams 
177fb6b3c8dSJae Hyun Yoo /* Qualcomm DC-SCM hardware value */
178fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP1  0x00000000
179fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP2  0x00000041
180fb6b3c8dSJae Hyun Yoo 
1819bb6d140SJoel Stanley #define AST_SMP_MAILBOX_BASE            0x1e6e2180
1829bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_ENTRY        (AST_SMP_MAILBOX_BASE + 0x0)
1839bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_GOSIGN       (AST_SMP_MAILBOX_BASE + 0x4)
1849bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_READY        (AST_SMP_MAILBOX_BASE + 0x8)
1859bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_POLLINSN     (AST_SMP_MAILBOX_BASE + 0xc)
1869bb6d140SJoel Stanley #define AST_SMP_MBOX_CODE               (AST_SMP_MAILBOX_BASE + 0x10)
1879bb6d140SJoel Stanley #define AST_SMP_MBOX_GOSIGN             0xabbaab00
1889bb6d140SJoel Stanley 
1899bb6d140SJoel Stanley static void aspeed_write_smpboot(ARMCPU *cpu,
1909bb6d140SJoel Stanley                                  const struct arm_boot_info *info)
1919bb6d140SJoel Stanley {
1929bb6d140SJoel Stanley     static const uint32_t poll_mailbox_ready[] = {
1939bb6d140SJoel Stanley         /*
1949bb6d140SJoel Stanley          * r2 = per-cpu go sign value
1959bb6d140SJoel Stanley          * r1 = AST_SMP_MBOX_FIELD_ENTRY
1969bb6d140SJoel Stanley          * r0 = AST_SMP_MBOX_FIELD_GOSIGN
1979bb6d140SJoel Stanley          */
1989bb6d140SJoel Stanley         0xee100fb0,  /* mrc     p15, 0, r0, c0, c0, 5 */
1999bb6d140SJoel Stanley         0xe21000ff,  /* ands    r0, r0, #255          */
2009bb6d140SJoel Stanley         0xe59f201c,  /* ldr     r2, [pc, #28]         */
2019bb6d140SJoel Stanley         0xe1822000,  /* orr     r2, r2, r0            */
2029bb6d140SJoel Stanley 
2039bb6d140SJoel Stanley         0xe59f1018,  /* ldr     r1, [pc, #24]         */
2049bb6d140SJoel Stanley         0xe59f0018,  /* ldr     r0, [pc, #24]         */
2059bb6d140SJoel Stanley 
2069bb6d140SJoel Stanley         0xe320f002,  /* wfe                           */
2079bb6d140SJoel Stanley         0xe5904000,  /* ldr     r4, [r0]              */
2089bb6d140SJoel Stanley         0xe1520004,  /* cmp     r2, r4                */
2099bb6d140SJoel Stanley         0x1afffffb,  /* bne     <wfe>                 */
2109bb6d140SJoel Stanley         0xe591f000,  /* ldr     pc, [r1]              */
2119bb6d140SJoel Stanley         AST_SMP_MBOX_GOSIGN,
2129bb6d140SJoel Stanley         AST_SMP_MBOX_FIELD_ENTRY,
2139bb6d140SJoel Stanley         AST_SMP_MBOX_FIELD_GOSIGN,
2149bb6d140SJoel Stanley     };
2159bb6d140SJoel Stanley 
2169bb6d140SJoel Stanley     rom_add_blob_fixed("aspeed.smpboot", poll_mailbox_ready,
2179bb6d140SJoel Stanley                        sizeof(poll_mailbox_ready),
2189bb6d140SJoel Stanley                        info->smp_loader_start);
2199bb6d140SJoel Stanley }
2209bb6d140SJoel Stanley 
2219bb6d140SJoel Stanley static void aspeed_reset_secondary(ARMCPU *cpu,
2229bb6d140SJoel Stanley                                    const struct arm_boot_info *info)
2239bb6d140SJoel Stanley {
2249bb6d140SJoel Stanley     AddressSpace *as = arm_boot_address_space(cpu, info);
2259bb6d140SJoel Stanley     CPUState *cs = CPU(cpu);
2269bb6d140SJoel Stanley 
2279bb6d140SJoel Stanley     /* info->smp_bootreg_addr */
2289bb6d140SJoel Stanley     address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0,
2299bb6d140SJoel Stanley                                MEMTXATTRS_UNSPECIFIED, NULL);
2309bb6d140SJoel Stanley     cpu_set_pc(cs, info->smp_loader_start);
2319bb6d140SJoel Stanley }
2329bb6d140SJoel Stanley 
233d769a1daSCédric Le Goater #define FIRMWARE_ADDR 0x0
234d769a1daSCédric Le Goater 
235d769a1daSCédric Le Goater static void write_boot_rom(DriveInfo *dinfo, hwaddr addr, size_t rom_size,
236d769a1daSCédric Le Goater                            Error **errp)
237d769a1daSCédric Le Goater {
238d769a1daSCédric Le Goater     BlockBackend *blk = blk_by_legacy_dinfo(dinfo);
23905e6e40aSWentao_Liang     g_autofree void *storage = NULL;
2400c7209beSCédric Le Goater     int64_t size;
241d769a1daSCédric Le Goater 
2420c7209beSCédric Le Goater     /* The block backend size should have already been 'validated' by
2430c7209beSCédric Le Goater      * the creation of the m25p80 object.
2440c7209beSCédric Le Goater      */
2450c7209beSCédric Le Goater     size = blk_getlength(blk);
2460c7209beSCédric Le Goater     if (size <= 0) {
2470c7209beSCédric Le Goater         error_setg(errp, "failed to get flash size");
2480c7209beSCédric Le Goater         return;
2490c7209beSCédric Le Goater     }
2500c7209beSCédric Le Goater 
2510c7209beSCédric Le Goater     if (rom_size > size) {
2520c7209beSCédric Le Goater         rom_size = size;
253d769a1daSCédric Le Goater     }
254d769a1daSCédric Le Goater 
25505e6e40aSWentao_Liang     storage = g_malloc0(rom_size);
256d769a1daSCédric Le Goater     if (blk_pread(blk, 0, storage, rom_size) < 0) {
257d769a1daSCédric Le Goater         error_setg(errp, "failed to read the initial flash content");
258d769a1daSCédric Le Goater         return;
259d769a1daSCédric Le Goater     }
260d769a1daSCédric Le Goater 
261d769a1daSCédric Le Goater     rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr);
262d769a1daSCédric Le Goater }
263d769a1daSCédric Le Goater 
2649bd4ac61SCédric Le Goater static void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
2659bd4ac61SCédric Le Goater                                       unsigned int count, int unit0)
266e1ad9bc4SCédric Le Goater {
267e1ad9bc4SCédric Le Goater     int i;
268179b2058SPatrick Williams 
269179b2058SPatrick Williams     if (!flashtype) {
270179b2058SPatrick Williams         return;
271179b2058SPatrick Williams     }
272e1ad9bc4SCédric Le Goater 
2739bd4ac61SCédric Le Goater     for (i = 0; i < count; ++i) {
2748ec239f2SMarkus Armbruster         DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i);
275e1ad9bc4SCédric Le Goater         qemu_irq cs_line;
276a7d78befSCédric Le Goater         DeviceState *dev;
277e1ad9bc4SCédric Le Goater 
278a7d78befSCédric Le Goater         dev = qdev_new(flashtype);
279e1ad9bc4SCédric Le Goater         if (dinfo) {
280a7d78befSCédric Le Goater             qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo));
281e1ad9bc4SCédric Le Goater         }
282a7d78befSCédric Le Goater         qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal);
283e1ad9bc4SCédric Le Goater 
284a7d78befSCédric Le Goater         cs_line = qdev_get_gpio_in_named(dev, SSI_GPIO_CS, 0);
285e1ad9bc4SCédric Le Goater         sysbus_connect_irq(SYS_BUS_DEVICE(s), i + 1, cs_line);
286e1ad9bc4SCédric Le Goater     }
287e1ad9bc4SCédric Le Goater }
288e1ad9bc4SCédric Le Goater 
289a29e3e12SAndrew Jeffery static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo)
290a29e3e12SAndrew Jeffery {
291a29e3e12SAndrew Jeffery         DeviceState *card;
292a29e3e12SAndrew Jeffery 
293756f739bSPhilippe Mathieu-Daudé         if (!dinfo) {
294756f739bSPhilippe Mathieu-Daudé             return;
295756f739bSPhilippe Mathieu-Daudé         }
2963e80f690SMarkus Armbruster         card = qdev_new(TYPE_SD_CARD);
297934df912SMarkus Armbruster         qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
298a29e3e12SAndrew Jeffery                                 &error_fatal);
2993e80f690SMarkus Armbruster         qdev_realize_and_unref(card,
3003e80f690SMarkus Armbruster                                qdev_get_child_bus(DEVICE(sdhci), "sd-bus"),
3013e80f690SMarkus Armbruster                                &error_fatal);
302a29e3e12SAndrew Jeffery }
303a29e3e12SAndrew Jeffery 
304baa4732bSCédric Le Goater static void aspeed_machine_init(MachineState *machine)
305327d8e4eSAndrew Jeffery {
306888b2b03SPhilippe Mathieu-Daudé     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
307baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
308b033271fSCédric Le Goater     AspeedSoCClass *sc;
309d769a1daSCédric Le Goater     DriveInfo *drive0 = drive_get(IF_MTD, 0, 0);
3102bea128cSEddie James     int i;
311d3bad7e7SCédric Le Goater     NICInfo *nd = &nd_table[0];
312327d8e4eSAndrew Jeffery 
3139fc7fc4dSMarkus Armbruster     object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
314327d8e4eSAndrew Jeffery 
315b033271fSCédric Le Goater     sc = ASPEED_SOC_GET_CLASS(&bmc->soc);
316b033271fSCédric Le Goater 
317533eb415SIgor Mammedov     /*
318346160cbSCédric Le Goater      * This will error out if the RAM size is not supported by the
319346160cbSCédric Le Goater      * memory controller of the SoC.
320533eb415SIgor Mammedov      */
3216e504a98SPaolo Bonzini     object_property_set_uint(OBJECT(&bmc->soc), "ram-size", machine->ram_size,
322533eb415SIgor Mammedov                              &error_fatal);
323533eb415SIgor Mammedov 
324d3bad7e7SCédric Le Goater     for (i = 0; i < sc->macs_num; i++) {
325d3bad7e7SCédric Le Goater         if ((amc->macs_mask & (1 << i)) && nd->used) {
326d3bad7e7SCédric Le Goater             qemu_check_nic_model(nd, TYPE_FTGMAC100);
327d3bad7e7SCédric Le Goater             qdev_set_nic_properties(DEVICE(&bmc->soc.ftgmac100[i]), nd);
328d3bad7e7SCédric Le Goater             nd++;
329d3bad7e7SCédric Le Goater         }
330d3bad7e7SCédric Le Goater     }
331d3bad7e7SCédric Le Goater 
3325325cc34SMarkus Armbruster     object_property_set_int(OBJECT(&bmc->soc), "hw-strap1", amc->hw_strap1,
33387e79af0SAndrew Jeffery                             &error_abort);
3345325cc34SMarkus Armbruster     object_property_set_int(OBJECT(&bmc->soc), "hw-strap2", amc->hw_strap2,
335ccc2c418SCédric Le Goater                             &error_abort);
3364dd9d554SPeter Delevoryas     object_property_set_link(OBJECT(&bmc->soc), "memory",
3374dd9d554SPeter Delevoryas                              OBJECT(get_system_memory()), &error_abort);
3385325cc34SMarkus Armbruster     object_property_set_link(OBJECT(&bmc->soc), "dram",
3390df2d9a6SCédric Le Goater                              OBJECT(machine->ram), &error_abort);
340b6e70d1dSJoel Stanley     if (machine->kernel_filename) {
341b6e70d1dSJoel Stanley         /*
342b6e70d1dSJoel Stanley          * When booting with a -kernel command line there is no u-boot
343b6e70d1dSJoel Stanley          * that runs to unlock the SCU. In this case set the default to
344b6e70d1dSJoel Stanley          * be unlocked as the kernel expects
345b6e70d1dSJoel Stanley          */
3465325cc34SMarkus Armbruster         object_property_set_int(OBJECT(&bmc->soc), "hw-prot-key",
3475325cc34SMarkus Armbruster                                 ASPEED_SCU_PROT_KEY, &error_abort);
348b6e70d1dSJoel Stanley     }
3495d63d0c7SPeter Delevoryas     qdev_prop_set_uint32(DEVICE(&bmc->soc), "uart-default",
3505d63d0c7SPeter Delevoryas                          amc->uart_default);
351ce189ab2SMarkus Armbruster     qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
352327d8e4eSAndrew Jeffery 
3538ec239f2SMarkus Armbruster     aspeed_board_init_flashes(&bmc->soc.fmc,
3548ec239f2SMarkus Armbruster                               bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
3559bd4ac61SCédric Le Goater                               amc->num_cs, 0);
3568ec239f2SMarkus Armbruster     aspeed_board_init_flashes(&bmc->soc.spi[0],
3578ec239f2SMarkus Armbruster                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
3589bd4ac61SCédric Le Goater                               1, amc->num_cs);
359e1ad9bc4SCédric Le Goater 
360d769a1daSCédric Le Goater     /* Install first FMC flash content as a boot rom. */
361d769a1daSCédric Le Goater     if (drive0) {
362d769a1daSCédric Le Goater         AspeedSMCFlash *fl = &bmc->soc.fmc.flashes[0];
363d769a1daSCédric Le Goater         MemoryRegion *boot_rom = g_new(MemoryRegion, 1);
3646bb55e79SCédric Le Goater         uint64_t size = memory_region_size(&fl->mmio);
365d769a1daSCédric Le Goater 
366d769a1daSCédric Le Goater         /*
367d769a1daSCédric Le Goater          * create a ROM region using the default mapping window size of
36893bf276dSCédric Le Goater          * the flash module. The window size is 64MB for the AST2400
36993bf276dSCédric Le Goater          * SoC and 128MB for the AST2500 SoC, which is twice as big as
37093bf276dSCédric Le Goater          * needed by the flash modules of the Aspeed machines.
371d769a1daSCédric Le Goater          */
3721a15311aSCédric Le Goater         if (ASPEED_MACHINE(machine)->mmio_exec) {
373f489960dSPhilippe Mathieu-Daudé             memory_region_init_alias(boot_rom, NULL, "aspeed.boot_rom",
3746bb55e79SCédric Le Goater                                      &fl->mmio, 0, size);
3751a15311aSCédric Le Goater             memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
3761a15311aSCédric Le Goater                                         boot_rom);
3771a15311aSCédric Le Goater         } else {
378f489960dSPhilippe Mathieu-Daudé             memory_region_init_rom(boot_rom, NULL, "aspeed.boot_rom",
3796bb55e79SCédric Le Goater                                    size, &error_abort);
380d769a1daSCédric Le Goater             memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
381d769a1daSCédric Le Goater                                         boot_rom);
3826bb55e79SCédric Le Goater             write_boot_rom(drive0, FIRMWARE_ADDR, size, &error_abort);
383d769a1daSCédric Le Goater         }
3841a15311aSCédric Le Goater     }
385d769a1daSCédric Le Goater 
386b7f1a0cbSCédric Le Goater     if (machine->kernel_filename && sc->num_cpus > 1) {
3879bb6d140SJoel Stanley         /* With no u-boot we must set up a boot stub for the secondary CPU */
3889bb6d140SJoel Stanley         MemoryRegion *smpboot = g_new(MemoryRegion, 1);
389f489960dSPhilippe Mathieu-Daudé         memory_region_init_ram(smpboot, NULL, "aspeed.smpboot",
3909bb6d140SJoel Stanley                                0x80, &error_abort);
3919bb6d140SJoel Stanley         memory_region_add_subregion(get_system_memory(),
3929bb6d140SJoel Stanley                                     AST_SMP_MAILBOX_BASE, smpboot);
3939bb6d140SJoel Stanley 
3949bb6d140SJoel Stanley         aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot;
3959bb6d140SJoel Stanley         aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary;
3969bb6d140SJoel Stanley         aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE;
3979bb6d140SJoel Stanley     }
3989bb6d140SJoel Stanley 
3996e504a98SPaolo Bonzini     aspeed_board_binfo.ram_size = machine->ram_size;
400347df6f8SEduardo Habkost     aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM];
401b033271fSCédric Le Goater 
402baa4732bSCédric Le Goater     if (amc->i2c_init) {
403baa4732bSCédric Le Goater         amc->i2c_init(bmc);
4042cf6cb50SCédric Le Goater     }
4052cf6cb50SCédric Le Goater 
4060e2c24c6SAndrew Jeffery     for (i = 0; i < bmc->soc.sdhci.num_slots; i++) {
4078ec239f2SMarkus Armbruster         sdhci_attach_drive(&bmc->soc.sdhci.slots[i],
4088ec239f2SMarkus Armbruster                            drive_get(IF_SD, 0, i));
409a29e3e12SAndrew Jeffery     }
4102bea128cSEddie James 
411a29e3e12SAndrew Jeffery     if (bmc->soc.emmc.num_slots) {
4128ec239f2SMarkus Armbruster         sdhci_attach_drive(&bmc->soc.emmc.slots[0],
4138ec239f2SMarkus Armbruster                            drive_get(IF_SD, 0, bmc->soc.sdhci.num_slots));
4142bea128cSEddie James     }
4152bea128cSEddie James 
4162744ece8STao Xu     arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo);
417327d8e4eSAndrew Jeffery }
418327d8e4eSAndrew Jeffery 
41982b6a3f6SJohn Wang static void at24c_eeprom_init(I2CBus *bus, uint8_t addr, uint32_t rsize)
42082b6a3f6SJohn Wang {
42182b6a3f6SJohn Wang     I2CSlave *i2c_dev = i2c_slave_new("at24c-eeprom", addr);
42282b6a3f6SJohn Wang     DeviceState *dev = DEVICE(i2c_dev);
42382b6a3f6SJohn Wang 
42482b6a3f6SJohn Wang     qdev_prop_set_uint32(dev, "rom-size", rsize);
42582b6a3f6SJohn Wang     i2c_slave_realize_and_unref(i2c_dev, bus, &error_abort);
42682b6a3f6SJohn Wang }
42782b6a3f6SJohn Wang 
428612b219aSPhilippe Mathieu-Daudé static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
4292cf6cb50SCédric Le Goater {
4302cf6cb50SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
431a87e81b9SCédric Le Goater     DeviceState *dev;
4323d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
4332cf6cb50SCédric Le Goater 
4342cf6cb50SCédric Le Goater     /* The palmetto platform expects a ds3231 RTC but a ds1338 is
4352cf6cb50SCédric Le Goater      * enough to provide basic RTC features. Alarms will be missing */
4361373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
437a87e81b9SCédric Le Goater 
4387a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
4393d165f12SCédric Le Goater                           eeprom_buf);
4403d165f12SCédric Le Goater 
441a87e81b9SCédric Le Goater     /* add a TMP423 temperature sensor */
4421373b15bSPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
4431373b15bSPhilippe Mathieu-Daudé                                          "tmp423", 0x4c));
4445325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
4455325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
4465325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
4475325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort);
4482cf6cb50SCédric Le Goater }
4492cf6cb50SCédric Le Goater 
4509cccb912SPatrick Venture static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc)
4519cccb912SPatrick Venture {
4529cccb912SPatrick Venture     AspeedSoCState *soc = &bmc->soc;
4539cccb912SPatrick Venture 
4549cccb912SPatrick Venture     /*
4559cccb912SPatrick Venture      * The quanta-q71l platform expects tmp75s which are compatible with
4569cccb912SPatrick Venture      * tmp105s.
4579cccb912SPatrick Venture      */
4589cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c);
4599cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e);
4609cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f);
4619cccb912SPatrick Venture 
4629cccb912SPatrick Venture     /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */
4639cccb912SPatrick Venture     /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */
4649cccb912SPatrick Venture     /* TODO: Add Memory Riser i2c mux and eeproms. */
4659cccb912SPatrick Venture 
4663ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74);
4673ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77);
4683ec75e39SPatrick Venture 
4699cccb912SPatrick Venture     /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */
4703ec75e39SPatrick Venture 
4713ec75e39SPatrick Venture     /* i2c-7 */
4723ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70);
4739cccb912SPatrick Venture     /*        - i2c@0: pmbus@59 */
4749cccb912SPatrick Venture     /*        - i2c@1: pmbus@58 */
4759cccb912SPatrick Venture     /*        - i2c@2: pmbus@58 */
4769cccb912SPatrick Venture     /*        - i2c@3: pmbus@59 */
4773ec75e39SPatrick Venture 
4789cccb912SPatrick Venture     /* TODO: i2c-7: Add PDB FRU eeprom@52 */
4799cccb912SPatrick Venture     /* TODO: i2c-8: Add BMC FRU eeprom@50 */
4809cccb912SPatrick Venture }
4819cccb912SPatrick Venture 
482612b219aSPhilippe Mathieu-Daudé static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
4832cf6cb50SCédric Le Goater {
4842cf6cb50SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
4853d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
4863d165f12SCédric Le Goater 
4877a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50,
4883d165f12SCédric Le Goater                           eeprom_buf);
4892cf6cb50SCédric Le Goater 
4902cf6cb50SCédric Le Goater     /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
4911373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
492044475f3SPhilippe Mathieu-Daudé                      TYPE_TMP105, 0x4d);
4932cf6cb50SCédric Le Goater }
4942cf6cb50SCédric Le Goater 
495612b219aSPhilippe Mathieu-Daudé static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
496ccc2c418SCédric Le Goater {
49752bcd997SHoward Chiu     AspeedSoCState *soc = &bmc->soc;
49852bcd997SHoward Chiu     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
49952bcd997SHoward Chiu 
50052bcd997SHoward Chiu     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50,
50152bcd997SHoward Chiu                           eeprom_buf);
50252bcd997SHoward Chiu 
50352bcd997SHoward Chiu     /* LM75 is compatible with TMP105 driver */
50452bcd997SHoward Chiu     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
50552bcd997SHoward Chiu                      TYPE_TMP105, 0x4d);
506ccc2c418SCédric Le Goater }
507ccc2c418SCédric Le Goater 
508612b219aSPhilippe Mathieu-Daudé static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
5096c4567c7SCédric Le Goater {
5106c4567c7SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
5116c4567c7SCédric Le Goater 
5126c4567c7SCédric Le Goater     /* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
5136c4567c7SCédric Le Goater      * good enough */
5141373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
5156c4567c7SCédric Le Goater }
5166c4567c7SCédric Le Goater 
517f4aec252SCédric Le Goater static void create_pca9552(AspeedSoCState *soc, int bus_id, int addr)
518f4aec252SCédric Le Goater {
519f4aec252SCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, bus_id),
520f4aec252SCédric Le Goater                             TYPE_PCA9552, addr);
521f4aec252SCédric Le Goater }
522f4aec252SCédric Le Goater 
523612b219aSPhilippe Mathieu-Daudé static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc)
524143b040fSPatrick Williams {
525143b040fSPatrick Williams     AspeedSoCState *soc = &bmc->soc;
526143b040fSPatrick Williams 
527143b040fSPatrick Williams     /* bus 2 : */
5281373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48);
5291373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49);
530143b040fSPatrick Williams     /* bus 2 : pca9546 @ 0x73 */
531143b040fSPatrick Williams 
532143b040fSPatrick Williams     /* bus 3 : pca9548 @ 0x70 */
533143b040fSPatrick Williams 
534143b040fSPatrick Williams     /* bus 4 : */
535143b040fSPatrick Williams     uint8_t *eeprom4_54 = g_malloc0(8 * 1024);
5367a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54,
537143b040fSPatrick Williams                           eeprom4_54);
538143b040fSPatrick Williams     /* PCA9539 @ 0x76, but PCA9552 is compatible */
539f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x76);
540143b040fSPatrick Williams     /* PCA9539 @ 0x77, but PCA9552 is compatible */
541f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x77);
542143b040fSPatrick Williams 
543143b040fSPatrick Williams     /* bus 6 : */
5441373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48);
5451373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49);
546143b040fSPatrick Williams     /* bus 6 : pca9546 @ 0x73 */
547143b040fSPatrick Williams 
548143b040fSPatrick Williams     /* bus 8 : */
549143b040fSPatrick Williams     uint8_t *eeprom8_56 = g_malloc0(8 * 1024);
5507a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56,
551143b040fSPatrick Williams                           eeprom8_56);
552f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x60);
553f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x61);
554143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1d */
555143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1f */
556143b040fSPatrick Williams 
557143b040fSPatrick Williams     /*
558143b040fSPatrick Williams      * bus 13 : pca9548 @ 0x71
559143b040fSPatrick Williams      *      - channel 3:
560143b040fSPatrick Williams      *          - tmm421 @ 0x4c
561143b040fSPatrick Williams      *          - tmp421 @ 0x4e
562143b040fSPatrick Williams      *          - tmp421 @ 0x4f
563143b040fSPatrick Williams      */
564143b040fSPatrick Williams 
565143b040fSPatrick Williams }
566143b040fSPatrick Williams 
567612b219aSPhilippe Mathieu-Daudé static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
56862c2c2ebSCédric Le Goater {
5697cfbde5eSPhilippe Mathieu-Daudé     static const struct {
5707cfbde5eSPhilippe Mathieu-Daudé         unsigned gpio_id;
5717cfbde5eSPhilippe Mathieu-Daudé         LEDColor color;
5727cfbde5eSPhilippe Mathieu-Daudé         const char *description;
5737cfbde5eSPhilippe Mathieu-Daudé         bool gpio_polarity;
5747cfbde5eSPhilippe Mathieu-Daudé     } pca1_leds[] = {
5757cfbde5eSPhilippe Mathieu-Daudé         {13, LED_COLOR_GREEN, "front-fault-4",  GPIO_POLARITY_ACTIVE_LOW},
5767cfbde5eSPhilippe Mathieu-Daudé         {14, LED_COLOR_GREEN, "front-power-3",  GPIO_POLARITY_ACTIVE_LOW},
5777cfbde5eSPhilippe Mathieu-Daudé         {15, LED_COLOR_GREEN, "front-id-5",     GPIO_POLARITY_ACTIVE_LOW},
5787cfbde5eSPhilippe Mathieu-Daudé     };
57962c2c2ebSCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
5803d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
58115ce12cfSPhilippe Mathieu-Daudé     DeviceState *dev;
5827cfbde5eSPhilippe Mathieu-Daudé     LEDState *led;
58362c2c2ebSCédric Le Goater 
58463ceb818SCédric Le Goater     /* Bus 3: TODO bmp280@77 */
585db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
58615ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca1");
5872616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
5882616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 3),
58915ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
5908c9a61d7SCédric Le Goater 
5917cfbde5eSPhilippe Mathieu-Daudé     for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) {
5927cfbde5eSPhilippe Mathieu-Daudé         led = led_create_simple(OBJECT(bmc),
5937cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].gpio_polarity,
5947cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].color,
5957cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].description);
5967cfbde5eSPhilippe Mathieu-Daudé         qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id,
5977cfbde5eSPhilippe Mathieu-Daudé                               qdev_get_gpio_in(DEVICE(led), 0));
5987cfbde5eSPhilippe Mathieu-Daudé     }
599b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76);
6002a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "max31785", 0x52);
6011373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c);
6021373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c);
60362c2c2ebSCédric Le Goater 
60462c2c2ebSCédric Le Goater     /* The Witherspoon expects a TMP275 but a TMP105 is compatible */
6051373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105,
606044475f3SPhilippe Mathieu-Daudé                      0x4a);
6076c4567c7SCédric Le Goater 
6086c4567c7SCédric Le Goater     /* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
6096c4567c7SCédric Le Goater      * good enough */
6101373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
6113d165f12SCédric Le Goater 
6127a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51,
6133d165f12SCédric Le Goater                           eeprom_buf);
614db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
61515ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca0");
6162616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
6172616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 11),
61815ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
61963ceb818SCédric Le Goater     /* Bus 11: TODO ucd90160@64 */
62062c2c2ebSCédric Le Goater }
62162c2c2ebSCédric Le Goater 
62295f068c8SJohn Wang static void g220a_bmc_i2c_init(AspeedMachineState *bmc)
62395f068c8SJohn Wang {
62495f068c8SJohn Wang     AspeedSoCState *soc = &bmc->soc;
62595f068c8SJohn Wang     DeviceState *dev;
62695f068c8SJohn Wang 
62795f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3),
62895f068c8SJohn Wang                                          "emc1413", 0x4c));
62995f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
63095f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
63195f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
63295f068c8SJohn Wang 
63395f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12),
63495f068c8SJohn Wang                                          "emc1413", 0x4c));
63595f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
63695f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
63795f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
63895f068c8SJohn Wang 
63995f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13),
64095f068c8SJohn Wang                                          "emc1413", 0x4c));
64195f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
64295f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
64395f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
6446f5f6507SJohn Wang 
6456f5f6507SJohn Wang     static uint8_t eeprom_buf[2 * 1024] = {
6466f5f6507SJohn Wang             0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe,
6476f5f6507SJohn Wang             0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65,
6486f5f6507SJohn Wang             0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32,
6496f5f6507SJohn Wang             0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42,
6506f5f6507SJohn Wang             0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45,
6516f5f6507SJohn Wang             0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1,
6526f5f6507SJohn Wang             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7,
6536f5f6507SJohn Wang     };
6546f5f6507SJohn Wang     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57,
6556f5f6507SJohn Wang                           eeprom_buf);
65695f068c8SJohn Wang }
65795f068c8SJohn Wang 
658fa6d98c0SJoel Stanley static void aspeed_eeprom_init(I2CBus *bus, uint8_t addr, uint32_t rsize)
659fa6d98c0SJoel Stanley {
660fa6d98c0SJoel Stanley     I2CSlave *i2c_dev = i2c_slave_new("at24c-eeprom", addr);
661fa6d98c0SJoel Stanley     DeviceState *dev = DEVICE(i2c_dev);
662fa6d98c0SJoel Stanley 
663fa6d98c0SJoel Stanley     qdev_prop_set_uint32(dev, "rom-size", rsize);
664fa6d98c0SJoel Stanley     i2c_slave_realize_and_unref(i2c_dev, bus, &error_abort);
665fa6d98c0SJoel Stanley }
666fa6d98c0SJoel Stanley 
66782b6a3f6SJohn Wang static void fp5280g2_bmc_i2c_init(AspeedMachineState *bmc)
66882b6a3f6SJohn Wang {
66982b6a3f6SJohn Wang     AspeedSoCState *soc = &bmc->soc;
67082b6a3f6SJohn Wang     I2CSlave *i2c_mux;
67182b6a3f6SJohn Wang 
67282b6a3f6SJohn Wang     /* The at24c256 */
67382b6a3f6SJohn Wang     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 1), 0x50, 32768);
67482b6a3f6SJohn Wang 
67582b6a3f6SJohn Wang     /* The fp5280g2 expects a TMP112 but a TMP105 is compatible */
67682b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
67782b6a3f6SJohn Wang                      0x48);
67882b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
67982b6a3f6SJohn Wang                      0x49);
68082b6a3f6SJohn Wang 
68182b6a3f6SJohn Wang     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
68282b6a3f6SJohn Wang                      "pca9546", 0x70);
68382b6a3f6SJohn Wang     /* It expects a TMP112 but a TMP105 is compatible */
68482b6a3f6SJohn Wang     i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0), TYPE_TMP105,
68582b6a3f6SJohn Wang                      0x4a);
68682b6a3f6SJohn Wang 
68782b6a3f6SJohn Wang     /* It expects a ds3232 but a ds1338 is good enough */
68882b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "ds1338", 0x68);
68982b6a3f6SJohn Wang 
69082b6a3f6SJohn Wang     /* It expects a pca9555 but a pca9552 is compatible */
691f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x30);
69282b6a3f6SJohn Wang }
69382b6a3f6SJohn Wang 
69458e52bdbSCédric Le Goater static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
69558e52bdbSCédric Le Goater {
69658e52bdbSCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
697fa6d98c0SJoel Stanley     I2CSlave *i2c_mux;
698fa6d98c0SJoel Stanley 
699fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB);
70058e52bdbSCédric Le Goater 
701f4aec252SCédric Le Goater     create_pca9552(soc, 3, 0x61);
702bcb122f8SJoel Stanley 
70358e52bdbSCédric Le Goater     /* The rainier expects a TMP275 but a TMP105 is compatible */
70458e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
70558e52bdbSCédric Le Goater                      0x48);
70658e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
70758e52bdbSCédric Le Goater                      0x49);
70858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
70958e52bdbSCédric Le Goater                      0x4a);
710fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4),
711fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
712fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
713fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
714fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB);
715f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x60);
71658e52bdbSCédric Le Goater 
71758e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
71858e52bdbSCédric Le Goater                      0x48);
71958e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
72058e52bdbSCédric Le Goater                      0x49);
721f4aec252SCédric Le Goater     create_pca9552(soc, 5, 0x60);
722f4aec252SCédric Le Goater     create_pca9552(soc, 5, 0x61);
723fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5),
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);
72758e52bdbSCédric Le Goater 
72858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
72958e52bdbSCédric Le Goater                      0x48);
73058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
73158e52bdbSCédric Le Goater                      0x4a);
73258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
73358e52bdbSCédric Le Goater                      0x4b);
734fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6),
735fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
736fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
737fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
738fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB);
739fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB);
74058e52bdbSCédric Le Goater 
741f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x30);
742f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x31);
743f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x32);
744f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x33);
745f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x60);
746f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x61);
747b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76);
74858e52bdbSCédric Le Goater     /* Bus 7: TODO si7021-a20@20 */
74958e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105,
75058e52bdbSCédric Le Goater                      0x48);
7512a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "max31785", 0x52);
752fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB);
753fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB);
75458e52bdbSCédric Le Goater 
75558e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
75658e52bdbSCédric Le Goater                      0x48);
75758e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
75858e52bdbSCédric Le Goater                      0x4a);
759fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50, 64 * KiB);
760fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 64 * KiB);
761f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x60);
762f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x61);
76358e52bdbSCédric Le Goater     /* Bus 8: ucd90320@11 */
76458e52bdbSCédric Le Goater     /* Bus 8: ucd90320@b */
76558e52bdbSCédric Le Goater     /* Bus 8: ucd90320@c */
76658e52bdbSCédric Le Goater 
76758e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c);
76858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d);
769fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB);
77058e52bdbSCédric Le Goater 
77158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c);
77258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d);
773fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB);
77458e52bdbSCédric Le Goater 
77558e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
77658e52bdbSCédric Le Goater                      0x48);
77758e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
77858e52bdbSCédric Le Goater                      0x49);
779fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11),
780fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
781fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
782fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
783f4aec252SCédric Le Goater     create_pca9552(soc, 11, 0x60);
784fa6d98c0SJoel Stanley 
785fa6d98c0SJoel Stanley 
786fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB);
787f4aec252SCédric Le Goater     create_pca9552(soc, 13, 0x60);
788fa6d98c0SJoel Stanley 
789fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB);
790f4aec252SCédric Le Goater     create_pca9552(soc, 14, 0x60);
791fa6d98c0SJoel Stanley 
792fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB);
793f4aec252SCédric Le Goater     create_pca9552(soc, 15, 0x60);
79458e52bdbSCédric Le Goater }
79558e52bdbSCédric Le Goater 
796febbe308SPeter Delevoryas static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr,
797febbe308SPeter Delevoryas                                  I2CBus **channels)
798febbe308SPeter Delevoryas {
799febbe308SPeter Delevoryas     I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr);
800febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
801febbe308SPeter Delevoryas         channels[i] = pca954x_i2c_get_bus(mux, i);
802febbe308SPeter Delevoryas     }
803febbe308SPeter Delevoryas }
804febbe308SPeter Delevoryas 
805febbe308SPeter Delevoryas #define TYPE_LM75 TYPE_TMP105
806febbe308SPeter Delevoryas #define TYPE_TMP75 TYPE_TMP105
807febbe308SPeter Delevoryas #define TYPE_TMP422 "tmp422"
808febbe308SPeter Delevoryas 
809febbe308SPeter Delevoryas static void fuji_bmc_i2c_init(AspeedMachineState *bmc)
810febbe308SPeter Delevoryas {
811febbe308SPeter Delevoryas     AspeedSoCState *soc = &bmc->soc;
812febbe308SPeter Delevoryas     I2CBus *i2c[144] = {};
813febbe308SPeter Delevoryas 
814febbe308SPeter Delevoryas     for (int i = 0; i < 16; i++) {
815febbe308SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
816febbe308SPeter Delevoryas     }
817febbe308SPeter Delevoryas     I2CBus *i2c180 = i2c[2];
818febbe308SPeter Delevoryas     I2CBus *i2c480 = i2c[8];
819febbe308SPeter Delevoryas     I2CBus *i2c600 = i2c[11];
820febbe308SPeter Delevoryas 
821febbe308SPeter Delevoryas     get_pca9548_channels(i2c180, 0x70, &i2c[16]);
822febbe308SPeter Delevoryas     get_pca9548_channels(i2c480, 0x70, &i2c[24]);
823febbe308SPeter Delevoryas     /* NOTE: The device tree skips [32, 40) in the alias numbering */
824febbe308SPeter Delevoryas     get_pca9548_channels(i2c600, 0x77, &i2c[40]);
825febbe308SPeter Delevoryas     get_pca9548_channels(i2c[24], 0x71, &i2c[48]);
826febbe308SPeter Delevoryas     get_pca9548_channels(i2c[25], 0x72, &i2c[56]);
827febbe308SPeter Delevoryas     get_pca9548_channels(i2c[26], 0x76, &i2c[64]);
828febbe308SPeter Delevoryas     get_pca9548_channels(i2c[27], 0x76, &i2c[72]);
829febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
830febbe308SPeter Delevoryas         get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]);
831febbe308SPeter Delevoryas     }
832febbe308SPeter Delevoryas 
833febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c);
834febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d);
835febbe308SPeter Delevoryas 
836febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[19], 0x52, 64 * KiB);
837febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[20], 0x50, 2 * KiB);
838febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[22], 0x52, 2 * KiB);
839febbe308SPeter Delevoryas 
840febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x48);
841febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x49);
842febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x4a);
843febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_TMP422, 0x4c);
844febbe308SPeter Delevoryas 
845febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[8], 0x51, 64 * KiB);
846febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a);
847febbe308SPeter Delevoryas 
848febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[50], TYPE_LM75, 0x4c);
849febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[50], 0x52, 64 * KiB);
850febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[51], TYPE_TMP75, 0x48);
851febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[52], TYPE_TMP75, 0x49);
852febbe308SPeter Delevoryas 
853febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[59], TYPE_TMP75, 0x48);
854febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[60], TYPE_TMP75, 0x49);
855febbe308SPeter Delevoryas 
856febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[65], 0x53, 64 * KiB);
857febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x49);
858febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x48);
859febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[68], 0x52, 64 * KiB);
860febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[69], 0x52, 64 * KiB);
861febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[70], 0x52, 64 * KiB);
862febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[71], 0x52, 64 * KiB);
863febbe308SPeter Delevoryas 
864febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[73], 0x53, 64 * KiB);
865febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x49);
866febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x48);
867febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[76], 0x52, 64 * KiB);
868febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[77], 0x52, 64 * KiB);
869febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[78], 0x52, 64 * KiB);
870febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[79], 0x52, 64 * KiB);
871febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[28], 0x50, 2 * KiB);
872febbe308SPeter Delevoryas 
873febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
874febbe308SPeter Delevoryas         aspeed_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB);
875febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[82 + i * 8], TYPE_TMP75, 0x48);
876febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[83 + i * 8], TYPE_TMP75, 0x4b);
877febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[84 + i * 8], TYPE_TMP75, 0x4a);
878febbe308SPeter Delevoryas     }
879febbe308SPeter Delevoryas }
880febbe308SPeter Delevoryas 
881a20c54b1SPatrick Williams #define TYPE_TMP421 "tmp421"
882a20c54b1SPatrick Williams 
883a20c54b1SPatrick Williams static void bletchley_bmc_i2c_init(AspeedMachineState *bmc)
884a20c54b1SPatrick Williams {
885a20c54b1SPatrick Williams     AspeedSoCState *soc = &bmc->soc;
886a20c54b1SPatrick Williams     I2CBus *i2c[13] = {};
887a20c54b1SPatrick Williams     for (int i = 0; i < 13; i++) {
888a20c54b1SPatrick Williams         if ((i == 8) || (i == 11)) {
889a20c54b1SPatrick Williams             continue;
890a20c54b1SPatrick Williams         }
891a20c54b1SPatrick Williams         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
892a20c54b1SPatrick Williams     }
893a20c54b1SPatrick Williams 
894a20c54b1SPatrick Williams     /* Bus 0 - 5 all have the same config. */
895a20c54b1SPatrick Williams     for (int i = 0; i < 6; i++) {
896a20c54b1SPatrick Williams         /* Missing model: ti,ina230 @ 0x45 */
897a20c54b1SPatrick Williams         /* Missing model: mps,mp5023 @ 0x40 */
898a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_TMP421, 0x4f);
899a20c54b1SPatrick Williams         /* Missing model: nxp,pca9539 @ 0x76, but PCA9552 works enough */
900a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x76);
901a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x67);
902a20c54b1SPatrick Williams         /* Missing model: fsc,fusb302 @ 0x22 */
903a20c54b1SPatrick Williams     }
904a20c54b1SPatrick Williams 
905a20c54b1SPatrick Williams     /* Bus 6 */
906a20c54b1SPatrick Williams     at24c_eeprom_init(i2c[6], 0x56, 65536);
907a20c54b1SPatrick Williams     /* Missing model: nxp,pcf85263 @ 0x51 , but ds1338 works enough */
908a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[6], "ds1338", 0x51);
909a20c54b1SPatrick Williams 
910a20c54b1SPatrick Williams 
911a20c54b1SPatrick Williams     /* Bus 7 */
912a20c54b1SPatrick Williams     at24c_eeprom_init(i2c[7], 0x54, 65536);
913a20c54b1SPatrick Williams 
914a20c54b1SPatrick Williams     /* Bus 9 */
915a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[9], TYPE_TMP421, 0x4f);
916a20c54b1SPatrick Williams 
917a20c54b1SPatrick Williams     /* Bus 10 */
918a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[10], TYPE_TMP421, 0x4f);
919a20c54b1SPatrick Williams     /* Missing model: ti,hdc1080 @ 0x40 */
920a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[10], TYPE_PCA9552, 0x67);
921a20c54b1SPatrick Williams 
922a20c54b1SPatrick Williams     /* Bus 12 */
923a20c54b1SPatrick Williams     /* Missing model: adi,adm1278 @ 0x11 */
924a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4c);
925a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4d);
926a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_PCA9552, 0x67);
927a20c54b1SPatrick Williams }
928a20c54b1SPatrick Williams 
929fa699e80SPeter Delevoryas static void fby35_i2c_init(AspeedMachineState *bmc)
930fa699e80SPeter Delevoryas {
931fa699e80SPeter Delevoryas     AspeedSoCState *soc = &bmc->soc;
932fa699e80SPeter Delevoryas     I2CBus *i2c[16];
933fa699e80SPeter Delevoryas 
934fa699e80SPeter Delevoryas     for (int i = 0; i < 16; i++) {
935fa699e80SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
936fa699e80SPeter Delevoryas     }
937fa699e80SPeter Delevoryas 
938fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[2], TYPE_LM75, 0x4f);
939fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_TMP421, 0x1f);
940fa699e80SPeter Delevoryas     /* Hotswap controller is actually supposed to be mp5920 or ltc4282. */
941fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[11], "adm1272", 0x44);
942fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4e);
943fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4f);
944fa699e80SPeter Delevoryas 
945fa699e80SPeter Delevoryas     aspeed_eeprom_init(i2c[4], 0x51, 128 * KiB);
946fa699e80SPeter Delevoryas     aspeed_eeprom_init(i2c[6], 0x51, 128 * KiB);
947fa699e80SPeter Delevoryas     aspeed_eeprom_init(i2c[8], 0x50, 32 * KiB);
948fa699e80SPeter Delevoryas     aspeed_eeprom_init(i2c[11], 0x51, 128 * KiB);
949fa699e80SPeter Delevoryas     aspeed_eeprom_init(i2c[11], 0x54, 128 * KiB);
950fa699e80SPeter Delevoryas 
951fa699e80SPeter Delevoryas     /*
952fa699e80SPeter Delevoryas      * TODO: There is a multi-master i2c connection to an AST1030 MiniBMC on
953fa699e80SPeter Delevoryas      * buses 0, 1, 2, 3, and 9. Source address 0x10, target address 0x20 on
954fa699e80SPeter Delevoryas      * each.
955fa699e80SPeter Delevoryas      */
956fa699e80SPeter Delevoryas }
957fa699e80SPeter Delevoryas 
958fb6b3c8dSJae Hyun Yoo static void qcom_dc_scm_bmc_i2c_init(AspeedMachineState *bmc)
959fb6b3c8dSJae Hyun Yoo {
960fb6b3c8dSJae Hyun Yoo     AspeedSoCState *soc = &bmc->soc;
961fb6b3c8dSJae Hyun Yoo 
962fb6b3c8dSJae Hyun Yoo     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 15), "tmp105", 0x4d);
963fb6b3c8dSJae Hyun Yoo }
964fb6b3c8dSJae Hyun Yoo 
965ece4cccdSGraeme Gregory static void qcom_dc_scm_firework_i2c_init(AspeedMachineState *bmc)
966ece4cccdSGraeme Gregory {
967ece4cccdSGraeme Gregory     AspeedSoCState *soc = &bmc->soc;
968*cfc68f16SMaheswara Kurapati     I2CSlave *therm_mux;
969ece4cccdSGraeme Gregory 
970ece4cccdSGraeme Gregory     /* Create the generic DC-SCM hardware */
971ece4cccdSGraeme Gregory     qcom_dc_scm_bmc_i2c_init(bmc);
972ece4cccdSGraeme Gregory 
973ece4cccdSGraeme Gregory     /* Now create the Firework specific hardware */
9742a75e8c3SMaheswara Kurapati 
975*cfc68f16SMaheswara Kurapati     /* I2C8 Thermal Diodes*/
976*cfc68f16SMaheswara Kurapati     therm_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
977*cfc68f16SMaheswara Kurapati                                         "pca9548", 0x70);
978*cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 0), TYPE_LM75, 0x4C);
979*cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 1), TYPE_LM75, 0x4C);
980*cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 2), TYPE_LM75, 0x48);
981*cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 3), TYPE_LM75, 0x48);
982*cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 4), TYPE_LM75, 0x48);
983*cfc68f16SMaheswara Kurapati 
9842a75e8c3SMaheswara Kurapati     /* I2C9 Fan Controller (MAX31785) */
9852a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x52);
9862a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x54);
987ece4cccdSGraeme Gregory }
988ece4cccdSGraeme Gregory 
9891a15311aSCédric Le Goater static bool aspeed_get_mmio_exec(Object *obj, Error **errp)
9901a15311aSCédric Le Goater {
9911a15311aSCédric Le Goater     return ASPEED_MACHINE(obj)->mmio_exec;
9921a15311aSCédric Le Goater }
9931a15311aSCédric Le Goater 
9941a15311aSCédric Le Goater static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp)
9951a15311aSCédric Le Goater {
9961a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = value;
9971a15311aSCédric Le Goater }
9981a15311aSCédric Le Goater 
9991a15311aSCédric Le Goater static void aspeed_machine_instance_init(Object *obj)
10001a15311aSCédric Le Goater {
10011a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = false;
10021a15311aSCédric Le Goater }
10031a15311aSCédric Le Goater 
10049820e52fSCédric Le Goater static char *aspeed_get_fmc_model(Object *obj, Error **errp)
10059820e52fSCédric Le Goater {
10069820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10079820e52fSCédric Le Goater     return g_strdup(bmc->fmc_model);
10089820e52fSCédric Le Goater }
10099820e52fSCédric Le Goater 
10109820e52fSCédric Le Goater static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp)
10119820e52fSCédric Le Goater {
10129820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10139820e52fSCédric Le Goater 
10149820e52fSCédric Le Goater     g_free(bmc->fmc_model);
10159820e52fSCédric Le Goater     bmc->fmc_model = g_strdup(value);
10169820e52fSCédric Le Goater }
10179820e52fSCédric Le Goater 
10189820e52fSCédric Le Goater static char *aspeed_get_spi_model(Object *obj, Error **errp)
10199820e52fSCédric Le Goater {
10209820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10219820e52fSCédric Le Goater     return g_strdup(bmc->spi_model);
10229820e52fSCédric Le Goater }
10239820e52fSCédric Le Goater 
10249820e52fSCédric Le Goater static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp)
10259820e52fSCédric Le Goater {
10269820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10279820e52fSCédric Le Goater 
10289820e52fSCédric Le Goater     g_free(bmc->spi_model);
10299820e52fSCédric Le Goater     bmc->spi_model = g_strdup(value);
10309820e52fSCédric Le Goater }
10319820e52fSCédric Le Goater 
10321a15311aSCédric Le Goater static void aspeed_machine_class_props_init(ObjectClass *oc)
10331a15311aSCédric Le Goater {
10341a15311aSCédric Le Goater     object_class_property_add_bool(oc, "execute-in-place",
10351a15311aSCédric Le Goater                                    aspeed_get_mmio_exec,
1036d2623129SMarkus Armbruster                                    aspeed_set_mmio_exec);
10371a15311aSCédric Le Goater     object_class_property_set_description(oc, "execute-in-place",
10387eecec7dSMarkus Armbruster                            "boot directly from CE0 flash device");
10399820e52fSCédric Le Goater 
10409820e52fSCédric Le Goater     object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model,
10419820e52fSCédric Le Goater                                    aspeed_set_fmc_model);
10429820e52fSCédric Le Goater     object_class_property_set_description(oc, "fmc-model",
10439820e52fSCédric Le Goater                                           "Change the FMC Flash model");
10449820e52fSCédric Le Goater     object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model,
10459820e52fSCédric Le Goater                                    aspeed_set_spi_model);
10469820e52fSCédric Le Goater     object_class_property_set_description(oc, "spi-model",
10479820e52fSCédric Le Goater                                           "Change the SPI Flash model");
10481a15311aSCédric Le Goater }
10491a15311aSCédric Le Goater 
1050b7f1a0cbSCédric Le Goater static int aspeed_soc_num_cpus(const char *soc_name)
1051b7f1a0cbSCédric Le Goater {
1052b7f1a0cbSCédric Le Goater    AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(soc_name));
1053b7f1a0cbSCédric Le Goater    return sc->num_cpus;
1054b7f1a0cbSCédric Le Goater }
1055b7f1a0cbSCédric Le Goater 
1056fca9ca1bSCédric Le Goater static void aspeed_machine_class_init(ObjectClass *oc, void *data)
105762c2c2ebSCédric Le Goater {
105862c2c2ebSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1059d3bad7e7SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
106062c2c2ebSCédric Le Goater 
1061fca9ca1bSCédric Le Goater     mc->init = aspeed_machine_init;
106262c2c2ebSCédric Le Goater     mc->no_floppy = 1;
106362c2c2ebSCédric Le Goater     mc->no_cdrom = 1;
106462c2c2ebSCédric Le Goater     mc->no_parallel = 1;
1065afcbaed6SIgor Mammedov     mc->default_ram_id = "ram";
1066d3bad7e7SCédric Le Goater     amc->macs_mask = ASPEED_MAC0_ON;
10675d63d0c7SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART5;
10681a15311aSCédric Le Goater 
10691a15311aSCédric Le Goater     aspeed_machine_class_props_init(oc);
107062c2c2ebSCédric Le Goater }
107162c2c2ebSCédric Le Goater 
1072baa4732bSCédric Le Goater static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
1073baa4732bSCédric Le Goater {
1074baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1075baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1076baa4732bSCédric Le Goater 
1077baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Palmetto BMC (ARM926EJ-S)";
1078baa4732bSCédric Le Goater     amc->soc_name  = "ast2400-a1";
1079baa4732bSCédric Le Goater     amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1;
1080baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
1081baa4732bSCédric Le Goater     amc->spi_model = "mx25l25635e";
1082baa4732bSCédric Le Goater     amc->num_cs    = 1;
1083baa4732bSCédric Le Goater     amc->i2c_init  = palmetto_bmc_i2c_init;
1084baa4732bSCédric Le Goater     mc->default_ram_size       = 256 * MiB;
1085b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1086b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1087baa4732bSCédric Le Goater };
1088baa4732bSCédric Le Goater 
10899cccb912SPatrick Venture static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data)
10909cccb912SPatrick Venture {
10919cccb912SPatrick Venture     MachineClass *mc = MACHINE_CLASS(oc);
10929cccb912SPatrick Venture     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
10939cccb912SPatrick Venture 
10949cccb912SPatrick Venture     mc->desc       = "Quanta-Q71l BMC (ARM926EJ-S)";
10959cccb912SPatrick Venture     amc->soc_name  = "ast2400-a1";
10969cccb912SPatrick Venture     amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1;
10979cccb912SPatrick Venture     amc->fmc_model = "n25q256a";
10989cccb912SPatrick Venture     amc->spi_model = "mx25l25635e";
10999cccb912SPatrick Venture     amc->num_cs    = 1;
11009cccb912SPatrick Venture     amc->i2c_init  = quanta_q71l_bmc_i2c_init;
11019cccb912SPatrick Venture     mc->default_ram_size       = 128 * MiB;
11029cccb912SPatrick Venture     mc->default_cpus = mc->min_cpus = mc->max_cpus =
11039cccb912SPatrick Venture         aspeed_soc_num_cpus(amc->soc_name);
11049cccb912SPatrick Venture }
11059cccb912SPatrick Venture 
110640a38df5SErik Smit static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc,
110740a38df5SErik Smit                                                         void *data)
110840a38df5SErik Smit {
110940a38df5SErik Smit     MachineClass *mc = MACHINE_CLASS(oc);
111040a38df5SErik Smit     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
111140a38df5SErik Smit 
111240a38df5SErik Smit     mc->desc       = "Supermicro X11 BMC (ARM926EJ-S)";
111340a38df5SErik Smit     amc->soc_name  = "ast2400-a1";
111440a38df5SErik Smit     amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1;
111540a38df5SErik Smit     amc->fmc_model = "mx25l25635e";
111640a38df5SErik Smit     amc->spi_model = "mx25l25635e";
111740a38df5SErik Smit     amc->num_cs    = 1;
111840a38df5SErik Smit     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
111940a38df5SErik Smit     amc->i2c_init  = palmetto_bmc_i2c_init;
112040a38df5SErik Smit     mc->default_ram_size = 256 * MiB;
112140a38df5SErik Smit }
112240a38df5SErik Smit 
1123baa4732bSCédric Le Goater static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data)
1124baa4732bSCédric Le Goater {
1125baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1126baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1127baa4732bSCédric Le Goater 
1128baa4732bSCédric Le Goater     mc->desc       = "Aspeed AST2500 EVB (ARM1176)";
1129baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1130baa4732bSCédric Le Goater     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
1131753abfc4SJae Hyun Yoo     amc->fmc_model = "mx25l25635e";
1132baa4732bSCédric Le Goater     amc->spi_model = "mx25l25635e";
1133baa4732bSCédric Le Goater     amc->num_cs    = 1;
1134baa4732bSCédric Le Goater     amc->i2c_init  = ast2500_evb_i2c_init;
1135baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
1136b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1137b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1138baa4732bSCédric Le Goater };
1139baa4732bSCédric Le Goater 
1140baa4732bSCédric Le Goater static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data)
1141baa4732bSCédric Le Goater {
1142baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1143baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1144baa4732bSCédric Le Goater 
1145baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Romulus BMC (ARM1176)";
1146baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1147baa4732bSCédric Le Goater     amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1;
1148baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
1149baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1150baa4732bSCédric Le Goater     amc->num_cs    = 2;
1151baa4732bSCédric Le Goater     amc->i2c_init  = romulus_bmc_i2c_init;
1152baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
1153b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1154b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1155baa4732bSCédric Le Goater };
1156baa4732bSCédric Le Goater 
1157143b040fSPatrick Williams static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data)
1158143b040fSPatrick Williams {
1159143b040fSPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1160143b040fSPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1161143b040fSPatrick Williams 
1162143b040fSPatrick Williams     mc->desc       = "OCP SonoraPass BMC (ARM1176)";
1163143b040fSPatrick Williams     amc->soc_name  = "ast2500-a1";
1164143b040fSPatrick Williams     amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1;
1165143b040fSPatrick Williams     amc->fmc_model = "mx66l1g45g";
1166143b040fSPatrick Williams     amc->spi_model = "mx66l1g45g";
1167143b040fSPatrick Williams     amc->num_cs    = 2;
1168143b040fSPatrick Williams     amc->i2c_init  = sonorapass_bmc_i2c_init;
1169143b040fSPatrick Williams     mc->default_ram_size       = 512 * MiB;
1170b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1171b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1172143b040fSPatrick Williams };
1173143b040fSPatrick Williams 
1174baa4732bSCédric Le Goater static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data)
1175baa4732bSCédric Le Goater {
1176baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1177baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1178baa4732bSCédric Le Goater 
1179baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Witherspoon BMC (ARM1176)";
1180baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1181baa4732bSCédric Le Goater     amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1;
1182baa4732bSCédric Le Goater     amc->fmc_model = "mx25l25635e";
1183baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1184baa4732bSCédric Le Goater     amc->num_cs    = 2;
1185baa4732bSCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init;
1186baa4732bSCédric Le Goater     mc->default_ram_size = 512 * MiB;
1187b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1188b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1189baa4732bSCédric Le Goater };
1190baa4732bSCédric Le Goater 
1191baa4732bSCédric Le Goater static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
1192baa4732bSCédric Le Goater {
1193baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1194baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1195baa4732bSCédric Le Goater 
1196f548f201SPeter Maydell     mc->desc       = "Aspeed AST2600 EVB (Cortex-A7)";
1197c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
1198baa4732bSCédric Le Goater     amc->hw_strap1 = AST2600_EVB_HW_STRAP1;
1199baa4732bSCédric Le Goater     amc->hw_strap2 = AST2600_EVB_HW_STRAP2;
1200753abfc4SJae Hyun Yoo     amc->fmc_model = "mx66u51235f";
1201baa4732bSCédric Le Goater     amc->spi_model = "mx66u51235f";
1202baa4732bSCédric Le Goater     amc->num_cs    = 1;
120329193286SGuenter Roeck     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON |
120429193286SGuenter Roeck                      ASPEED_MAC3_ON;
1205baa4732bSCédric Le Goater     amc->i2c_init  = ast2600_evb_i2c_init;
1206baa4732bSCédric Le Goater     mc->default_ram_size = 1 * GiB;
1207b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1208b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1209baa4732bSCédric Le Goater };
1210baa4732bSCédric Le Goater 
121163ceb818SCédric Le Goater static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data)
121263ceb818SCédric Le Goater {
121363ceb818SCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
121463ceb818SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
121563ceb818SCédric Le Goater 
1216f548f201SPeter Maydell     mc->desc       = "OpenPOWER Tacoma BMC (Cortex-A7)";
1217c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
121863ceb818SCédric Le Goater     amc->hw_strap1 = TACOMA_BMC_HW_STRAP1;
121963ceb818SCédric Le Goater     amc->hw_strap2 = TACOMA_BMC_HW_STRAP2;
122063ceb818SCédric Le Goater     amc->fmc_model = "mx66l1g45g";
122163ceb818SCédric Le Goater     amc->spi_model = "mx66l1g45g";
122263ceb818SCédric Le Goater     amc->num_cs    = 2;
1223d3bad7e7SCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON;
122463ceb818SCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init; /* Same board layout */
122563ceb818SCédric Le Goater     mc->default_ram_size = 1 * GiB;
1226b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1227b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
122863ceb818SCédric Le Goater };
122963ceb818SCédric Le Goater 
123095f068c8SJohn Wang static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data)
123195f068c8SJohn Wang {
123295f068c8SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
123395f068c8SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
123495f068c8SJohn Wang 
123595f068c8SJohn Wang     mc->desc       = "Bytedance G220A BMC (ARM1176)";
123695f068c8SJohn Wang     amc->soc_name  = "ast2500-a1";
123795f068c8SJohn Wang     amc->hw_strap1 = G220A_BMC_HW_STRAP1;
123895f068c8SJohn Wang     amc->fmc_model = "n25q512a";
123995f068c8SJohn Wang     amc->spi_model = "mx25l25635e";
124095f068c8SJohn Wang     amc->num_cs    = 2;
12415bb825c8SGuenter Roeck     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
124295f068c8SJohn Wang     amc->i2c_init  = g220a_bmc_i2c_init;
124395f068c8SJohn Wang     mc->default_ram_size = 1024 * MiB;
124495f068c8SJohn Wang     mc->default_cpus = mc->min_cpus = mc->max_cpus =
124595f068c8SJohn Wang         aspeed_soc_num_cpus(amc->soc_name);
124695f068c8SJohn Wang };
124795f068c8SJohn Wang 
124882b6a3f6SJohn Wang static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc, void *data)
124982b6a3f6SJohn Wang {
125082b6a3f6SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
125182b6a3f6SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
125282b6a3f6SJohn Wang 
125382b6a3f6SJohn Wang     mc->desc       = "Inspur FP5280G2 BMC (ARM1176)";
125482b6a3f6SJohn Wang     amc->soc_name  = "ast2500-a1";
125582b6a3f6SJohn Wang     amc->hw_strap1 = FP5280G2_BMC_HW_STRAP1;
125682b6a3f6SJohn Wang     amc->fmc_model = "n25q512a";
125782b6a3f6SJohn Wang     amc->spi_model = "mx25l25635e";
125882b6a3f6SJohn Wang     amc->num_cs    = 2;
125982b6a3f6SJohn Wang     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
126082b6a3f6SJohn Wang     amc->i2c_init  = fp5280g2_bmc_i2c_init;
126182b6a3f6SJohn Wang     mc->default_ram_size = 512 * MiB;
126282b6a3f6SJohn Wang     mc->default_cpus = mc->min_cpus = mc->max_cpus =
126382b6a3f6SJohn Wang         aspeed_soc_num_cpus(amc->soc_name);
126482b6a3f6SJohn Wang };
126582b6a3f6SJohn Wang 
126658e52bdbSCédric Le Goater static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data)
126758e52bdbSCédric Le Goater {
126858e52bdbSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
126958e52bdbSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
127058e52bdbSCédric Le Goater 
1271f548f201SPeter Maydell     mc->desc       = "IBM Rainier BMC (Cortex-A7)";
1272c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
127358e52bdbSCédric Le Goater     amc->hw_strap1 = RAINIER_BMC_HW_STRAP1;
127458e52bdbSCédric Le Goater     amc->hw_strap2 = RAINIER_BMC_HW_STRAP2;
127558e52bdbSCédric Le Goater     amc->fmc_model = "mx66l1g45g";
127658e52bdbSCédric Le Goater     amc->spi_model = "mx66l1g45g";
127758e52bdbSCédric Le Goater     amc->num_cs    = 2;
127858e52bdbSCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
127958e52bdbSCédric Le Goater     amc->i2c_init  = rainier_bmc_i2c_init;
128058e52bdbSCédric Le Goater     mc->default_ram_size = 1 * GiB;
128158e52bdbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
128258e52bdbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
128358e52bdbSCédric Le Goater };
128458e52bdbSCédric Le Goater 
1285febbe308SPeter Delevoryas /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */
1286febbe308SPeter Delevoryas #if HOST_LONG_BITS == 32
1287febbe308SPeter Delevoryas #define FUJI_BMC_RAM_SIZE (1 * GiB)
1288febbe308SPeter Delevoryas #else
1289febbe308SPeter Delevoryas #define FUJI_BMC_RAM_SIZE (2 * GiB)
1290febbe308SPeter Delevoryas #endif
1291febbe308SPeter Delevoryas 
1292febbe308SPeter Delevoryas static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data)
1293febbe308SPeter Delevoryas {
1294febbe308SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1295febbe308SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1296febbe308SPeter Delevoryas 
1297febbe308SPeter Delevoryas     mc->desc = "Facebook Fuji BMC (Cortex-A7)";
1298febbe308SPeter Delevoryas     amc->soc_name = "ast2600-a3";
1299febbe308SPeter Delevoryas     amc->hw_strap1 = FUJI_BMC_HW_STRAP1;
1300febbe308SPeter Delevoryas     amc->hw_strap2 = FUJI_BMC_HW_STRAP2;
1301febbe308SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1302febbe308SPeter Delevoryas     amc->spi_model = "mx66l1g45g";
1303febbe308SPeter Delevoryas     amc->num_cs = 2;
1304febbe308SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1305febbe308SPeter Delevoryas     amc->i2c_init = fuji_bmc_i2c_init;
1306febbe308SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART1;
1307febbe308SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
1308febbe308SPeter Delevoryas     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1309febbe308SPeter Delevoryas         aspeed_soc_num_cpus(amc->soc_name);
1310febbe308SPeter Delevoryas };
1311febbe308SPeter Delevoryas 
1312a20c54b1SPatrick Williams static void aspeed_machine_bletchley_class_init(ObjectClass *oc, void *data)
1313a20c54b1SPatrick Williams {
1314a20c54b1SPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1315a20c54b1SPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1316a20c54b1SPatrick Williams 
1317a20c54b1SPatrick Williams     mc->desc       = "Facebook Bletchley BMC (Cortex-A7)";
1318a20c54b1SPatrick Williams     amc->soc_name  = "ast2600-a3";
1319a20c54b1SPatrick Williams     amc->hw_strap1 = BLETCHLEY_BMC_HW_STRAP1;
1320a20c54b1SPatrick Williams     amc->hw_strap2 = BLETCHLEY_BMC_HW_STRAP2;
1321a20c54b1SPatrick Williams     amc->fmc_model = "w25q01jvq";
1322a20c54b1SPatrick Williams     amc->spi_model = NULL;
1323a20c54b1SPatrick Williams     amc->num_cs    = 2;
1324a20c54b1SPatrick Williams     amc->macs_mask = ASPEED_MAC2_ON;
1325a20c54b1SPatrick Williams     amc->i2c_init  = bletchley_bmc_i2c_init;
1326a20c54b1SPatrick Williams     mc->default_ram_size = 512 * MiB;
1327a20c54b1SPatrick Williams     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1328a20c54b1SPatrick Williams         aspeed_soc_num_cpus(amc->soc_name);
1329a20c54b1SPatrick Williams }
1330a20c54b1SPatrick Williams 
1331fa699e80SPeter Delevoryas static void fby35_reset(MachineState *state)
1332fa699e80SPeter Delevoryas {
1333fa699e80SPeter Delevoryas     AspeedMachineState *bmc = ASPEED_MACHINE(state);
1334fa699e80SPeter Delevoryas     AspeedGPIOState *gpio = &bmc->soc.gpio;
1335fa699e80SPeter Delevoryas 
1336fa699e80SPeter Delevoryas     qemu_devices_reset();
1337fa699e80SPeter Delevoryas 
1338fa699e80SPeter Delevoryas     /* Board ID */
1339fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV4", true, &error_fatal);
1340fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV5", true, &error_fatal);
1341fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV6", true, &error_fatal);
1342fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV7", false, &error_fatal);
1343fa699e80SPeter Delevoryas }
1344fa699e80SPeter Delevoryas 
1345fa699e80SPeter Delevoryas static void aspeed_machine_fby35_class_init(ObjectClass *oc, void *data)
1346fa699e80SPeter Delevoryas {
1347fa699e80SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1348fa699e80SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1349fa699e80SPeter Delevoryas 
1350fa699e80SPeter Delevoryas     mc->desc       = "Facebook fby35 BMC (Cortex-A7)";
1351fa699e80SPeter Delevoryas     mc->reset      = fby35_reset;
1352fa699e80SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1353fa699e80SPeter Delevoryas     amc->num_cs    = 2;
1354fa699e80SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1355fa699e80SPeter Delevoryas     amc->i2c_init  = fby35_i2c_init;
1356fa699e80SPeter Delevoryas     /* FIXME: Replace this macro with something more general */
1357fa699e80SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
1358fa699e80SPeter Delevoryas }
1359fa699e80SPeter Delevoryas 
136066c895b8SJamin Lin #define AST1030_INTERNAL_FLASH_SIZE (1024 * 1024)
136166c895b8SJamin Lin /* Main SYSCLK frequency in Hz (200MHz) */
136266c895b8SJamin Lin #define SYSCLK_FRQ 200000000ULL
136366c895b8SJamin Lin 
136466c895b8SJamin Lin static void aspeed_minibmc_machine_init(MachineState *machine)
136566c895b8SJamin Lin {
136666c895b8SJamin Lin     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
136766c895b8SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
136866c895b8SJamin Lin     Clock *sysclk;
136966c895b8SJamin Lin 
137066c895b8SJamin Lin     sysclk = clock_new(OBJECT(machine), "SYSCLK");
137166c895b8SJamin Lin     clock_set_hz(sysclk, SYSCLK_FRQ);
137266c895b8SJamin Lin 
137366c895b8SJamin Lin     object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
137466c895b8SJamin Lin     qdev_connect_clock_in(DEVICE(&bmc->soc), "sysclk", sysclk);
137566c895b8SJamin Lin 
13764dd9d554SPeter Delevoryas     object_property_set_link(OBJECT(&bmc->soc), "memory",
13774dd9d554SPeter Delevoryas                              OBJECT(get_system_memory()), &error_abort);
137866c895b8SJamin Lin     qdev_prop_set_uint32(DEVICE(&bmc->soc), "uart-default",
137966c895b8SJamin Lin                          amc->uart_default);
138066c895b8SJamin Lin     qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
138166c895b8SJamin Lin 
138266c895b8SJamin Lin     aspeed_board_init_flashes(&bmc->soc.fmc,
138366c895b8SJamin Lin                               bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
138466c895b8SJamin Lin                               amc->num_cs,
138566c895b8SJamin Lin                               0);
138666c895b8SJamin Lin 
138766c895b8SJamin Lin     aspeed_board_init_flashes(&bmc->soc.spi[0],
138866c895b8SJamin Lin                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
138966c895b8SJamin Lin                               amc->num_cs, amc->num_cs);
139066c895b8SJamin Lin 
139166c895b8SJamin Lin     aspeed_board_init_flashes(&bmc->soc.spi[1],
139266c895b8SJamin Lin                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
139366c895b8SJamin Lin                               amc->num_cs, (amc->num_cs * 2));
139466c895b8SJamin Lin 
139566c895b8SJamin Lin     if (amc->i2c_init) {
139666c895b8SJamin Lin         amc->i2c_init(bmc);
139766c895b8SJamin Lin     }
139866c895b8SJamin Lin 
139966c895b8SJamin Lin     armv7m_load_kernel(ARM_CPU(first_cpu),
140066c895b8SJamin Lin                        machine->kernel_filename,
140166c895b8SJamin Lin                        AST1030_INTERNAL_FLASH_SIZE);
140266c895b8SJamin Lin }
140366c895b8SJamin Lin 
14044c70ab16STroy Lee static void ast1030_evb_i2c_init(AspeedMachineState *bmc)
14054c70ab16STroy Lee {
14064c70ab16STroy Lee     AspeedSoCState *soc = &bmc->soc;
14074c70ab16STroy Lee 
14084c70ab16STroy Lee     /* U10 24C08 connects to SDA/SCL Groupt 1 by default */
14094c70ab16STroy Lee     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
14104c70ab16STroy Lee     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, eeprom_buf);
14114c70ab16STroy Lee 
14124c70ab16STroy Lee     /* U11 LM75 connects to SDA/SCL Group 2 by default */
14134c70ab16STroy Lee     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d);
14144c70ab16STroy Lee }
14154c70ab16STroy Lee 
141666c895b8SJamin Lin static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc,
141766c895b8SJamin Lin                                                           void *data)
141866c895b8SJamin Lin {
141966c895b8SJamin Lin     MachineClass *mc = MACHINE_CLASS(oc);
142066c895b8SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
142166c895b8SJamin Lin 
142266c895b8SJamin Lin     mc->desc = "Aspeed AST1030 MiniBMC (Cortex-M4)";
142366c895b8SJamin Lin     amc->soc_name = "ast1030-a1";
142466c895b8SJamin Lin     amc->hw_strap1 = 0;
142566c895b8SJamin Lin     amc->hw_strap2 = 0;
142666c895b8SJamin Lin     mc->init = aspeed_minibmc_machine_init;
14274c70ab16STroy Lee     amc->i2c_init = ast1030_evb_i2c_init;
142866c895b8SJamin Lin     mc->default_ram_size = 0;
142966c895b8SJamin Lin     mc->default_cpus = mc->min_cpus = mc->max_cpus = 1;
143066c895b8SJamin Lin     amc->fmc_model = "sst25vf032b";
143166c895b8SJamin Lin     amc->spi_model = "sst25vf032b";
143266c895b8SJamin Lin     amc->num_cs = 2;
143366c895b8SJamin Lin     amc->macs_mask = 0;
143466c895b8SJamin Lin }
143566c895b8SJamin Lin 
1436fb6b3c8dSJae Hyun Yoo static void aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass *oc,
1437fb6b3c8dSJae Hyun Yoo                                                      void *data)
1438fb6b3c8dSJae Hyun Yoo {
1439fb6b3c8dSJae Hyun Yoo     MachineClass *mc = MACHINE_CLASS(oc);
1440fb6b3c8dSJae Hyun Yoo     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1441fb6b3c8dSJae Hyun Yoo 
1442fb6b3c8dSJae Hyun Yoo     mc->desc       = "Qualcomm DC-SCM V1 BMC (Cortex A7)";
1443fb6b3c8dSJae Hyun Yoo     amc->soc_name  = "ast2600-a3";
1444fb6b3c8dSJae Hyun Yoo     amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1445fb6b3c8dSJae Hyun Yoo     amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1446fb6b3c8dSJae Hyun Yoo     amc->fmc_model = "n25q512a";
1447fb6b3c8dSJae Hyun Yoo     amc->spi_model = "n25q512a";
1448fb6b3c8dSJae Hyun Yoo     amc->num_cs    = 2;
1449fb6b3c8dSJae Hyun Yoo     amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1450fb6b3c8dSJae Hyun Yoo     amc->i2c_init  = qcom_dc_scm_bmc_i2c_init;
1451fb6b3c8dSJae Hyun Yoo     mc->default_ram_size = 1 * GiB;
1452fb6b3c8dSJae Hyun Yoo     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1453fb6b3c8dSJae Hyun Yoo         aspeed_soc_num_cpus(amc->soc_name);
1454fb6b3c8dSJae Hyun Yoo };
1455fb6b3c8dSJae Hyun Yoo 
1456ece4cccdSGraeme Gregory static void aspeed_machine_qcom_firework_class_init(ObjectClass *oc,
1457ece4cccdSGraeme Gregory                                                     void *data)
1458ece4cccdSGraeme Gregory {
1459ece4cccdSGraeme Gregory     MachineClass *mc = MACHINE_CLASS(oc);
1460ece4cccdSGraeme Gregory     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1461ece4cccdSGraeme Gregory 
1462ece4cccdSGraeme Gregory     mc->desc       = "Qualcomm DC-SCM V1/Firework BMC (Cortex A7)";
1463ece4cccdSGraeme Gregory     amc->soc_name  = "ast2600-a3";
1464ece4cccdSGraeme Gregory     amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1465ece4cccdSGraeme Gregory     amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1466ece4cccdSGraeme Gregory     amc->fmc_model = "n25q512a";
1467ece4cccdSGraeme Gregory     amc->spi_model = "n25q512a";
1468ece4cccdSGraeme Gregory     amc->num_cs    = 2;
1469ece4cccdSGraeme Gregory     amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1470ece4cccdSGraeme Gregory     amc->i2c_init  = qcom_dc_scm_firework_i2c_init;
1471ece4cccdSGraeme Gregory     mc->default_ram_size = 1 * GiB;
1472ece4cccdSGraeme Gregory     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1473ece4cccdSGraeme Gregory         aspeed_soc_num_cpus(amc->soc_name);
1474ece4cccdSGraeme Gregory };
1475ece4cccdSGraeme Gregory 
1476baa4732bSCédric Le Goater static const TypeInfo aspeed_machine_types[] = {
1477baa4732bSCédric Le Goater     {
1478baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("palmetto-bmc"),
1479baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1480baa4732bSCédric Le Goater         .class_init    = aspeed_machine_palmetto_class_init,
1481baa4732bSCédric Le Goater     }, {
148240a38df5SErik Smit         .name          = MACHINE_TYPE_NAME("supermicrox11-bmc"),
148340a38df5SErik Smit         .parent        = TYPE_ASPEED_MACHINE,
148440a38df5SErik Smit         .class_init    = aspeed_machine_supermicrox11_bmc_class_init,
148540a38df5SErik Smit     }, {
1486baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2500-evb"),
1487baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1488baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2500_evb_class_init,
1489baa4732bSCédric Le Goater     }, {
1490baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("romulus-bmc"),
1491baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1492baa4732bSCédric Le Goater         .class_init    = aspeed_machine_romulus_class_init,
1493baa4732bSCédric Le Goater     }, {
1494143b040fSPatrick Williams         .name          = MACHINE_TYPE_NAME("sonorapass-bmc"),
1495143b040fSPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1496143b040fSPatrick Williams         .class_init    = aspeed_machine_sonorapass_class_init,
1497143b040fSPatrick Williams     }, {
1498baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("witherspoon-bmc"),
1499baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1500baa4732bSCédric Le Goater         .class_init    = aspeed_machine_witherspoon_class_init,
1501baa4732bSCédric Le Goater     }, {
1502baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2600-evb"),
1503baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1504baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2600_evb_class_init,
1505baa4732bSCédric Le Goater     }, {
150663ceb818SCédric Le Goater         .name          = MACHINE_TYPE_NAME("tacoma-bmc"),
150763ceb818SCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
150863ceb818SCédric Le Goater         .class_init    = aspeed_machine_tacoma_class_init,
150963ceb818SCédric Le Goater     }, {
151095f068c8SJohn Wang         .name          = MACHINE_TYPE_NAME("g220a-bmc"),
151195f068c8SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
151295f068c8SJohn Wang         .class_init    = aspeed_machine_g220a_class_init,
151395f068c8SJohn Wang     }, {
1514fb6b3c8dSJae Hyun Yoo         .name          = MACHINE_TYPE_NAME("qcom-dc-scm-v1-bmc"),
1515fb6b3c8dSJae Hyun Yoo         .parent        = TYPE_ASPEED_MACHINE,
1516fb6b3c8dSJae Hyun Yoo         .class_init    = aspeed_machine_qcom_dc_scm_v1_class_init,
1517fb6b3c8dSJae Hyun Yoo     }, {
1518ece4cccdSGraeme Gregory         .name          = MACHINE_TYPE_NAME("qcom-firework-bmc"),
1519ece4cccdSGraeme Gregory         .parent        = TYPE_ASPEED_MACHINE,
1520ece4cccdSGraeme Gregory         .class_init    = aspeed_machine_qcom_firework_class_init,
1521ece4cccdSGraeme Gregory     }, {
152282b6a3f6SJohn Wang         .name          = MACHINE_TYPE_NAME("fp5280g2-bmc"),
152382b6a3f6SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
152482b6a3f6SJohn Wang         .class_init    = aspeed_machine_fp5280g2_class_init,
152582b6a3f6SJohn Wang     }, {
15269cccb912SPatrick Venture         .name          = MACHINE_TYPE_NAME("quanta-q71l-bmc"),
15279cccb912SPatrick Venture         .parent        = TYPE_ASPEED_MACHINE,
15289cccb912SPatrick Venture         .class_init    = aspeed_machine_quanta_q71l_class_init,
15299cccb912SPatrick Venture     }, {
153058e52bdbSCédric Le Goater         .name          = MACHINE_TYPE_NAME("rainier-bmc"),
153158e52bdbSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
153258e52bdbSCédric Le Goater         .class_init    = aspeed_machine_rainier_class_init,
153358e52bdbSCédric Le Goater     }, {
1534febbe308SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fuji-bmc"),
1535febbe308SPeter Delevoryas         .parent        = TYPE_ASPEED_MACHINE,
1536febbe308SPeter Delevoryas         .class_init    = aspeed_machine_fuji_class_init,
1537febbe308SPeter Delevoryas     }, {
1538a20c54b1SPatrick Williams         .name          = MACHINE_TYPE_NAME("bletchley-bmc"),
1539a20c54b1SPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1540a20c54b1SPatrick Williams         .class_init    = aspeed_machine_bletchley_class_init,
1541a20c54b1SPatrick Williams     }, {
1542fa699e80SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fby35-bmc"),
1543fa699e80SPeter Delevoryas         .parent        = MACHINE_TYPE_NAME("ast2600-evb"),
1544fa699e80SPeter Delevoryas         .class_init    = aspeed_machine_fby35_class_init,
1545fa699e80SPeter Delevoryas     }, {
154666c895b8SJamin Lin         .name           = MACHINE_TYPE_NAME("ast1030-evb"),
154766c895b8SJamin Lin         .parent         = TYPE_ASPEED_MACHINE,
154866c895b8SJamin Lin         .class_init     = aspeed_minibmc_machine_ast1030_evb_class_init,
154966c895b8SJamin Lin     }, {
1550fca9ca1bSCédric Le Goater         .name          = TYPE_ASPEED_MACHINE,
155162c2c2ebSCédric Le Goater         .parent        = TYPE_MACHINE,
1552888b2b03SPhilippe Mathieu-Daudé         .instance_size = sizeof(AspeedMachineState),
15531a15311aSCédric Le Goater         .instance_init = aspeed_machine_instance_init,
1554fca9ca1bSCédric Le Goater         .class_size    = sizeof(AspeedMachineClass),
1555fca9ca1bSCédric Le Goater         .class_init    = aspeed_machine_class_init,
1556baa4732bSCédric Le Goater         .abstract      = true,
1557baa4732bSCédric Le Goater     }
1558fca9ca1bSCédric Le Goater };
155974fb1f38SCédric Le Goater 
1560baa4732bSCédric Le Goater DEFINE_TYPES(aspeed_machine_types)
1561