xref: /qemu/hw/arm/aspeed.c (revision 8ec239f2d80bed82ad5a361ddfb9ca3560a45ad8)
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 
109aae7a18dSAdriana Kobylak /* Swift hardware value: 0xF11AD206 */
110aae7a18dSAdriana Kobylak #define SWIFT_BMC_HW_STRAP1 (                                           \
111aae7a18dSAdriana Kobylak         AST2500_HW_STRAP1_DEFAULTS |                                    \
112aae7a18dSAdriana Kobylak         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
113aae7a18dSAdriana Kobylak         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
114aae7a18dSAdriana Kobylak         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
115aae7a18dSAdriana Kobylak         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
116aae7a18dSAdriana Kobylak         SCU_H_PLL_BYPASS_EN |                                           \
117aae7a18dSAdriana Kobylak         SCU_AST2500_HW_STRAP_ACPI_ENABLE |                              \
118aae7a18dSAdriana Kobylak         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER))
119aae7a18dSAdriana Kobylak 
12095f068c8SJohn Wang #define G220A_BMC_HW_STRAP1 (                                      \
12195f068c8SJohn Wang         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
12295f068c8SJohn Wang         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
12395f068c8SJohn Wang         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
12495f068c8SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
12595f068c8SJohn Wang         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
12695f068c8SJohn Wang         SCU_HW_STRAP_2ND_BOOT_WDT |                                     \
12795f068c8SJohn Wang         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
12895f068c8SJohn Wang         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
12995f068c8SJohn Wang         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
13095f068c8SJohn Wang         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
13195f068c8SJohn Wang         SCU_HW_STRAP_VGA_SIZE_SET(VGA_64M_DRAM) |                       \
13295f068c8SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED1)
13395f068c8SJohn Wang 
13482b6a3f6SJohn Wang /* FP5280G2 hardware value: 0XF100D286 */
13582b6a3f6SJohn Wang #define FP5280G2_BMC_HW_STRAP1 (                                      \
13682b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
13782b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
13882b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
13982b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
14082b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
14182b6a3f6SJohn Wang         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
14282b6a3f6SJohn Wang         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
14382b6a3f6SJohn Wang         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
14482b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
14582b6a3f6SJohn Wang         SCU_HW_STRAP_MAC1_RGMII |                                       \
14682b6a3f6SJohn Wang         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
14782b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED1)
14882b6a3f6SJohn Wang 
14962c2c2ebSCédric Le Goater /* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */
15062c2c2ebSCédric Le Goater #define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1
15162c2c2ebSCédric Le Goater 
1529cccb912SPatrick Venture /* Quanta-Q71l hardware value */
1539cccb912SPatrick Venture #define QUANTA_Q71L_BMC_HW_STRAP1 (                                     \
1549cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) |               \
1559cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2/* DDR3 with CL=6, CWL=5 */) | \
1569cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
1579cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_24M_IN) |       \
1589cccb912SPatrick Venture         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
1599cccb912SPatrick Venture         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_PASS_THROUGH) |          \
1609cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
1619cccb912SPatrick Venture         SCU_HW_STRAP_SPI_WIDTH |                                        \
1629cccb912SPatrick Venture         SCU_HW_STRAP_VGA_SIZE_SET(VGA_8M_DRAM) |                        \
1639cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
1649cccb912SPatrick Venture 
165ccc2c418SCédric Le Goater /* AST2600 evb hardware value */
166ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP1 0x000000C0
167ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP2 0x00000003
168ccc2c418SCédric Le Goater 
16963ceb818SCédric Le Goater /* Tacoma hardware value */
17063ceb818SCédric Le Goater #define TACOMA_BMC_HW_STRAP1  0x00000000
1717582591aSJoel Stanley #define TACOMA_BMC_HW_STRAP2  0x00000040
17263ceb818SCédric Le Goater 
17358e52bdbSCédric Le Goater /* Rainier hardware value: (QEMU prototype) */
17458e52bdbSCédric Le Goater #define RAINIER_BMC_HW_STRAP1 0x00000000
17558e52bdbSCédric Le Goater #define RAINIER_BMC_HW_STRAP2 0x00000000
17658e52bdbSCédric Le Goater 
177febbe308SPeter Delevoryas /* Fuji hardware value */
178febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP1    0x00000000
179febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP2    0x00000000
180febbe308SPeter Delevoryas 
181ebe31c0aSCédric Le Goater /*
182ebe31c0aSCédric Le Goater  * The max ram region is for firmwares that scan the address space
183ebe31c0aSCédric Le Goater  * with load/store to guess how much RAM the SoC has.
184ebe31c0aSCédric Le Goater  */
185ebe31c0aSCédric Le Goater static uint64_t max_ram_read(void *opaque, hwaddr offset, unsigned size)
186ebe31c0aSCédric Le Goater {
187ebe31c0aSCédric Le Goater     return 0;
188ebe31c0aSCédric Le Goater }
189ebe31c0aSCédric Le Goater 
190ebe31c0aSCédric Le Goater static void max_ram_write(void *opaque, hwaddr offset, uint64_t value,
191ebe31c0aSCédric Le Goater                            unsigned size)
192ebe31c0aSCédric Le Goater {
193ebe31c0aSCédric Le Goater     /* Discard writes */
194ebe31c0aSCédric Le Goater }
195ebe31c0aSCédric Le Goater 
196ebe31c0aSCédric Le Goater static const MemoryRegionOps max_ram_ops = {
197ebe31c0aSCédric Le Goater     .read = max_ram_read,
198ebe31c0aSCédric Le Goater     .write = max_ram_write,
199ebe31c0aSCédric Le Goater     .endianness = DEVICE_NATIVE_ENDIAN,
200ebe31c0aSCédric Le Goater };
201ebe31c0aSCédric Le Goater 
2029bb6d140SJoel Stanley #define AST_SMP_MAILBOX_BASE            0x1e6e2180
2039bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_ENTRY        (AST_SMP_MAILBOX_BASE + 0x0)
2049bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_GOSIGN       (AST_SMP_MAILBOX_BASE + 0x4)
2059bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_READY        (AST_SMP_MAILBOX_BASE + 0x8)
2069bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_POLLINSN     (AST_SMP_MAILBOX_BASE + 0xc)
2079bb6d140SJoel Stanley #define AST_SMP_MBOX_CODE               (AST_SMP_MAILBOX_BASE + 0x10)
2089bb6d140SJoel Stanley #define AST_SMP_MBOX_GOSIGN             0xabbaab00
2099bb6d140SJoel Stanley 
2109bb6d140SJoel Stanley static void aspeed_write_smpboot(ARMCPU *cpu,
2119bb6d140SJoel Stanley                                  const struct arm_boot_info *info)
2129bb6d140SJoel Stanley {
2139bb6d140SJoel Stanley     static const uint32_t poll_mailbox_ready[] = {
2149bb6d140SJoel Stanley         /*
2159bb6d140SJoel Stanley          * r2 = per-cpu go sign value
2169bb6d140SJoel Stanley          * r1 = AST_SMP_MBOX_FIELD_ENTRY
2179bb6d140SJoel Stanley          * r0 = AST_SMP_MBOX_FIELD_GOSIGN
2189bb6d140SJoel Stanley          */
2199bb6d140SJoel Stanley         0xee100fb0,  /* mrc     p15, 0, r0, c0, c0, 5 */
2209bb6d140SJoel Stanley         0xe21000ff,  /* ands    r0, r0, #255          */
2219bb6d140SJoel Stanley         0xe59f201c,  /* ldr     r2, [pc, #28]         */
2229bb6d140SJoel Stanley         0xe1822000,  /* orr     r2, r2, r0            */
2239bb6d140SJoel Stanley 
2249bb6d140SJoel Stanley         0xe59f1018,  /* ldr     r1, [pc, #24]         */
2259bb6d140SJoel Stanley         0xe59f0018,  /* ldr     r0, [pc, #24]         */
2269bb6d140SJoel Stanley 
2279bb6d140SJoel Stanley         0xe320f002,  /* wfe                           */
2289bb6d140SJoel Stanley         0xe5904000,  /* ldr     r4, [r0]              */
2299bb6d140SJoel Stanley         0xe1520004,  /* cmp     r2, r4                */
2309bb6d140SJoel Stanley         0x1afffffb,  /* bne     <wfe>                 */
2319bb6d140SJoel Stanley         0xe591f000,  /* ldr     pc, [r1]              */
2329bb6d140SJoel Stanley         AST_SMP_MBOX_GOSIGN,
2339bb6d140SJoel Stanley         AST_SMP_MBOX_FIELD_ENTRY,
2349bb6d140SJoel Stanley         AST_SMP_MBOX_FIELD_GOSIGN,
2359bb6d140SJoel Stanley     };
2369bb6d140SJoel Stanley 
2379bb6d140SJoel Stanley     rom_add_blob_fixed("aspeed.smpboot", poll_mailbox_ready,
2389bb6d140SJoel Stanley                        sizeof(poll_mailbox_ready),
2399bb6d140SJoel Stanley                        info->smp_loader_start);
2409bb6d140SJoel Stanley }
2419bb6d140SJoel Stanley 
2429bb6d140SJoel Stanley static void aspeed_reset_secondary(ARMCPU *cpu,
2439bb6d140SJoel Stanley                                    const struct arm_boot_info *info)
2449bb6d140SJoel Stanley {
2459bb6d140SJoel Stanley     AddressSpace *as = arm_boot_address_space(cpu, info);
2469bb6d140SJoel Stanley     CPUState *cs = CPU(cpu);
2479bb6d140SJoel Stanley 
2489bb6d140SJoel Stanley     /* info->smp_bootreg_addr */
2499bb6d140SJoel Stanley     address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0,
2509bb6d140SJoel Stanley                                MEMTXATTRS_UNSPECIFIED, NULL);
2519bb6d140SJoel Stanley     cpu_set_pc(cs, info->smp_loader_start);
2529bb6d140SJoel Stanley }
2539bb6d140SJoel Stanley 
254d769a1daSCédric Le Goater #define FIRMWARE_ADDR 0x0
255d769a1daSCédric Le Goater 
256d769a1daSCédric Le Goater static void write_boot_rom(DriveInfo *dinfo, hwaddr addr, size_t rom_size,
257d769a1daSCédric Le Goater                            Error **errp)
258d769a1daSCédric Le Goater {
259d769a1daSCédric Le Goater     BlockBackend *blk = blk_by_legacy_dinfo(dinfo);
260d769a1daSCédric Le Goater     uint8_t *storage;
2610c7209beSCédric Le Goater     int64_t size;
262d769a1daSCédric Le Goater 
2630c7209beSCédric Le Goater     /* The block backend size should have already been 'validated' by
2640c7209beSCédric Le Goater      * the creation of the m25p80 object.
2650c7209beSCédric Le Goater      */
2660c7209beSCédric Le Goater     size = blk_getlength(blk);
2670c7209beSCédric Le Goater     if (size <= 0) {
2680c7209beSCédric Le Goater         error_setg(errp, "failed to get flash size");
2690c7209beSCédric Le Goater         return;
2700c7209beSCédric Le Goater     }
2710c7209beSCédric Le Goater 
2720c7209beSCédric Le Goater     if (rom_size > size) {
2730c7209beSCédric Le Goater         rom_size = size;
274d769a1daSCédric Le Goater     }
275d769a1daSCédric Le Goater 
276d769a1daSCédric Le Goater     storage = g_new0(uint8_t, rom_size);
277d769a1daSCédric Le Goater     if (blk_pread(blk, 0, storage, rom_size) < 0) {
278d769a1daSCédric Le Goater         error_setg(errp, "failed to read the initial flash content");
279d769a1daSCédric Le Goater         return;
280d769a1daSCédric Le Goater     }
281d769a1daSCédric Le Goater 
282d769a1daSCédric Le Goater     rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr);
283d769a1daSCédric Le Goater     g_free(storage);
284d769a1daSCédric Le Goater }
285d769a1daSCédric Le Goater 
286c20b4cccSMarkus Armbruster static void aspeed_board_init_flashes(AspeedSMCState *s,
287*8ec239f2SMarkus Armbruster                                       const char *flashtype,
288*8ec239f2SMarkus Armbruster                                       int unit0)
289e1ad9bc4SCédric Le Goater {
290e1ad9bc4SCédric Le Goater     int i ;
291e1ad9bc4SCédric Le Goater 
292e1ad9bc4SCédric Le Goater     for (i = 0; i < s->num_cs; ++i) {
293*8ec239f2SMarkus Armbruster         DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i);
294e1ad9bc4SCédric Le Goater         qemu_irq cs_line;
295a7d78befSCédric Le Goater         DeviceState *dev;
296e1ad9bc4SCédric Le Goater 
297a7d78befSCédric Le Goater         dev = qdev_new(flashtype);
298e1ad9bc4SCédric Le Goater         if (dinfo) {
299a7d78befSCédric Le Goater             qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo));
300e1ad9bc4SCédric Le Goater         }
301a7d78befSCédric Le Goater         qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal);
302e1ad9bc4SCédric Le Goater 
303a7d78befSCédric Le Goater         cs_line = qdev_get_gpio_in_named(dev, SSI_GPIO_CS, 0);
304e1ad9bc4SCédric Le Goater         sysbus_connect_irq(SYS_BUS_DEVICE(s), i + 1, cs_line);
305e1ad9bc4SCédric Le Goater     }
306e1ad9bc4SCédric Le Goater }
307e1ad9bc4SCédric Le Goater 
308a29e3e12SAndrew Jeffery static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo)
309a29e3e12SAndrew Jeffery {
310a29e3e12SAndrew Jeffery         DeviceState *card;
311a29e3e12SAndrew Jeffery 
312756f739bSPhilippe Mathieu-Daudé         if (!dinfo) {
313756f739bSPhilippe Mathieu-Daudé             return;
314756f739bSPhilippe Mathieu-Daudé         }
3153e80f690SMarkus Armbruster         card = qdev_new(TYPE_SD_CARD);
316934df912SMarkus Armbruster         qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
317a29e3e12SAndrew Jeffery                                 &error_fatal);
3183e80f690SMarkus Armbruster         qdev_realize_and_unref(card,
3193e80f690SMarkus Armbruster                                qdev_get_child_bus(DEVICE(sdhci), "sd-bus"),
3203e80f690SMarkus Armbruster                                &error_fatal);
321a29e3e12SAndrew Jeffery }
322a29e3e12SAndrew Jeffery 
323baa4732bSCédric Le Goater static void aspeed_machine_init(MachineState *machine)
324327d8e4eSAndrew Jeffery {
325888b2b03SPhilippe Mathieu-Daudé     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
326baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
327b033271fSCédric Le Goater     AspeedSoCClass *sc;
328d769a1daSCédric Le Goater     DriveInfo *drive0 = drive_get(IF_MTD, 0, 0);
329ebe31c0aSCédric Le Goater     ram_addr_t max_ram_size;
3302bea128cSEddie James     int i;
331d3bad7e7SCédric Le Goater     NICInfo *nd = &nd_table[0];
332327d8e4eSAndrew Jeffery 
333ad1a9782SCédric Le Goater     memory_region_init(&bmc->ram_container, NULL, "aspeed-ram-container",
3347df9f028SPhilippe Mathieu-Daudé                        4 * GiB);
335afcbaed6SIgor Mammedov     memory_region_add_subregion(&bmc->ram_container, 0, machine->ram);
336ad1a9782SCédric Le Goater 
3379fc7fc4dSMarkus Armbruster     object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
338327d8e4eSAndrew Jeffery 
339b033271fSCédric Le Goater     sc = ASPEED_SOC_GET_CLASS(&bmc->soc);
340b033271fSCédric Le Goater 
341533eb415SIgor Mammedov     /*
342533eb415SIgor Mammedov      * This will error out if isize is not supported by memory controller.
343533eb415SIgor Mammedov      */
3446e504a98SPaolo Bonzini     object_property_set_uint(OBJECT(&bmc->soc), "ram-size", machine->ram_size,
345533eb415SIgor Mammedov                              &error_fatal);
346533eb415SIgor Mammedov 
347d3bad7e7SCédric Le Goater     for (i = 0; i < sc->macs_num; i++) {
348d3bad7e7SCédric Le Goater         if ((amc->macs_mask & (1 << i)) && nd->used) {
349d3bad7e7SCédric Le Goater             qemu_check_nic_model(nd, TYPE_FTGMAC100);
350d3bad7e7SCédric Le Goater             qdev_set_nic_properties(DEVICE(&bmc->soc.ftgmac100[i]), nd);
351d3bad7e7SCédric Le Goater             nd++;
352d3bad7e7SCédric Le Goater         }
353d3bad7e7SCédric Le Goater     }
354d3bad7e7SCédric Le Goater 
3555325cc34SMarkus Armbruster     object_property_set_int(OBJECT(&bmc->soc), "hw-strap1", amc->hw_strap1,
35687e79af0SAndrew Jeffery                             &error_abort);
3575325cc34SMarkus Armbruster     object_property_set_int(OBJECT(&bmc->soc), "hw-strap2", amc->hw_strap2,
358ccc2c418SCédric Le Goater                             &error_abort);
3595325cc34SMarkus Armbruster     object_property_set_int(OBJECT(&bmc->soc), "num-cs", amc->num_cs,
36026d5df95SCédric Le Goater                             &error_abort);
3615325cc34SMarkus Armbruster     object_property_set_link(OBJECT(&bmc->soc), "dram",
3620df2d9a6SCédric Le Goater                              OBJECT(machine->ram), &error_abort);
363b6e70d1dSJoel Stanley     if (machine->kernel_filename) {
364b6e70d1dSJoel Stanley         /*
365b6e70d1dSJoel Stanley          * When booting with a -kernel command line there is no u-boot
366b6e70d1dSJoel Stanley          * that runs to unlock the SCU. In this case set the default to
367b6e70d1dSJoel Stanley          * be unlocked as the kernel expects
368b6e70d1dSJoel Stanley          */
3695325cc34SMarkus Armbruster         object_property_set_int(OBJECT(&bmc->soc), "hw-prot-key",
3705325cc34SMarkus Armbruster                                 ASPEED_SCU_PROT_KEY, &error_abort);
371b6e70d1dSJoel Stanley     }
3725d63d0c7SPeter Delevoryas     qdev_prop_set_uint32(DEVICE(&bmc->soc), "uart-default",
3735d63d0c7SPeter Delevoryas                          amc->uart_default);
374ce189ab2SMarkus Armbruster     qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
375327d8e4eSAndrew Jeffery 
376d783d1feSCédric Le Goater     memory_region_add_subregion(get_system_memory(),
377347df6f8SEduardo Habkost                                 sc->memmap[ASPEED_DEV_SDRAM],
378ad1a9782SCédric Le Goater                                 &bmc->ram_container);
379de46f5f4SCédric Le Goater 
380ebe31c0aSCédric Le Goater     max_ram_size = object_property_get_uint(OBJECT(&bmc->soc), "max-ram-size",
381ebe31c0aSCédric Le Goater                                             &error_abort);
382ebe31c0aSCédric Le Goater     memory_region_init_io(&bmc->max_ram, NULL, &max_ram_ops, NULL,
3836e504a98SPaolo Bonzini                           "max_ram", max_ram_size  - machine->ram_size);
3846e504a98SPaolo Bonzini     memory_region_add_subregion(&bmc->ram_container, machine->ram_size, &bmc->max_ram);
385ebe31c0aSCédric Le Goater 
386*8ec239f2SMarkus Armbruster     aspeed_board_init_flashes(&bmc->soc.fmc,
387*8ec239f2SMarkus Armbruster                               bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
388*8ec239f2SMarkus Armbruster                               0);
389*8ec239f2SMarkus Armbruster     aspeed_board_init_flashes(&bmc->soc.spi[0],
390*8ec239f2SMarkus Armbruster                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
391*8ec239f2SMarkus Armbruster                               bmc->soc.fmc.num_cs);
392e1ad9bc4SCédric Le Goater 
393d769a1daSCédric Le Goater     /* Install first FMC flash content as a boot rom. */
394d769a1daSCédric Le Goater     if (drive0) {
395d769a1daSCédric Le Goater         AspeedSMCFlash *fl = &bmc->soc.fmc.flashes[0];
396d769a1daSCédric Le Goater         MemoryRegion *boot_rom = g_new(MemoryRegion, 1);
3976bb55e79SCédric Le Goater         uint64_t size = memory_region_size(&fl->mmio);
398d769a1daSCédric Le Goater 
399d769a1daSCédric Le Goater         /*
400d769a1daSCédric Le Goater          * create a ROM region using the default mapping window size of
40193bf276dSCédric Le Goater          * the flash module. The window size is 64MB for the AST2400
40293bf276dSCédric Le Goater          * SoC and 128MB for the AST2500 SoC, which is twice as big as
40393bf276dSCédric Le Goater          * needed by the flash modules of the Aspeed machines.
404d769a1daSCédric Le Goater          */
4051a15311aSCédric Le Goater         if (ASPEED_MACHINE(machine)->mmio_exec) {
406f489960dSPhilippe Mathieu-Daudé             memory_region_init_alias(boot_rom, NULL, "aspeed.boot_rom",
4076bb55e79SCédric Le Goater                                      &fl->mmio, 0, size);
4081a15311aSCédric Le Goater             memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
4091a15311aSCédric Le Goater                                         boot_rom);
4101a15311aSCédric Le Goater         } else {
411f489960dSPhilippe Mathieu-Daudé             memory_region_init_rom(boot_rom, NULL, "aspeed.boot_rom",
4126bb55e79SCédric Le Goater                                    size, &error_abort);
413d769a1daSCédric Le Goater             memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
414d769a1daSCédric Le Goater                                         boot_rom);
4156bb55e79SCédric Le Goater             write_boot_rom(drive0, FIRMWARE_ADDR, size, &error_abort);
416d769a1daSCédric Le Goater         }
4171a15311aSCédric Le Goater     }
418d769a1daSCédric Le Goater 
419b7f1a0cbSCédric Le Goater     if (machine->kernel_filename && sc->num_cpus > 1) {
4209bb6d140SJoel Stanley         /* With no u-boot we must set up a boot stub for the secondary CPU */
4219bb6d140SJoel Stanley         MemoryRegion *smpboot = g_new(MemoryRegion, 1);
422f489960dSPhilippe Mathieu-Daudé         memory_region_init_ram(smpboot, NULL, "aspeed.smpboot",
4239bb6d140SJoel Stanley                                0x80, &error_abort);
4249bb6d140SJoel Stanley         memory_region_add_subregion(get_system_memory(),
4259bb6d140SJoel Stanley                                     AST_SMP_MAILBOX_BASE, smpboot);
4269bb6d140SJoel Stanley 
4279bb6d140SJoel Stanley         aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot;
4289bb6d140SJoel Stanley         aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary;
4299bb6d140SJoel Stanley         aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE;
4309bb6d140SJoel Stanley     }
4319bb6d140SJoel Stanley 
4326e504a98SPaolo Bonzini     aspeed_board_binfo.ram_size = machine->ram_size;
433347df6f8SEduardo Habkost     aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM];
434b7f1a0cbSCédric Le Goater     aspeed_board_binfo.nb_cpus = sc->num_cpus;
435b033271fSCédric Le Goater 
436baa4732bSCédric Le Goater     if (amc->i2c_init) {
437baa4732bSCédric Le Goater         amc->i2c_init(bmc);
4382cf6cb50SCédric Le Goater     }
4392cf6cb50SCédric Le Goater 
4400e2c24c6SAndrew Jeffery     for (i = 0; i < bmc->soc.sdhci.num_slots; i++) {
441*8ec239f2SMarkus Armbruster         sdhci_attach_drive(&bmc->soc.sdhci.slots[i],
442*8ec239f2SMarkus Armbruster                            drive_get(IF_SD, 0, i));
443a29e3e12SAndrew Jeffery     }
4442bea128cSEddie James 
445a29e3e12SAndrew Jeffery     if (bmc->soc.emmc.num_slots) {
446*8ec239f2SMarkus Armbruster         sdhci_attach_drive(&bmc->soc.emmc.slots[0],
447*8ec239f2SMarkus Armbruster                            drive_get(IF_SD, 0, bmc->soc.sdhci.num_slots));
4482bea128cSEddie James     }
4492bea128cSEddie James 
4502744ece8STao Xu     arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo);
451327d8e4eSAndrew Jeffery }
452327d8e4eSAndrew Jeffery 
45382b6a3f6SJohn Wang static void at24c_eeprom_init(I2CBus *bus, uint8_t addr, uint32_t rsize)
45482b6a3f6SJohn Wang {
45582b6a3f6SJohn Wang     I2CSlave *i2c_dev = i2c_slave_new("at24c-eeprom", addr);
45682b6a3f6SJohn Wang     DeviceState *dev = DEVICE(i2c_dev);
45782b6a3f6SJohn Wang 
45882b6a3f6SJohn Wang     qdev_prop_set_uint32(dev, "rom-size", rsize);
45982b6a3f6SJohn Wang     i2c_slave_realize_and_unref(i2c_dev, bus, &error_abort);
46082b6a3f6SJohn Wang }
46182b6a3f6SJohn Wang 
462612b219aSPhilippe Mathieu-Daudé static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
4632cf6cb50SCédric Le Goater {
4642cf6cb50SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
465a87e81b9SCédric Le Goater     DeviceState *dev;
4663d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
4672cf6cb50SCédric Le Goater 
4682cf6cb50SCédric Le Goater     /* The palmetto platform expects a ds3231 RTC but a ds1338 is
4692cf6cb50SCédric Le Goater      * enough to provide basic RTC features. Alarms will be missing */
4701373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
471a87e81b9SCédric Le Goater 
4727a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
4733d165f12SCédric Le Goater                           eeprom_buf);
4743d165f12SCédric Le Goater 
475a87e81b9SCédric Le Goater     /* add a TMP423 temperature sensor */
4761373b15bSPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
4771373b15bSPhilippe Mathieu-Daudé                                          "tmp423", 0x4c));
4785325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
4795325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
4805325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
4815325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort);
4822cf6cb50SCédric Le Goater }
4832cf6cb50SCédric Le Goater 
4849cccb912SPatrick Venture static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc)
4859cccb912SPatrick Venture {
4869cccb912SPatrick Venture     AspeedSoCState *soc = &bmc->soc;
4879cccb912SPatrick Venture 
4889cccb912SPatrick Venture     /*
4899cccb912SPatrick Venture      * The quanta-q71l platform expects tmp75s which are compatible with
4909cccb912SPatrick Venture      * tmp105s.
4919cccb912SPatrick Venture      */
4929cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c);
4939cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e);
4949cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f);
4959cccb912SPatrick Venture 
4969cccb912SPatrick Venture     /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */
4979cccb912SPatrick Venture     /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */
4989cccb912SPatrick Venture     /* TODO: Add Memory Riser i2c mux and eeproms. */
4999cccb912SPatrick Venture 
5003ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74);
5013ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77);
5023ec75e39SPatrick Venture 
5039cccb912SPatrick Venture     /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */
5043ec75e39SPatrick Venture 
5053ec75e39SPatrick Venture     /* i2c-7 */
5063ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70);
5079cccb912SPatrick Venture     /*        - i2c@0: pmbus@59 */
5089cccb912SPatrick Venture     /*        - i2c@1: pmbus@58 */
5099cccb912SPatrick Venture     /*        - i2c@2: pmbus@58 */
5109cccb912SPatrick Venture     /*        - i2c@3: pmbus@59 */
5113ec75e39SPatrick Venture 
5129cccb912SPatrick Venture     /* TODO: i2c-7: Add PDB FRU eeprom@52 */
5139cccb912SPatrick Venture     /* TODO: i2c-8: Add BMC FRU eeprom@50 */
5149cccb912SPatrick Venture }
5159cccb912SPatrick Venture 
516612b219aSPhilippe Mathieu-Daudé static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
5172cf6cb50SCédric Le Goater {
5182cf6cb50SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
5193d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
5203d165f12SCédric Le Goater 
5217a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50,
5223d165f12SCédric Le Goater                           eeprom_buf);
5232cf6cb50SCédric Le Goater 
5242cf6cb50SCédric Le Goater     /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
5251373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
526044475f3SPhilippe Mathieu-Daudé                      TYPE_TMP105, 0x4d);
5276c4567c7SCédric Le Goater 
5286c4567c7SCédric Le Goater     /* The AST2500 EVB does not have an RTC. Let's pretend that one is
5296c4567c7SCédric Le Goater      * plugged on the I2C bus header */
5301373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
5312cf6cb50SCédric Le Goater }
5322cf6cb50SCédric Le Goater 
533612b219aSPhilippe Mathieu-Daudé static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
534ccc2c418SCédric Le Goater {
535ccc2c418SCédric Le Goater     /* Start with some devices on our I2C busses */
536ccc2c418SCédric Le Goater     ast2500_evb_i2c_init(bmc);
537ccc2c418SCédric Le Goater }
538ccc2c418SCédric Le Goater 
539612b219aSPhilippe Mathieu-Daudé static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
5406c4567c7SCédric Le Goater {
5416c4567c7SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
5426c4567c7SCédric Le Goater 
5436c4567c7SCédric Le Goater     /* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
5446c4567c7SCédric Le Goater      * good enough */
5451373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
5466c4567c7SCédric Le Goater }
5476c4567c7SCédric Le Goater 
548612b219aSPhilippe Mathieu-Daudé static void swift_bmc_i2c_init(AspeedMachineState *bmc)
549aae7a18dSAdriana Kobylak {
550aae7a18dSAdriana Kobylak     AspeedSoCState *soc = &bmc->soc;
551aae7a18dSAdriana Kobylak 
5521373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "pca9552", 0x60);
553aae7a18dSAdriana Kobylak 
554aae7a18dSAdriana Kobylak     /* The swift board expects a TMP275 but a TMP105 is compatible */
5551373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "tmp105", 0x48);
556aae7a18dSAdriana Kobylak     /* The swift board expects a pca9551 but a pca9552 is compatible */
5571373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9552", 0x60);
558aae7a18dSAdriana Kobylak 
559aae7a18dSAdriana Kobylak     /* The swift board expects an Epson RX8900 RTC but a ds1338 is compatible */
5601373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "ds1338", 0x32);
5611373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x60);
562aae7a18dSAdriana Kobylak 
5631373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c);
564aae7a18dSAdriana Kobylak     /* The swift board expects a pca9539 but a pca9552 is compatible */
5651373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "pca9552", 0x74);
566aae7a18dSAdriana Kobylak 
5671373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c);
568aae7a18dSAdriana Kobylak     /* The swift board expects a pca9539 but a pca9552 is compatible */
5691373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "pca9552",
570aae7a18dSAdriana Kobylak                      0x74);
571aae7a18dSAdriana Kobylak 
572aae7a18dSAdriana Kobylak     /* The swift board expects a TMP275 but a TMP105 is compatible */
5731373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12), "tmp105", 0x48);
5741373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12), "tmp105", 0x4a);
575aae7a18dSAdriana Kobylak }
576aae7a18dSAdriana Kobylak 
577612b219aSPhilippe Mathieu-Daudé static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc)
578143b040fSPatrick Williams {
579143b040fSPatrick Williams     AspeedSoCState *soc = &bmc->soc;
580143b040fSPatrick Williams 
581143b040fSPatrick Williams     /* bus 2 : */
5821373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48);
5831373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49);
584143b040fSPatrick Williams     /* bus 2 : pca9546 @ 0x73 */
585143b040fSPatrick Williams 
586143b040fSPatrick Williams     /* bus 3 : pca9548 @ 0x70 */
587143b040fSPatrick Williams 
588143b040fSPatrick Williams     /* bus 4 : */
589143b040fSPatrick Williams     uint8_t *eeprom4_54 = g_malloc0(8 * 1024);
5907a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54,
591143b040fSPatrick Williams                           eeprom4_54);
592143b040fSPatrick Williams     /* PCA9539 @ 0x76, but PCA9552 is compatible */
5931373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "pca9552", 0x76);
594143b040fSPatrick Williams     /* PCA9539 @ 0x77, but PCA9552 is compatible */
5951373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "pca9552", 0x77);
596143b040fSPatrick Williams 
597143b040fSPatrick Williams     /* bus 6 : */
5981373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48);
5991373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49);
600143b040fSPatrick Williams     /* bus 6 : pca9546 @ 0x73 */
601143b040fSPatrick Williams 
602143b040fSPatrick Williams     /* bus 8 : */
603143b040fSPatrick Williams     uint8_t *eeprom8_56 = g_malloc0(8 * 1024);
6047a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56,
605143b040fSPatrick Williams                           eeprom8_56);
6061373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x60);
6071373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x61);
608143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1d */
609143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1f */
610143b040fSPatrick Williams 
611143b040fSPatrick Williams     /*
612143b040fSPatrick Williams      * bus 13 : pca9548 @ 0x71
613143b040fSPatrick Williams      *      - channel 3:
614143b040fSPatrick Williams      *          - tmm421 @ 0x4c
615143b040fSPatrick Williams      *          - tmp421 @ 0x4e
616143b040fSPatrick Williams      *          - tmp421 @ 0x4f
617143b040fSPatrick Williams      */
618143b040fSPatrick Williams 
619143b040fSPatrick Williams }
620143b040fSPatrick Williams 
621612b219aSPhilippe Mathieu-Daudé static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
62262c2c2ebSCédric Le Goater {
6237cfbde5eSPhilippe Mathieu-Daudé     static const struct {
6247cfbde5eSPhilippe Mathieu-Daudé         unsigned gpio_id;
6257cfbde5eSPhilippe Mathieu-Daudé         LEDColor color;
6267cfbde5eSPhilippe Mathieu-Daudé         const char *description;
6277cfbde5eSPhilippe Mathieu-Daudé         bool gpio_polarity;
6287cfbde5eSPhilippe Mathieu-Daudé     } pca1_leds[] = {
6297cfbde5eSPhilippe Mathieu-Daudé         {13, LED_COLOR_GREEN, "front-fault-4",  GPIO_POLARITY_ACTIVE_LOW},
6307cfbde5eSPhilippe Mathieu-Daudé         {14, LED_COLOR_GREEN, "front-power-3",  GPIO_POLARITY_ACTIVE_LOW},
6317cfbde5eSPhilippe Mathieu-Daudé         {15, LED_COLOR_GREEN, "front-id-5",     GPIO_POLARITY_ACTIVE_LOW},
6327cfbde5eSPhilippe Mathieu-Daudé     };
63362c2c2ebSCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
6343d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
63515ce12cfSPhilippe Mathieu-Daudé     DeviceState *dev;
6367cfbde5eSPhilippe Mathieu-Daudé     LEDState *led;
63762c2c2ebSCédric Le Goater 
63863ceb818SCédric Le Goater     /* Bus 3: TODO bmp280@77 */
63963ceb818SCédric Le Goater     /* Bus 3: TODO max31785@52 */
640db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
64115ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca1");
6422616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
6432616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 3),
64415ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
6458c9a61d7SCédric Le Goater 
6467cfbde5eSPhilippe Mathieu-Daudé     for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) {
6477cfbde5eSPhilippe Mathieu-Daudé         led = led_create_simple(OBJECT(bmc),
6487cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].gpio_polarity,
6497cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].color,
6507cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].description);
6517cfbde5eSPhilippe Mathieu-Daudé         qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id,
6527cfbde5eSPhilippe Mathieu-Daudé                               qdev_get_gpio_in(DEVICE(led), 0));
6537cfbde5eSPhilippe Mathieu-Daudé     }
654b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76);
6551373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c);
6561373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c);
65762c2c2ebSCédric Le Goater 
65862c2c2ebSCédric Le Goater     /* The Witherspoon expects a TMP275 but a TMP105 is compatible */
6591373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105,
660044475f3SPhilippe Mathieu-Daudé                      0x4a);
6616c4567c7SCédric Le Goater 
6626c4567c7SCédric Le Goater     /* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
6636c4567c7SCédric Le Goater      * good enough */
6641373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
6653d165f12SCédric Le Goater 
6667a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51,
6673d165f12SCédric Le Goater                           eeprom_buf);
668db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
66915ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca0");
6702616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
6712616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 11),
67215ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
67363ceb818SCédric Le Goater     /* Bus 11: TODO ucd90160@64 */
67462c2c2ebSCédric Le Goater }
67562c2c2ebSCédric Le Goater 
67695f068c8SJohn Wang static void g220a_bmc_i2c_init(AspeedMachineState *bmc)
67795f068c8SJohn Wang {
67895f068c8SJohn Wang     AspeedSoCState *soc = &bmc->soc;
67995f068c8SJohn Wang     DeviceState *dev;
68095f068c8SJohn Wang 
68195f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3),
68295f068c8SJohn Wang                                          "emc1413", 0x4c));
68395f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
68495f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
68595f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
68695f068c8SJohn Wang 
68795f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12),
68895f068c8SJohn Wang                                          "emc1413", 0x4c));
68995f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
69095f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
69195f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
69295f068c8SJohn Wang 
69395f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13),
69495f068c8SJohn Wang                                          "emc1413", 0x4c));
69595f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
69695f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
69795f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
6986f5f6507SJohn Wang 
6996f5f6507SJohn Wang     static uint8_t eeprom_buf[2 * 1024] = {
7006f5f6507SJohn Wang             0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe,
7016f5f6507SJohn Wang             0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65,
7026f5f6507SJohn Wang             0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32,
7036f5f6507SJohn Wang             0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42,
7046f5f6507SJohn Wang             0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45,
7056f5f6507SJohn Wang             0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1,
7066f5f6507SJohn Wang             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7,
7076f5f6507SJohn Wang     };
7086f5f6507SJohn Wang     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57,
7096f5f6507SJohn Wang                           eeprom_buf);
71095f068c8SJohn Wang }
71195f068c8SJohn Wang 
712fa6d98c0SJoel Stanley static void aspeed_eeprom_init(I2CBus *bus, uint8_t addr, uint32_t rsize)
713fa6d98c0SJoel Stanley {
714fa6d98c0SJoel Stanley     I2CSlave *i2c_dev = i2c_slave_new("at24c-eeprom", addr);
715fa6d98c0SJoel Stanley     DeviceState *dev = DEVICE(i2c_dev);
716fa6d98c0SJoel Stanley 
717fa6d98c0SJoel Stanley     qdev_prop_set_uint32(dev, "rom-size", rsize);
718fa6d98c0SJoel Stanley     i2c_slave_realize_and_unref(i2c_dev, bus, &error_abort);
719fa6d98c0SJoel Stanley }
720fa6d98c0SJoel Stanley 
72182b6a3f6SJohn Wang static void fp5280g2_bmc_i2c_init(AspeedMachineState *bmc)
72282b6a3f6SJohn Wang {
72382b6a3f6SJohn Wang     AspeedSoCState *soc = &bmc->soc;
72482b6a3f6SJohn Wang     I2CSlave *i2c_mux;
72582b6a3f6SJohn Wang 
72682b6a3f6SJohn Wang     /* The at24c256 */
72782b6a3f6SJohn Wang     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 1), 0x50, 32768);
72882b6a3f6SJohn Wang 
72982b6a3f6SJohn Wang     /* The fp5280g2 expects a TMP112 but a TMP105 is compatible */
73082b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
73182b6a3f6SJohn Wang                      0x48);
73282b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
73382b6a3f6SJohn Wang                      0x49);
73482b6a3f6SJohn Wang 
73582b6a3f6SJohn Wang     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
73682b6a3f6SJohn Wang                      "pca9546", 0x70);
73782b6a3f6SJohn Wang     /* It expects a TMP112 but a TMP105 is compatible */
73882b6a3f6SJohn Wang     i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0), TYPE_TMP105,
73982b6a3f6SJohn Wang                      0x4a);
74082b6a3f6SJohn Wang 
74182b6a3f6SJohn Wang     /* It expects a ds3232 but a ds1338 is good enough */
74282b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "ds1338", 0x68);
74382b6a3f6SJohn Wang 
74482b6a3f6SJohn Wang     /* It expects a pca9555 but a pca9552 is compatible */
74582b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_PCA9552,
74682b6a3f6SJohn Wang                      0x20);
74782b6a3f6SJohn Wang }
74882b6a3f6SJohn Wang 
74958e52bdbSCédric Le Goater static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
75058e52bdbSCédric Le Goater {
75158e52bdbSCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
752fa6d98c0SJoel Stanley     I2CSlave *i2c_mux;
753fa6d98c0SJoel Stanley 
754fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB);
75558e52bdbSCédric Le Goater 
75658e52bdbSCédric Le Goater     /* The rainier expects a TMP275 but a TMP105 is compatible */
75758e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
75858e52bdbSCédric Le Goater                      0x48);
75958e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
76058e52bdbSCédric Le Goater                      0x49);
76158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
76258e52bdbSCédric Le Goater                      0x4a);
763fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4),
764fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
765fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
766fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
767fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB);
76858e52bdbSCédric Le Goater 
76958e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
77058e52bdbSCédric Le Goater                      0x48);
77158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
77258e52bdbSCédric Le Goater                      0x49);
773fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5),
774fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
775fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
776fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
77758e52bdbSCédric Le Goater 
77858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
77958e52bdbSCédric Le Goater                      0x48);
78058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
78158e52bdbSCédric Le Goater                      0x4a);
78258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
78358e52bdbSCédric Le Goater                      0x4b);
784fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6),
785fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
786fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
787fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
788fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB);
789fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB);
79058e52bdbSCédric Le Goater 
79158e52bdbSCédric Le Goater     /* Bus 7: TODO max31785@52 */
79258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9552", 0x61);
793b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76);
79458e52bdbSCédric Le Goater     /* Bus 7: TODO si7021-a20@20 */
79558e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105,
79658e52bdbSCédric Le Goater                      0x48);
797fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB);
798fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB);
79958e52bdbSCédric Le Goater 
80058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
80158e52bdbSCédric Le Goater                      0x48);
80258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
80358e52bdbSCédric Le Goater                      0x4a);
804fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50, 64 * KiB);
805fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 64 * KiB);
80658e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x61);
80758e52bdbSCédric Le Goater     /* Bus 8: ucd90320@11 */
80858e52bdbSCédric Le Goater     /* Bus 8: ucd90320@b */
80958e52bdbSCédric Le Goater     /* Bus 8: ucd90320@c */
81058e52bdbSCédric Le Goater 
81158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c);
81258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d);
813fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB);
81458e52bdbSCédric Le Goater 
81558e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c);
81658e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d);
817fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB);
81858e52bdbSCédric Le Goater 
81958e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
82058e52bdbSCédric Le Goater                      0x48);
82158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
82258e52bdbSCédric Le Goater                      0x49);
823fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11),
824fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
825fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
826fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
827fa6d98c0SJoel Stanley 
828fa6d98c0SJoel Stanley 
829fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB);
830fa6d98c0SJoel Stanley 
831fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB);
832fa6d98c0SJoel Stanley 
833fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB);
83458e52bdbSCédric Le Goater }
83558e52bdbSCédric Le Goater 
836febbe308SPeter Delevoryas static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr,
837febbe308SPeter Delevoryas                                  I2CBus **channels)
838febbe308SPeter Delevoryas {
839febbe308SPeter Delevoryas     I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr);
840febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
841febbe308SPeter Delevoryas         channels[i] = pca954x_i2c_get_bus(mux, i);
842febbe308SPeter Delevoryas     }
843febbe308SPeter Delevoryas }
844febbe308SPeter Delevoryas 
845febbe308SPeter Delevoryas #define TYPE_LM75 TYPE_TMP105
846febbe308SPeter Delevoryas #define TYPE_TMP75 TYPE_TMP105
847febbe308SPeter Delevoryas #define TYPE_TMP422 "tmp422"
848febbe308SPeter Delevoryas 
849febbe308SPeter Delevoryas static void fuji_bmc_i2c_init(AspeedMachineState *bmc)
850febbe308SPeter Delevoryas {
851febbe308SPeter Delevoryas     AspeedSoCState *soc = &bmc->soc;
852febbe308SPeter Delevoryas     I2CBus *i2c[144] = {};
853febbe308SPeter Delevoryas 
854febbe308SPeter Delevoryas     for (int i = 0; i < 16; i++) {
855febbe308SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
856febbe308SPeter Delevoryas     }
857febbe308SPeter Delevoryas     I2CBus *i2c180 = i2c[2];
858febbe308SPeter Delevoryas     I2CBus *i2c480 = i2c[8];
859febbe308SPeter Delevoryas     I2CBus *i2c600 = i2c[11];
860febbe308SPeter Delevoryas 
861febbe308SPeter Delevoryas     get_pca9548_channels(i2c180, 0x70, &i2c[16]);
862febbe308SPeter Delevoryas     get_pca9548_channels(i2c480, 0x70, &i2c[24]);
863febbe308SPeter Delevoryas     /* NOTE: The device tree skips [32, 40) in the alias numbering */
864febbe308SPeter Delevoryas     get_pca9548_channels(i2c600, 0x77, &i2c[40]);
865febbe308SPeter Delevoryas     get_pca9548_channels(i2c[24], 0x71, &i2c[48]);
866febbe308SPeter Delevoryas     get_pca9548_channels(i2c[25], 0x72, &i2c[56]);
867febbe308SPeter Delevoryas     get_pca9548_channels(i2c[26], 0x76, &i2c[64]);
868febbe308SPeter Delevoryas     get_pca9548_channels(i2c[27], 0x76, &i2c[72]);
869febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
870febbe308SPeter Delevoryas         get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]);
871febbe308SPeter Delevoryas     }
872febbe308SPeter Delevoryas 
873febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c);
874febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d);
875febbe308SPeter Delevoryas 
876febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[19], 0x52, 64 * KiB);
877febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[20], 0x50, 2 * KiB);
878febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[22], 0x52, 2 * KiB);
879febbe308SPeter Delevoryas 
880febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x48);
881febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x49);
882febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x4a);
883febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_TMP422, 0x4c);
884febbe308SPeter Delevoryas 
885febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[8], 0x51, 64 * KiB);
886febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a);
887febbe308SPeter Delevoryas 
888febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[50], TYPE_LM75, 0x4c);
889febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[50], 0x52, 64 * KiB);
890febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[51], TYPE_TMP75, 0x48);
891febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[52], TYPE_TMP75, 0x49);
892febbe308SPeter Delevoryas 
893febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[59], TYPE_TMP75, 0x48);
894febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[60], TYPE_TMP75, 0x49);
895febbe308SPeter Delevoryas 
896febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[65], 0x53, 64 * KiB);
897febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x49);
898febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x48);
899febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[68], 0x52, 64 * KiB);
900febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[69], 0x52, 64 * KiB);
901febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[70], 0x52, 64 * KiB);
902febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[71], 0x52, 64 * KiB);
903febbe308SPeter Delevoryas 
904febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[73], 0x53, 64 * KiB);
905febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x49);
906febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x48);
907febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[76], 0x52, 64 * KiB);
908febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[77], 0x52, 64 * KiB);
909febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[78], 0x52, 64 * KiB);
910febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[79], 0x52, 64 * KiB);
911febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[28], 0x50, 2 * KiB);
912febbe308SPeter Delevoryas 
913febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
914febbe308SPeter Delevoryas         aspeed_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB);
915febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[82 + i * 8], TYPE_TMP75, 0x48);
916febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[83 + i * 8], TYPE_TMP75, 0x4b);
917febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[84 + i * 8], TYPE_TMP75, 0x4a);
918febbe308SPeter Delevoryas     }
919febbe308SPeter Delevoryas }
920febbe308SPeter Delevoryas 
9211a15311aSCédric Le Goater static bool aspeed_get_mmio_exec(Object *obj, Error **errp)
9221a15311aSCédric Le Goater {
9231a15311aSCédric Le Goater     return ASPEED_MACHINE(obj)->mmio_exec;
9241a15311aSCédric Le Goater }
9251a15311aSCédric Le Goater 
9261a15311aSCédric Le Goater static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp)
9271a15311aSCédric Le Goater {
9281a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = value;
9291a15311aSCédric Le Goater }
9301a15311aSCédric Le Goater 
9311a15311aSCédric Le Goater static void aspeed_machine_instance_init(Object *obj)
9321a15311aSCédric Le Goater {
9331a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = false;
9341a15311aSCédric Le Goater }
9351a15311aSCédric Le Goater 
9369820e52fSCédric Le Goater static char *aspeed_get_fmc_model(Object *obj, Error **errp)
9379820e52fSCédric Le Goater {
9389820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
9399820e52fSCédric Le Goater     return g_strdup(bmc->fmc_model);
9409820e52fSCédric Le Goater }
9419820e52fSCédric Le Goater 
9429820e52fSCédric Le Goater static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp)
9439820e52fSCédric Le Goater {
9449820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
9459820e52fSCédric Le Goater 
9469820e52fSCédric Le Goater     g_free(bmc->fmc_model);
9479820e52fSCédric Le Goater     bmc->fmc_model = g_strdup(value);
9489820e52fSCédric Le Goater }
9499820e52fSCédric Le Goater 
9509820e52fSCédric Le Goater static char *aspeed_get_spi_model(Object *obj, Error **errp)
9519820e52fSCédric Le Goater {
9529820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
9539820e52fSCédric Le Goater     return g_strdup(bmc->spi_model);
9549820e52fSCédric Le Goater }
9559820e52fSCédric Le Goater 
9569820e52fSCédric Le Goater static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp)
9579820e52fSCédric Le Goater {
9589820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
9599820e52fSCédric Le Goater 
9609820e52fSCédric Le Goater     g_free(bmc->spi_model);
9619820e52fSCédric Le Goater     bmc->spi_model = g_strdup(value);
9629820e52fSCédric Le Goater }
9639820e52fSCédric Le Goater 
9641a15311aSCédric Le Goater static void aspeed_machine_class_props_init(ObjectClass *oc)
9651a15311aSCédric Le Goater {
9661a15311aSCédric Le Goater     object_class_property_add_bool(oc, "execute-in-place",
9671a15311aSCédric Le Goater                                    aspeed_get_mmio_exec,
968d2623129SMarkus Armbruster                                    aspeed_set_mmio_exec);
9691a15311aSCédric Le Goater     object_class_property_set_description(oc, "execute-in-place",
9707eecec7dSMarkus Armbruster                            "boot directly from CE0 flash device");
9719820e52fSCédric Le Goater 
9729820e52fSCédric Le Goater     object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model,
9739820e52fSCédric Le Goater                                    aspeed_set_fmc_model);
9749820e52fSCédric Le Goater     object_class_property_set_description(oc, "fmc-model",
9759820e52fSCédric Le Goater                                           "Change the FMC Flash model");
9769820e52fSCédric Le Goater     object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model,
9779820e52fSCédric Le Goater                                    aspeed_set_spi_model);
9789820e52fSCédric Le Goater     object_class_property_set_description(oc, "spi-model",
9799820e52fSCédric Le Goater                                           "Change the SPI Flash model");
9801a15311aSCédric Le Goater }
9811a15311aSCédric Le Goater 
982b7f1a0cbSCédric Le Goater static int aspeed_soc_num_cpus(const char *soc_name)
983b7f1a0cbSCédric Le Goater {
984b7f1a0cbSCédric Le Goater    AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(soc_name));
985b7f1a0cbSCédric Le Goater    return sc->num_cpus;
986b7f1a0cbSCédric Le Goater }
987b7f1a0cbSCédric Le Goater 
988fca9ca1bSCédric Le Goater static void aspeed_machine_class_init(ObjectClass *oc, void *data)
98962c2c2ebSCédric Le Goater {
99062c2c2ebSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
991d3bad7e7SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
99262c2c2ebSCédric Le Goater 
993fca9ca1bSCédric Le Goater     mc->init = aspeed_machine_init;
99462c2c2ebSCédric Le Goater     mc->no_floppy = 1;
99562c2c2ebSCédric Le Goater     mc->no_cdrom = 1;
99662c2c2ebSCédric Le Goater     mc->no_parallel = 1;
997afcbaed6SIgor Mammedov     mc->default_ram_id = "ram";
998d3bad7e7SCédric Le Goater     amc->macs_mask = ASPEED_MAC0_ON;
9995d63d0c7SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART5;
10001a15311aSCédric Le Goater 
10011a15311aSCédric Le Goater     aspeed_machine_class_props_init(oc);
100262c2c2ebSCédric Le Goater }
100362c2c2ebSCédric Le Goater 
1004baa4732bSCédric Le Goater static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
1005baa4732bSCédric Le Goater {
1006baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1007baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1008baa4732bSCédric Le Goater 
1009baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Palmetto BMC (ARM926EJ-S)";
1010baa4732bSCédric Le Goater     amc->soc_name  = "ast2400-a1";
1011baa4732bSCédric Le Goater     amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1;
1012baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
1013baa4732bSCédric Le Goater     amc->spi_model = "mx25l25635e";
1014baa4732bSCédric Le Goater     amc->num_cs    = 1;
1015baa4732bSCédric Le Goater     amc->i2c_init  = palmetto_bmc_i2c_init;
1016baa4732bSCédric Le Goater     mc->default_ram_size       = 256 * MiB;
1017b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1018b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1019baa4732bSCédric Le Goater };
1020baa4732bSCédric Le Goater 
10219cccb912SPatrick Venture static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data)
10229cccb912SPatrick Venture {
10239cccb912SPatrick Venture     MachineClass *mc = MACHINE_CLASS(oc);
10249cccb912SPatrick Venture     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
10259cccb912SPatrick Venture 
10269cccb912SPatrick Venture     mc->desc       = "Quanta-Q71l BMC (ARM926EJ-S)";
10279cccb912SPatrick Venture     amc->soc_name  = "ast2400-a1";
10289cccb912SPatrick Venture     amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1;
10299cccb912SPatrick Venture     amc->fmc_model = "n25q256a";
10309cccb912SPatrick Venture     amc->spi_model = "mx25l25635e";
10319cccb912SPatrick Venture     amc->num_cs    = 1;
10329cccb912SPatrick Venture     amc->i2c_init  = quanta_q71l_bmc_i2c_init;
10339cccb912SPatrick Venture     mc->default_ram_size       = 128 * MiB;
10349cccb912SPatrick Venture     mc->default_cpus = mc->min_cpus = mc->max_cpus =
10359cccb912SPatrick Venture         aspeed_soc_num_cpus(amc->soc_name);
10369cccb912SPatrick Venture }
10379cccb912SPatrick Venture 
103840a38df5SErik Smit static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc,
103940a38df5SErik Smit                                                         void *data)
104040a38df5SErik Smit {
104140a38df5SErik Smit     MachineClass *mc = MACHINE_CLASS(oc);
104240a38df5SErik Smit     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
104340a38df5SErik Smit 
104440a38df5SErik Smit     mc->desc       = "Supermicro X11 BMC (ARM926EJ-S)";
104540a38df5SErik Smit     amc->soc_name  = "ast2400-a1";
104640a38df5SErik Smit     amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1;
104740a38df5SErik Smit     amc->fmc_model = "mx25l25635e";
104840a38df5SErik Smit     amc->spi_model = "mx25l25635e";
104940a38df5SErik Smit     amc->num_cs    = 1;
105040a38df5SErik Smit     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
105140a38df5SErik Smit     amc->i2c_init  = palmetto_bmc_i2c_init;
105240a38df5SErik Smit     mc->default_ram_size = 256 * MiB;
105340a38df5SErik Smit }
105440a38df5SErik Smit 
1055baa4732bSCédric Le Goater static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data)
1056baa4732bSCédric Le Goater {
1057baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1058baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1059baa4732bSCédric Le Goater 
1060baa4732bSCédric Le Goater     mc->desc       = "Aspeed AST2500 EVB (ARM1176)";
1061baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1062baa4732bSCédric Le Goater     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
1063baa4732bSCédric Le Goater     amc->fmc_model = "w25q256";
1064baa4732bSCédric Le Goater     amc->spi_model = "mx25l25635e";
1065baa4732bSCédric Le Goater     amc->num_cs    = 1;
1066baa4732bSCédric Le Goater     amc->i2c_init  = ast2500_evb_i2c_init;
1067baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
1068b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1069b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1070baa4732bSCédric Le Goater };
1071baa4732bSCédric Le Goater 
1072baa4732bSCédric Le Goater static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data)
1073baa4732bSCédric Le Goater {
1074baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1075baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1076baa4732bSCédric Le Goater 
1077baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Romulus BMC (ARM1176)";
1078baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1079baa4732bSCédric Le Goater     amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1;
1080baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
1081baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1082baa4732bSCédric Le Goater     amc->num_cs    = 2;
1083baa4732bSCédric Le Goater     amc->i2c_init  = romulus_bmc_i2c_init;
1084baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
1085b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1086b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1087baa4732bSCédric Le Goater };
1088baa4732bSCédric Le Goater 
1089143b040fSPatrick Williams static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data)
1090143b040fSPatrick Williams {
1091143b040fSPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1092143b040fSPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1093143b040fSPatrick Williams 
1094143b040fSPatrick Williams     mc->desc       = "OCP SonoraPass BMC (ARM1176)";
1095143b040fSPatrick Williams     amc->soc_name  = "ast2500-a1";
1096143b040fSPatrick Williams     amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1;
1097143b040fSPatrick Williams     amc->fmc_model = "mx66l1g45g";
1098143b040fSPatrick Williams     amc->spi_model = "mx66l1g45g";
1099143b040fSPatrick Williams     amc->num_cs    = 2;
1100143b040fSPatrick Williams     amc->i2c_init  = sonorapass_bmc_i2c_init;
1101143b040fSPatrick Williams     mc->default_ram_size       = 512 * MiB;
1102b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1103b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1104143b040fSPatrick Williams };
1105143b040fSPatrick Williams 
1106baa4732bSCédric Le Goater static void aspeed_machine_swift_class_init(ObjectClass *oc, void *data)
1107baa4732bSCédric Le Goater {
1108baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1109baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1110baa4732bSCédric Le Goater 
1111baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Swift BMC (ARM1176)";
1112baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1113baa4732bSCédric Le Goater     amc->hw_strap1 = SWIFT_BMC_HW_STRAP1;
1114baa4732bSCédric Le Goater     amc->fmc_model = "mx66l1g45g";
1115baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1116baa4732bSCédric Le Goater     amc->num_cs    = 2;
1117baa4732bSCédric Le Goater     amc->i2c_init  = swift_bmc_i2c_init;
1118baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
1119b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1120b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
112163a9c7e0SCédric Le Goater 
112263a9c7e0SCédric Le Goater     mc->deprecation_reason = "redundant system. Please use a similar "
112363a9c7e0SCédric Le Goater         "OpenPOWER BMC, Witherspoon or Romulus.";
1124baa4732bSCédric Le Goater };
1125baa4732bSCédric Le Goater 
1126baa4732bSCédric Le Goater static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data)
1127baa4732bSCédric Le Goater {
1128baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1129baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1130baa4732bSCédric Le Goater 
1131baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Witherspoon BMC (ARM1176)";
1132baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1133baa4732bSCédric Le Goater     amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1;
1134baa4732bSCédric Le Goater     amc->fmc_model = "mx25l25635e";
1135baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1136baa4732bSCédric Le Goater     amc->num_cs    = 2;
1137baa4732bSCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init;
1138baa4732bSCédric Le Goater     mc->default_ram_size = 512 * MiB;
1139b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1140b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1141baa4732bSCédric Le Goater };
1142baa4732bSCédric Le Goater 
1143baa4732bSCédric Le Goater static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
1144baa4732bSCédric Le Goater {
1145baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1146baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1147baa4732bSCédric Le Goater 
1148f548f201SPeter Maydell     mc->desc       = "Aspeed AST2600 EVB (Cortex-A7)";
1149c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
1150baa4732bSCédric Le Goater     amc->hw_strap1 = AST2600_EVB_HW_STRAP1;
1151baa4732bSCédric Le Goater     amc->hw_strap2 = AST2600_EVB_HW_STRAP2;
1152baa4732bSCédric Le Goater     amc->fmc_model = "w25q512jv";
1153baa4732bSCédric Le Goater     amc->spi_model = "mx66u51235f";
1154baa4732bSCédric Le Goater     amc->num_cs    = 1;
115529193286SGuenter Roeck     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON |
115629193286SGuenter Roeck                      ASPEED_MAC3_ON;
1157baa4732bSCédric Le Goater     amc->i2c_init  = ast2600_evb_i2c_init;
1158baa4732bSCédric Le Goater     mc->default_ram_size = 1 * GiB;
1159b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1160b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1161baa4732bSCédric Le Goater };
1162baa4732bSCédric Le Goater 
116363ceb818SCédric Le Goater static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data)
116463ceb818SCédric Le Goater {
116563ceb818SCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
116663ceb818SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
116763ceb818SCédric Le Goater 
1168f548f201SPeter Maydell     mc->desc       = "OpenPOWER Tacoma BMC (Cortex-A7)";
1169c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
117063ceb818SCédric Le Goater     amc->hw_strap1 = TACOMA_BMC_HW_STRAP1;
117163ceb818SCédric Le Goater     amc->hw_strap2 = TACOMA_BMC_HW_STRAP2;
117263ceb818SCédric Le Goater     amc->fmc_model = "mx66l1g45g";
117363ceb818SCédric Le Goater     amc->spi_model = "mx66l1g45g";
117463ceb818SCédric Le Goater     amc->num_cs    = 2;
1175d3bad7e7SCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON;
117663ceb818SCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init; /* Same board layout */
117763ceb818SCédric Le Goater     mc->default_ram_size = 1 * GiB;
1178b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1179b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
118063ceb818SCédric Le Goater };
118163ceb818SCédric Le Goater 
118295f068c8SJohn Wang static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data)
118395f068c8SJohn Wang {
118495f068c8SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
118595f068c8SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
118695f068c8SJohn Wang 
118795f068c8SJohn Wang     mc->desc       = "Bytedance G220A BMC (ARM1176)";
118895f068c8SJohn Wang     amc->soc_name  = "ast2500-a1";
118995f068c8SJohn Wang     amc->hw_strap1 = G220A_BMC_HW_STRAP1;
119095f068c8SJohn Wang     amc->fmc_model = "n25q512a";
119195f068c8SJohn Wang     amc->spi_model = "mx25l25635e";
119295f068c8SJohn Wang     amc->num_cs    = 2;
11935bb825c8SGuenter Roeck     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
119495f068c8SJohn Wang     amc->i2c_init  = g220a_bmc_i2c_init;
119595f068c8SJohn Wang     mc->default_ram_size = 1024 * MiB;
119695f068c8SJohn Wang     mc->default_cpus = mc->min_cpus = mc->max_cpus =
119795f068c8SJohn Wang         aspeed_soc_num_cpus(amc->soc_name);
119895f068c8SJohn Wang };
119995f068c8SJohn Wang 
120082b6a3f6SJohn Wang static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc, void *data)
120182b6a3f6SJohn Wang {
120282b6a3f6SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
120382b6a3f6SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
120482b6a3f6SJohn Wang 
120582b6a3f6SJohn Wang     mc->desc       = "Inspur FP5280G2 BMC (ARM1176)";
120682b6a3f6SJohn Wang     amc->soc_name  = "ast2500-a1";
120782b6a3f6SJohn Wang     amc->hw_strap1 = FP5280G2_BMC_HW_STRAP1;
120882b6a3f6SJohn Wang     amc->fmc_model = "n25q512a";
120982b6a3f6SJohn Wang     amc->spi_model = "mx25l25635e";
121082b6a3f6SJohn Wang     amc->num_cs    = 2;
121182b6a3f6SJohn Wang     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
121282b6a3f6SJohn Wang     amc->i2c_init  = fp5280g2_bmc_i2c_init;
121382b6a3f6SJohn Wang     mc->default_ram_size = 512 * MiB;
121482b6a3f6SJohn Wang     mc->default_cpus = mc->min_cpus = mc->max_cpus =
121582b6a3f6SJohn Wang         aspeed_soc_num_cpus(amc->soc_name);
121682b6a3f6SJohn Wang };
121782b6a3f6SJohn Wang 
121858e52bdbSCédric Le Goater static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data)
121958e52bdbSCédric Le Goater {
122058e52bdbSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
122158e52bdbSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
122258e52bdbSCédric Le Goater 
1223f548f201SPeter Maydell     mc->desc       = "IBM Rainier BMC (Cortex-A7)";
1224c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
122558e52bdbSCédric Le Goater     amc->hw_strap1 = RAINIER_BMC_HW_STRAP1;
122658e52bdbSCédric Le Goater     amc->hw_strap2 = RAINIER_BMC_HW_STRAP2;
122758e52bdbSCédric Le Goater     amc->fmc_model = "mx66l1g45g";
122858e52bdbSCédric Le Goater     amc->spi_model = "mx66l1g45g";
122958e52bdbSCédric Le Goater     amc->num_cs    = 2;
123058e52bdbSCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
123158e52bdbSCédric Le Goater     amc->i2c_init  = rainier_bmc_i2c_init;
123258e52bdbSCédric Le Goater     mc->default_ram_size = 1 * GiB;
123358e52bdbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
123458e52bdbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
123558e52bdbSCédric Le Goater };
123658e52bdbSCédric Le Goater 
1237febbe308SPeter Delevoryas /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */
1238febbe308SPeter Delevoryas #if HOST_LONG_BITS == 32
1239febbe308SPeter Delevoryas #define FUJI_BMC_RAM_SIZE (1 * GiB)
1240febbe308SPeter Delevoryas #else
1241febbe308SPeter Delevoryas #define FUJI_BMC_RAM_SIZE (2 * GiB)
1242febbe308SPeter Delevoryas #endif
1243febbe308SPeter Delevoryas 
1244febbe308SPeter Delevoryas static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data)
1245febbe308SPeter Delevoryas {
1246febbe308SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1247febbe308SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1248febbe308SPeter Delevoryas 
1249febbe308SPeter Delevoryas     mc->desc = "Facebook Fuji BMC (Cortex-A7)";
1250febbe308SPeter Delevoryas     amc->soc_name = "ast2600-a3";
1251febbe308SPeter Delevoryas     amc->hw_strap1 = FUJI_BMC_HW_STRAP1;
1252febbe308SPeter Delevoryas     amc->hw_strap2 = FUJI_BMC_HW_STRAP2;
1253febbe308SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1254febbe308SPeter Delevoryas     amc->spi_model = "mx66l1g45g";
1255febbe308SPeter Delevoryas     amc->num_cs = 2;
1256febbe308SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1257febbe308SPeter Delevoryas     amc->i2c_init = fuji_bmc_i2c_init;
1258febbe308SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART1;
1259febbe308SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
1260febbe308SPeter Delevoryas     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1261febbe308SPeter Delevoryas         aspeed_soc_num_cpus(amc->soc_name);
1262febbe308SPeter Delevoryas };
1263febbe308SPeter Delevoryas 
1264baa4732bSCédric Le Goater static const TypeInfo aspeed_machine_types[] = {
1265baa4732bSCédric Le Goater     {
1266baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("palmetto-bmc"),
1267baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1268baa4732bSCédric Le Goater         .class_init    = aspeed_machine_palmetto_class_init,
1269baa4732bSCédric Le Goater     }, {
127040a38df5SErik Smit         .name          = MACHINE_TYPE_NAME("supermicrox11-bmc"),
127140a38df5SErik Smit         .parent        = TYPE_ASPEED_MACHINE,
127240a38df5SErik Smit         .class_init    = aspeed_machine_supermicrox11_bmc_class_init,
127340a38df5SErik Smit     }, {
1274baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2500-evb"),
1275baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1276baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2500_evb_class_init,
1277baa4732bSCédric Le Goater     }, {
1278baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("romulus-bmc"),
1279baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1280baa4732bSCédric Le Goater         .class_init    = aspeed_machine_romulus_class_init,
1281baa4732bSCédric Le Goater     }, {
1282baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("swift-bmc"),
1283baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1284baa4732bSCédric Le Goater         .class_init    = aspeed_machine_swift_class_init,
1285baa4732bSCédric Le Goater     }, {
1286143b040fSPatrick Williams         .name          = MACHINE_TYPE_NAME("sonorapass-bmc"),
1287143b040fSPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1288143b040fSPatrick Williams         .class_init    = aspeed_machine_sonorapass_class_init,
1289143b040fSPatrick Williams     }, {
1290baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("witherspoon-bmc"),
1291baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1292baa4732bSCédric Le Goater         .class_init    = aspeed_machine_witherspoon_class_init,
1293baa4732bSCédric Le Goater     }, {
1294baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2600-evb"),
1295baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1296baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2600_evb_class_init,
1297baa4732bSCédric Le Goater     }, {
129863ceb818SCédric Le Goater         .name          = MACHINE_TYPE_NAME("tacoma-bmc"),
129963ceb818SCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
130063ceb818SCédric Le Goater         .class_init    = aspeed_machine_tacoma_class_init,
130163ceb818SCédric Le Goater     }, {
130295f068c8SJohn Wang         .name          = MACHINE_TYPE_NAME("g220a-bmc"),
130395f068c8SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
130495f068c8SJohn Wang         .class_init    = aspeed_machine_g220a_class_init,
130595f068c8SJohn Wang     }, {
130682b6a3f6SJohn Wang         .name          = MACHINE_TYPE_NAME("fp5280g2-bmc"),
130782b6a3f6SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
130882b6a3f6SJohn Wang         .class_init    = aspeed_machine_fp5280g2_class_init,
130982b6a3f6SJohn Wang     }, {
13109cccb912SPatrick Venture         .name          = MACHINE_TYPE_NAME("quanta-q71l-bmc"),
13119cccb912SPatrick Venture         .parent        = TYPE_ASPEED_MACHINE,
13129cccb912SPatrick Venture         .class_init    = aspeed_machine_quanta_q71l_class_init,
13139cccb912SPatrick Venture     }, {
131458e52bdbSCédric Le Goater         .name          = MACHINE_TYPE_NAME("rainier-bmc"),
131558e52bdbSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
131658e52bdbSCédric Le Goater         .class_init    = aspeed_machine_rainier_class_init,
131758e52bdbSCédric Le Goater     }, {
1318febbe308SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fuji-bmc"),
1319febbe308SPeter Delevoryas         .parent        = TYPE_ASPEED_MACHINE,
1320febbe308SPeter Delevoryas         .class_init    = aspeed_machine_fuji_class_init,
1321febbe308SPeter Delevoryas     }, {
1322fca9ca1bSCédric Le Goater         .name          = TYPE_ASPEED_MACHINE,
132362c2c2ebSCédric Le Goater         .parent        = TYPE_MACHINE,
1324888b2b03SPhilippe Mathieu-Daudé         .instance_size = sizeof(AspeedMachineState),
13251a15311aSCédric Le Goater         .instance_init = aspeed_machine_instance_init,
1326fca9ca1bSCédric Le Goater         .class_size    = sizeof(AspeedMachineClass),
1327fca9ca1bSCédric Le Goater         .class_init    = aspeed_machine_class_init,
1328baa4732bSCédric Le Goater         .abstract      = true,
1329baa4732bSCédric Le Goater     }
1330fca9ca1bSCédric Le Goater };
133174fb1f38SCédric Le Goater 
1332baa4732bSCédric Le Goater DEFINE_TYPES(aspeed_machine_types)
1333