xref: /qemu/hw/arm/aspeed.c (revision 4dd9d55416695b651d8146e057acff8954bc203d)
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 
1779bb6d140SJoel Stanley #define AST_SMP_MAILBOX_BASE            0x1e6e2180
1789bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_ENTRY        (AST_SMP_MAILBOX_BASE + 0x0)
1799bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_GOSIGN       (AST_SMP_MAILBOX_BASE + 0x4)
1809bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_READY        (AST_SMP_MAILBOX_BASE + 0x8)
1819bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_POLLINSN     (AST_SMP_MAILBOX_BASE + 0xc)
1829bb6d140SJoel Stanley #define AST_SMP_MBOX_CODE               (AST_SMP_MAILBOX_BASE + 0x10)
1839bb6d140SJoel Stanley #define AST_SMP_MBOX_GOSIGN             0xabbaab00
1849bb6d140SJoel Stanley 
1859bb6d140SJoel Stanley static void aspeed_write_smpboot(ARMCPU *cpu,
1869bb6d140SJoel Stanley                                  const struct arm_boot_info *info)
1879bb6d140SJoel Stanley {
1889bb6d140SJoel Stanley     static const uint32_t poll_mailbox_ready[] = {
1899bb6d140SJoel Stanley         /*
1909bb6d140SJoel Stanley          * r2 = per-cpu go sign value
1919bb6d140SJoel Stanley          * r1 = AST_SMP_MBOX_FIELD_ENTRY
1929bb6d140SJoel Stanley          * r0 = AST_SMP_MBOX_FIELD_GOSIGN
1939bb6d140SJoel Stanley          */
1949bb6d140SJoel Stanley         0xee100fb0,  /* mrc     p15, 0, r0, c0, c0, 5 */
1959bb6d140SJoel Stanley         0xe21000ff,  /* ands    r0, r0, #255          */
1969bb6d140SJoel Stanley         0xe59f201c,  /* ldr     r2, [pc, #28]         */
1979bb6d140SJoel Stanley         0xe1822000,  /* orr     r2, r2, r0            */
1989bb6d140SJoel Stanley 
1999bb6d140SJoel Stanley         0xe59f1018,  /* ldr     r1, [pc, #24]         */
2009bb6d140SJoel Stanley         0xe59f0018,  /* ldr     r0, [pc, #24]         */
2019bb6d140SJoel Stanley 
2029bb6d140SJoel Stanley         0xe320f002,  /* wfe                           */
2039bb6d140SJoel Stanley         0xe5904000,  /* ldr     r4, [r0]              */
2049bb6d140SJoel Stanley         0xe1520004,  /* cmp     r2, r4                */
2059bb6d140SJoel Stanley         0x1afffffb,  /* bne     <wfe>                 */
2069bb6d140SJoel Stanley         0xe591f000,  /* ldr     pc, [r1]              */
2079bb6d140SJoel Stanley         AST_SMP_MBOX_GOSIGN,
2089bb6d140SJoel Stanley         AST_SMP_MBOX_FIELD_ENTRY,
2099bb6d140SJoel Stanley         AST_SMP_MBOX_FIELD_GOSIGN,
2109bb6d140SJoel Stanley     };
2119bb6d140SJoel Stanley 
2129bb6d140SJoel Stanley     rom_add_blob_fixed("aspeed.smpboot", poll_mailbox_ready,
2139bb6d140SJoel Stanley                        sizeof(poll_mailbox_ready),
2149bb6d140SJoel Stanley                        info->smp_loader_start);
2159bb6d140SJoel Stanley }
2169bb6d140SJoel Stanley 
2179bb6d140SJoel Stanley static void aspeed_reset_secondary(ARMCPU *cpu,
2189bb6d140SJoel Stanley                                    const struct arm_boot_info *info)
2199bb6d140SJoel Stanley {
2209bb6d140SJoel Stanley     AddressSpace *as = arm_boot_address_space(cpu, info);
2219bb6d140SJoel Stanley     CPUState *cs = CPU(cpu);
2229bb6d140SJoel Stanley 
2239bb6d140SJoel Stanley     /* info->smp_bootreg_addr */
2249bb6d140SJoel Stanley     address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0,
2259bb6d140SJoel Stanley                                MEMTXATTRS_UNSPECIFIED, NULL);
2269bb6d140SJoel Stanley     cpu_set_pc(cs, info->smp_loader_start);
2279bb6d140SJoel Stanley }
2289bb6d140SJoel Stanley 
229d769a1daSCédric Le Goater #define FIRMWARE_ADDR 0x0
230d769a1daSCédric Le Goater 
231d769a1daSCédric Le Goater static void write_boot_rom(DriveInfo *dinfo, hwaddr addr, size_t rom_size,
232d769a1daSCédric Le Goater                            Error **errp)
233d769a1daSCédric Le Goater {
234d769a1daSCédric Le Goater     BlockBackend *blk = blk_by_legacy_dinfo(dinfo);
23505e6e40aSWentao_Liang     g_autofree void *storage = NULL;
2360c7209beSCédric Le Goater     int64_t size;
237d769a1daSCédric Le Goater 
2380c7209beSCédric Le Goater     /* The block backend size should have already been 'validated' by
2390c7209beSCédric Le Goater      * the creation of the m25p80 object.
2400c7209beSCédric Le Goater      */
2410c7209beSCédric Le Goater     size = blk_getlength(blk);
2420c7209beSCédric Le Goater     if (size <= 0) {
2430c7209beSCédric Le Goater         error_setg(errp, "failed to get flash size");
2440c7209beSCédric Le Goater         return;
2450c7209beSCédric Le Goater     }
2460c7209beSCédric Le Goater 
2470c7209beSCédric Le Goater     if (rom_size > size) {
2480c7209beSCédric Le Goater         rom_size = size;
249d769a1daSCédric Le Goater     }
250d769a1daSCédric Le Goater 
25105e6e40aSWentao_Liang     storage = g_malloc0(rom_size);
252d769a1daSCédric Le Goater     if (blk_pread(blk, 0, storage, rom_size) < 0) {
253d769a1daSCédric Le Goater         error_setg(errp, "failed to read the initial flash content");
254d769a1daSCédric Le Goater         return;
255d769a1daSCédric Le Goater     }
256d769a1daSCédric Le Goater 
257d769a1daSCédric Le Goater     rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr);
258d769a1daSCédric Le Goater }
259d769a1daSCédric Le Goater 
2609bd4ac61SCédric Le Goater static void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
2619bd4ac61SCédric Le Goater                                       unsigned int count, int unit0)
262e1ad9bc4SCédric Le Goater {
263e1ad9bc4SCédric Le Goater     int i;
264179b2058SPatrick Williams 
265179b2058SPatrick Williams     if (!flashtype) {
266179b2058SPatrick Williams         return;
267179b2058SPatrick Williams     }
268e1ad9bc4SCédric Le Goater 
2699bd4ac61SCédric Le Goater     for (i = 0; i < count; ++i) {
2708ec239f2SMarkus Armbruster         DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i);
271e1ad9bc4SCédric Le Goater         qemu_irq cs_line;
272a7d78befSCédric Le Goater         DeviceState *dev;
273e1ad9bc4SCédric Le Goater 
274a7d78befSCédric Le Goater         dev = qdev_new(flashtype);
275e1ad9bc4SCédric Le Goater         if (dinfo) {
276a7d78befSCédric Le Goater             qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo));
277e1ad9bc4SCédric Le Goater         }
278a7d78befSCédric Le Goater         qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal);
279e1ad9bc4SCédric Le Goater 
280a7d78befSCédric Le Goater         cs_line = qdev_get_gpio_in_named(dev, SSI_GPIO_CS, 0);
281e1ad9bc4SCédric Le Goater         sysbus_connect_irq(SYS_BUS_DEVICE(s), i + 1, cs_line);
282e1ad9bc4SCédric Le Goater     }
283e1ad9bc4SCédric Le Goater }
284e1ad9bc4SCédric Le Goater 
285a29e3e12SAndrew Jeffery static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo)
286a29e3e12SAndrew Jeffery {
287a29e3e12SAndrew Jeffery         DeviceState *card;
288a29e3e12SAndrew Jeffery 
289756f739bSPhilippe Mathieu-Daudé         if (!dinfo) {
290756f739bSPhilippe Mathieu-Daudé             return;
291756f739bSPhilippe Mathieu-Daudé         }
2923e80f690SMarkus Armbruster         card = qdev_new(TYPE_SD_CARD);
293934df912SMarkus Armbruster         qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
294a29e3e12SAndrew Jeffery                                 &error_fatal);
2953e80f690SMarkus Armbruster         qdev_realize_and_unref(card,
2963e80f690SMarkus Armbruster                                qdev_get_child_bus(DEVICE(sdhci), "sd-bus"),
2973e80f690SMarkus Armbruster                                &error_fatal);
298a29e3e12SAndrew Jeffery }
299a29e3e12SAndrew Jeffery 
300baa4732bSCédric Le Goater static void aspeed_machine_init(MachineState *machine)
301327d8e4eSAndrew Jeffery {
302888b2b03SPhilippe Mathieu-Daudé     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
303baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
304b033271fSCédric Le Goater     AspeedSoCClass *sc;
305d769a1daSCédric Le Goater     DriveInfo *drive0 = drive_get(IF_MTD, 0, 0);
3062bea128cSEddie James     int i;
307d3bad7e7SCédric Le Goater     NICInfo *nd = &nd_table[0];
308327d8e4eSAndrew Jeffery 
3099fc7fc4dSMarkus Armbruster     object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
310327d8e4eSAndrew Jeffery 
311b033271fSCédric Le Goater     sc = ASPEED_SOC_GET_CLASS(&bmc->soc);
312b033271fSCédric Le Goater 
313533eb415SIgor Mammedov     /*
314346160cbSCédric Le Goater      * This will error out if the RAM size is not supported by the
315346160cbSCédric Le Goater      * memory controller of the SoC.
316533eb415SIgor Mammedov      */
3176e504a98SPaolo Bonzini     object_property_set_uint(OBJECT(&bmc->soc), "ram-size", machine->ram_size,
318533eb415SIgor Mammedov                              &error_fatal);
319533eb415SIgor Mammedov 
320d3bad7e7SCédric Le Goater     for (i = 0; i < sc->macs_num; i++) {
321d3bad7e7SCédric Le Goater         if ((amc->macs_mask & (1 << i)) && nd->used) {
322d3bad7e7SCédric Le Goater             qemu_check_nic_model(nd, TYPE_FTGMAC100);
323d3bad7e7SCédric Le Goater             qdev_set_nic_properties(DEVICE(&bmc->soc.ftgmac100[i]), nd);
324d3bad7e7SCédric Le Goater             nd++;
325d3bad7e7SCédric Le Goater         }
326d3bad7e7SCédric Le Goater     }
327d3bad7e7SCédric Le Goater 
3285325cc34SMarkus Armbruster     object_property_set_int(OBJECT(&bmc->soc), "hw-strap1", amc->hw_strap1,
32987e79af0SAndrew Jeffery                             &error_abort);
3305325cc34SMarkus Armbruster     object_property_set_int(OBJECT(&bmc->soc), "hw-strap2", amc->hw_strap2,
331ccc2c418SCédric Le Goater                             &error_abort);
332*4dd9d554SPeter Delevoryas     object_property_set_link(OBJECT(&bmc->soc), "memory",
333*4dd9d554SPeter Delevoryas                              OBJECT(get_system_memory()), &error_abort);
3345325cc34SMarkus Armbruster     object_property_set_link(OBJECT(&bmc->soc), "dram",
3350df2d9a6SCédric Le Goater                              OBJECT(machine->ram), &error_abort);
336b6e70d1dSJoel Stanley     if (machine->kernel_filename) {
337b6e70d1dSJoel Stanley         /*
338b6e70d1dSJoel Stanley          * When booting with a -kernel command line there is no u-boot
339b6e70d1dSJoel Stanley          * that runs to unlock the SCU. In this case set the default to
340b6e70d1dSJoel Stanley          * be unlocked as the kernel expects
341b6e70d1dSJoel Stanley          */
3425325cc34SMarkus Armbruster         object_property_set_int(OBJECT(&bmc->soc), "hw-prot-key",
3435325cc34SMarkus Armbruster                                 ASPEED_SCU_PROT_KEY, &error_abort);
344b6e70d1dSJoel Stanley     }
3455d63d0c7SPeter Delevoryas     qdev_prop_set_uint32(DEVICE(&bmc->soc), "uart-default",
3465d63d0c7SPeter Delevoryas                          amc->uart_default);
347ce189ab2SMarkus Armbruster     qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
348327d8e4eSAndrew Jeffery 
3498ec239f2SMarkus Armbruster     aspeed_board_init_flashes(&bmc->soc.fmc,
3508ec239f2SMarkus Armbruster                               bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
3519bd4ac61SCédric Le Goater                               amc->num_cs, 0);
3528ec239f2SMarkus Armbruster     aspeed_board_init_flashes(&bmc->soc.spi[0],
3538ec239f2SMarkus Armbruster                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
3549bd4ac61SCédric Le Goater                               1, amc->num_cs);
355e1ad9bc4SCédric Le Goater 
356d769a1daSCédric Le Goater     /* Install first FMC flash content as a boot rom. */
357d769a1daSCédric Le Goater     if (drive0) {
358d769a1daSCédric Le Goater         AspeedSMCFlash *fl = &bmc->soc.fmc.flashes[0];
359d769a1daSCédric Le Goater         MemoryRegion *boot_rom = g_new(MemoryRegion, 1);
3606bb55e79SCédric Le Goater         uint64_t size = memory_region_size(&fl->mmio);
361d769a1daSCédric Le Goater 
362d769a1daSCédric Le Goater         /*
363d769a1daSCédric Le Goater          * create a ROM region using the default mapping window size of
36493bf276dSCédric Le Goater          * the flash module. The window size is 64MB for the AST2400
36593bf276dSCédric Le Goater          * SoC and 128MB for the AST2500 SoC, which is twice as big as
36693bf276dSCédric Le Goater          * needed by the flash modules of the Aspeed machines.
367d769a1daSCédric Le Goater          */
3681a15311aSCédric Le Goater         if (ASPEED_MACHINE(machine)->mmio_exec) {
369f489960dSPhilippe Mathieu-Daudé             memory_region_init_alias(boot_rom, NULL, "aspeed.boot_rom",
3706bb55e79SCédric Le Goater                                      &fl->mmio, 0, size);
3711a15311aSCédric Le Goater             memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
3721a15311aSCédric Le Goater                                         boot_rom);
3731a15311aSCédric Le Goater         } else {
374f489960dSPhilippe Mathieu-Daudé             memory_region_init_rom(boot_rom, NULL, "aspeed.boot_rom",
3756bb55e79SCédric Le Goater                                    size, &error_abort);
376d769a1daSCédric Le Goater             memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
377d769a1daSCédric Le Goater                                         boot_rom);
3786bb55e79SCédric Le Goater             write_boot_rom(drive0, FIRMWARE_ADDR, size, &error_abort);
379d769a1daSCédric Le Goater         }
3801a15311aSCédric Le Goater     }
381d769a1daSCédric Le Goater 
382b7f1a0cbSCédric Le Goater     if (machine->kernel_filename && sc->num_cpus > 1) {
3839bb6d140SJoel Stanley         /* With no u-boot we must set up a boot stub for the secondary CPU */
3849bb6d140SJoel Stanley         MemoryRegion *smpboot = g_new(MemoryRegion, 1);
385f489960dSPhilippe Mathieu-Daudé         memory_region_init_ram(smpboot, NULL, "aspeed.smpboot",
3869bb6d140SJoel Stanley                                0x80, &error_abort);
3879bb6d140SJoel Stanley         memory_region_add_subregion(get_system_memory(),
3889bb6d140SJoel Stanley                                     AST_SMP_MAILBOX_BASE, smpboot);
3899bb6d140SJoel Stanley 
3909bb6d140SJoel Stanley         aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot;
3919bb6d140SJoel Stanley         aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary;
3929bb6d140SJoel Stanley         aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE;
3939bb6d140SJoel Stanley     }
3949bb6d140SJoel Stanley 
3956e504a98SPaolo Bonzini     aspeed_board_binfo.ram_size = machine->ram_size;
396347df6f8SEduardo Habkost     aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM];
397b033271fSCédric Le Goater 
398baa4732bSCédric Le Goater     if (amc->i2c_init) {
399baa4732bSCédric Le Goater         amc->i2c_init(bmc);
4002cf6cb50SCédric Le Goater     }
4012cf6cb50SCédric Le Goater 
4020e2c24c6SAndrew Jeffery     for (i = 0; i < bmc->soc.sdhci.num_slots; i++) {
4038ec239f2SMarkus Armbruster         sdhci_attach_drive(&bmc->soc.sdhci.slots[i],
4048ec239f2SMarkus Armbruster                            drive_get(IF_SD, 0, i));
405a29e3e12SAndrew Jeffery     }
4062bea128cSEddie James 
407a29e3e12SAndrew Jeffery     if (bmc->soc.emmc.num_slots) {
4088ec239f2SMarkus Armbruster         sdhci_attach_drive(&bmc->soc.emmc.slots[0],
4098ec239f2SMarkus Armbruster                            drive_get(IF_SD, 0, bmc->soc.sdhci.num_slots));
4102bea128cSEddie James     }
4112bea128cSEddie James 
4122744ece8STao Xu     arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo);
413327d8e4eSAndrew Jeffery }
414327d8e4eSAndrew Jeffery 
41582b6a3f6SJohn Wang static void at24c_eeprom_init(I2CBus *bus, uint8_t addr, uint32_t rsize)
41682b6a3f6SJohn Wang {
41782b6a3f6SJohn Wang     I2CSlave *i2c_dev = i2c_slave_new("at24c-eeprom", addr);
41882b6a3f6SJohn Wang     DeviceState *dev = DEVICE(i2c_dev);
41982b6a3f6SJohn Wang 
42082b6a3f6SJohn Wang     qdev_prop_set_uint32(dev, "rom-size", rsize);
42182b6a3f6SJohn Wang     i2c_slave_realize_and_unref(i2c_dev, bus, &error_abort);
42282b6a3f6SJohn Wang }
42382b6a3f6SJohn Wang 
424612b219aSPhilippe Mathieu-Daudé static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
4252cf6cb50SCédric Le Goater {
4262cf6cb50SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
427a87e81b9SCédric Le Goater     DeviceState *dev;
4283d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
4292cf6cb50SCédric Le Goater 
4302cf6cb50SCédric Le Goater     /* The palmetto platform expects a ds3231 RTC but a ds1338 is
4312cf6cb50SCédric Le Goater      * enough to provide basic RTC features. Alarms will be missing */
4321373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
433a87e81b9SCédric Le Goater 
4347a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
4353d165f12SCédric Le Goater                           eeprom_buf);
4363d165f12SCédric Le Goater 
437a87e81b9SCédric Le Goater     /* add a TMP423 temperature sensor */
4381373b15bSPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
4391373b15bSPhilippe Mathieu-Daudé                                          "tmp423", 0x4c));
4405325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
4415325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
4425325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
4435325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort);
4442cf6cb50SCédric Le Goater }
4452cf6cb50SCédric Le Goater 
4469cccb912SPatrick Venture static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc)
4479cccb912SPatrick Venture {
4489cccb912SPatrick Venture     AspeedSoCState *soc = &bmc->soc;
4499cccb912SPatrick Venture 
4509cccb912SPatrick Venture     /*
4519cccb912SPatrick Venture      * The quanta-q71l platform expects tmp75s which are compatible with
4529cccb912SPatrick Venture      * tmp105s.
4539cccb912SPatrick Venture      */
4549cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c);
4559cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e);
4569cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f);
4579cccb912SPatrick Venture 
4589cccb912SPatrick Venture     /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */
4599cccb912SPatrick Venture     /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */
4609cccb912SPatrick Venture     /* TODO: Add Memory Riser i2c mux and eeproms. */
4619cccb912SPatrick Venture 
4623ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74);
4633ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77);
4643ec75e39SPatrick Venture 
4659cccb912SPatrick Venture     /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */
4663ec75e39SPatrick Venture 
4673ec75e39SPatrick Venture     /* i2c-7 */
4683ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70);
4699cccb912SPatrick Venture     /*        - i2c@0: pmbus@59 */
4709cccb912SPatrick Venture     /*        - i2c@1: pmbus@58 */
4719cccb912SPatrick Venture     /*        - i2c@2: pmbus@58 */
4729cccb912SPatrick Venture     /*        - i2c@3: pmbus@59 */
4733ec75e39SPatrick Venture 
4749cccb912SPatrick Venture     /* TODO: i2c-7: Add PDB FRU eeprom@52 */
4759cccb912SPatrick Venture     /* TODO: i2c-8: Add BMC FRU eeprom@50 */
4769cccb912SPatrick Venture }
4779cccb912SPatrick Venture 
478612b219aSPhilippe Mathieu-Daudé static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
4792cf6cb50SCédric Le Goater {
4802cf6cb50SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
4813d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
4823d165f12SCédric Le Goater 
4837a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50,
4843d165f12SCédric Le Goater                           eeprom_buf);
4852cf6cb50SCédric Le Goater 
4862cf6cb50SCédric Le Goater     /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
4871373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
488044475f3SPhilippe Mathieu-Daudé                      TYPE_TMP105, 0x4d);
4892cf6cb50SCédric Le Goater }
4902cf6cb50SCédric Le Goater 
491612b219aSPhilippe Mathieu-Daudé static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
492ccc2c418SCédric Le Goater {
49352bcd997SHoward Chiu     AspeedSoCState *soc = &bmc->soc;
49452bcd997SHoward Chiu     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
49552bcd997SHoward Chiu 
49652bcd997SHoward Chiu     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50,
49752bcd997SHoward Chiu                           eeprom_buf);
49852bcd997SHoward Chiu 
49952bcd997SHoward Chiu     /* LM75 is compatible with TMP105 driver */
50052bcd997SHoward Chiu     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
50152bcd997SHoward Chiu                      TYPE_TMP105, 0x4d);
502ccc2c418SCédric Le Goater }
503ccc2c418SCédric Le Goater 
504612b219aSPhilippe Mathieu-Daudé static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
5056c4567c7SCédric Le Goater {
5066c4567c7SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
5076c4567c7SCédric Le Goater 
5086c4567c7SCédric Le Goater     /* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
5096c4567c7SCédric Le Goater      * good enough */
5101373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
5116c4567c7SCédric Le Goater }
5126c4567c7SCédric Le Goater 
513f4aec252SCédric Le Goater static void create_pca9552(AspeedSoCState *soc, int bus_id, int addr)
514f4aec252SCédric Le Goater {
515f4aec252SCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, bus_id),
516f4aec252SCédric Le Goater                             TYPE_PCA9552, addr);
517f4aec252SCédric Le Goater }
518f4aec252SCédric Le Goater 
519612b219aSPhilippe Mathieu-Daudé static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc)
520143b040fSPatrick Williams {
521143b040fSPatrick Williams     AspeedSoCState *soc = &bmc->soc;
522143b040fSPatrick Williams 
523143b040fSPatrick Williams     /* bus 2 : */
5241373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48);
5251373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49);
526143b040fSPatrick Williams     /* bus 2 : pca9546 @ 0x73 */
527143b040fSPatrick Williams 
528143b040fSPatrick Williams     /* bus 3 : pca9548 @ 0x70 */
529143b040fSPatrick Williams 
530143b040fSPatrick Williams     /* bus 4 : */
531143b040fSPatrick Williams     uint8_t *eeprom4_54 = g_malloc0(8 * 1024);
5327a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54,
533143b040fSPatrick Williams                           eeprom4_54);
534143b040fSPatrick Williams     /* PCA9539 @ 0x76, but PCA9552 is compatible */
535f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x76);
536143b040fSPatrick Williams     /* PCA9539 @ 0x77, but PCA9552 is compatible */
537f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x77);
538143b040fSPatrick Williams 
539143b040fSPatrick Williams     /* bus 6 : */
5401373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48);
5411373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49);
542143b040fSPatrick Williams     /* bus 6 : pca9546 @ 0x73 */
543143b040fSPatrick Williams 
544143b040fSPatrick Williams     /* bus 8 : */
545143b040fSPatrick Williams     uint8_t *eeprom8_56 = g_malloc0(8 * 1024);
5467a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56,
547143b040fSPatrick Williams                           eeprom8_56);
548f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x60);
549f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x61);
550143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1d */
551143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1f */
552143b040fSPatrick Williams 
553143b040fSPatrick Williams     /*
554143b040fSPatrick Williams      * bus 13 : pca9548 @ 0x71
555143b040fSPatrick Williams      *      - channel 3:
556143b040fSPatrick Williams      *          - tmm421 @ 0x4c
557143b040fSPatrick Williams      *          - tmp421 @ 0x4e
558143b040fSPatrick Williams      *          - tmp421 @ 0x4f
559143b040fSPatrick Williams      */
560143b040fSPatrick Williams 
561143b040fSPatrick Williams }
562143b040fSPatrick Williams 
563612b219aSPhilippe Mathieu-Daudé static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
56462c2c2ebSCédric Le Goater {
5657cfbde5eSPhilippe Mathieu-Daudé     static const struct {
5667cfbde5eSPhilippe Mathieu-Daudé         unsigned gpio_id;
5677cfbde5eSPhilippe Mathieu-Daudé         LEDColor color;
5687cfbde5eSPhilippe Mathieu-Daudé         const char *description;
5697cfbde5eSPhilippe Mathieu-Daudé         bool gpio_polarity;
5707cfbde5eSPhilippe Mathieu-Daudé     } pca1_leds[] = {
5717cfbde5eSPhilippe Mathieu-Daudé         {13, LED_COLOR_GREEN, "front-fault-4",  GPIO_POLARITY_ACTIVE_LOW},
5727cfbde5eSPhilippe Mathieu-Daudé         {14, LED_COLOR_GREEN, "front-power-3",  GPIO_POLARITY_ACTIVE_LOW},
5737cfbde5eSPhilippe Mathieu-Daudé         {15, LED_COLOR_GREEN, "front-id-5",     GPIO_POLARITY_ACTIVE_LOW},
5747cfbde5eSPhilippe Mathieu-Daudé     };
57562c2c2ebSCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
5763d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
57715ce12cfSPhilippe Mathieu-Daudé     DeviceState *dev;
5787cfbde5eSPhilippe Mathieu-Daudé     LEDState *led;
57962c2c2ebSCédric Le Goater 
58063ceb818SCédric Le Goater     /* Bus 3: TODO bmp280@77 */
58163ceb818SCédric Le Goater     /* Bus 3: TODO max31785@52 */
582db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
58315ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca1");
5842616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
5852616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 3),
58615ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
5878c9a61d7SCédric Le Goater 
5887cfbde5eSPhilippe Mathieu-Daudé     for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) {
5897cfbde5eSPhilippe Mathieu-Daudé         led = led_create_simple(OBJECT(bmc),
5907cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].gpio_polarity,
5917cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].color,
5927cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].description);
5937cfbde5eSPhilippe Mathieu-Daudé         qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id,
5947cfbde5eSPhilippe Mathieu-Daudé                               qdev_get_gpio_in(DEVICE(led), 0));
5957cfbde5eSPhilippe Mathieu-Daudé     }
596b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76);
5971373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c);
5981373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c);
59962c2c2ebSCédric Le Goater 
60062c2c2ebSCédric Le Goater     /* The Witherspoon expects a TMP275 but a TMP105 is compatible */
6011373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105,
602044475f3SPhilippe Mathieu-Daudé                      0x4a);
6036c4567c7SCédric Le Goater 
6046c4567c7SCédric Le Goater     /* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
6056c4567c7SCédric Le Goater      * good enough */
6061373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
6073d165f12SCédric Le Goater 
6087a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51,
6093d165f12SCédric Le Goater                           eeprom_buf);
610db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
61115ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca0");
6122616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
6132616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 11),
61415ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
61563ceb818SCédric Le Goater     /* Bus 11: TODO ucd90160@64 */
61662c2c2ebSCédric Le Goater }
61762c2c2ebSCédric Le Goater 
61895f068c8SJohn Wang static void g220a_bmc_i2c_init(AspeedMachineState *bmc)
61995f068c8SJohn Wang {
62095f068c8SJohn Wang     AspeedSoCState *soc = &bmc->soc;
62195f068c8SJohn Wang     DeviceState *dev;
62295f068c8SJohn Wang 
62395f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3),
62495f068c8SJohn Wang                                          "emc1413", 0x4c));
62595f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
62695f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
62795f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
62895f068c8SJohn Wang 
62995f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12),
63095f068c8SJohn Wang                                          "emc1413", 0x4c));
63195f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
63295f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
63395f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
63495f068c8SJohn Wang 
63595f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13),
63695f068c8SJohn Wang                                          "emc1413", 0x4c));
63795f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
63895f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
63995f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
6406f5f6507SJohn Wang 
6416f5f6507SJohn Wang     static uint8_t eeprom_buf[2 * 1024] = {
6426f5f6507SJohn Wang             0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe,
6436f5f6507SJohn Wang             0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65,
6446f5f6507SJohn Wang             0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32,
6456f5f6507SJohn Wang             0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42,
6466f5f6507SJohn Wang             0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45,
6476f5f6507SJohn Wang             0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1,
6486f5f6507SJohn Wang             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7,
6496f5f6507SJohn Wang     };
6506f5f6507SJohn Wang     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57,
6516f5f6507SJohn Wang                           eeprom_buf);
65295f068c8SJohn Wang }
65395f068c8SJohn Wang 
654fa6d98c0SJoel Stanley static void aspeed_eeprom_init(I2CBus *bus, uint8_t addr, uint32_t rsize)
655fa6d98c0SJoel Stanley {
656fa6d98c0SJoel Stanley     I2CSlave *i2c_dev = i2c_slave_new("at24c-eeprom", addr);
657fa6d98c0SJoel Stanley     DeviceState *dev = DEVICE(i2c_dev);
658fa6d98c0SJoel Stanley 
659fa6d98c0SJoel Stanley     qdev_prop_set_uint32(dev, "rom-size", rsize);
660fa6d98c0SJoel Stanley     i2c_slave_realize_and_unref(i2c_dev, bus, &error_abort);
661fa6d98c0SJoel Stanley }
662fa6d98c0SJoel Stanley 
66382b6a3f6SJohn Wang static void fp5280g2_bmc_i2c_init(AspeedMachineState *bmc)
66482b6a3f6SJohn Wang {
66582b6a3f6SJohn Wang     AspeedSoCState *soc = &bmc->soc;
66682b6a3f6SJohn Wang     I2CSlave *i2c_mux;
66782b6a3f6SJohn Wang 
66882b6a3f6SJohn Wang     /* The at24c256 */
66982b6a3f6SJohn Wang     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 1), 0x50, 32768);
67082b6a3f6SJohn Wang 
67182b6a3f6SJohn Wang     /* The fp5280g2 expects a TMP112 but a TMP105 is compatible */
67282b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
67382b6a3f6SJohn Wang                      0x48);
67482b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
67582b6a3f6SJohn Wang                      0x49);
67682b6a3f6SJohn Wang 
67782b6a3f6SJohn Wang     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
67882b6a3f6SJohn Wang                      "pca9546", 0x70);
67982b6a3f6SJohn Wang     /* It expects a TMP112 but a TMP105 is compatible */
68082b6a3f6SJohn Wang     i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0), TYPE_TMP105,
68182b6a3f6SJohn Wang                      0x4a);
68282b6a3f6SJohn Wang 
68382b6a3f6SJohn Wang     /* It expects a ds3232 but a ds1338 is good enough */
68482b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "ds1338", 0x68);
68582b6a3f6SJohn Wang 
68682b6a3f6SJohn Wang     /* It expects a pca9555 but a pca9552 is compatible */
687f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x30);
68882b6a3f6SJohn Wang }
68982b6a3f6SJohn Wang 
69058e52bdbSCédric Le Goater static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
69158e52bdbSCédric Le Goater {
69258e52bdbSCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
693fa6d98c0SJoel Stanley     I2CSlave *i2c_mux;
694fa6d98c0SJoel Stanley 
695fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB);
69658e52bdbSCédric Le Goater 
697f4aec252SCédric Le Goater     create_pca9552(soc, 3, 0x61);
698bcb122f8SJoel Stanley 
69958e52bdbSCédric Le Goater     /* The rainier expects a TMP275 but a TMP105 is compatible */
70058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
70158e52bdbSCédric Le Goater                      0x48);
70258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
70358e52bdbSCédric Le Goater                      0x49);
70458e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
70558e52bdbSCédric Le Goater                      0x4a);
706fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4),
707fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
708fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
709fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
710fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB);
711f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x60);
71258e52bdbSCédric Le Goater 
71358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
71458e52bdbSCédric Le Goater                      0x48);
71558e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
71658e52bdbSCédric Le Goater                      0x49);
717f4aec252SCédric Le Goater     create_pca9552(soc, 5, 0x60);
718f4aec252SCédric Le Goater     create_pca9552(soc, 5, 0x61);
719fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5),
720fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
721fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
722fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
72358e52bdbSCédric Le Goater 
72458e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
72558e52bdbSCédric Le Goater                      0x48);
72658e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
72758e52bdbSCédric Le Goater                      0x4a);
72858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
72958e52bdbSCédric Le Goater                      0x4b);
730fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6),
731fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
732fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
733fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
734fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB);
735fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB);
73658e52bdbSCédric Le Goater 
737f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x30);
738f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x31);
739f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x32);
740f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x33);
74158e52bdbSCédric Le Goater     /* Bus 7: TODO max31785@52 */
742f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x60);
743f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x61);
744b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76);
74558e52bdbSCédric Le Goater     /* Bus 7: TODO si7021-a20@20 */
74658e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105,
74758e52bdbSCédric Le Goater                      0x48);
748fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB);
749fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB);
75058e52bdbSCédric Le Goater 
75158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
75258e52bdbSCédric Le Goater                      0x48);
75358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
75458e52bdbSCédric Le Goater                      0x4a);
755fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50, 64 * KiB);
756fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 64 * KiB);
757f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x60);
758f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x61);
75958e52bdbSCédric Le Goater     /* Bus 8: ucd90320@11 */
76058e52bdbSCédric Le Goater     /* Bus 8: ucd90320@b */
76158e52bdbSCédric Le Goater     /* Bus 8: ucd90320@c */
76258e52bdbSCédric Le Goater 
76358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c);
76458e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d);
765fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB);
76658e52bdbSCédric Le Goater 
76758e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c);
76858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d);
769fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB);
77058e52bdbSCédric Le Goater 
77158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
77258e52bdbSCédric Le Goater                      0x48);
77358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
77458e52bdbSCédric Le Goater                      0x49);
775fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11),
776fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
777fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
778fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
779f4aec252SCédric Le Goater     create_pca9552(soc, 11, 0x60);
780fa6d98c0SJoel Stanley 
781fa6d98c0SJoel Stanley 
782fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB);
783f4aec252SCédric Le Goater     create_pca9552(soc, 13, 0x60);
784fa6d98c0SJoel Stanley 
785fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB);
786f4aec252SCédric Le Goater     create_pca9552(soc, 14, 0x60);
787fa6d98c0SJoel Stanley 
788fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB);
789f4aec252SCédric Le Goater     create_pca9552(soc, 15, 0x60);
79058e52bdbSCédric Le Goater }
79158e52bdbSCédric Le Goater 
792febbe308SPeter Delevoryas static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr,
793febbe308SPeter Delevoryas                                  I2CBus **channels)
794febbe308SPeter Delevoryas {
795febbe308SPeter Delevoryas     I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr);
796febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
797febbe308SPeter Delevoryas         channels[i] = pca954x_i2c_get_bus(mux, i);
798febbe308SPeter Delevoryas     }
799febbe308SPeter Delevoryas }
800febbe308SPeter Delevoryas 
801febbe308SPeter Delevoryas #define TYPE_LM75 TYPE_TMP105
802febbe308SPeter Delevoryas #define TYPE_TMP75 TYPE_TMP105
803febbe308SPeter Delevoryas #define TYPE_TMP422 "tmp422"
804febbe308SPeter Delevoryas 
805febbe308SPeter Delevoryas static void fuji_bmc_i2c_init(AspeedMachineState *bmc)
806febbe308SPeter Delevoryas {
807febbe308SPeter Delevoryas     AspeedSoCState *soc = &bmc->soc;
808febbe308SPeter Delevoryas     I2CBus *i2c[144] = {};
809febbe308SPeter Delevoryas 
810febbe308SPeter Delevoryas     for (int i = 0; i < 16; i++) {
811febbe308SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
812febbe308SPeter Delevoryas     }
813febbe308SPeter Delevoryas     I2CBus *i2c180 = i2c[2];
814febbe308SPeter Delevoryas     I2CBus *i2c480 = i2c[8];
815febbe308SPeter Delevoryas     I2CBus *i2c600 = i2c[11];
816febbe308SPeter Delevoryas 
817febbe308SPeter Delevoryas     get_pca9548_channels(i2c180, 0x70, &i2c[16]);
818febbe308SPeter Delevoryas     get_pca9548_channels(i2c480, 0x70, &i2c[24]);
819febbe308SPeter Delevoryas     /* NOTE: The device tree skips [32, 40) in the alias numbering */
820febbe308SPeter Delevoryas     get_pca9548_channels(i2c600, 0x77, &i2c[40]);
821febbe308SPeter Delevoryas     get_pca9548_channels(i2c[24], 0x71, &i2c[48]);
822febbe308SPeter Delevoryas     get_pca9548_channels(i2c[25], 0x72, &i2c[56]);
823febbe308SPeter Delevoryas     get_pca9548_channels(i2c[26], 0x76, &i2c[64]);
824febbe308SPeter Delevoryas     get_pca9548_channels(i2c[27], 0x76, &i2c[72]);
825febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
826febbe308SPeter Delevoryas         get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]);
827febbe308SPeter Delevoryas     }
828febbe308SPeter Delevoryas 
829febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c);
830febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d);
831febbe308SPeter Delevoryas 
832febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[19], 0x52, 64 * KiB);
833febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[20], 0x50, 2 * KiB);
834febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[22], 0x52, 2 * KiB);
835febbe308SPeter Delevoryas 
836febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x48);
837febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x49);
838febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x4a);
839febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_TMP422, 0x4c);
840febbe308SPeter Delevoryas 
841febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[8], 0x51, 64 * KiB);
842febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a);
843febbe308SPeter Delevoryas 
844febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[50], TYPE_LM75, 0x4c);
845febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[50], 0x52, 64 * KiB);
846febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[51], TYPE_TMP75, 0x48);
847febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[52], TYPE_TMP75, 0x49);
848febbe308SPeter Delevoryas 
849febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[59], TYPE_TMP75, 0x48);
850febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[60], TYPE_TMP75, 0x49);
851febbe308SPeter Delevoryas 
852febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[65], 0x53, 64 * KiB);
853febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x49);
854febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x48);
855febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[68], 0x52, 64 * KiB);
856febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[69], 0x52, 64 * KiB);
857febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[70], 0x52, 64 * KiB);
858febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[71], 0x52, 64 * KiB);
859febbe308SPeter Delevoryas 
860febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[73], 0x53, 64 * KiB);
861febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x49);
862febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x48);
863febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[76], 0x52, 64 * KiB);
864febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[77], 0x52, 64 * KiB);
865febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[78], 0x52, 64 * KiB);
866febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[79], 0x52, 64 * KiB);
867febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[28], 0x50, 2 * KiB);
868febbe308SPeter Delevoryas 
869febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
870febbe308SPeter Delevoryas         aspeed_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB);
871febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[82 + i * 8], TYPE_TMP75, 0x48);
872febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[83 + i * 8], TYPE_TMP75, 0x4b);
873febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[84 + i * 8], TYPE_TMP75, 0x4a);
874febbe308SPeter Delevoryas     }
875febbe308SPeter Delevoryas }
876febbe308SPeter Delevoryas 
877a20c54b1SPatrick Williams #define TYPE_TMP421 "tmp421"
878a20c54b1SPatrick Williams 
879a20c54b1SPatrick Williams static void bletchley_bmc_i2c_init(AspeedMachineState *bmc)
880a20c54b1SPatrick Williams {
881a20c54b1SPatrick Williams     AspeedSoCState *soc = &bmc->soc;
882a20c54b1SPatrick Williams     I2CBus *i2c[13] = {};
883a20c54b1SPatrick Williams     for (int i = 0; i < 13; i++) {
884a20c54b1SPatrick Williams         if ((i == 8) || (i == 11)) {
885a20c54b1SPatrick Williams             continue;
886a20c54b1SPatrick Williams         }
887a20c54b1SPatrick Williams         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
888a20c54b1SPatrick Williams     }
889a20c54b1SPatrick Williams 
890a20c54b1SPatrick Williams     /* Bus 0 - 5 all have the same config. */
891a20c54b1SPatrick Williams     for (int i = 0; i < 6; i++) {
892a20c54b1SPatrick Williams         /* Missing model: ti,ina230 @ 0x45 */
893a20c54b1SPatrick Williams         /* Missing model: mps,mp5023 @ 0x40 */
894a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_TMP421, 0x4f);
895a20c54b1SPatrick Williams         /* Missing model: nxp,pca9539 @ 0x76, but PCA9552 works enough */
896a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x76);
897a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x67);
898a20c54b1SPatrick Williams         /* Missing model: fsc,fusb302 @ 0x22 */
899a20c54b1SPatrick Williams     }
900a20c54b1SPatrick Williams 
901a20c54b1SPatrick Williams     /* Bus 6 */
902a20c54b1SPatrick Williams     at24c_eeprom_init(i2c[6], 0x56, 65536);
903a20c54b1SPatrick Williams     /* Missing model: nxp,pcf85263 @ 0x51 , but ds1338 works enough */
904a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[6], "ds1338", 0x51);
905a20c54b1SPatrick Williams 
906a20c54b1SPatrick Williams 
907a20c54b1SPatrick Williams     /* Bus 7 */
908a20c54b1SPatrick Williams     at24c_eeprom_init(i2c[7], 0x54, 65536);
909a20c54b1SPatrick Williams 
910a20c54b1SPatrick Williams     /* Bus 9 */
911a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[9], TYPE_TMP421, 0x4f);
912a20c54b1SPatrick Williams 
913a20c54b1SPatrick Williams     /* Bus 10 */
914a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[10], TYPE_TMP421, 0x4f);
915a20c54b1SPatrick Williams     /* Missing model: ti,hdc1080 @ 0x40 */
916a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[10], TYPE_PCA9552, 0x67);
917a20c54b1SPatrick Williams 
918a20c54b1SPatrick Williams     /* Bus 12 */
919a20c54b1SPatrick Williams     /* Missing model: adi,adm1278 @ 0x11 */
920a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4c);
921a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4d);
922a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_PCA9552, 0x67);
923a20c54b1SPatrick Williams }
924a20c54b1SPatrick Williams 
925fa699e80SPeter Delevoryas static void fby35_i2c_init(AspeedMachineState *bmc)
926fa699e80SPeter Delevoryas {
927fa699e80SPeter Delevoryas     AspeedSoCState *soc = &bmc->soc;
928fa699e80SPeter Delevoryas     I2CBus *i2c[16];
929fa699e80SPeter Delevoryas 
930fa699e80SPeter Delevoryas     for (int i = 0; i < 16; i++) {
931fa699e80SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
932fa699e80SPeter Delevoryas     }
933fa699e80SPeter Delevoryas 
934fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[2], TYPE_LM75, 0x4f);
935fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_TMP421, 0x1f);
936fa699e80SPeter Delevoryas     /* Hotswap controller is actually supposed to be mp5920 or ltc4282. */
937fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[11], "adm1272", 0x44);
938fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4e);
939fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4f);
940fa699e80SPeter Delevoryas 
941fa699e80SPeter Delevoryas     aspeed_eeprom_init(i2c[4], 0x51, 128 * KiB);
942fa699e80SPeter Delevoryas     aspeed_eeprom_init(i2c[6], 0x51, 128 * KiB);
943fa699e80SPeter Delevoryas     aspeed_eeprom_init(i2c[8], 0x50, 32 * KiB);
944fa699e80SPeter Delevoryas     aspeed_eeprom_init(i2c[11], 0x51, 128 * KiB);
945fa699e80SPeter Delevoryas     aspeed_eeprom_init(i2c[11], 0x54, 128 * KiB);
946fa699e80SPeter Delevoryas 
947fa699e80SPeter Delevoryas     /*
948fa699e80SPeter Delevoryas      * TODO: There is a multi-master i2c connection to an AST1030 MiniBMC on
949fa699e80SPeter Delevoryas      * buses 0, 1, 2, 3, and 9. Source address 0x10, target address 0x20 on
950fa699e80SPeter Delevoryas      * each.
951fa699e80SPeter Delevoryas      */
952fa699e80SPeter Delevoryas }
953fa699e80SPeter Delevoryas 
9541a15311aSCédric Le Goater static bool aspeed_get_mmio_exec(Object *obj, Error **errp)
9551a15311aSCédric Le Goater {
9561a15311aSCédric Le Goater     return ASPEED_MACHINE(obj)->mmio_exec;
9571a15311aSCédric Le Goater }
9581a15311aSCédric Le Goater 
9591a15311aSCédric Le Goater static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp)
9601a15311aSCédric Le Goater {
9611a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = value;
9621a15311aSCédric Le Goater }
9631a15311aSCédric Le Goater 
9641a15311aSCédric Le Goater static void aspeed_machine_instance_init(Object *obj)
9651a15311aSCédric Le Goater {
9661a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = false;
9671a15311aSCédric Le Goater }
9681a15311aSCédric Le Goater 
9699820e52fSCédric Le Goater static char *aspeed_get_fmc_model(Object *obj, Error **errp)
9709820e52fSCédric Le Goater {
9719820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
9729820e52fSCédric Le Goater     return g_strdup(bmc->fmc_model);
9739820e52fSCédric Le Goater }
9749820e52fSCédric Le Goater 
9759820e52fSCédric Le Goater static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp)
9769820e52fSCédric Le Goater {
9779820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
9789820e52fSCédric Le Goater 
9799820e52fSCédric Le Goater     g_free(bmc->fmc_model);
9809820e52fSCédric Le Goater     bmc->fmc_model = g_strdup(value);
9819820e52fSCédric Le Goater }
9829820e52fSCédric Le Goater 
9839820e52fSCédric Le Goater static char *aspeed_get_spi_model(Object *obj, Error **errp)
9849820e52fSCédric Le Goater {
9859820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
9869820e52fSCédric Le Goater     return g_strdup(bmc->spi_model);
9879820e52fSCédric Le Goater }
9889820e52fSCédric Le Goater 
9899820e52fSCédric Le Goater static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp)
9909820e52fSCédric Le Goater {
9919820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
9929820e52fSCédric Le Goater 
9939820e52fSCédric Le Goater     g_free(bmc->spi_model);
9949820e52fSCédric Le Goater     bmc->spi_model = g_strdup(value);
9959820e52fSCédric Le Goater }
9969820e52fSCédric Le Goater 
9971a15311aSCédric Le Goater static void aspeed_machine_class_props_init(ObjectClass *oc)
9981a15311aSCédric Le Goater {
9991a15311aSCédric Le Goater     object_class_property_add_bool(oc, "execute-in-place",
10001a15311aSCédric Le Goater                                    aspeed_get_mmio_exec,
1001d2623129SMarkus Armbruster                                    aspeed_set_mmio_exec);
10021a15311aSCédric Le Goater     object_class_property_set_description(oc, "execute-in-place",
10037eecec7dSMarkus Armbruster                            "boot directly from CE0 flash device");
10049820e52fSCédric Le Goater 
10059820e52fSCédric Le Goater     object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model,
10069820e52fSCédric Le Goater                                    aspeed_set_fmc_model);
10079820e52fSCédric Le Goater     object_class_property_set_description(oc, "fmc-model",
10089820e52fSCédric Le Goater                                           "Change the FMC Flash model");
10099820e52fSCédric Le Goater     object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model,
10109820e52fSCédric Le Goater                                    aspeed_set_spi_model);
10119820e52fSCédric Le Goater     object_class_property_set_description(oc, "spi-model",
10129820e52fSCédric Le Goater                                           "Change the SPI Flash model");
10131a15311aSCédric Le Goater }
10141a15311aSCédric Le Goater 
1015b7f1a0cbSCédric Le Goater static int aspeed_soc_num_cpus(const char *soc_name)
1016b7f1a0cbSCédric Le Goater {
1017b7f1a0cbSCédric Le Goater    AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(soc_name));
1018b7f1a0cbSCédric Le Goater    return sc->num_cpus;
1019b7f1a0cbSCédric Le Goater }
1020b7f1a0cbSCédric Le Goater 
1021fca9ca1bSCédric Le Goater static void aspeed_machine_class_init(ObjectClass *oc, void *data)
102262c2c2ebSCédric Le Goater {
102362c2c2ebSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1024d3bad7e7SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
102562c2c2ebSCédric Le Goater 
1026fca9ca1bSCédric Le Goater     mc->init = aspeed_machine_init;
102762c2c2ebSCédric Le Goater     mc->no_floppy = 1;
102862c2c2ebSCédric Le Goater     mc->no_cdrom = 1;
102962c2c2ebSCédric Le Goater     mc->no_parallel = 1;
1030afcbaed6SIgor Mammedov     mc->default_ram_id = "ram";
1031d3bad7e7SCédric Le Goater     amc->macs_mask = ASPEED_MAC0_ON;
10325d63d0c7SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART5;
10331a15311aSCédric Le Goater 
10341a15311aSCédric Le Goater     aspeed_machine_class_props_init(oc);
103562c2c2ebSCédric Le Goater }
103662c2c2ebSCédric Le Goater 
1037baa4732bSCédric Le Goater static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
1038baa4732bSCédric Le Goater {
1039baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1040baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1041baa4732bSCédric Le Goater 
1042baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Palmetto BMC (ARM926EJ-S)";
1043baa4732bSCédric Le Goater     amc->soc_name  = "ast2400-a1";
1044baa4732bSCédric Le Goater     amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1;
1045baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
1046baa4732bSCédric Le Goater     amc->spi_model = "mx25l25635e";
1047baa4732bSCédric Le Goater     amc->num_cs    = 1;
1048baa4732bSCédric Le Goater     amc->i2c_init  = palmetto_bmc_i2c_init;
1049baa4732bSCédric Le Goater     mc->default_ram_size       = 256 * MiB;
1050b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1051b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1052baa4732bSCédric Le Goater };
1053baa4732bSCédric Le Goater 
10549cccb912SPatrick Venture static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data)
10559cccb912SPatrick Venture {
10569cccb912SPatrick Venture     MachineClass *mc = MACHINE_CLASS(oc);
10579cccb912SPatrick Venture     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
10589cccb912SPatrick Venture 
10599cccb912SPatrick Venture     mc->desc       = "Quanta-Q71l BMC (ARM926EJ-S)";
10609cccb912SPatrick Venture     amc->soc_name  = "ast2400-a1";
10619cccb912SPatrick Venture     amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1;
10629cccb912SPatrick Venture     amc->fmc_model = "n25q256a";
10639cccb912SPatrick Venture     amc->spi_model = "mx25l25635e";
10649cccb912SPatrick Venture     amc->num_cs    = 1;
10659cccb912SPatrick Venture     amc->i2c_init  = quanta_q71l_bmc_i2c_init;
10669cccb912SPatrick Venture     mc->default_ram_size       = 128 * MiB;
10679cccb912SPatrick Venture     mc->default_cpus = mc->min_cpus = mc->max_cpus =
10689cccb912SPatrick Venture         aspeed_soc_num_cpus(amc->soc_name);
10699cccb912SPatrick Venture }
10709cccb912SPatrick Venture 
107140a38df5SErik Smit static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc,
107240a38df5SErik Smit                                                         void *data)
107340a38df5SErik Smit {
107440a38df5SErik Smit     MachineClass *mc = MACHINE_CLASS(oc);
107540a38df5SErik Smit     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
107640a38df5SErik Smit 
107740a38df5SErik Smit     mc->desc       = "Supermicro X11 BMC (ARM926EJ-S)";
107840a38df5SErik Smit     amc->soc_name  = "ast2400-a1";
107940a38df5SErik Smit     amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1;
108040a38df5SErik Smit     amc->fmc_model = "mx25l25635e";
108140a38df5SErik Smit     amc->spi_model = "mx25l25635e";
108240a38df5SErik Smit     amc->num_cs    = 1;
108340a38df5SErik Smit     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
108440a38df5SErik Smit     amc->i2c_init  = palmetto_bmc_i2c_init;
108540a38df5SErik Smit     mc->default_ram_size = 256 * MiB;
108640a38df5SErik Smit }
108740a38df5SErik Smit 
1088baa4732bSCédric Le Goater static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data)
1089baa4732bSCédric Le Goater {
1090baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1091baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1092baa4732bSCédric Le Goater 
1093baa4732bSCédric Le Goater     mc->desc       = "Aspeed AST2500 EVB (ARM1176)";
1094baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1095baa4732bSCédric Le Goater     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
1096753abfc4SJae Hyun Yoo     amc->fmc_model = "mx25l25635e";
1097baa4732bSCédric Le Goater     amc->spi_model = "mx25l25635e";
1098baa4732bSCédric Le Goater     amc->num_cs    = 1;
1099baa4732bSCédric Le Goater     amc->i2c_init  = ast2500_evb_i2c_init;
1100baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
1101b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1102b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1103baa4732bSCédric Le Goater };
1104baa4732bSCédric Le Goater 
1105baa4732bSCédric Le Goater static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data)
1106baa4732bSCédric Le Goater {
1107baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1108baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1109baa4732bSCédric Le Goater 
1110baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Romulus BMC (ARM1176)";
1111baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1112baa4732bSCédric Le Goater     amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1;
1113baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
1114baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1115baa4732bSCédric Le Goater     amc->num_cs    = 2;
1116baa4732bSCédric Le Goater     amc->i2c_init  = romulus_bmc_i2c_init;
1117baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
1118b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1119b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1120baa4732bSCédric Le Goater };
1121baa4732bSCédric Le Goater 
1122143b040fSPatrick Williams static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data)
1123143b040fSPatrick Williams {
1124143b040fSPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1125143b040fSPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1126143b040fSPatrick Williams 
1127143b040fSPatrick Williams     mc->desc       = "OCP SonoraPass BMC (ARM1176)";
1128143b040fSPatrick Williams     amc->soc_name  = "ast2500-a1";
1129143b040fSPatrick Williams     amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1;
1130143b040fSPatrick Williams     amc->fmc_model = "mx66l1g45g";
1131143b040fSPatrick Williams     amc->spi_model = "mx66l1g45g";
1132143b040fSPatrick Williams     amc->num_cs    = 2;
1133143b040fSPatrick Williams     amc->i2c_init  = sonorapass_bmc_i2c_init;
1134143b040fSPatrick Williams     mc->default_ram_size       = 512 * MiB;
1135b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1136b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1137143b040fSPatrick Williams };
1138143b040fSPatrick Williams 
1139baa4732bSCédric Le Goater static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data)
1140baa4732bSCédric Le Goater {
1141baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1142baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1143baa4732bSCédric Le Goater 
1144baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Witherspoon BMC (ARM1176)";
1145baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1146baa4732bSCédric Le Goater     amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1;
1147baa4732bSCédric Le Goater     amc->fmc_model = "mx25l25635e";
1148baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1149baa4732bSCédric Le Goater     amc->num_cs    = 2;
1150baa4732bSCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init;
1151baa4732bSCédric Le Goater     mc->default_ram_size = 512 * MiB;
1152b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1153b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1154baa4732bSCédric Le Goater };
1155baa4732bSCédric Le Goater 
1156baa4732bSCédric Le Goater static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
1157baa4732bSCédric Le Goater {
1158baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1159baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1160baa4732bSCédric Le Goater 
1161f548f201SPeter Maydell     mc->desc       = "Aspeed AST2600 EVB (Cortex-A7)";
1162c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
1163baa4732bSCédric Le Goater     amc->hw_strap1 = AST2600_EVB_HW_STRAP1;
1164baa4732bSCédric Le Goater     amc->hw_strap2 = AST2600_EVB_HW_STRAP2;
1165753abfc4SJae Hyun Yoo     amc->fmc_model = "mx66u51235f";
1166baa4732bSCédric Le Goater     amc->spi_model = "mx66u51235f";
1167baa4732bSCédric Le Goater     amc->num_cs    = 1;
116829193286SGuenter Roeck     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON |
116929193286SGuenter Roeck                      ASPEED_MAC3_ON;
1170baa4732bSCédric Le Goater     amc->i2c_init  = ast2600_evb_i2c_init;
1171baa4732bSCédric Le Goater     mc->default_ram_size = 1 * GiB;
1172b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1173b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1174baa4732bSCédric Le Goater };
1175baa4732bSCédric Le Goater 
117663ceb818SCédric Le Goater static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data)
117763ceb818SCédric Le Goater {
117863ceb818SCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
117963ceb818SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
118063ceb818SCédric Le Goater 
1181f548f201SPeter Maydell     mc->desc       = "OpenPOWER Tacoma BMC (Cortex-A7)";
1182c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
118363ceb818SCédric Le Goater     amc->hw_strap1 = TACOMA_BMC_HW_STRAP1;
118463ceb818SCédric Le Goater     amc->hw_strap2 = TACOMA_BMC_HW_STRAP2;
118563ceb818SCédric Le Goater     amc->fmc_model = "mx66l1g45g";
118663ceb818SCédric Le Goater     amc->spi_model = "mx66l1g45g";
118763ceb818SCédric Le Goater     amc->num_cs    = 2;
1188d3bad7e7SCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON;
118963ceb818SCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init; /* Same board layout */
119063ceb818SCédric Le Goater     mc->default_ram_size = 1 * GiB;
1191b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1192b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
119363ceb818SCédric Le Goater };
119463ceb818SCédric Le Goater 
119595f068c8SJohn Wang static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data)
119695f068c8SJohn Wang {
119795f068c8SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
119895f068c8SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
119995f068c8SJohn Wang 
120095f068c8SJohn Wang     mc->desc       = "Bytedance G220A BMC (ARM1176)";
120195f068c8SJohn Wang     amc->soc_name  = "ast2500-a1";
120295f068c8SJohn Wang     amc->hw_strap1 = G220A_BMC_HW_STRAP1;
120395f068c8SJohn Wang     amc->fmc_model = "n25q512a";
120495f068c8SJohn Wang     amc->spi_model = "mx25l25635e";
120595f068c8SJohn Wang     amc->num_cs    = 2;
12065bb825c8SGuenter Roeck     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
120795f068c8SJohn Wang     amc->i2c_init  = g220a_bmc_i2c_init;
120895f068c8SJohn Wang     mc->default_ram_size = 1024 * MiB;
120995f068c8SJohn Wang     mc->default_cpus = mc->min_cpus = mc->max_cpus =
121095f068c8SJohn Wang         aspeed_soc_num_cpus(amc->soc_name);
121195f068c8SJohn Wang };
121295f068c8SJohn Wang 
121382b6a3f6SJohn Wang static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc, void *data)
121482b6a3f6SJohn Wang {
121582b6a3f6SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
121682b6a3f6SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
121782b6a3f6SJohn Wang 
121882b6a3f6SJohn Wang     mc->desc       = "Inspur FP5280G2 BMC (ARM1176)";
121982b6a3f6SJohn Wang     amc->soc_name  = "ast2500-a1";
122082b6a3f6SJohn Wang     amc->hw_strap1 = FP5280G2_BMC_HW_STRAP1;
122182b6a3f6SJohn Wang     amc->fmc_model = "n25q512a";
122282b6a3f6SJohn Wang     amc->spi_model = "mx25l25635e";
122382b6a3f6SJohn Wang     amc->num_cs    = 2;
122482b6a3f6SJohn Wang     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
122582b6a3f6SJohn Wang     amc->i2c_init  = fp5280g2_bmc_i2c_init;
122682b6a3f6SJohn Wang     mc->default_ram_size = 512 * MiB;
122782b6a3f6SJohn Wang     mc->default_cpus = mc->min_cpus = mc->max_cpus =
122882b6a3f6SJohn Wang         aspeed_soc_num_cpus(amc->soc_name);
122982b6a3f6SJohn Wang };
123082b6a3f6SJohn Wang 
123158e52bdbSCédric Le Goater static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data)
123258e52bdbSCédric Le Goater {
123358e52bdbSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
123458e52bdbSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
123558e52bdbSCédric Le Goater 
1236f548f201SPeter Maydell     mc->desc       = "IBM Rainier BMC (Cortex-A7)";
1237c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
123858e52bdbSCédric Le Goater     amc->hw_strap1 = RAINIER_BMC_HW_STRAP1;
123958e52bdbSCédric Le Goater     amc->hw_strap2 = RAINIER_BMC_HW_STRAP2;
124058e52bdbSCédric Le Goater     amc->fmc_model = "mx66l1g45g";
124158e52bdbSCédric Le Goater     amc->spi_model = "mx66l1g45g";
124258e52bdbSCédric Le Goater     amc->num_cs    = 2;
124358e52bdbSCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
124458e52bdbSCédric Le Goater     amc->i2c_init  = rainier_bmc_i2c_init;
124558e52bdbSCédric Le Goater     mc->default_ram_size = 1 * GiB;
124658e52bdbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
124758e52bdbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
124858e52bdbSCédric Le Goater };
124958e52bdbSCédric Le Goater 
1250febbe308SPeter Delevoryas /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */
1251febbe308SPeter Delevoryas #if HOST_LONG_BITS == 32
1252febbe308SPeter Delevoryas #define FUJI_BMC_RAM_SIZE (1 * GiB)
1253febbe308SPeter Delevoryas #else
1254febbe308SPeter Delevoryas #define FUJI_BMC_RAM_SIZE (2 * GiB)
1255febbe308SPeter Delevoryas #endif
1256febbe308SPeter Delevoryas 
1257febbe308SPeter Delevoryas static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data)
1258febbe308SPeter Delevoryas {
1259febbe308SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1260febbe308SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1261febbe308SPeter Delevoryas 
1262febbe308SPeter Delevoryas     mc->desc = "Facebook Fuji BMC (Cortex-A7)";
1263febbe308SPeter Delevoryas     amc->soc_name = "ast2600-a3";
1264febbe308SPeter Delevoryas     amc->hw_strap1 = FUJI_BMC_HW_STRAP1;
1265febbe308SPeter Delevoryas     amc->hw_strap2 = FUJI_BMC_HW_STRAP2;
1266febbe308SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1267febbe308SPeter Delevoryas     amc->spi_model = "mx66l1g45g";
1268febbe308SPeter Delevoryas     amc->num_cs = 2;
1269febbe308SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1270febbe308SPeter Delevoryas     amc->i2c_init = fuji_bmc_i2c_init;
1271febbe308SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART1;
1272febbe308SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
1273febbe308SPeter Delevoryas     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1274febbe308SPeter Delevoryas         aspeed_soc_num_cpus(amc->soc_name);
1275febbe308SPeter Delevoryas };
1276febbe308SPeter Delevoryas 
1277a20c54b1SPatrick Williams static void aspeed_machine_bletchley_class_init(ObjectClass *oc, void *data)
1278a20c54b1SPatrick Williams {
1279a20c54b1SPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1280a20c54b1SPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1281a20c54b1SPatrick Williams 
1282a20c54b1SPatrick Williams     mc->desc       = "Facebook Bletchley BMC (Cortex-A7)";
1283a20c54b1SPatrick Williams     amc->soc_name  = "ast2600-a3";
1284a20c54b1SPatrick Williams     amc->hw_strap1 = BLETCHLEY_BMC_HW_STRAP1;
1285a20c54b1SPatrick Williams     amc->hw_strap2 = BLETCHLEY_BMC_HW_STRAP2;
1286a20c54b1SPatrick Williams     amc->fmc_model = "w25q01jvq";
1287a20c54b1SPatrick Williams     amc->spi_model = NULL;
1288a20c54b1SPatrick Williams     amc->num_cs    = 2;
1289a20c54b1SPatrick Williams     amc->macs_mask = ASPEED_MAC2_ON;
1290a20c54b1SPatrick Williams     amc->i2c_init  = bletchley_bmc_i2c_init;
1291a20c54b1SPatrick Williams     mc->default_ram_size = 512 * MiB;
1292a20c54b1SPatrick Williams     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1293a20c54b1SPatrick Williams         aspeed_soc_num_cpus(amc->soc_name);
1294a20c54b1SPatrick Williams }
1295a20c54b1SPatrick Williams 
1296fa699e80SPeter Delevoryas static void fby35_reset(MachineState *state)
1297fa699e80SPeter Delevoryas {
1298fa699e80SPeter Delevoryas     AspeedMachineState *bmc = ASPEED_MACHINE(state);
1299fa699e80SPeter Delevoryas     AspeedGPIOState *gpio = &bmc->soc.gpio;
1300fa699e80SPeter Delevoryas 
1301fa699e80SPeter Delevoryas     qemu_devices_reset();
1302fa699e80SPeter Delevoryas 
1303fa699e80SPeter Delevoryas     /* Board ID */
1304fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV4", true, &error_fatal);
1305fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV5", true, &error_fatal);
1306fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV6", true, &error_fatal);
1307fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV7", false, &error_fatal);
1308fa699e80SPeter Delevoryas }
1309fa699e80SPeter Delevoryas 
1310fa699e80SPeter Delevoryas static void aspeed_machine_fby35_class_init(ObjectClass *oc, void *data)
1311fa699e80SPeter Delevoryas {
1312fa699e80SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1313fa699e80SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1314fa699e80SPeter Delevoryas 
1315fa699e80SPeter Delevoryas     mc->desc       = "Facebook fby35 BMC (Cortex-A7)";
1316fa699e80SPeter Delevoryas     mc->reset      = fby35_reset;
1317fa699e80SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1318fa699e80SPeter Delevoryas     amc->num_cs    = 2;
1319fa699e80SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1320fa699e80SPeter Delevoryas     amc->i2c_init  = fby35_i2c_init;
1321fa699e80SPeter Delevoryas     /* FIXME: Replace this macro with something more general */
1322fa699e80SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
1323fa699e80SPeter Delevoryas }
1324fa699e80SPeter Delevoryas 
132566c895b8SJamin Lin #define AST1030_INTERNAL_FLASH_SIZE (1024 * 1024)
132666c895b8SJamin Lin /* Main SYSCLK frequency in Hz (200MHz) */
132766c895b8SJamin Lin #define SYSCLK_FRQ 200000000ULL
132866c895b8SJamin Lin 
132966c895b8SJamin Lin static void aspeed_minibmc_machine_init(MachineState *machine)
133066c895b8SJamin Lin {
133166c895b8SJamin Lin     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
133266c895b8SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
133366c895b8SJamin Lin     Clock *sysclk;
133466c895b8SJamin Lin 
133566c895b8SJamin Lin     sysclk = clock_new(OBJECT(machine), "SYSCLK");
133666c895b8SJamin Lin     clock_set_hz(sysclk, SYSCLK_FRQ);
133766c895b8SJamin Lin 
133866c895b8SJamin Lin     object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
133966c895b8SJamin Lin     qdev_connect_clock_in(DEVICE(&bmc->soc), "sysclk", sysclk);
134066c895b8SJamin Lin 
1341*4dd9d554SPeter Delevoryas     object_property_set_link(OBJECT(&bmc->soc), "memory",
1342*4dd9d554SPeter Delevoryas                              OBJECT(get_system_memory()), &error_abort);
134366c895b8SJamin Lin     qdev_prop_set_uint32(DEVICE(&bmc->soc), "uart-default",
134466c895b8SJamin Lin                          amc->uart_default);
134566c895b8SJamin Lin     qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
134666c895b8SJamin Lin 
134766c895b8SJamin Lin     aspeed_board_init_flashes(&bmc->soc.fmc,
134866c895b8SJamin Lin                               bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
134966c895b8SJamin Lin                               amc->num_cs,
135066c895b8SJamin Lin                               0);
135166c895b8SJamin Lin 
135266c895b8SJamin Lin     aspeed_board_init_flashes(&bmc->soc.spi[0],
135366c895b8SJamin Lin                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
135466c895b8SJamin Lin                               amc->num_cs, amc->num_cs);
135566c895b8SJamin Lin 
135666c895b8SJamin Lin     aspeed_board_init_flashes(&bmc->soc.spi[1],
135766c895b8SJamin Lin                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
135866c895b8SJamin Lin                               amc->num_cs, (amc->num_cs * 2));
135966c895b8SJamin Lin 
136066c895b8SJamin Lin     if (amc->i2c_init) {
136166c895b8SJamin Lin         amc->i2c_init(bmc);
136266c895b8SJamin Lin     }
136366c895b8SJamin Lin 
136466c895b8SJamin Lin     armv7m_load_kernel(ARM_CPU(first_cpu),
136566c895b8SJamin Lin                        machine->kernel_filename,
136666c895b8SJamin Lin                        AST1030_INTERNAL_FLASH_SIZE);
136766c895b8SJamin Lin }
136866c895b8SJamin Lin 
13694c70ab16STroy Lee static void ast1030_evb_i2c_init(AspeedMachineState *bmc)
13704c70ab16STroy Lee {
13714c70ab16STroy Lee     AspeedSoCState *soc = &bmc->soc;
13724c70ab16STroy Lee 
13734c70ab16STroy Lee     /* U10 24C08 connects to SDA/SCL Groupt 1 by default */
13744c70ab16STroy Lee     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
13754c70ab16STroy Lee     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, eeprom_buf);
13764c70ab16STroy Lee 
13774c70ab16STroy Lee     /* U11 LM75 connects to SDA/SCL Group 2 by default */
13784c70ab16STroy Lee     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d);
13794c70ab16STroy Lee }
13804c70ab16STroy Lee 
138166c895b8SJamin Lin static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc,
138266c895b8SJamin Lin                                                           void *data)
138366c895b8SJamin Lin {
138466c895b8SJamin Lin     MachineClass *mc = MACHINE_CLASS(oc);
138566c895b8SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
138666c895b8SJamin Lin 
138766c895b8SJamin Lin     mc->desc = "Aspeed AST1030 MiniBMC (Cortex-M4)";
138866c895b8SJamin Lin     amc->soc_name = "ast1030-a1";
138966c895b8SJamin Lin     amc->hw_strap1 = 0;
139066c895b8SJamin Lin     amc->hw_strap2 = 0;
139166c895b8SJamin Lin     mc->init = aspeed_minibmc_machine_init;
13924c70ab16STroy Lee     amc->i2c_init = ast1030_evb_i2c_init;
139366c895b8SJamin Lin     mc->default_ram_size = 0;
139466c895b8SJamin Lin     mc->default_cpus = mc->min_cpus = mc->max_cpus = 1;
139566c895b8SJamin Lin     amc->fmc_model = "sst25vf032b";
139666c895b8SJamin Lin     amc->spi_model = "sst25vf032b";
139766c895b8SJamin Lin     amc->num_cs = 2;
139866c895b8SJamin Lin     amc->macs_mask = 0;
139966c895b8SJamin Lin }
140066c895b8SJamin Lin 
1401baa4732bSCédric Le Goater static const TypeInfo aspeed_machine_types[] = {
1402baa4732bSCédric Le Goater     {
1403baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("palmetto-bmc"),
1404baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1405baa4732bSCédric Le Goater         .class_init    = aspeed_machine_palmetto_class_init,
1406baa4732bSCédric Le Goater     }, {
140740a38df5SErik Smit         .name          = MACHINE_TYPE_NAME("supermicrox11-bmc"),
140840a38df5SErik Smit         .parent        = TYPE_ASPEED_MACHINE,
140940a38df5SErik Smit         .class_init    = aspeed_machine_supermicrox11_bmc_class_init,
141040a38df5SErik Smit     }, {
1411baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2500-evb"),
1412baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1413baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2500_evb_class_init,
1414baa4732bSCédric Le Goater     }, {
1415baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("romulus-bmc"),
1416baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1417baa4732bSCédric Le Goater         .class_init    = aspeed_machine_romulus_class_init,
1418baa4732bSCédric Le Goater     }, {
1419143b040fSPatrick Williams         .name          = MACHINE_TYPE_NAME("sonorapass-bmc"),
1420143b040fSPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1421143b040fSPatrick Williams         .class_init    = aspeed_machine_sonorapass_class_init,
1422143b040fSPatrick Williams     }, {
1423baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("witherspoon-bmc"),
1424baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1425baa4732bSCédric Le Goater         .class_init    = aspeed_machine_witherspoon_class_init,
1426baa4732bSCédric Le Goater     }, {
1427baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2600-evb"),
1428baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1429baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2600_evb_class_init,
1430baa4732bSCédric Le Goater     }, {
143163ceb818SCédric Le Goater         .name          = MACHINE_TYPE_NAME("tacoma-bmc"),
143263ceb818SCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
143363ceb818SCédric Le Goater         .class_init    = aspeed_machine_tacoma_class_init,
143463ceb818SCédric Le Goater     }, {
143595f068c8SJohn Wang         .name          = MACHINE_TYPE_NAME("g220a-bmc"),
143695f068c8SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
143795f068c8SJohn Wang         .class_init    = aspeed_machine_g220a_class_init,
143895f068c8SJohn Wang     }, {
143982b6a3f6SJohn Wang         .name          = MACHINE_TYPE_NAME("fp5280g2-bmc"),
144082b6a3f6SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
144182b6a3f6SJohn Wang         .class_init    = aspeed_machine_fp5280g2_class_init,
144282b6a3f6SJohn Wang     }, {
14439cccb912SPatrick Venture         .name          = MACHINE_TYPE_NAME("quanta-q71l-bmc"),
14449cccb912SPatrick Venture         .parent        = TYPE_ASPEED_MACHINE,
14459cccb912SPatrick Venture         .class_init    = aspeed_machine_quanta_q71l_class_init,
14469cccb912SPatrick Venture     }, {
144758e52bdbSCédric Le Goater         .name          = MACHINE_TYPE_NAME("rainier-bmc"),
144858e52bdbSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
144958e52bdbSCédric Le Goater         .class_init    = aspeed_machine_rainier_class_init,
145058e52bdbSCédric Le Goater     }, {
1451febbe308SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fuji-bmc"),
1452febbe308SPeter Delevoryas         .parent        = TYPE_ASPEED_MACHINE,
1453febbe308SPeter Delevoryas         .class_init    = aspeed_machine_fuji_class_init,
1454febbe308SPeter Delevoryas     }, {
1455a20c54b1SPatrick Williams         .name          = MACHINE_TYPE_NAME("bletchley-bmc"),
1456a20c54b1SPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1457a20c54b1SPatrick Williams         .class_init    = aspeed_machine_bletchley_class_init,
1458a20c54b1SPatrick Williams     }, {
1459fa699e80SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fby35-bmc"),
1460fa699e80SPeter Delevoryas         .parent        = MACHINE_TYPE_NAME("ast2600-evb"),
1461fa699e80SPeter Delevoryas         .class_init    = aspeed_machine_fby35_class_init,
1462fa699e80SPeter Delevoryas     }, {
146366c895b8SJamin Lin         .name           = MACHINE_TYPE_NAME("ast1030-evb"),
146466c895b8SJamin Lin         .parent         = TYPE_ASPEED_MACHINE,
146566c895b8SJamin Lin         .class_init     = aspeed_minibmc_machine_ast1030_evb_class_init,
146666c895b8SJamin Lin     }, {
1467fca9ca1bSCédric Le Goater         .name          = TYPE_ASPEED_MACHINE,
146862c2c2ebSCédric Le Goater         .parent        = TYPE_MACHINE,
1469888b2b03SPhilippe Mathieu-Daudé         .instance_size = sizeof(AspeedMachineState),
14701a15311aSCédric Le Goater         .instance_init = aspeed_machine_instance_init,
1471fca9ca1bSCédric Le Goater         .class_size    = sizeof(AspeedMachineClass),
1472fca9ca1bSCédric Le Goater         .class_init    = aspeed_machine_class_init,
1473baa4732bSCédric Le Goater         .abstract      = true,
1474baa4732bSCédric Le Goater     }
1475fca9ca1bSCédric Le Goater };
147674fb1f38SCédric Le Goater 
1477baa4732bSCédric Le Goater DEFINE_TYPES(aspeed_machine_types)
1478