xref: /qemu/hw/arm/aspeed.c (revision b6d1df64824d554d1e48133fdb535dbe89bc7d69)
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"
24d769a1daSCédric Le Goater #include "hw/loader.h"
25d769a1daSCédric Le Goater #include "qemu/error-report.h"
26a9df9622SJoel Stanley #include "qemu/units.h"
27327d8e4eSAndrew Jeffery 
2874fb1f38SCédric Le Goater static struct arm_boot_info aspeed_board_binfo = {
29b033271fSCédric Le Goater     .board_id = -1, /* device-tree-only board */
30327d8e4eSAndrew Jeffery };
31327d8e4eSAndrew Jeffery 
32612b219aSPhilippe Mathieu-Daudé struct AspeedMachineState {
33888b2b03SPhilippe Mathieu-Daudé     /* Private */
34888b2b03SPhilippe Mathieu-Daudé     MachineState parent_obj;
35888b2b03SPhilippe Mathieu-Daudé     /* Public */
36888b2b03SPhilippe Mathieu-Daudé 
37ff90606fSCédric Le Goater     AspeedSoCState soc;
38ad1a9782SCédric Le Goater     MemoryRegion ram_container;
39ebe31c0aSCédric Le Goater     MemoryRegion max_ram;
40888b2b03SPhilippe Mathieu-Daudé     bool mmio_exec;
419820e52fSCédric Le Goater     char *fmc_model;
429820e52fSCédric Le Goater     char *spi_model;
43ea066d39SThomas Huth };
44327d8e4eSAndrew Jeffery 
45ef17f836SCédric Le Goater /* Palmetto hardware value: 0x120CE416 */
468da33ef7SCédric Le Goater #define PALMETTO_BMC_HW_STRAP1 (                                        \
478da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_256MB) |               \
488da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2 /* DDR3 with CL=6, CWL=5 */) | \
498da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
508da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) |       \
518da33ef7SCédric Le Goater         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
528da33ef7SCédric Le Goater         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
538da33ef7SCédric Le Goater         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) |                \
548da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
558da33ef7SCédric Le Goater         SCU_HW_STRAP_SPI_WIDTH |                                        \
568da33ef7SCédric Le Goater         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
578da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
588da33ef7SCédric Le Goater 
5940a38df5SErik Smit /* TODO: Find the actual hardware value */
6040a38df5SErik Smit #define SUPERMICROX11_BMC_HW_STRAP1 (                                   \
6140a38df5SErik Smit         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) |               \
6240a38df5SErik Smit         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2) |                           \
6340a38df5SErik Smit         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
6440a38df5SErik Smit         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) |       \
6540a38df5SErik Smit         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
6640a38df5SErik Smit         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
6740a38df5SErik Smit         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) |                \
6840a38df5SErik Smit         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
6940a38df5SErik Smit         SCU_HW_STRAP_SPI_WIDTH |                                        \
7040a38df5SErik Smit         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
7140a38df5SErik Smit         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
7240a38df5SErik Smit 
73ef17f836SCédric Le Goater /* AST2500 evb hardware value: 0xF100C2E6 */
749a7c1750SCédric Le Goater #define AST2500_EVB_HW_STRAP1 ((                                        \
759a7c1750SCédric Le Goater         AST2500_HW_STRAP1_DEFAULTS |                                    \
769a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
779a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
789a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
799a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
809a7c1750SCédric Le Goater         SCU_HW_STRAP_MAC1_RGMII |                                       \
819a7c1750SCédric Le Goater         SCU_HW_STRAP_MAC0_RGMII) &                                      \
829a7c1750SCédric Le Goater         ~SCU_HW_STRAP_2ND_BOOT_WDT)
839a7c1750SCédric Le Goater 
84ef17f836SCédric Le Goater /* Romulus hardware value: 0xF10AD206 */
85ef17f836SCédric Le Goater #define ROMULUS_BMC_HW_STRAP1 (                                         \
86ef17f836SCédric Le Goater         AST2500_HW_STRAP1_DEFAULTS |                                    \
87ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
88ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
89ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
90ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
91ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_ACPI_ENABLE |                              \
92ef17f836SCédric Le Goater         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER))
93ef17f836SCédric Le Goater 
94143b040fSPatrick Williams /* Sonorapass hardware value: 0xF100D216 */
95143b040fSPatrick Williams #define SONORAPASS_BMC_HW_STRAP1 (                                      \
96143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
97143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
98143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
99143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
100143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
101143b040fSPatrick Williams         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
102143b040fSPatrick Williams         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
103143b040fSPatrick Williams         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
104143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
105143b040fSPatrick Williams         SCU_HW_STRAP_VGA_BIOS_ROM |                                     \
106143b040fSPatrick Williams         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
107143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_RESERVED1)
108143b040fSPatrick Williams 
10995f068c8SJohn Wang #define G220A_BMC_HW_STRAP1 (                                      \
11095f068c8SJohn Wang         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
11195f068c8SJohn Wang         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
11295f068c8SJohn Wang         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
11395f068c8SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
11495f068c8SJohn Wang         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
11595f068c8SJohn Wang         SCU_HW_STRAP_2ND_BOOT_WDT |                                     \
11695f068c8SJohn Wang         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
11795f068c8SJohn Wang         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
11895f068c8SJohn Wang         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
11995f068c8SJohn Wang         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
12095f068c8SJohn Wang         SCU_HW_STRAP_VGA_SIZE_SET(VGA_64M_DRAM) |                       \
12195f068c8SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED1)
12295f068c8SJohn Wang 
12382b6a3f6SJohn Wang /* FP5280G2 hardware value: 0XF100D286 */
12482b6a3f6SJohn Wang #define FP5280G2_BMC_HW_STRAP1 (                                      \
12582b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
12682b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
12782b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
12882b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
12982b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
13082b6a3f6SJohn Wang         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
13182b6a3f6SJohn Wang         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
13282b6a3f6SJohn Wang         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
13382b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
13482b6a3f6SJohn Wang         SCU_HW_STRAP_MAC1_RGMII |                                       \
13582b6a3f6SJohn Wang         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
13682b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED1)
13782b6a3f6SJohn Wang 
13862c2c2ebSCédric Le Goater /* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */
13962c2c2ebSCédric Le Goater #define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1
14062c2c2ebSCédric Le Goater 
1419cccb912SPatrick Venture /* Quanta-Q71l hardware value */
1429cccb912SPatrick Venture #define QUANTA_Q71L_BMC_HW_STRAP1 (                                     \
1439cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) |               \
1449cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2/* DDR3 with CL=6, CWL=5 */) | \
1459cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
1469cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_24M_IN) |       \
1479cccb912SPatrick Venture         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
1489cccb912SPatrick Venture         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_PASS_THROUGH) |          \
1499cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
1509cccb912SPatrick Venture         SCU_HW_STRAP_SPI_WIDTH |                                        \
1519cccb912SPatrick Venture         SCU_HW_STRAP_VGA_SIZE_SET(VGA_8M_DRAM) |                        \
1529cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
1539cccb912SPatrick Venture 
154ccc2c418SCédric Le Goater /* AST2600 evb hardware value */
155ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP1 0x000000C0
156ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP2 0x00000003
157ccc2c418SCédric Le Goater 
15863ceb818SCédric Le Goater /* Tacoma hardware value */
15963ceb818SCédric Le Goater #define TACOMA_BMC_HW_STRAP1  0x00000000
1607582591aSJoel Stanley #define TACOMA_BMC_HW_STRAP2  0x00000040
16163ceb818SCédric Le Goater 
16258e52bdbSCédric Le Goater /* Rainier hardware value: (QEMU prototype) */
163*b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP1 0x00422016
164*b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP2 0x80000848
16558e52bdbSCédric Le Goater 
166febbe308SPeter Delevoryas /* Fuji hardware value */
167febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP1    0x00000000
168febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP2    0x00000000
169febbe308SPeter Delevoryas 
170ebe31c0aSCédric Le Goater /*
171ebe31c0aSCédric Le Goater  * The max ram region is for firmwares that scan the address space
172ebe31c0aSCédric Le Goater  * with load/store to guess how much RAM the SoC has.
173ebe31c0aSCédric Le Goater  */
174ebe31c0aSCédric Le Goater static uint64_t max_ram_read(void *opaque, hwaddr offset, unsigned size)
175ebe31c0aSCédric Le Goater {
176ebe31c0aSCédric Le Goater     return 0;
177ebe31c0aSCédric Le Goater }
178ebe31c0aSCédric Le Goater 
179ebe31c0aSCédric Le Goater static void max_ram_write(void *opaque, hwaddr offset, uint64_t value,
180ebe31c0aSCédric Le Goater                            unsigned size)
181ebe31c0aSCédric Le Goater {
182ebe31c0aSCédric Le Goater     /* Discard writes */
183ebe31c0aSCédric Le Goater }
184ebe31c0aSCédric Le Goater 
185ebe31c0aSCédric Le Goater static const MemoryRegionOps max_ram_ops = {
186ebe31c0aSCédric Le Goater     .read = max_ram_read,
187ebe31c0aSCédric Le Goater     .write = max_ram_write,
188ebe31c0aSCédric Le Goater     .endianness = DEVICE_NATIVE_ENDIAN,
189ebe31c0aSCédric Le Goater };
190ebe31c0aSCédric Le Goater 
1919bb6d140SJoel Stanley #define AST_SMP_MAILBOX_BASE            0x1e6e2180
1929bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_ENTRY        (AST_SMP_MAILBOX_BASE + 0x0)
1939bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_GOSIGN       (AST_SMP_MAILBOX_BASE + 0x4)
1949bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_READY        (AST_SMP_MAILBOX_BASE + 0x8)
1959bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_POLLINSN     (AST_SMP_MAILBOX_BASE + 0xc)
1969bb6d140SJoel Stanley #define AST_SMP_MBOX_CODE               (AST_SMP_MAILBOX_BASE + 0x10)
1979bb6d140SJoel Stanley #define AST_SMP_MBOX_GOSIGN             0xabbaab00
1989bb6d140SJoel Stanley 
1999bb6d140SJoel Stanley static void aspeed_write_smpboot(ARMCPU *cpu,
2009bb6d140SJoel Stanley                                  const struct arm_boot_info *info)
2019bb6d140SJoel Stanley {
2029bb6d140SJoel Stanley     static const uint32_t poll_mailbox_ready[] = {
2039bb6d140SJoel Stanley         /*
2049bb6d140SJoel Stanley          * r2 = per-cpu go sign value
2059bb6d140SJoel Stanley          * r1 = AST_SMP_MBOX_FIELD_ENTRY
2069bb6d140SJoel Stanley          * r0 = AST_SMP_MBOX_FIELD_GOSIGN
2079bb6d140SJoel Stanley          */
2089bb6d140SJoel Stanley         0xee100fb0,  /* mrc     p15, 0, r0, c0, c0, 5 */
2099bb6d140SJoel Stanley         0xe21000ff,  /* ands    r0, r0, #255          */
2109bb6d140SJoel Stanley         0xe59f201c,  /* ldr     r2, [pc, #28]         */
2119bb6d140SJoel Stanley         0xe1822000,  /* orr     r2, r2, r0            */
2129bb6d140SJoel Stanley 
2139bb6d140SJoel Stanley         0xe59f1018,  /* ldr     r1, [pc, #24]         */
2149bb6d140SJoel Stanley         0xe59f0018,  /* ldr     r0, [pc, #24]         */
2159bb6d140SJoel Stanley 
2169bb6d140SJoel Stanley         0xe320f002,  /* wfe                           */
2179bb6d140SJoel Stanley         0xe5904000,  /* ldr     r4, [r0]              */
2189bb6d140SJoel Stanley         0xe1520004,  /* cmp     r2, r4                */
2199bb6d140SJoel Stanley         0x1afffffb,  /* bne     <wfe>                 */
2209bb6d140SJoel Stanley         0xe591f000,  /* ldr     pc, [r1]              */
2219bb6d140SJoel Stanley         AST_SMP_MBOX_GOSIGN,
2229bb6d140SJoel Stanley         AST_SMP_MBOX_FIELD_ENTRY,
2239bb6d140SJoel Stanley         AST_SMP_MBOX_FIELD_GOSIGN,
2249bb6d140SJoel Stanley     };
2259bb6d140SJoel Stanley 
2269bb6d140SJoel Stanley     rom_add_blob_fixed("aspeed.smpboot", poll_mailbox_ready,
2279bb6d140SJoel Stanley                        sizeof(poll_mailbox_ready),
2289bb6d140SJoel Stanley                        info->smp_loader_start);
2299bb6d140SJoel Stanley }
2309bb6d140SJoel Stanley 
2319bb6d140SJoel Stanley static void aspeed_reset_secondary(ARMCPU *cpu,
2329bb6d140SJoel Stanley                                    const struct arm_boot_info *info)
2339bb6d140SJoel Stanley {
2349bb6d140SJoel Stanley     AddressSpace *as = arm_boot_address_space(cpu, info);
2359bb6d140SJoel Stanley     CPUState *cs = CPU(cpu);
2369bb6d140SJoel Stanley 
2379bb6d140SJoel Stanley     /* info->smp_bootreg_addr */
2389bb6d140SJoel Stanley     address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0,
2399bb6d140SJoel Stanley                                MEMTXATTRS_UNSPECIFIED, NULL);
2409bb6d140SJoel Stanley     cpu_set_pc(cs, info->smp_loader_start);
2419bb6d140SJoel Stanley }
2429bb6d140SJoel Stanley 
243d769a1daSCédric Le Goater #define FIRMWARE_ADDR 0x0
244d769a1daSCédric Le Goater 
245d769a1daSCédric Le Goater static void write_boot_rom(DriveInfo *dinfo, hwaddr addr, size_t rom_size,
246d769a1daSCédric Le Goater                            Error **errp)
247d769a1daSCédric Le Goater {
248d769a1daSCédric Le Goater     BlockBackend *blk = blk_by_legacy_dinfo(dinfo);
249d769a1daSCédric Le Goater     uint8_t *storage;
2500c7209beSCédric Le Goater     int64_t size;
251d769a1daSCédric Le Goater 
2520c7209beSCédric Le Goater     /* The block backend size should have already been 'validated' by
2530c7209beSCédric Le Goater      * the creation of the m25p80 object.
2540c7209beSCédric Le Goater      */
2550c7209beSCédric Le Goater     size = blk_getlength(blk);
2560c7209beSCédric Le Goater     if (size <= 0) {
2570c7209beSCédric Le Goater         error_setg(errp, "failed to get flash size");
2580c7209beSCédric Le Goater         return;
2590c7209beSCédric Le Goater     }
2600c7209beSCédric Le Goater 
2610c7209beSCédric Le Goater     if (rom_size > size) {
2620c7209beSCédric Le Goater         rom_size = size;
263d769a1daSCédric Le Goater     }
264d769a1daSCédric Le Goater 
265d769a1daSCédric Le Goater     storage = g_new0(uint8_t, rom_size);
266d769a1daSCédric Le Goater     if (blk_pread(blk, 0, storage, rom_size) < 0) {
267d769a1daSCédric Le Goater         error_setg(errp, "failed to read the initial flash content");
268d769a1daSCédric Le Goater         return;
269d769a1daSCédric Le Goater     }
270d769a1daSCédric Le Goater 
271d769a1daSCédric Le Goater     rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr);
272d769a1daSCédric Le Goater     g_free(storage);
273d769a1daSCédric Le Goater }
274d769a1daSCédric Le Goater 
275c20b4cccSMarkus Armbruster static void aspeed_board_init_flashes(AspeedSMCState *s,
2768ec239f2SMarkus Armbruster                                       const char *flashtype,
2778ec239f2SMarkus Armbruster                                       int unit0)
278e1ad9bc4SCédric Le Goater {
279e1ad9bc4SCédric Le Goater     int i ;
280e1ad9bc4SCédric Le Goater 
281e1ad9bc4SCédric Le Goater     for (i = 0; i < s->num_cs; ++i) {
2828ec239f2SMarkus Armbruster         DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i);
283e1ad9bc4SCédric Le Goater         qemu_irq cs_line;
284a7d78befSCédric Le Goater         DeviceState *dev;
285e1ad9bc4SCédric Le Goater 
286a7d78befSCédric Le Goater         dev = qdev_new(flashtype);
287e1ad9bc4SCédric Le Goater         if (dinfo) {
288a7d78befSCédric Le Goater             qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo));
289e1ad9bc4SCédric Le Goater         }
290a7d78befSCédric Le Goater         qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal);
291e1ad9bc4SCédric Le Goater 
292a7d78befSCédric Le Goater         cs_line = qdev_get_gpio_in_named(dev, SSI_GPIO_CS, 0);
293e1ad9bc4SCédric Le Goater         sysbus_connect_irq(SYS_BUS_DEVICE(s), i + 1, cs_line);
294e1ad9bc4SCédric Le Goater     }
295e1ad9bc4SCédric Le Goater }
296e1ad9bc4SCédric Le Goater 
297a29e3e12SAndrew Jeffery static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo)
298a29e3e12SAndrew Jeffery {
299a29e3e12SAndrew Jeffery         DeviceState *card;
300a29e3e12SAndrew Jeffery 
301756f739bSPhilippe Mathieu-Daudé         if (!dinfo) {
302756f739bSPhilippe Mathieu-Daudé             return;
303756f739bSPhilippe Mathieu-Daudé         }
3043e80f690SMarkus Armbruster         card = qdev_new(TYPE_SD_CARD);
305934df912SMarkus Armbruster         qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
306a29e3e12SAndrew Jeffery                                 &error_fatal);
3073e80f690SMarkus Armbruster         qdev_realize_and_unref(card,
3083e80f690SMarkus Armbruster                                qdev_get_child_bus(DEVICE(sdhci), "sd-bus"),
3093e80f690SMarkus Armbruster                                &error_fatal);
310a29e3e12SAndrew Jeffery }
311a29e3e12SAndrew Jeffery 
312baa4732bSCédric Le Goater static void aspeed_machine_init(MachineState *machine)
313327d8e4eSAndrew Jeffery {
314888b2b03SPhilippe Mathieu-Daudé     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
315baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
316b033271fSCédric Le Goater     AspeedSoCClass *sc;
317d769a1daSCédric Le Goater     DriveInfo *drive0 = drive_get(IF_MTD, 0, 0);
318ebe31c0aSCédric Le Goater     ram_addr_t max_ram_size;
3192bea128cSEddie James     int i;
320d3bad7e7SCédric Le Goater     NICInfo *nd = &nd_table[0];
321327d8e4eSAndrew Jeffery 
322ad1a9782SCédric Le Goater     memory_region_init(&bmc->ram_container, NULL, "aspeed-ram-container",
3237df9f028SPhilippe Mathieu-Daudé                        4 * GiB);
324afcbaed6SIgor Mammedov     memory_region_add_subregion(&bmc->ram_container, 0, machine->ram);
325ad1a9782SCédric Le Goater 
3269fc7fc4dSMarkus Armbruster     object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
327327d8e4eSAndrew Jeffery 
328b033271fSCédric Le Goater     sc = ASPEED_SOC_GET_CLASS(&bmc->soc);
329b033271fSCédric Le Goater 
330533eb415SIgor Mammedov     /*
331533eb415SIgor Mammedov      * This will error out if isize is not supported by memory controller.
332533eb415SIgor Mammedov      */
3336e504a98SPaolo Bonzini     object_property_set_uint(OBJECT(&bmc->soc), "ram-size", machine->ram_size,
334533eb415SIgor Mammedov                              &error_fatal);
335533eb415SIgor Mammedov 
336d3bad7e7SCédric Le Goater     for (i = 0; i < sc->macs_num; i++) {
337d3bad7e7SCédric Le Goater         if ((amc->macs_mask & (1 << i)) && nd->used) {
338d3bad7e7SCédric Le Goater             qemu_check_nic_model(nd, TYPE_FTGMAC100);
339d3bad7e7SCédric Le Goater             qdev_set_nic_properties(DEVICE(&bmc->soc.ftgmac100[i]), nd);
340d3bad7e7SCédric Le Goater             nd++;
341d3bad7e7SCédric Le Goater         }
342d3bad7e7SCédric Le Goater     }
343d3bad7e7SCédric Le Goater 
3445325cc34SMarkus Armbruster     object_property_set_int(OBJECT(&bmc->soc), "hw-strap1", amc->hw_strap1,
34587e79af0SAndrew Jeffery                             &error_abort);
3465325cc34SMarkus Armbruster     object_property_set_int(OBJECT(&bmc->soc), "hw-strap2", amc->hw_strap2,
347ccc2c418SCédric Le Goater                             &error_abort);
3485325cc34SMarkus Armbruster     object_property_set_int(OBJECT(&bmc->soc), "num-cs", amc->num_cs,
34926d5df95SCédric Le Goater                             &error_abort);
3505325cc34SMarkus Armbruster     object_property_set_link(OBJECT(&bmc->soc), "dram",
3510df2d9a6SCédric Le Goater                              OBJECT(machine->ram), &error_abort);
352b6e70d1dSJoel Stanley     if (machine->kernel_filename) {
353b6e70d1dSJoel Stanley         /*
354b6e70d1dSJoel Stanley          * When booting with a -kernel command line there is no u-boot
355b6e70d1dSJoel Stanley          * that runs to unlock the SCU. In this case set the default to
356b6e70d1dSJoel Stanley          * be unlocked as the kernel expects
357b6e70d1dSJoel Stanley          */
3585325cc34SMarkus Armbruster         object_property_set_int(OBJECT(&bmc->soc), "hw-prot-key",
3595325cc34SMarkus Armbruster                                 ASPEED_SCU_PROT_KEY, &error_abort);
360b6e70d1dSJoel Stanley     }
3615d63d0c7SPeter Delevoryas     qdev_prop_set_uint32(DEVICE(&bmc->soc), "uart-default",
3625d63d0c7SPeter Delevoryas                          amc->uart_default);
363ce189ab2SMarkus Armbruster     qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
364327d8e4eSAndrew Jeffery 
365d783d1feSCédric Le Goater     memory_region_add_subregion(get_system_memory(),
366347df6f8SEduardo Habkost                                 sc->memmap[ASPEED_DEV_SDRAM],
367ad1a9782SCédric Le Goater                                 &bmc->ram_container);
368de46f5f4SCédric Le Goater 
369ebe31c0aSCédric Le Goater     max_ram_size = object_property_get_uint(OBJECT(&bmc->soc), "max-ram-size",
370ebe31c0aSCédric Le Goater                                             &error_abort);
371ebe31c0aSCédric Le Goater     memory_region_init_io(&bmc->max_ram, NULL, &max_ram_ops, NULL,
3726e504a98SPaolo Bonzini                           "max_ram", max_ram_size  - machine->ram_size);
3736e504a98SPaolo Bonzini     memory_region_add_subregion(&bmc->ram_container, machine->ram_size, &bmc->max_ram);
374ebe31c0aSCédric Le Goater 
3758ec239f2SMarkus Armbruster     aspeed_board_init_flashes(&bmc->soc.fmc,
3768ec239f2SMarkus Armbruster                               bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
3778ec239f2SMarkus Armbruster                               0);
3788ec239f2SMarkus Armbruster     aspeed_board_init_flashes(&bmc->soc.spi[0],
3798ec239f2SMarkus Armbruster                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
3808ec239f2SMarkus Armbruster                               bmc->soc.fmc.num_cs);
381e1ad9bc4SCédric Le Goater 
382d769a1daSCédric Le Goater     /* Install first FMC flash content as a boot rom. */
383d769a1daSCédric Le Goater     if (drive0) {
384d769a1daSCédric Le Goater         AspeedSMCFlash *fl = &bmc->soc.fmc.flashes[0];
385d769a1daSCédric Le Goater         MemoryRegion *boot_rom = g_new(MemoryRegion, 1);
3866bb55e79SCédric Le Goater         uint64_t size = memory_region_size(&fl->mmio);
387d769a1daSCédric Le Goater 
388d769a1daSCédric Le Goater         /*
389d769a1daSCédric Le Goater          * create a ROM region using the default mapping window size of
39093bf276dSCédric Le Goater          * the flash module. The window size is 64MB for the AST2400
39193bf276dSCédric Le Goater          * SoC and 128MB for the AST2500 SoC, which is twice as big as
39293bf276dSCédric Le Goater          * needed by the flash modules of the Aspeed machines.
393d769a1daSCédric Le Goater          */
3941a15311aSCédric Le Goater         if (ASPEED_MACHINE(machine)->mmio_exec) {
395f489960dSPhilippe Mathieu-Daudé             memory_region_init_alias(boot_rom, NULL, "aspeed.boot_rom",
3966bb55e79SCédric Le Goater                                      &fl->mmio, 0, size);
3971a15311aSCédric Le Goater             memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
3981a15311aSCédric Le Goater                                         boot_rom);
3991a15311aSCédric Le Goater         } else {
400f489960dSPhilippe Mathieu-Daudé             memory_region_init_rom(boot_rom, NULL, "aspeed.boot_rom",
4016bb55e79SCédric Le Goater                                    size, &error_abort);
402d769a1daSCédric Le Goater             memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
403d769a1daSCédric Le Goater                                         boot_rom);
4046bb55e79SCédric Le Goater             write_boot_rom(drive0, FIRMWARE_ADDR, size, &error_abort);
405d769a1daSCédric Le Goater         }
4061a15311aSCédric Le Goater     }
407d769a1daSCédric Le Goater 
408b7f1a0cbSCédric Le Goater     if (machine->kernel_filename && sc->num_cpus > 1) {
4099bb6d140SJoel Stanley         /* With no u-boot we must set up a boot stub for the secondary CPU */
4109bb6d140SJoel Stanley         MemoryRegion *smpboot = g_new(MemoryRegion, 1);
411f489960dSPhilippe Mathieu-Daudé         memory_region_init_ram(smpboot, NULL, "aspeed.smpboot",
4129bb6d140SJoel Stanley                                0x80, &error_abort);
4139bb6d140SJoel Stanley         memory_region_add_subregion(get_system_memory(),
4149bb6d140SJoel Stanley                                     AST_SMP_MAILBOX_BASE, smpboot);
4159bb6d140SJoel Stanley 
4169bb6d140SJoel Stanley         aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot;
4179bb6d140SJoel Stanley         aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary;
4189bb6d140SJoel Stanley         aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE;
4199bb6d140SJoel Stanley     }
4209bb6d140SJoel Stanley 
4216e504a98SPaolo Bonzini     aspeed_board_binfo.ram_size = machine->ram_size;
422347df6f8SEduardo Habkost     aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM];
423b033271fSCédric Le Goater 
424baa4732bSCédric Le Goater     if (amc->i2c_init) {
425baa4732bSCédric Le Goater         amc->i2c_init(bmc);
4262cf6cb50SCédric Le Goater     }
4272cf6cb50SCédric Le Goater 
4280e2c24c6SAndrew Jeffery     for (i = 0; i < bmc->soc.sdhci.num_slots; i++) {
4298ec239f2SMarkus Armbruster         sdhci_attach_drive(&bmc->soc.sdhci.slots[i],
4308ec239f2SMarkus Armbruster                            drive_get(IF_SD, 0, i));
431a29e3e12SAndrew Jeffery     }
4322bea128cSEddie James 
433a29e3e12SAndrew Jeffery     if (bmc->soc.emmc.num_slots) {
4348ec239f2SMarkus Armbruster         sdhci_attach_drive(&bmc->soc.emmc.slots[0],
4358ec239f2SMarkus Armbruster                            drive_get(IF_SD, 0, bmc->soc.sdhci.num_slots));
4362bea128cSEddie James     }
4372bea128cSEddie James 
4382744ece8STao Xu     arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo);
439327d8e4eSAndrew Jeffery }
440327d8e4eSAndrew Jeffery 
44182b6a3f6SJohn Wang static void at24c_eeprom_init(I2CBus *bus, uint8_t addr, uint32_t rsize)
44282b6a3f6SJohn Wang {
44382b6a3f6SJohn Wang     I2CSlave *i2c_dev = i2c_slave_new("at24c-eeprom", addr);
44482b6a3f6SJohn Wang     DeviceState *dev = DEVICE(i2c_dev);
44582b6a3f6SJohn Wang 
44682b6a3f6SJohn Wang     qdev_prop_set_uint32(dev, "rom-size", rsize);
44782b6a3f6SJohn Wang     i2c_slave_realize_and_unref(i2c_dev, bus, &error_abort);
44882b6a3f6SJohn Wang }
44982b6a3f6SJohn Wang 
450612b219aSPhilippe Mathieu-Daudé static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
4512cf6cb50SCédric Le Goater {
4522cf6cb50SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
453a87e81b9SCédric Le Goater     DeviceState *dev;
4543d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
4552cf6cb50SCédric Le Goater 
4562cf6cb50SCédric Le Goater     /* The palmetto platform expects a ds3231 RTC but a ds1338 is
4572cf6cb50SCédric Le Goater      * enough to provide basic RTC features. Alarms will be missing */
4581373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
459a87e81b9SCédric Le Goater 
4607a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
4613d165f12SCédric Le Goater                           eeprom_buf);
4623d165f12SCédric Le Goater 
463a87e81b9SCédric Le Goater     /* add a TMP423 temperature sensor */
4641373b15bSPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
4651373b15bSPhilippe Mathieu-Daudé                                          "tmp423", 0x4c));
4665325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
4675325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
4685325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
4695325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort);
4702cf6cb50SCédric Le Goater }
4712cf6cb50SCédric Le Goater 
4729cccb912SPatrick Venture static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc)
4739cccb912SPatrick Venture {
4749cccb912SPatrick Venture     AspeedSoCState *soc = &bmc->soc;
4759cccb912SPatrick Venture 
4769cccb912SPatrick Venture     /*
4779cccb912SPatrick Venture      * The quanta-q71l platform expects tmp75s which are compatible with
4789cccb912SPatrick Venture      * tmp105s.
4799cccb912SPatrick Venture      */
4809cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c);
4819cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e);
4829cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f);
4839cccb912SPatrick Venture 
4849cccb912SPatrick Venture     /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */
4859cccb912SPatrick Venture     /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */
4869cccb912SPatrick Venture     /* TODO: Add Memory Riser i2c mux and eeproms. */
4879cccb912SPatrick Venture 
4883ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74);
4893ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77);
4903ec75e39SPatrick Venture 
4919cccb912SPatrick Venture     /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */
4923ec75e39SPatrick Venture 
4933ec75e39SPatrick Venture     /* i2c-7 */
4943ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70);
4959cccb912SPatrick Venture     /*        - i2c@0: pmbus@59 */
4969cccb912SPatrick Venture     /*        - i2c@1: pmbus@58 */
4979cccb912SPatrick Venture     /*        - i2c@2: pmbus@58 */
4989cccb912SPatrick Venture     /*        - i2c@3: pmbus@59 */
4993ec75e39SPatrick Venture 
5009cccb912SPatrick Venture     /* TODO: i2c-7: Add PDB FRU eeprom@52 */
5019cccb912SPatrick Venture     /* TODO: i2c-8: Add BMC FRU eeprom@50 */
5029cccb912SPatrick Venture }
5039cccb912SPatrick Venture 
504612b219aSPhilippe Mathieu-Daudé static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
5052cf6cb50SCédric Le Goater {
5062cf6cb50SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
5073d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
5083d165f12SCédric Le Goater 
5097a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50,
5103d165f12SCédric Le Goater                           eeprom_buf);
5112cf6cb50SCédric Le Goater 
5122cf6cb50SCédric Le Goater     /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
5131373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
514044475f3SPhilippe Mathieu-Daudé                      TYPE_TMP105, 0x4d);
5156c4567c7SCédric Le Goater 
5166c4567c7SCédric Le Goater     /* The AST2500 EVB does not have an RTC. Let's pretend that one is
5176c4567c7SCédric Le Goater      * plugged on the I2C bus header */
5181373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
5192cf6cb50SCédric Le Goater }
5202cf6cb50SCédric Le Goater 
521612b219aSPhilippe Mathieu-Daudé static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
522ccc2c418SCédric Le Goater {
523ccc2c418SCédric Le Goater     /* Start with some devices on our I2C busses */
524ccc2c418SCédric Le Goater     ast2500_evb_i2c_init(bmc);
525ccc2c418SCédric Le Goater }
526ccc2c418SCédric Le Goater 
527612b219aSPhilippe Mathieu-Daudé static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
5286c4567c7SCédric Le Goater {
5296c4567c7SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
5306c4567c7SCédric Le Goater 
5316c4567c7SCédric Le Goater     /* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
5326c4567c7SCédric Le Goater      * good enough */
5331373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
5346c4567c7SCédric Le Goater }
5356c4567c7SCédric Le Goater 
536612b219aSPhilippe Mathieu-Daudé static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc)
537143b040fSPatrick Williams {
538143b040fSPatrick Williams     AspeedSoCState *soc = &bmc->soc;
539143b040fSPatrick Williams 
540143b040fSPatrick Williams     /* bus 2 : */
5411373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48);
5421373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49);
543143b040fSPatrick Williams     /* bus 2 : pca9546 @ 0x73 */
544143b040fSPatrick Williams 
545143b040fSPatrick Williams     /* bus 3 : pca9548 @ 0x70 */
546143b040fSPatrick Williams 
547143b040fSPatrick Williams     /* bus 4 : */
548143b040fSPatrick Williams     uint8_t *eeprom4_54 = g_malloc0(8 * 1024);
5497a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54,
550143b040fSPatrick Williams                           eeprom4_54);
551143b040fSPatrick Williams     /* PCA9539 @ 0x76, but PCA9552 is compatible */
5521373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "pca9552", 0x76);
553143b040fSPatrick Williams     /* PCA9539 @ 0x77, but PCA9552 is compatible */
5541373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "pca9552", 0x77);
555143b040fSPatrick Williams 
556143b040fSPatrick Williams     /* bus 6 : */
5571373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48);
5581373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49);
559143b040fSPatrick Williams     /* bus 6 : pca9546 @ 0x73 */
560143b040fSPatrick Williams 
561143b040fSPatrick Williams     /* bus 8 : */
562143b040fSPatrick Williams     uint8_t *eeprom8_56 = g_malloc0(8 * 1024);
5637a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56,
564143b040fSPatrick Williams                           eeprom8_56);
5651373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x60);
5661373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x61);
567143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1d */
568143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1f */
569143b040fSPatrick Williams 
570143b040fSPatrick Williams     /*
571143b040fSPatrick Williams      * bus 13 : pca9548 @ 0x71
572143b040fSPatrick Williams      *      - channel 3:
573143b040fSPatrick Williams      *          - tmm421 @ 0x4c
574143b040fSPatrick Williams      *          - tmp421 @ 0x4e
575143b040fSPatrick Williams      *          - tmp421 @ 0x4f
576143b040fSPatrick Williams      */
577143b040fSPatrick Williams 
578143b040fSPatrick Williams }
579143b040fSPatrick Williams 
580612b219aSPhilippe Mathieu-Daudé static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
58162c2c2ebSCédric Le Goater {
5827cfbde5eSPhilippe Mathieu-Daudé     static const struct {
5837cfbde5eSPhilippe Mathieu-Daudé         unsigned gpio_id;
5847cfbde5eSPhilippe Mathieu-Daudé         LEDColor color;
5857cfbde5eSPhilippe Mathieu-Daudé         const char *description;
5867cfbde5eSPhilippe Mathieu-Daudé         bool gpio_polarity;
5877cfbde5eSPhilippe Mathieu-Daudé     } pca1_leds[] = {
5887cfbde5eSPhilippe Mathieu-Daudé         {13, LED_COLOR_GREEN, "front-fault-4",  GPIO_POLARITY_ACTIVE_LOW},
5897cfbde5eSPhilippe Mathieu-Daudé         {14, LED_COLOR_GREEN, "front-power-3",  GPIO_POLARITY_ACTIVE_LOW},
5907cfbde5eSPhilippe Mathieu-Daudé         {15, LED_COLOR_GREEN, "front-id-5",     GPIO_POLARITY_ACTIVE_LOW},
5917cfbde5eSPhilippe Mathieu-Daudé     };
59262c2c2ebSCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
5933d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
59415ce12cfSPhilippe Mathieu-Daudé     DeviceState *dev;
5957cfbde5eSPhilippe Mathieu-Daudé     LEDState *led;
59662c2c2ebSCédric Le Goater 
59763ceb818SCédric Le Goater     /* Bus 3: TODO bmp280@77 */
59863ceb818SCédric Le Goater     /* Bus 3: TODO max31785@52 */
599db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
60015ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca1");
6012616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
6022616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 3),
60315ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
6048c9a61d7SCédric Le Goater 
6057cfbde5eSPhilippe Mathieu-Daudé     for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) {
6067cfbde5eSPhilippe Mathieu-Daudé         led = led_create_simple(OBJECT(bmc),
6077cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].gpio_polarity,
6087cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].color,
6097cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].description);
6107cfbde5eSPhilippe Mathieu-Daudé         qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id,
6117cfbde5eSPhilippe Mathieu-Daudé                               qdev_get_gpio_in(DEVICE(led), 0));
6127cfbde5eSPhilippe Mathieu-Daudé     }
613b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76);
6141373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c);
6151373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c);
61662c2c2ebSCédric Le Goater 
61762c2c2ebSCédric Le Goater     /* The Witherspoon expects a TMP275 but a TMP105 is compatible */
6181373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105,
619044475f3SPhilippe Mathieu-Daudé                      0x4a);
6206c4567c7SCédric Le Goater 
6216c4567c7SCédric Le Goater     /* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
6226c4567c7SCédric Le Goater      * good enough */
6231373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
6243d165f12SCédric Le Goater 
6257a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51,
6263d165f12SCédric Le Goater                           eeprom_buf);
627db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
62815ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca0");
6292616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
6302616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 11),
63115ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
63263ceb818SCédric Le Goater     /* Bus 11: TODO ucd90160@64 */
63362c2c2ebSCédric Le Goater }
63462c2c2ebSCédric Le Goater 
63595f068c8SJohn Wang static void g220a_bmc_i2c_init(AspeedMachineState *bmc)
63695f068c8SJohn Wang {
63795f068c8SJohn Wang     AspeedSoCState *soc = &bmc->soc;
63895f068c8SJohn Wang     DeviceState *dev;
63995f068c8SJohn Wang 
64095f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3),
64195f068c8SJohn Wang                                          "emc1413", 0x4c));
64295f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
64395f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
64495f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
64595f068c8SJohn Wang 
64695f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12),
64795f068c8SJohn Wang                                          "emc1413", 0x4c));
64895f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
64995f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
65095f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
65195f068c8SJohn Wang 
65295f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13),
65395f068c8SJohn Wang                                          "emc1413", 0x4c));
65495f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
65595f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
65695f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
6576f5f6507SJohn Wang 
6586f5f6507SJohn Wang     static uint8_t eeprom_buf[2 * 1024] = {
6596f5f6507SJohn Wang             0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe,
6606f5f6507SJohn Wang             0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65,
6616f5f6507SJohn Wang             0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32,
6626f5f6507SJohn Wang             0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42,
6636f5f6507SJohn Wang             0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45,
6646f5f6507SJohn Wang             0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1,
6656f5f6507SJohn Wang             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7,
6666f5f6507SJohn Wang     };
6676f5f6507SJohn Wang     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57,
6686f5f6507SJohn Wang                           eeprom_buf);
66995f068c8SJohn Wang }
67095f068c8SJohn Wang 
671fa6d98c0SJoel Stanley static void aspeed_eeprom_init(I2CBus *bus, uint8_t addr, uint32_t rsize)
672fa6d98c0SJoel Stanley {
673fa6d98c0SJoel Stanley     I2CSlave *i2c_dev = i2c_slave_new("at24c-eeprom", addr);
674fa6d98c0SJoel Stanley     DeviceState *dev = DEVICE(i2c_dev);
675fa6d98c0SJoel Stanley 
676fa6d98c0SJoel Stanley     qdev_prop_set_uint32(dev, "rom-size", rsize);
677fa6d98c0SJoel Stanley     i2c_slave_realize_and_unref(i2c_dev, bus, &error_abort);
678fa6d98c0SJoel Stanley }
679fa6d98c0SJoel Stanley 
68082b6a3f6SJohn Wang static void fp5280g2_bmc_i2c_init(AspeedMachineState *bmc)
68182b6a3f6SJohn Wang {
68282b6a3f6SJohn Wang     AspeedSoCState *soc = &bmc->soc;
68382b6a3f6SJohn Wang     I2CSlave *i2c_mux;
68482b6a3f6SJohn Wang 
68582b6a3f6SJohn Wang     /* The at24c256 */
68682b6a3f6SJohn Wang     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 1), 0x50, 32768);
68782b6a3f6SJohn Wang 
68882b6a3f6SJohn Wang     /* The fp5280g2 expects a TMP112 but a TMP105 is compatible */
68982b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
69082b6a3f6SJohn Wang                      0x48);
69182b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
69282b6a3f6SJohn Wang                      0x49);
69382b6a3f6SJohn Wang 
69482b6a3f6SJohn Wang     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
69582b6a3f6SJohn Wang                      "pca9546", 0x70);
69682b6a3f6SJohn Wang     /* It expects a TMP112 but a TMP105 is compatible */
69782b6a3f6SJohn Wang     i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0), TYPE_TMP105,
69882b6a3f6SJohn Wang                      0x4a);
69982b6a3f6SJohn Wang 
70082b6a3f6SJohn Wang     /* It expects a ds3232 but a ds1338 is good enough */
70182b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "ds1338", 0x68);
70282b6a3f6SJohn Wang 
70382b6a3f6SJohn Wang     /* It expects a pca9555 but a pca9552 is compatible */
70482b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_PCA9552,
70582b6a3f6SJohn Wang                      0x20);
70682b6a3f6SJohn Wang }
70782b6a3f6SJohn Wang 
70858e52bdbSCédric Le Goater static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
70958e52bdbSCédric Le Goater {
71058e52bdbSCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
711fa6d98c0SJoel Stanley     I2CSlave *i2c_mux;
712fa6d98c0SJoel Stanley 
713fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB);
71458e52bdbSCédric Le Goater 
715bcb122f8SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "pca9552", 0x61);
716bcb122f8SJoel Stanley 
71758e52bdbSCédric Le Goater     /* The rainier expects a TMP275 but a TMP105 is compatible */
71858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
71958e52bdbSCédric Le Goater                      0x48);
72058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
72158e52bdbSCédric Le Goater                      0x49);
72258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
72358e52bdbSCédric Le Goater                      0x4a);
724fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4),
725fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
726fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
727fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
728fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB);
729bcb122f8SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "pca9552", 0x60);
73058e52bdbSCédric Le Goater 
73158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
73258e52bdbSCédric Le Goater                      0x48);
73358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
73458e52bdbSCédric Le Goater                      0x49);
735bcb122f8SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "pca9552", 0x60);
736bcb122f8SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "pca9552", 0x61);
737fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5),
738fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
739fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
740fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
74158e52bdbSCédric Le Goater 
74258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
74358e52bdbSCédric Le Goater                      0x48);
74458e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
74558e52bdbSCédric Le Goater                      0x4a);
74658e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
74758e52bdbSCédric Le Goater                      0x4b);
748fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6),
749fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
750fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
751fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
752fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB);
753fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB);
75458e52bdbSCédric Le Goater 
755bcb122f8SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9552", 0x30);
756bcb122f8SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9552", 0x31);
757bcb122f8SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9552", 0x32);
758bcb122f8SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9552", 0x33);
75958e52bdbSCédric Le Goater     /* Bus 7: TODO max31785@52 */
760bcb122f8SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9552", 0x60);
76158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9552", 0x61);
762b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76);
76358e52bdbSCédric Le Goater     /* Bus 7: TODO si7021-a20@20 */
76458e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105,
76558e52bdbSCédric Le Goater                      0x48);
766fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB);
767fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB);
76858e52bdbSCédric Le Goater 
76958e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
77058e52bdbSCédric Le Goater                      0x48);
77158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
77258e52bdbSCédric Le Goater                      0x4a);
773fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50, 64 * KiB);
774fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 64 * KiB);
775bcb122f8SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x60);
77658e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x61);
77758e52bdbSCédric Le Goater     /* Bus 8: ucd90320@11 */
77858e52bdbSCédric Le Goater     /* Bus 8: ucd90320@b */
77958e52bdbSCédric Le Goater     /* Bus 8: ucd90320@c */
78058e52bdbSCédric Le Goater 
78158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c);
78258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d);
783fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB);
78458e52bdbSCédric Le Goater 
78558e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c);
78658e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d);
787fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB);
78858e52bdbSCédric Le Goater 
78958e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
79058e52bdbSCédric Le Goater                      0x48);
79158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
79258e52bdbSCédric Le Goater                      0x49);
793fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11),
794fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
795fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
796fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
797bcb122f8SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "pca9552", 0x60);
798fa6d98c0SJoel Stanley 
799fa6d98c0SJoel Stanley 
800fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB);
801bcb122f8SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13), "pca9552", 0x60);
802fa6d98c0SJoel Stanley 
803fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB);
804bcb122f8SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 14), "pca9552", 0x60);
805fa6d98c0SJoel Stanley 
806fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB);
807bcb122f8SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 15), "pca9552", 0x60);
80858e52bdbSCédric Le Goater }
80958e52bdbSCédric Le Goater 
810febbe308SPeter Delevoryas static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr,
811febbe308SPeter Delevoryas                                  I2CBus **channels)
812febbe308SPeter Delevoryas {
813febbe308SPeter Delevoryas     I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr);
814febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
815febbe308SPeter Delevoryas         channels[i] = pca954x_i2c_get_bus(mux, i);
816febbe308SPeter Delevoryas     }
817febbe308SPeter Delevoryas }
818febbe308SPeter Delevoryas 
819febbe308SPeter Delevoryas #define TYPE_LM75 TYPE_TMP105
820febbe308SPeter Delevoryas #define TYPE_TMP75 TYPE_TMP105
821febbe308SPeter Delevoryas #define TYPE_TMP422 "tmp422"
822febbe308SPeter Delevoryas 
823febbe308SPeter Delevoryas static void fuji_bmc_i2c_init(AspeedMachineState *bmc)
824febbe308SPeter Delevoryas {
825febbe308SPeter Delevoryas     AspeedSoCState *soc = &bmc->soc;
826febbe308SPeter Delevoryas     I2CBus *i2c[144] = {};
827febbe308SPeter Delevoryas 
828febbe308SPeter Delevoryas     for (int i = 0; i < 16; i++) {
829febbe308SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
830febbe308SPeter Delevoryas     }
831febbe308SPeter Delevoryas     I2CBus *i2c180 = i2c[2];
832febbe308SPeter Delevoryas     I2CBus *i2c480 = i2c[8];
833febbe308SPeter Delevoryas     I2CBus *i2c600 = i2c[11];
834febbe308SPeter Delevoryas 
835febbe308SPeter Delevoryas     get_pca9548_channels(i2c180, 0x70, &i2c[16]);
836febbe308SPeter Delevoryas     get_pca9548_channels(i2c480, 0x70, &i2c[24]);
837febbe308SPeter Delevoryas     /* NOTE: The device tree skips [32, 40) in the alias numbering */
838febbe308SPeter Delevoryas     get_pca9548_channels(i2c600, 0x77, &i2c[40]);
839febbe308SPeter Delevoryas     get_pca9548_channels(i2c[24], 0x71, &i2c[48]);
840febbe308SPeter Delevoryas     get_pca9548_channels(i2c[25], 0x72, &i2c[56]);
841febbe308SPeter Delevoryas     get_pca9548_channels(i2c[26], 0x76, &i2c[64]);
842febbe308SPeter Delevoryas     get_pca9548_channels(i2c[27], 0x76, &i2c[72]);
843febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
844febbe308SPeter Delevoryas         get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]);
845febbe308SPeter Delevoryas     }
846febbe308SPeter Delevoryas 
847febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c);
848febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d);
849febbe308SPeter Delevoryas 
850febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[19], 0x52, 64 * KiB);
851febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[20], 0x50, 2 * KiB);
852febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[22], 0x52, 2 * KiB);
853febbe308SPeter Delevoryas 
854febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x48);
855febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x49);
856febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x4a);
857febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_TMP422, 0x4c);
858febbe308SPeter Delevoryas 
859febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[8], 0x51, 64 * KiB);
860febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a);
861febbe308SPeter Delevoryas 
862febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[50], TYPE_LM75, 0x4c);
863febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[50], 0x52, 64 * KiB);
864febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[51], TYPE_TMP75, 0x48);
865febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[52], TYPE_TMP75, 0x49);
866febbe308SPeter Delevoryas 
867febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[59], TYPE_TMP75, 0x48);
868febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[60], TYPE_TMP75, 0x49);
869febbe308SPeter Delevoryas 
870febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[65], 0x53, 64 * KiB);
871febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x49);
872febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x48);
873febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[68], 0x52, 64 * KiB);
874febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[69], 0x52, 64 * KiB);
875febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[70], 0x52, 64 * KiB);
876febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[71], 0x52, 64 * KiB);
877febbe308SPeter Delevoryas 
878febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[73], 0x53, 64 * KiB);
879febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x49);
880febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x48);
881febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[76], 0x52, 64 * KiB);
882febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[77], 0x52, 64 * KiB);
883febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[78], 0x52, 64 * KiB);
884febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[79], 0x52, 64 * KiB);
885febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[28], 0x50, 2 * KiB);
886febbe308SPeter Delevoryas 
887febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
888febbe308SPeter Delevoryas         aspeed_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB);
889febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[82 + i * 8], TYPE_TMP75, 0x48);
890febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[83 + i * 8], TYPE_TMP75, 0x4b);
891febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[84 + i * 8], TYPE_TMP75, 0x4a);
892febbe308SPeter Delevoryas     }
893febbe308SPeter Delevoryas }
894febbe308SPeter Delevoryas 
8951a15311aSCédric Le Goater static bool aspeed_get_mmio_exec(Object *obj, Error **errp)
8961a15311aSCédric Le Goater {
8971a15311aSCédric Le Goater     return ASPEED_MACHINE(obj)->mmio_exec;
8981a15311aSCédric Le Goater }
8991a15311aSCédric Le Goater 
9001a15311aSCédric Le Goater static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp)
9011a15311aSCédric Le Goater {
9021a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = value;
9031a15311aSCédric Le Goater }
9041a15311aSCédric Le Goater 
9051a15311aSCédric Le Goater static void aspeed_machine_instance_init(Object *obj)
9061a15311aSCédric Le Goater {
9071a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = false;
9081a15311aSCédric Le Goater }
9091a15311aSCédric Le Goater 
9109820e52fSCédric Le Goater static char *aspeed_get_fmc_model(Object *obj, Error **errp)
9119820e52fSCédric Le Goater {
9129820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
9139820e52fSCédric Le Goater     return g_strdup(bmc->fmc_model);
9149820e52fSCédric Le Goater }
9159820e52fSCédric Le Goater 
9169820e52fSCédric Le Goater static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp)
9179820e52fSCédric Le Goater {
9189820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
9199820e52fSCédric Le Goater 
9209820e52fSCédric Le Goater     g_free(bmc->fmc_model);
9219820e52fSCédric Le Goater     bmc->fmc_model = g_strdup(value);
9229820e52fSCédric Le Goater }
9239820e52fSCédric Le Goater 
9249820e52fSCédric Le Goater static char *aspeed_get_spi_model(Object *obj, Error **errp)
9259820e52fSCédric Le Goater {
9269820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
9279820e52fSCédric Le Goater     return g_strdup(bmc->spi_model);
9289820e52fSCédric Le Goater }
9299820e52fSCédric Le Goater 
9309820e52fSCédric Le Goater static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp)
9319820e52fSCédric Le Goater {
9329820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
9339820e52fSCédric Le Goater 
9349820e52fSCédric Le Goater     g_free(bmc->spi_model);
9359820e52fSCédric Le Goater     bmc->spi_model = g_strdup(value);
9369820e52fSCédric Le Goater }
9379820e52fSCédric Le Goater 
9381a15311aSCédric Le Goater static void aspeed_machine_class_props_init(ObjectClass *oc)
9391a15311aSCédric Le Goater {
9401a15311aSCédric Le Goater     object_class_property_add_bool(oc, "execute-in-place",
9411a15311aSCédric Le Goater                                    aspeed_get_mmio_exec,
942d2623129SMarkus Armbruster                                    aspeed_set_mmio_exec);
9431a15311aSCédric Le Goater     object_class_property_set_description(oc, "execute-in-place",
9447eecec7dSMarkus Armbruster                            "boot directly from CE0 flash device");
9459820e52fSCédric Le Goater 
9469820e52fSCédric Le Goater     object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model,
9479820e52fSCédric Le Goater                                    aspeed_set_fmc_model);
9489820e52fSCédric Le Goater     object_class_property_set_description(oc, "fmc-model",
9499820e52fSCédric Le Goater                                           "Change the FMC Flash model");
9509820e52fSCédric Le Goater     object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model,
9519820e52fSCédric Le Goater                                    aspeed_set_spi_model);
9529820e52fSCédric Le Goater     object_class_property_set_description(oc, "spi-model",
9539820e52fSCédric Le Goater                                           "Change the SPI Flash model");
9541a15311aSCédric Le Goater }
9551a15311aSCédric Le Goater 
956b7f1a0cbSCédric Le Goater static int aspeed_soc_num_cpus(const char *soc_name)
957b7f1a0cbSCédric Le Goater {
958b7f1a0cbSCédric Le Goater    AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(soc_name));
959b7f1a0cbSCédric Le Goater    return sc->num_cpus;
960b7f1a0cbSCédric Le Goater }
961b7f1a0cbSCédric Le Goater 
962fca9ca1bSCédric Le Goater static void aspeed_machine_class_init(ObjectClass *oc, void *data)
96362c2c2ebSCédric Le Goater {
96462c2c2ebSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
965d3bad7e7SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
96662c2c2ebSCédric Le Goater 
967fca9ca1bSCédric Le Goater     mc->init = aspeed_machine_init;
96862c2c2ebSCédric Le Goater     mc->no_floppy = 1;
96962c2c2ebSCédric Le Goater     mc->no_cdrom = 1;
97062c2c2ebSCédric Le Goater     mc->no_parallel = 1;
971afcbaed6SIgor Mammedov     mc->default_ram_id = "ram";
972d3bad7e7SCédric Le Goater     amc->macs_mask = ASPEED_MAC0_ON;
9735d63d0c7SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART5;
9741a15311aSCédric Le Goater 
9751a15311aSCédric Le Goater     aspeed_machine_class_props_init(oc);
97662c2c2ebSCédric Le Goater }
97762c2c2ebSCédric Le Goater 
978baa4732bSCédric Le Goater static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
979baa4732bSCédric Le Goater {
980baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
981baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
982baa4732bSCédric Le Goater 
983baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Palmetto BMC (ARM926EJ-S)";
984baa4732bSCédric Le Goater     amc->soc_name  = "ast2400-a1";
985baa4732bSCédric Le Goater     amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1;
986baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
987baa4732bSCédric Le Goater     amc->spi_model = "mx25l25635e";
988baa4732bSCédric Le Goater     amc->num_cs    = 1;
989baa4732bSCédric Le Goater     amc->i2c_init  = palmetto_bmc_i2c_init;
990baa4732bSCédric Le Goater     mc->default_ram_size       = 256 * MiB;
991b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
992b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
993baa4732bSCédric Le Goater };
994baa4732bSCédric Le Goater 
9959cccb912SPatrick Venture static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data)
9969cccb912SPatrick Venture {
9979cccb912SPatrick Venture     MachineClass *mc = MACHINE_CLASS(oc);
9989cccb912SPatrick Venture     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
9999cccb912SPatrick Venture 
10009cccb912SPatrick Venture     mc->desc       = "Quanta-Q71l BMC (ARM926EJ-S)";
10019cccb912SPatrick Venture     amc->soc_name  = "ast2400-a1";
10029cccb912SPatrick Venture     amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1;
10039cccb912SPatrick Venture     amc->fmc_model = "n25q256a";
10049cccb912SPatrick Venture     amc->spi_model = "mx25l25635e";
10059cccb912SPatrick Venture     amc->num_cs    = 1;
10069cccb912SPatrick Venture     amc->i2c_init  = quanta_q71l_bmc_i2c_init;
10079cccb912SPatrick Venture     mc->default_ram_size       = 128 * MiB;
10089cccb912SPatrick Venture     mc->default_cpus = mc->min_cpus = mc->max_cpus =
10099cccb912SPatrick Venture         aspeed_soc_num_cpus(amc->soc_name);
10109cccb912SPatrick Venture }
10119cccb912SPatrick Venture 
101240a38df5SErik Smit static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc,
101340a38df5SErik Smit                                                         void *data)
101440a38df5SErik Smit {
101540a38df5SErik Smit     MachineClass *mc = MACHINE_CLASS(oc);
101640a38df5SErik Smit     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
101740a38df5SErik Smit 
101840a38df5SErik Smit     mc->desc       = "Supermicro X11 BMC (ARM926EJ-S)";
101940a38df5SErik Smit     amc->soc_name  = "ast2400-a1";
102040a38df5SErik Smit     amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1;
102140a38df5SErik Smit     amc->fmc_model = "mx25l25635e";
102240a38df5SErik Smit     amc->spi_model = "mx25l25635e";
102340a38df5SErik Smit     amc->num_cs    = 1;
102440a38df5SErik Smit     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
102540a38df5SErik Smit     amc->i2c_init  = palmetto_bmc_i2c_init;
102640a38df5SErik Smit     mc->default_ram_size = 256 * MiB;
102740a38df5SErik Smit }
102840a38df5SErik Smit 
1029baa4732bSCédric Le Goater static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data)
1030baa4732bSCédric Le Goater {
1031baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1032baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1033baa4732bSCédric Le Goater 
1034baa4732bSCédric Le Goater     mc->desc       = "Aspeed AST2500 EVB (ARM1176)";
1035baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1036baa4732bSCédric Le Goater     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
1037baa4732bSCédric Le Goater     amc->fmc_model = "w25q256";
1038baa4732bSCédric Le Goater     amc->spi_model = "mx25l25635e";
1039baa4732bSCédric Le Goater     amc->num_cs    = 1;
1040baa4732bSCédric Le Goater     amc->i2c_init  = ast2500_evb_i2c_init;
1041baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
1042b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1043b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1044baa4732bSCédric Le Goater };
1045baa4732bSCédric Le Goater 
1046baa4732bSCédric Le Goater static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data)
1047baa4732bSCédric Le Goater {
1048baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1049baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1050baa4732bSCédric Le Goater 
1051baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Romulus BMC (ARM1176)";
1052baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1053baa4732bSCédric Le Goater     amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1;
1054baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
1055baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1056baa4732bSCédric Le Goater     amc->num_cs    = 2;
1057baa4732bSCédric Le Goater     amc->i2c_init  = romulus_bmc_i2c_init;
1058baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
1059b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1060b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1061baa4732bSCédric Le Goater };
1062baa4732bSCédric Le Goater 
1063143b040fSPatrick Williams static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data)
1064143b040fSPatrick Williams {
1065143b040fSPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1066143b040fSPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1067143b040fSPatrick Williams 
1068143b040fSPatrick Williams     mc->desc       = "OCP SonoraPass BMC (ARM1176)";
1069143b040fSPatrick Williams     amc->soc_name  = "ast2500-a1";
1070143b040fSPatrick Williams     amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1;
1071143b040fSPatrick Williams     amc->fmc_model = "mx66l1g45g";
1072143b040fSPatrick Williams     amc->spi_model = "mx66l1g45g";
1073143b040fSPatrick Williams     amc->num_cs    = 2;
1074143b040fSPatrick Williams     amc->i2c_init  = sonorapass_bmc_i2c_init;
1075143b040fSPatrick Williams     mc->default_ram_size       = 512 * MiB;
1076b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1077b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1078143b040fSPatrick Williams };
1079143b040fSPatrick Williams 
1080baa4732bSCédric Le Goater static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data)
1081baa4732bSCédric Le Goater {
1082baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1083baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1084baa4732bSCédric Le Goater 
1085baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Witherspoon BMC (ARM1176)";
1086baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1087baa4732bSCédric Le Goater     amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1;
1088baa4732bSCédric Le Goater     amc->fmc_model = "mx25l25635e";
1089baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1090baa4732bSCédric Le Goater     amc->num_cs    = 2;
1091baa4732bSCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init;
1092baa4732bSCédric Le Goater     mc->default_ram_size = 512 * MiB;
1093b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1094b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1095baa4732bSCédric Le Goater };
1096baa4732bSCédric Le Goater 
1097baa4732bSCédric Le Goater static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
1098baa4732bSCédric Le Goater {
1099baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1100baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1101baa4732bSCédric Le Goater 
1102f548f201SPeter Maydell     mc->desc       = "Aspeed AST2600 EVB (Cortex-A7)";
1103c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
1104baa4732bSCédric Le Goater     amc->hw_strap1 = AST2600_EVB_HW_STRAP1;
1105baa4732bSCédric Le Goater     amc->hw_strap2 = AST2600_EVB_HW_STRAP2;
1106baa4732bSCédric Le Goater     amc->fmc_model = "w25q512jv";
1107baa4732bSCédric Le Goater     amc->spi_model = "mx66u51235f";
1108baa4732bSCédric Le Goater     amc->num_cs    = 1;
110929193286SGuenter Roeck     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON |
111029193286SGuenter Roeck                      ASPEED_MAC3_ON;
1111baa4732bSCédric Le Goater     amc->i2c_init  = ast2600_evb_i2c_init;
1112baa4732bSCédric Le Goater     mc->default_ram_size = 1 * GiB;
1113b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1114b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1115baa4732bSCédric Le Goater };
1116baa4732bSCédric Le Goater 
111763ceb818SCédric Le Goater static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data)
111863ceb818SCédric Le Goater {
111963ceb818SCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
112063ceb818SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
112163ceb818SCédric Le Goater 
1122f548f201SPeter Maydell     mc->desc       = "OpenPOWER Tacoma BMC (Cortex-A7)";
1123c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
112463ceb818SCédric Le Goater     amc->hw_strap1 = TACOMA_BMC_HW_STRAP1;
112563ceb818SCédric Le Goater     amc->hw_strap2 = TACOMA_BMC_HW_STRAP2;
112663ceb818SCédric Le Goater     amc->fmc_model = "mx66l1g45g";
112763ceb818SCédric Le Goater     amc->spi_model = "mx66l1g45g";
112863ceb818SCédric Le Goater     amc->num_cs    = 2;
1129d3bad7e7SCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON;
113063ceb818SCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init; /* Same board layout */
113163ceb818SCédric Le Goater     mc->default_ram_size = 1 * GiB;
1132b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1133b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
113463ceb818SCédric Le Goater };
113563ceb818SCédric Le Goater 
113695f068c8SJohn Wang static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data)
113795f068c8SJohn Wang {
113895f068c8SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
113995f068c8SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
114095f068c8SJohn Wang 
114195f068c8SJohn Wang     mc->desc       = "Bytedance G220A BMC (ARM1176)";
114295f068c8SJohn Wang     amc->soc_name  = "ast2500-a1";
114395f068c8SJohn Wang     amc->hw_strap1 = G220A_BMC_HW_STRAP1;
114495f068c8SJohn Wang     amc->fmc_model = "n25q512a";
114595f068c8SJohn Wang     amc->spi_model = "mx25l25635e";
114695f068c8SJohn Wang     amc->num_cs    = 2;
11475bb825c8SGuenter Roeck     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
114895f068c8SJohn Wang     amc->i2c_init  = g220a_bmc_i2c_init;
114995f068c8SJohn Wang     mc->default_ram_size = 1024 * MiB;
115095f068c8SJohn Wang     mc->default_cpus = mc->min_cpus = mc->max_cpus =
115195f068c8SJohn Wang         aspeed_soc_num_cpus(amc->soc_name);
115295f068c8SJohn Wang };
115395f068c8SJohn Wang 
115482b6a3f6SJohn Wang static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc, void *data)
115582b6a3f6SJohn Wang {
115682b6a3f6SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
115782b6a3f6SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
115882b6a3f6SJohn Wang 
115982b6a3f6SJohn Wang     mc->desc       = "Inspur FP5280G2 BMC (ARM1176)";
116082b6a3f6SJohn Wang     amc->soc_name  = "ast2500-a1";
116182b6a3f6SJohn Wang     amc->hw_strap1 = FP5280G2_BMC_HW_STRAP1;
116282b6a3f6SJohn Wang     amc->fmc_model = "n25q512a";
116382b6a3f6SJohn Wang     amc->spi_model = "mx25l25635e";
116482b6a3f6SJohn Wang     amc->num_cs    = 2;
116582b6a3f6SJohn Wang     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
116682b6a3f6SJohn Wang     amc->i2c_init  = fp5280g2_bmc_i2c_init;
116782b6a3f6SJohn Wang     mc->default_ram_size = 512 * MiB;
116882b6a3f6SJohn Wang     mc->default_cpus = mc->min_cpus = mc->max_cpus =
116982b6a3f6SJohn Wang         aspeed_soc_num_cpus(amc->soc_name);
117082b6a3f6SJohn Wang };
117182b6a3f6SJohn Wang 
117258e52bdbSCédric Le Goater static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data)
117358e52bdbSCédric Le Goater {
117458e52bdbSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
117558e52bdbSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
117658e52bdbSCédric Le Goater 
1177f548f201SPeter Maydell     mc->desc       = "IBM Rainier BMC (Cortex-A7)";
1178c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
117958e52bdbSCédric Le Goater     amc->hw_strap1 = RAINIER_BMC_HW_STRAP1;
118058e52bdbSCédric Le Goater     amc->hw_strap2 = RAINIER_BMC_HW_STRAP2;
118158e52bdbSCédric Le Goater     amc->fmc_model = "mx66l1g45g";
118258e52bdbSCédric Le Goater     amc->spi_model = "mx66l1g45g";
118358e52bdbSCédric Le Goater     amc->num_cs    = 2;
118458e52bdbSCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
118558e52bdbSCédric Le Goater     amc->i2c_init  = rainier_bmc_i2c_init;
118658e52bdbSCédric Le Goater     mc->default_ram_size = 1 * GiB;
118758e52bdbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
118858e52bdbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
118958e52bdbSCédric Le Goater };
119058e52bdbSCédric Le Goater 
1191febbe308SPeter Delevoryas /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */
1192febbe308SPeter Delevoryas #if HOST_LONG_BITS == 32
1193febbe308SPeter Delevoryas #define FUJI_BMC_RAM_SIZE (1 * GiB)
1194febbe308SPeter Delevoryas #else
1195febbe308SPeter Delevoryas #define FUJI_BMC_RAM_SIZE (2 * GiB)
1196febbe308SPeter Delevoryas #endif
1197febbe308SPeter Delevoryas 
1198febbe308SPeter Delevoryas static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data)
1199febbe308SPeter Delevoryas {
1200febbe308SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1201febbe308SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1202febbe308SPeter Delevoryas 
1203febbe308SPeter Delevoryas     mc->desc = "Facebook Fuji BMC (Cortex-A7)";
1204febbe308SPeter Delevoryas     amc->soc_name = "ast2600-a3";
1205febbe308SPeter Delevoryas     amc->hw_strap1 = FUJI_BMC_HW_STRAP1;
1206febbe308SPeter Delevoryas     amc->hw_strap2 = FUJI_BMC_HW_STRAP2;
1207febbe308SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1208febbe308SPeter Delevoryas     amc->spi_model = "mx66l1g45g";
1209febbe308SPeter Delevoryas     amc->num_cs = 2;
1210febbe308SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1211febbe308SPeter Delevoryas     amc->i2c_init = fuji_bmc_i2c_init;
1212febbe308SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART1;
1213febbe308SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
1214febbe308SPeter Delevoryas     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1215febbe308SPeter Delevoryas         aspeed_soc_num_cpus(amc->soc_name);
1216febbe308SPeter Delevoryas };
1217febbe308SPeter Delevoryas 
1218baa4732bSCédric Le Goater static const TypeInfo aspeed_machine_types[] = {
1219baa4732bSCédric Le Goater     {
1220baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("palmetto-bmc"),
1221baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1222baa4732bSCédric Le Goater         .class_init    = aspeed_machine_palmetto_class_init,
1223baa4732bSCédric Le Goater     }, {
122440a38df5SErik Smit         .name          = MACHINE_TYPE_NAME("supermicrox11-bmc"),
122540a38df5SErik Smit         .parent        = TYPE_ASPEED_MACHINE,
122640a38df5SErik Smit         .class_init    = aspeed_machine_supermicrox11_bmc_class_init,
122740a38df5SErik Smit     }, {
1228baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2500-evb"),
1229baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1230baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2500_evb_class_init,
1231baa4732bSCédric Le Goater     }, {
1232baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("romulus-bmc"),
1233baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1234baa4732bSCédric Le Goater         .class_init    = aspeed_machine_romulus_class_init,
1235baa4732bSCédric Le Goater     }, {
1236143b040fSPatrick Williams         .name          = MACHINE_TYPE_NAME("sonorapass-bmc"),
1237143b040fSPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1238143b040fSPatrick Williams         .class_init    = aspeed_machine_sonorapass_class_init,
1239143b040fSPatrick Williams     }, {
1240baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("witherspoon-bmc"),
1241baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1242baa4732bSCédric Le Goater         .class_init    = aspeed_machine_witherspoon_class_init,
1243baa4732bSCédric Le Goater     }, {
1244baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2600-evb"),
1245baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1246baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2600_evb_class_init,
1247baa4732bSCédric Le Goater     }, {
124863ceb818SCédric Le Goater         .name          = MACHINE_TYPE_NAME("tacoma-bmc"),
124963ceb818SCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
125063ceb818SCédric Le Goater         .class_init    = aspeed_machine_tacoma_class_init,
125163ceb818SCédric Le Goater     }, {
125295f068c8SJohn Wang         .name          = MACHINE_TYPE_NAME("g220a-bmc"),
125395f068c8SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
125495f068c8SJohn Wang         .class_init    = aspeed_machine_g220a_class_init,
125595f068c8SJohn Wang     }, {
125682b6a3f6SJohn Wang         .name          = MACHINE_TYPE_NAME("fp5280g2-bmc"),
125782b6a3f6SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
125882b6a3f6SJohn Wang         .class_init    = aspeed_machine_fp5280g2_class_init,
125982b6a3f6SJohn Wang     }, {
12609cccb912SPatrick Venture         .name          = MACHINE_TYPE_NAME("quanta-q71l-bmc"),
12619cccb912SPatrick Venture         .parent        = TYPE_ASPEED_MACHINE,
12629cccb912SPatrick Venture         .class_init    = aspeed_machine_quanta_q71l_class_init,
12639cccb912SPatrick Venture     }, {
126458e52bdbSCédric Le Goater         .name          = MACHINE_TYPE_NAME("rainier-bmc"),
126558e52bdbSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
126658e52bdbSCédric Le Goater         .class_init    = aspeed_machine_rainier_class_init,
126758e52bdbSCédric Le Goater     }, {
1268febbe308SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fuji-bmc"),
1269febbe308SPeter Delevoryas         .parent        = TYPE_ASPEED_MACHINE,
1270febbe308SPeter Delevoryas         .class_init    = aspeed_machine_fuji_class_init,
1271febbe308SPeter Delevoryas     }, {
1272fca9ca1bSCédric Le Goater         .name          = TYPE_ASPEED_MACHINE,
127362c2c2ebSCédric Le Goater         .parent        = TYPE_MACHINE,
1274888b2b03SPhilippe Mathieu-Daudé         .instance_size = sizeof(AspeedMachineState),
12751a15311aSCédric Le Goater         .instance_init = aspeed_machine_instance_init,
1276fca9ca1bSCédric Le Goater         .class_size    = sizeof(AspeedMachineClass),
1277fca9ca1bSCédric Le Goater         .class_init    = aspeed_machine_class_init,
1278baa4732bSCédric Le Goater         .abstract      = true,
1279baa4732bSCédric Le Goater     }
1280fca9ca1bSCédric Le Goater };
128174fb1f38SCédric Le Goater 
1282baa4732bSCédric Le Goater DEFINE_TYPES(aspeed_machine_types)
1283