xref: /qemu/hw/arm/aspeed.c (revision 5bb825c8359e69652f7f9fce40a58499093b2d26)
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 
13462c2c2ebSCédric Le Goater /* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */
13562c2c2ebSCédric Le Goater #define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1
13662c2c2ebSCédric Le Goater 
1379cccb912SPatrick Venture /* Quanta-Q71l hardware value */
1389cccb912SPatrick Venture #define QUANTA_Q71L_BMC_HW_STRAP1 (                                     \
1399cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) |               \
1409cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2/* DDR3 with CL=6, CWL=5 */) | \
1419cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
1429cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_24M_IN) |       \
1439cccb912SPatrick Venture         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
1449cccb912SPatrick Venture         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_PASS_THROUGH) |          \
1459cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
1469cccb912SPatrick Venture         SCU_HW_STRAP_SPI_WIDTH |                                        \
1479cccb912SPatrick Venture         SCU_HW_STRAP_VGA_SIZE_SET(VGA_8M_DRAM) |                        \
1489cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
1499cccb912SPatrick Venture 
150ccc2c418SCédric Le Goater /* AST2600 evb hardware value */
151ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP1 0x000000C0
152ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP2 0x00000003
153ccc2c418SCédric Le Goater 
15463ceb818SCédric Le Goater /* Tacoma hardware value */
15563ceb818SCédric Le Goater #define TACOMA_BMC_HW_STRAP1  0x00000000
1567582591aSJoel Stanley #define TACOMA_BMC_HW_STRAP2  0x00000040
15763ceb818SCédric Le Goater 
15858e52bdbSCédric Le Goater /* Rainier hardware value: (QEMU prototype) */
15958e52bdbSCédric Le Goater #define RAINIER_BMC_HW_STRAP1 0x00000000
16058e52bdbSCédric Le Goater #define RAINIER_BMC_HW_STRAP2 0x00000000
16158e52bdbSCédric Le Goater 
162ebe31c0aSCédric Le Goater /*
163ebe31c0aSCédric Le Goater  * The max ram region is for firmwares that scan the address space
164ebe31c0aSCédric Le Goater  * with load/store to guess how much RAM the SoC has.
165ebe31c0aSCédric Le Goater  */
166ebe31c0aSCédric Le Goater static uint64_t max_ram_read(void *opaque, hwaddr offset, unsigned size)
167ebe31c0aSCédric Le Goater {
168ebe31c0aSCédric Le Goater     return 0;
169ebe31c0aSCédric Le Goater }
170ebe31c0aSCédric Le Goater 
171ebe31c0aSCédric Le Goater static void max_ram_write(void *opaque, hwaddr offset, uint64_t value,
172ebe31c0aSCédric Le Goater                            unsigned size)
173ebe31c0aSCédric Le Goater {
174ebe31c0aSCédric Le Goater     /* Discard writes */
175ebe31c0aSCédric Le Goater }
176ebe31c0aSCédric Le Goater 
177ebe31c0aSCédric Le Goater static const MemoryRegionOps max_ram_ops = {
178ebe31c0aSCédric Le Goater     .read = max_ram_read,
179ebe31c0aSCédric Le Goater     .write = max_ram_write,
180ebe31c0aSCédric Le Goater     .endianness = DEVICE_NATIVE_ENDIAN,
181ebe31c0aSCédric Le Goater };
182ebe31c0aSCédric Le Goater 
1839bb6d140SJoel Stanley #define AST_SMP_MAILBOX_BASE            0x1e6e2180
1849bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_ENTRY        (AST_SMP_MAILBOX_BASE + 0x0)
1859bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_GOSIGN       (AST_SMP_MAILBOX_BASE + 0x4)
1869bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_READY        (AST_SMP_MAILBOX_BASE + 0x8)
1879bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_POLLINSN     (AST_SMP_MAILBOX_BASE + 0xc)
1889bb6d140SJoel Stanley #define AST_SMP_MBOX_CODE               (AST_SMP_MAILBOX_BASE + 0x10)
1899bb6d140SJoel Stanley #define AST_SMP_MBOX_GOSIGN             0xabbaab00
1909bb6d140SJoel Stanley 
1919bb6d140SJoel Stanley static void aspeed_write_smpboot(ARMCPU *cpu,
1929bb6d140SJoel Stanley                                  const struct arm_boot_info *info)
1939bb6d140SJoel Stanley {
1949bb6d140SJoel Stanley     static const uint32_t poll_mailbox_ready[] = {
1959bb6d140SJoel Stanley         /*
1969bb6d140SJoel Stanley          * r2 = per-cpu go sign value
1979bb6d140SJoel Stanley          * r1 = AST_SMP_MBOX_FIELD_ENTRY
1989bb6d140SJoel Stanley          * r0 = AST_SMP_MBOX_FIELD_GOSIGN
1999bb6d140SJoel Stanley          */
2009bb6d140SJoel Stanley         0xee100fb0,  /* mrc     p15, 0, r0, c0, c0, 5 */
2019bb6d140SJoel Stanley         0xe21000ff,  /* ands    r0, r0, #255          */
2029bb6d140SJoel Stanley         0xe59f201c,  /* ldr     r2, [pc, #28]         */
2039bb6d140SJoel Stanley         0xe1822000,  /* orr     r2, r2, r0            */
2049bb6d140SJoel Stanley 
2059bb6d140SJoel Stanley         0xe59f1018,  /* ldr     r1, [pc, #24]         */
2069bb6d140SJoel Stanley         0xe59f0018,  /* ldr     r0, [pc, #24]         */
2079bb6d140SJoel Stanley 
2089bb6d140SJoel Stanley         0xe320f002,  /* wfe                           */
2099bb6d140SJoel Stanley         0xe5904000,  /* ldr     r4, [r0]              */
2109bb6d140SJoel Stanley         0xe1520004,  /* cmp     r2, r4                */
2119bb6d140SJoel Stanley         0x1afffffb,  /* bne     <wfe>                 */
2129bb6d140SJoel Stanley         0xe591f000,  /* ldr     pc, [r1]              */
2139bb6d140SJoel Stanley         AST_SMP_MBOX_GOSIGN,
2149bb6d140SJoel Stanley         AST_SMP_MBOX_FIELD_ENTRY,
2159bb6d140SJoel Stanley         AST_SMP_MBOX_FIELD_GOSIGN,
2169bb6d140SJoel Stanley     };
2179bb6d140SJoel Stanley 
2189bb6d140SJoel Stanley     rom_add_blob_fixed("aspeed.smpboot", poll_mailbox_ready,
2199bb6d140SJoel Stanley                        sizeof(poll_mailbox_ready),
2209bb6d140SJoel Stanley                        info->smp_loader_start);
2219bb6d140SJoel Stanley }
2229bb6d140SJoel Stanley 
2239bb6d140SJoel Stanley static void aspeed_reset_secondary(ARMCPU *cpu,
2249bb6d140SJoel Stanley                                    const struct arm_boot_info *info)
2259bb6d140SJoel Stanley {
2269bb6d140SJoel Stanley     AddressSpace *as = arm_boot_address_space(cpu, info);
2279bb6d140SJoel Stanley     CPUState *cs = CPU(cpu);
2289bb6d140SJoel Stanley 
2299bb6d140SJoel Stanley     /* info->smp_bootreg_addr */
2309bb6d140SJoel Stanley     address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0,
2319bb6d140SJoel Stanley                                MEMTXATTRS_UNSPECIFIED, NULL);
2329bb6d140SJoel Stanley     cpu_set_pc(cs, info->smp_loader_start);
2339bb6d140SJoel Stanley }
2349bb6d140SJoel Stanley 
235d769a1daSCédric Le Goater #define FIRMWARE_ADDR 0x0
236d769a1daSCédric Le Goater 
237d769a1daSCédric Le Goater static void write_boot_rom(DriveInfo *dinfo, hwaddr addr, size_t rom_size,
238d769a1daSCédric Le Goater                            Error **errp)
239d769a1daSCédric Le Goater {
240d769a1daSCédric Le Goater     BlockBackend *blk = blk_by_legacy_dinfo(dinfo);
241d769a1daSCédric Le Goater     uint8_t *storage;
2420c7209beSCédric Le Goater     int64_t size;
243d769a1daSCédric Le Goater 
2440c7209beSCédric Le Goater     /* The block backend size should have already been 'validated' by
2450c7209beSCédric Le Goater      * the creation of the m25p80 object.
2460c7209beSCédric Le Goater      */
2470c7209beSCédric Le Goater     size = blk_getlength(blk);
2480c7209beSCédric Le Goater     if (size <= 0) {
2490c7209beSCédric Le Goater         error_setg(errp, "failed to get flash size");
2500c7209beSCédric Le Goater         return;
2510c7209beSCédric Le Goater     }
2520c7209beSCédric Le Goater 
2530c7209beSCédric Le Goater     if (rom_size > size) {
2540c7209beSCédric Le Goater         rom_size = size;
255d769a1daSCédric Le Goater     }
256d769a1daSCédric Le Goater 
257d769a1daSCédric Le Goater     storage = g_new0(uint8_t, rom_size);
258d769a1daSCédric Le Goater     if (blk_pread(blk, 0, storage, rom_size) < 0) {
259d769a1daSCédric Le Goater         error_setg(errp, "failed to read the initial flash content");
260d769a1daSCédric Le Goater         return;
261d769a1daSCédric Le Goater     }
262d769a1daSCédric Le Goater 
263d769a1daSCédric Le Goater     rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr);
264d769a1daSCédric Le Goater     g_free(storage);
265d769a1daSCédric Le Goater }
266d769a1daSCédric Le Goater 
267c20b4cccSMarkus Armbruster static void aspeed_board_init_flashes(AspeedSMCState *s,
268c20b4cccSMarkus Armbruster                                       const char *flashtype)
269e1ad9bc4SCédric Le Goater {
270e1ad9bc4SCédric Le Goater     int i ;
271e1ad9bc4SCédric Le Goater 
272e1ad9bc4SCédric Le Goater     for (i = 0; i < s->num_cs; ++i) {
273e1ad9bc4SCédric Le Goater         AspeedSMCFlash *fl = &s->flashes[i];
274e1ad9bc4SCédric Le Goater         DriveInfo *dinfo = drive_get_next(IF_MTD);
275e1ad9bc4SCédric Le Goater         qemu_irq cs_line;
276e1ad9bc4SCédric Le Goater 
27757d479c9SMarkus Armbruster         fl->flash = qdev_new(flashtype);
278e1ad9bc4SCédric Le Goater         if (dinfo) {
279c20b4cccSMarkus Armbruster             qdev_prop_set_drive(fl->flash, "drive",
280c20b4cccSMarkus Armbruster                                 blk_by_legacy_dinfo(dinfo));
281e1ad9bc4SCédric Le Goater         }
28257d479c9SMarkus Armbruster         qdev_realize_and_unref(fl->flash, BUS(s->spi), &error_fatal);
283e1ad9bc4SCédric Le Goater 
284e1ad9bc4SCédric Le Goater         cs_line = qdev_get_gpio_in_named(fl->flash, SSI_GPIO_CS, 0);
285e1ad9bc4SCédric Le Goater         sysbus_connect_irq(SYS_BUS_DEVICE(s), i + 1, cs_line);
286e1ad9bc4SCédric Le Goater     }
287e1ad9bc4SCédric Le Goater }
288e1ad9bc4SCédric Le Goater 
289a29e3e12SAndrew Jeffery static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo)
290a29e3e12SAndrew Jeffery {
291a29e3e12SAndrew Jeffery         DeviceState *card;
292a29e3e12SAndrew Jeffery 
293756f739bSPhilippe Mathieu-Daudé         if (!dinfo) {
294756f739bSPhilippe Mathieu-Daudé             return;
295756f739bSPhilippe Mathieu-Daudé         }
2963e80f690SMarkus Armbruster         card = qdev_new(TYPE_SD_CARD);
297934df912SMarkus Armbruster         qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
298a29e3e12SAndrew Jeffery                                 &error_fatal);
2993e80f690SMarkus Armbruster         qdev_realize_and_unref(card,
3003e80f690SMarkus Armbruster                                qdev_get_child_bus(DEVICE(sdhci), "sd-bus"),
3013e80f690SMarkus Armbruster                                &error_fatal);
302a29e3e12SAndrew Jeffery }
303a29e3e12SAndrew Jeffery 
304baa4732bSCédric Le Goater static void aspeed_machine_init(MachineState *machine)
305327d8e4eSAndrew Jeffery {
306888b2b03SPhilippe Mathieu-Daudé     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
307baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
308b033271fSCédric Le Goater     AspeedSoCClass *sc;
309d769a1daSCédric Le Goater     DriveInfo *drive0 = drive_get(IF_MTD, 0, 0);
310ebe31c0aSCédric Le Goater     ram_addr_t max_ram_size;
3112bea128cSEddie James     int i;
312d3bad7e7SCédric Le Goater     NICInfo *nd = &nd_table[0];
313327d8e4eSAndrew Jeffery 
314ad1a9782SCédric Le Goater     memory_region_init(&bmc->ram_container, NULL, "aspeed-ram-container",
3157df9f028SPhilippe Mathieu-Daudé                        4 * GiB);
316afcbaed6SIgor Mammedov     memory_region_add_subregion(&bmc->ram_container, 0, machine->ram);
317ad1a9782SCédric Le Goater 
3189fc7fc4dSMarkus Armbruster     object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
319327d8e4eSAndrew Jeffery 
320b033271fSCédric Le Goater     sc = ASPEED_SOC_GET_CLASS(&bmc->soc);
321b033271fSCédric Le Goater 
322533eb415SIgor Mammedov     /*
323533eb415SIgor Mammedov      * This will error out if isize is not supported by memory controller.
324533eb415SIgor Mammedov      */
3256e504a98SPaolo Bonzini     object_property_set_uint(OBJECT(&bmc->soc), "ram-size", machine->ram_size,
326533eb415SIgor Mammedov                              &error_fatal);
327533eb415SIgor Mammedov 
328d3bad7e7SCédric Le Goater     for (i = 0; i < sc->macs_num; i++) {
329d3bad7e7SCédric Le Goater         if ((amc->macs_mask & (1 << i)) && nd->used) {
330d3bad7e7SCédric Le Goater             qemu_check_nic_model(nd, TYPE_FTGMAC100);
331d3bad7e7SCédric Le Goater             qdev_set_nic_properties(DEVICE(&bmc->soc.ftgmac100[i]), nd);
332d3bad7e7SCédric Le Goater             nd++;
333d3bad7e7SCédric Le Goater         }
334d3bad7e7SCédric Le Goater     }
335d3bad7e7SCédric Le Goater 
3365325cc34SMarkus Armbruster     object_property_set_int(OBJECT(&bmc->soc), "hw-strap1", amc->hw_strap1,
33787e79af0SAndrew Jeffery                             &error_abort);
3385325cc34SMarkus Armbruster     object_property_set_int(OBJECT(&bmc->soc), "hw-strap2", amc->hw_strap2,
339ccc2c418SCédric Le Goater                             &error_abort);
3405325cc34SMarkus Armbruster     object_property_set_int(OBJECT(&bmc->soc), "num-cs", amc->num_cs,
34126d5df95SCédric Le Goater                             &error_abort);
3425325cc34SMarkus Armbruster     object_property_set_link(OBJECT(&bmc->soc), "dram",
3430df2d9a6SCédric Le Goater                              OBJECT(machine->ram), &error_abort);
344b6e70d1dSJoel Stanley     if (machine->kernel_filename) {
345b6e70d1dSJoel Stanley         /*
346b6e70d1dSJoel Stanley          * When booting with a -kernel command line there is no u-boot
347b6e70d1dSJoel Stanley          * that runs to unlock the SCU. In this case set the default to
348b6e70d1dSJoel Stanley          * be unlocked as the kernel expects
349b6e70d1dSJoel Stanley          */
3505325cc34SMarkus Armbruster         object_property_set_int(OBJECT(&bmc->soc), "hw-prot-key",
3515325cc34SMarkus Armbruster                                 ASPEED_SCU_PROT_KEY, &error_abort);
352b6e70d1dSJoel Stanley     }
353ce189ab2SMarkus Armbruster     qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
354327d8e4eSAndrew Jeffery 
355d783d1feSCédric Le Goater     memory_region_add_subregion(get_system_memory(),
356347df6f8SEduardo Habkost                                 sc->memmap[ASPEED_DEV_SDRAM],
357ad1a9782SCédric Le Goater                                 &bmc->ram_container);
358de46f5f4SCédric Le Goater 
359ebe31c0aSCédric Le Goater     max_ram_size = object_property_get_uint(OBJECT(&bmc->soc), "max-ram-size",
360ebe31c0aSCédric Le Goater                                             &error_abort);
361ebe31c0aSCédric Le Goater     memory_region_init_io(&bmc->max_ram, NULL, &max_ram_ops, NULL,
3626e504a98SPaolo Bonzini                           "max_ram", max_ram_size  - machine->ram_size);
3636e504a98SPaolo Bonzini     memory_region_add_subregion(&bmc->ram_container, machine->ram_size, &bmc->max_ram);
364ebe31c0aSCédric Le Goater 
3659820e52fSCédric Le Goater     aspeed_board_init_flashes(&bmc->soc.fmc, bmc->fmc_model ?
3669820e52fSCédric Le Goater                               bmc->fmc_model : amc->fmc_model);
3679820e52fSCédric Le Goater     aspeed_board_init_flashes(&bmc->soc.spi[0], bmc->spi_model ?
3689820e52fSCédric Le Goater                               bmc->spi_model : amc->spi_model);
369e1ad9bc4SCédric Le Goater 
370d769a1daSCédric Le Goater     /* Install first FMC flash content as a boot rom. */
371d769a1daSCédric Le Goater     if (drive0) {
372d769a1daSCédric Le Goater         AspeedSMCFlash *fl = &bmc->soc.fmc.flashes[0];
373d769a1daSCédric Le Goater         MemoryRegion *boot_rom = g_new(MemoryRegion, 1);
374d769a1daSCédric Le Goater 
375d769a1daSCédric Le Goater         /*
376d769a1daSCédric Le Goater          * create a ROM region using the default mapping window size of
37793bf276dSCédric Le Goater          * the flash module. The window size is 64MB for the AST2400
37893bf276dSCédric Le Goater          * SoC and 128MB for the AST2500 SoC, which is twice as big as
37993bf276dSCédric Le Goater          * needed by the flash modules of the Aspeed machines.
380d769a1daSCédric Le Goater          */
3811a15311aSCédric Le Goater         if (ASPEED_MACHINE(machine)->mmio_exec) {
382f489960dSPhilippe Mathieu-Daudé             memory_region_init_alias(boot_rom, NULL, "aspeed.boot_rom",
3831a15311aSCédric Le Goater                                      &fl->mmio, 0, fl->size);
3841a15311aSCédric Le Goater             memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
3851a15311aSCédric Le Goater                                         boot_rom);
3861a15311aSCédric Le Goater         } else {
387f489960dSPhilippe Mathieu-Daudé             memory_region_init_rom(boot_rom, NULL, "aspeed.boot_rom",
388d769a1daSCédric Le Goater                                    fl->size, &error_abort);
389d769a1daSCédric Le Goater             memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
390d769a1daSCédric Le Goater                                         boot_rom);
391d769a1daSCédric Le Goater             write_boot_rom(drive0, FIRMWARE_ADDR, fl->size, &error_abort);
392d769a1daSCédric Le Goater         }
3931a15311aSCédric Le Goater     }
394d769a1daSCédric Le Goater 
395b7f1a0cbSCédric Le Goater     if (machine->kernel_filename && sc->num_cpus > 1) {
3969bb6d140SJoel Stanley         /* With no u-boot we must set up a boot stub for the secondary CPU */
3979bb6d140SJoel Stanley         MemoryRegion *smpboot = g_new(MemoryRegion, 1);
398f489960dSPhilippe Mathieu-Daudé         memory_region_init_ram(smpboot, NULL, "aspeed.smpboot",
3999bb6d140SJoel Stanley                                0x80, &error_abort);
4009bb6d140SJoel Stanley         memory_region_add_subregion(get_system_memory(),
4019bb6d140SJoel Stanley                                     AST_SMP_MAILBOX_BASE, smpboot);
4029bb6d140SJoel Stanley 
4039bb6d140SJoel Stanley         aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot;
4049bb6d140SJoel Stanley         aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary;
4059bb6d140SJoel Stanley         aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE;
4069bb6d140SJoel Stanley     }
4079bb6d140SJoel Stanley 
4086e504a98SPaolo Bonzini     aspeed_board_binfo.ram_size = machine->ram_size;
409347df6f8SEduardo Habkost     aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM];
410b7f1a0cbSCédric Le Goater     aspeed_board_binfo.nb_cpus = sc->num_cpus;
411b033271fSCédric Le Goater 
412baa4732bSCédric Le Goater     if (amc->i2c_init) {
413baa4732bSCédric Le Goater         amc->i2c_init(bmc);
4142cf6cb50SCédric Le Goater     }
4152cf6cb50SCédric Le Goater 
4160e2c24c6SAndrew Jeffery     for (i = 0; i < bmc->soc.sdhci.num_slots; i++) {
417a29e3e12SAndrew Jeffery         sdhci_attach_drive(&bmc->soc.sdhci.slots[i], drive_get_next(IF_SD));
418a29e3e12SAndrew Jeffery     }
4192bea128cSEddie James 
420a29e3e12SAndrew Jeffery     if (bmc->soc.emmc.num_slots) {
421a29e3e12SAndrew Jeffery         sdhci_attach_drive(&bmc->soc.emmc.slots[0], drive_get_next(IF_SD));
4222bea128cSEddie James     }
4232bea128cSEddie James 
4242744ece8STao Xu     arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo);
425327d8e4eSAndrew Jeffery }
426327d8e4eSAndrew Jeffery 
427612b219aSPhilippe Mathieu-Daudé static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
4282cf6cb50SCédric Le Goater {
4292cf6cb50SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
430a87e81b9SCédric Le Goater     DeviceState *dev;
4313d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
4322cf6cb50SCédric Le Goater 
4332cf6cb50SCédric Le Goater     /* The palmetto platform expects a ds3231 RTC but a ds1338 is
4342cf6cb50SCédric Le Goater      * enough to provide basic RTC features. Alarms will be missing */
4351373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
436a87e81b9SCédric Le Goater 
4377a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
4383d165f12SCédric Le Goater                           eeprom_buf);
4393d165f12SCédric Le Goater 
440a87e81b9SCédric Le Goater     /* add a TMP423 temperature sensor */
4411373b15bSPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
4421373b15bSPhilippe Mathieu-Daudé                                          "tmp423", 0x4c));
4435325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
4445325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
4455325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
4465325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort);
4472cf6cb50SCédric Le Goater }
4482cf6cb50SCédric Le Goater 
4499cccb912SPatrick Venture static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc)
4509cccb912SPatrick Venture {
4519cccb912SPatrick Venture     AspeedSoCState *soc = &bmc->soc;
4529cccb912SPatrick Venture 
4539cccb912SPatrick Venture     /*
4549cccb912SPatrick Venture      * The quanta-q71l platform expects tmp75s which are compatible with
4559cccb912SPatrick Venture      * tmp105s.
4569cccb912SPatrick Venture      */
4579cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c);
4589cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e);
4599cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f);
4609cccb912SPatrick Venture 
4619cccb912SPatrick Venture     /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */
4629cccb912SPatrick Venture     /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */
4639cccb912SPatrick Venture     /* TODO: Add Memory Riser i2c mux and eeproms. */
4649cccb912SPatrick Venture 
4653ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74);
4663ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77);
4673ec75e39SPatrick Venture 
4689cccb912SPatrick Venture     /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */
4693ec75e39SPatrick Venture 
4703ec75e39SPatrick Venture     /* i2c-7 */
4713ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70);
4729cccb912SPatrick Venture     /*        - i2c@0: pmbus@59 */
4739cccb912SPatrick Venture     /*        - i2c@1: pmbus@58 */
4749cccb912SPatrick Venture     /*        - i2c@2: pmbus@58 */
4759cccb912SPatrick Venture     /*        - i2c@3: pmbus@59 */
4763ec75e39SPatrick Venture 
4779cccb912SPatrick Venture     /* TODO: i2c-7: Add PDB FRU eeprom@52 */
4789cccb912SPatrick Venture     /* TODO: i2c-8: Add BMC FRU eeprom@50 */
4799cccb912SPatrick Venture }
4809cccb912SPatrick Venture 
481612b219aSPhilippe Mathieu-Daudé static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
4822cf6cb50SCédric Le Goater {
4832cf6cb50SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
4843d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
4853d165f12SCédric Le Goater 
4867a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50,
4873d165f12SCédric Le Goater                           eeprom_buf);
4882cf6cb50SCédric Le Goater 
4892cf6cb50SCédric Le Goater     /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
4901373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
491044475f3SPhilippe Mathieu-Daudé                      TYPE_TMP105, 0x4d);
4926c4567c7SCédric Le Goater 
4936c4567c7SCédric Le Goater     /* The AST2500 EVB does not have an RTC. Let's pretend that one is
4946c4567c7SCédric Le Goater      * plugged on the I2C bus header */
4951373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
4962cf6cb50SCédric Le Goater }
4972cf6cb50SCédric Le Goater 
498612b219aSPhilippe Mathieu-Daudé static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
499ccc2c418SCédric Le Goater {
500ccc2c418SCédric Le Goater     /* Start with some devices on our I2C busses */
501ccc2c418SCédric Le Goater     ast2500_evb_i2c_init(bmc);
502ccc2c418SCédric Le Goater }
503ccc2c418SCédric Le Goater 
504612b219aSPhilippe Mathieu-Daudé static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
5056c4567c7SCédric Le Goater {
5066c4567c7SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
5076c4567c7SCédric Le Goater 
5086c4567c7SCédric Le Goater     /* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
5096c4567c7SCédric Le Goater      * good enough */
5101373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
5116c4567c7SCédric Le Goater }
5126c4567c7SCédric Le Goater 
513612b219aSPhilippe Mathieu-Daudé static void swift_bmc_i2c_init(AspeedMachineState *bmc)
514aae7a18dSAdriana Kobylak {
515aae7a18dSAdriana Kobylak     AspeedSoCState *soc = &bmc->soc;
516aae7a18dSAdriana Kobylak 
5171373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "pca9552", 0x60);
518aae7a18dSAdriana Kobylak 
519aae7a18dSAdriana Kobylak     /* The swift board expects a TMP275 but a TMP105 is compatible */
5201373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "tmp105", 0x48);
521aae7a18dSAdriana Kobylak     /* The swift board expects a pca9551 but a pca9552 is compatible */
5221373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9552", 0x60);
523aae7a18dSAdriana Kobylak 
524aae7a18dSAdriana Kobylak     /* The swift board expects an Epson RX8900 RTC but a ds1338 is compatible */
5251373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "ds1338", 0x32);
5261373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x60);
527aae7a18dSAdriana Kobylak 
5281373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c);
529aae7a18dSAdriana Kobylak     /* The swift board expects a pca9539 but a pca9552 is compatible */
5301373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "pca9552", 0x74);
531aae7a18dSAdriana Kobylak 
5321373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c);
533aae7a18dSAdriana Kobylak     /* The swift board expects a pca9539 but a pca9552 is compatible */
5341373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "pca9552",
535aae7a18dSAdriana Kobylak                      0x74);
536aae7a18dSAdriana Kobylak 
537aae7a18dSAdriana Kobylak     /* The swift board expects a TMP275 but a TMP105 is compatible */
5381373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12), "tmp105", 0x48);
5391373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12), "tmp105", 0x4a);
540aae7a18dSAdriana Kobylak }
541aae7a18dSAdriana Kobylak 
542612b219aSPhilippe Mathieu-Daudé static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc)
543143b040fSPatrick Williams {
544143b040fSPatrick Williams     AspeedSoCState *soc = &bmc->soc;
545143b040fSPatrick Williams 
546143b040fSPatrick Williams     /* bus 2 : */
5471373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48);
5481373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49);
549143b040fSPatrick Williams     /* bus 2 : pca9546 @ 0x73 */
550143b040fSPatrick Williams 
551143b040fSPatrick Williams     /* bus 3 : pca9548 @ 0x70 */
552143b040fSPatrick Williams 
553143b040fSPatrick Williams     /* bus 4 : */
554143b040fSPatrick Williams     uint8_t *eeprom4_54 = g_malloc0(8 * 1024);
5557a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54,
556143b040fSPatrick Williams                           eeprom4_54);
557143b040fSPatrick Williams     /* PCA9539 @ 0x76, but PCA9552 is compatible */
5581373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "pca9552", 0x76);
559143b040fSPatrick Williams     /* PCA9539 @ 0x77, but PCA9552 is compatible */
5601373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "pca9552", 0x77);
561143b040fSPatrick Williams 
562143b040fSPatrick Williams     /* bus 6 : */
5631373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48);
5641373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49);
565143b040fSPatrick Williams     /* bus 6 : pca9546 @ 0x73 */
566143b040fSPatrick Williams 
567143b040fSPatrick Williams     /* bus 8 : */
568143b040fSPatrick Williams     uint8_t *eeprom8_56 = g_malloc0(8 * 1024);
5697a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56,
570143b040fSPatrick Williams                           eeprom8_56);
5711373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x60);
5721373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x61);
573143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1d */
574143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1f */
575143b040fSPatrick Williams 
576143b040fSPatrick Williams     /*
577143b040fSPatrick Williams      * bus 13 : pca9548 @ 0x71
578143b040fSPatrick Williams      *      - channel 3:
579143b040fSPatrick Williams      *          - tmm421 @ 0x4c
580143b040fSPatrick Williams      *          - tmp421 @ 0x4e
581143b040fSPatrick Williams      *          - tmp421 @ 0x4f
582143b040fSPatrick Williams      */
583143b040fSPatrick Williams 
584143b040fSPatrick Williams }
585143b040fSPatrick Williams 
586612b219aSPhilippe Mathieu-Daudé static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
58762c2c2ebSCédric Le Goater {
5887cfbde5eSPhilippe Mathieu-Daudé     static const struct {
5897cfbde5eSPhilippe Mathieu-Daudé         unsigned gpio_id;
5907cfbde5eSPhilippe Mathieu-Daudé         LEDColor color;
5917cfbde5eSPhilippe Mathieu-Daudé         const char *description;
5927cfbde5eSPhilippe Mathieu-Daudé         bool gpio_polarity;
5937cfbde5eSPhilippe Mathieu-Daudé     } pca1_leds[] = {
5947cfbde5eSPhilippe Mathieu-Daudé         {13, LED_COLOR_GREEN, "front-fault-4",  GPIO_POLARITY_ACTIVE_LOW},
5957cfbde5eSPhilippe Mathieu-Daudé         {14, LED_COLOR_GREEN, "front-power-3",  GPIO_POLARITY_ACTIVE_LOW},
5967cfbde5eSPhilippe Mathieu-Daudé         {15, LED_COLOR_GREEN, "front-id-5",     GPIO_POLARITY_ACTIVE_LOW},
5977cfbde5eSPhilippe Mathieu-Daudé     };
59862c2c2ebSCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
5993d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
60015ce12cfSPhilippe Mathieu-Daudé     DeviceState *dev;
6017cfbde5eSPhilippe Mathieu-Daudé     LEDState *led;
60262c2c2ebSCédric Le Goater 
60363ceb818SCédric Le Goater     /* Bus 3: TODO bmp280@77 */
60463ceb818SCédric Le Goater     /* Bus 3: TODO max31785@52 */
60563ceb818SCédric Le Goater     /* Bus 3: TODO dps310@76 */
606db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
60715ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca1");
6082616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
6092616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 3),
61015ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
6118c9a61d7SCédric Le Goater 
6127cfbde5eSPhilippe Mathieu-Daudé     for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) {
6137cfbde5eSPhilippe Mathieu-Daudé         led = led_create_simple(OBJECT(bmc),
6147cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].gpio_polarity,
6157cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].color,
6167cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].description);
6177cfbde5eSPhilippe Mathieu-Daudé         qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id,
6187cfbde5eSPhilippe Mathieu-Daudé                               qdev_get_gpio_in(DEVICE(led), 0));
6197cfbde5eSPhilippe Mathieu-Daudé     }
6201373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c);
6211373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c);
62262c2c2ebSCédric Le Goater 
62362c2c2ebSCédric Le Goater     /* The Witherspoon expects a TMP275 but a TMP105 is compatible */
6241373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105,
625044475f3SPhilippe Mathieu-Daudé                      0x4a);
6266c4567c7SCédric Le Goater 
6276c4567c7SCédric Le Goater     /* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
6286c4567c7SCédric Le Goater      * good enough */
6291373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
6303d165f12SCédric Le Goater 
6317a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51,
6323d165f12SCédric Le Goater                           eeprom_buf);
633db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
63415ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca0");
6352616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
6362616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 11),
63715ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
63863ceb818SCédric Le Goater     /* Bus 11: TODO ucd90160@64 */
63962c2c2ebSCédric Le Goater }
64062c2c2ebSCédric Le Goater 
64195f068c8SJohn Wang static void g220a_bmc_i2c_init(AspeedMachineState *bmc)
64295f068c8SJohn Wang {
64395f068c8SJohn Wang     AspeedSoCState *soc = &bmc->soc;
64495f068c8SJohn Wang     DeviceState *dev;
64595f068c8SJohn Wang 
64695f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3),
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, 12),
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);
65795f068c8SJohn Wang 
65895f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13),
65995f068c8SJohn Wang                                          "emc1413", 0x4c));
66095f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
66195f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
66295f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
6636f5f6507SJohn Wang 
6646f5f6507SJohn Wang     static uint8_t eeprom_buf[2 * 1024] = {
6656f5f6507SJohn Wang             0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe,
6666f5f6507SJohn Wang             0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65,
6676f5f6507SJohn Wang             0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32,
6686f5f6507SJohn Wang             0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42,
6696f5f6507SJohn Wang             0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45,
6706f5f6507SJohn Wang             0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1,
6716f5f6507SJohn Wang             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7,
6726f5f6507SJohn Wang     };
6736f5f6507SJohn Wang     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57,
6746f5f6507SJohn Wang                           eeprom_buf);
67595f068c8SJohn Wang }
67695f068c8SJohn Wang 
67758e52bdbSCédric Le Goater static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
67858e52bdbSCédric Le Goater {
67958e52bdbSCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
68058e52bdbSCédric Le Goater 
68158e52bdbSCédric Le Goater     /* The rainier expects a TMP275 but a TMP105 is compatible */
68258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
68358e52bdbSCédric Le Goater                      0x48);
68458e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
68558e52bdbSCédric Le Goater                      0x49);
68658e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
68758e52bdbSCédric Le Goater                      0x4a);
68858e52bdbSCédric Le Goater 
68958e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
69058e52bdbSCédric Le Goater                      0x48);
69158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
69258e52bdbSCédric Le Goater                      0x49);
69358e52bdbSCédric Le Goater 
69458e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
69558e52bdbSCédric Le Goater                      0x48);
69658e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
69758e52bdbSCédric Le Goater                      0x4a);
69858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
69958e52bdbSCédric Le Goater                      0x4b);
70058e52bdbSCédric Le Goater 
70158e52bdbSCédric Le Goater     /* Bus 7: TODO dps310@76 */
70258e52bdbSCédric Le Goater     /* Bus 7: TODO max31785@52 */
70358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9552", 0x61);
70458e52bdbSCédric Le Goater     /* Bus 7: TODO si7021-a20@20 */
70558e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105,
70658e52bdbSCédric Le Goater                      0x48);
70758e52bdbSCédric Le Goater 
70858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
70958e52bdbSCédric Le Goater                      0x48);
71058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
71158e52bdbSCédric Le Goater                      0x4a);
71258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x61);
71358e52bdbSCédric Le Goater     /* Bus 8: ucd90320@11 */
71458e52bdbSCédric Le Goater     /* Bus 8: ucd90320@b */
71558e52bdbSCédric Le Goater     /* Bus 8: ucd90320@c */
71658e52bdbSCédric Le Goater 
71758e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c);
71858e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d);
71958e52bdbSCédric Le Goater 
72058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c);
72158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d);
72258e52bdbSCédric Le Goater 
72358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
72458e52bdbSCédric Le Goater                      0x48);
72558e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
72658e52bdbSCédric Le Goater                      0x49);
72758e52bdbSCédric Le Goater }
72858e52bdbSCédric Le Goater 
7291a15311aSCédric Le Goater static bool aspeed_get_mmio_exec(Object *obj, Error **errp)
7301a15311aSCédric Le Goater {
7311a15311aSCédric Le Goater     return ASPEED_MACHINE(obj)->mmio_exec;
7321a15311aSCédric Le Goater }
7331a15311aSCédric Le Goater 
7341a15311aSCédric Le Goater static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp)
7351a15311aSCédric Le Goater {
7361a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = value;
7371a15311aSCédric Le Goater }
7381a15311aSCédric Le Goater 
7391a15311aSCédric Le Goater static void aspeed_machine_instance_init(Object *obj)
7401a15311aSCédric Le Goater {
7411a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = false;
7421a15311aSCédric Le Goater }
7431a15311aSCédric Le Goater 
7449820e52fSCédric Le Goater static char *aspeed_get_fmc_model(Object *obj, Error **errp)
7459820e52fSCédric Le Goater {
7469820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
7479820e52fSCédric Le Goater     return g_strdup(bmc->fmc_model);
7489820e52fSCédric Le Goater }
7499820e52fSCédric Le Goater 
7509820e52fSCédric Le Goater static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp)
7519820e52fSCédric Le Goater {
7529820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
7539820e52fSCédric Le Goater 
7549820e52fSCédric Le Goater     g_free(bmc->fmc_model);
7559820e52fSCédric Le Goater     bmc->fmc_model = g_strdup(value);
7569820e52fSCédric Le Goater }
7579820e52fSCédric Le Goater 
7589820e52fSCédric Le Goater static char *aspeed_get_spi_model(Object *obj, Error **errp)
7599820e52fSCédric Le Goater {
7609820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
7619820e52fSCédric Le Goater     return g_strdup(bmc->spi_model);
7629820e52fSCédric Le Goater }
7639820e52fSCédric Le Goater 
7649820e52fSCédric Le Goater static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp)
7659820e52fSCédric Le Goater {
7669820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
7679820e52fSCédric Le Goater 
7689820e52fSCédric Le Goater     g_free(bmc->spi_model);
7699820e52fSCédric Le Goater     bmc->spi_model = g_strdup(value);
7709820e52fSCédric Le Goater }
7719820e52fSCédric Le Goater 
7721a15311aSCédric Le Goater static void aspeed_machine_class_props_init(ObjectClass *oc)
7731a15311aSCédric Le Goater {
7741a15311aSCédric Le Goater     object_class_property_add_bool(oc, "execute-in-place",
7751a15311aSCédric Le Goater                                    aspeed_get_mmio_exec,
776d2623129SMarkus Armbruster                                    aspeed_set_mmio_exec);
7771a15311aSCédric Le Goater     object_class_property_set_description(oc, "execute-in-place",
7787eecec7dSMarkus Armbruster                            "boot directly from CE0 flash device");
7799820e52fSCédric Le Goater 
7809820e52fSCédric Le Goater     object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model,
7819820e52fSCédric Le Goater                                    aspeed_set_fmc_model);
7829820e52fSCédric Le Goater     object_class_property_set_description(oc, "fmc-model",
7839820e52fSCédric Le Goater                                           "Change the FMC Flash model");
7849820e52fSCédric Le Goater     object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model,
7859820e52fSCédric Le Goater                                    aspeed_set_spi_model);
7869820e52fSCédric Le Goater     object_class_property_set_description(oc, "spi-model",
7879820e52fSCédric Le Goater                                           "Change the SPI Flash model");
7881a15311aSCédric Le Goater }
7891a15311aSCédric Le Goater 
790b7f1a0cbSCédric Le Goater static int aspeed_soc_num_cpus(const char *soc_name)
791b7f1a0cbSCédric Le Goater {
792b7f1a0cbSCédric Le Goater    AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(soc_name));
793b7f1a0cbSCédric Le Goater    return sc->num_cpus;
794b7f1a0cbSCédric Le Goater }
795b7f1a0cbSCédric Le Goater 
796fca9ca1bSCédric Le Goater static void aspeed_machine_class_init(ObjectClass *oc, void *data)
79762c2c2ebSCédric Le Goater {
79862c2c2ebSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
799d3bad7e7SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
80062c2c2ebSCédric Le Goater 
801fca9ca1bSCédric Le Goater     mc->init = aspeed_machine_init;
80262c2c2ebSCédric Le Goater     mc->no_floppy = 1;
80362c2c2ebSCédric Le Goater     mc->no_cdrom = 1;
80462c2c2ebSCédric Le Goater     mc->no_parallel = 1;
805afcbaed6SIgor Mammedov     mc->default_ram_id = "ram";
806d3bad7e7SCédric Le Goater     amc->macs_mask = ASPEED_MAC0_ON;
8071a15311aSCédric Le Goater 
8081a15311aSCédric Le Goater     aspeed_machine_class_props_init(oc);
80962c2c2ebSCédric Le Goater }
81062c2c2ebSCédric Le Goater 
811baa4732bSCédric Le Goater static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
812baa4732bSCédric Le Goater {
813baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
814baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
815baa4732bSCédric Le Goater 
816baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Palmetto BMC (ARM926EJ-S)";
817baa4732bSCédric Le Goater     amc->soc_name  = "ast2400-a1";
818baa4732bSCédric Le Goater     amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1;
819baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
820baa4732bSCédric Le Goater     amc->spi_model = "mx25l25635e";
821baa4732bSCédric Le Goater     amc->num_cs    = 1;
822baa4732bSCédric Le Goater     amc->i2c_init  = palmetto_bmc_i2c_init;
823baa4732bSCédric Le Goater     mc->default_ram_size       = 256 * MiB;
824b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
825b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
826baa4732bSCédric Le Goater };
827baa4732bSCédric Le Goater 
8289cccb912SPatrick Venture static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data)
8299cccb912SPatrick Venture {
8309cccb912SPatrick Venture     MachineClass *mc = MACHINE_CLASS(oc);
8319cccb912SPatrick Venture     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
8329cccb912SPatrick Venture 
8339cccb912SPatrick Venture     mc->desc       = "Quanta-Q71l BMC (ARM926EJ-S)";
8349cccb912SPatrick Venture     amc->soc_name  = "ast2400-a1";
8359cccb912SPatrick Venture     amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1;
8369cccb912SPatrick Venture     amc->fmc_model = "n25q256a";
8379cccb912SPatrick Venture     amc->spi_model = "mx25l25635e";
8389cccb912SPatrick Venture     amc->num_cs    = 1;
8399cccb912SPatrick Venture     amc->i2c_init  = quanta_q71l_bmc_i2c_init;
8409cccb912SPatrick Venture     mc->default_ram_size       = 128 * MiB;
8419cccb912SPatrick Venture     mc->default_cpus = mc->min_cpus = mc->max_cpus =
8429cccb912SPatrick Venture         aspeed_soc_num_cpus(amc->soc_name);
8439cccb912SPatrick Venture }
8449cccb912SPatrick Venture 
84540a38df5SErik Smit static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc,
84640a38df5SErik Smit                                                         void *data)
84740a38df5SErik Smit {
84840a38df5SErik Smit     MachineClass *mc = MACHINE_CLASS(oc);
84940a38df5SErik Smit     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
85040a38df5SErik Smit 
85140a38df5SErik Smit     mc->desc       = "Supermicro X11 BMC (ARM926EJ-S)";
85240a38df5SErik Smit     amc->soc_name  = "ast2400-a1";
85340a38df5SErik Smit     amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1;
85440a38df5SErik Smit     amc->fmc_model = "mx25l25635e";
85540a38df5SErik Smit     amc->spi_model = "mx25l25635e";
85640a38df5SErik Smit     amc->num_cs    = 1;
85740a38df5SErik Smit     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
85840a38df5SErik Smit     amc->i2c_init  = palmetto_bmc_i2c_init;
85940a38df5SErik Smit     mc->default_ram_size = 256 * MiB;
86040a38df5SErik Smit }
86140a38df5SErik Smit 
862baa4732bSCédric Le Goater static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data)
863baa4732bSCédric Le Goater {
864baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
865baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
866baa4732bSCédric Le Goater 
867baa4732bSCédric Le Goater     mc->desc       = "Aspeed AST2500 EVB (ARM1176)";
868baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
869baa4732bSCédric Le Goater     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
870baa4732bSCédric Le Goater     amc->fmc_model = "w25q256";
871baa4732bSCédric Le Goater     amc->spi_model = "mx25l25635e";
872baa4732bSCédric Le Goater     amc->num_cs    = 1;
873baa4732bSCédric Le Goater     amc->i2c_init  = ast2500_evb_i2c_init;
874baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
875b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
876b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
877baa4732bSCédric Le Goater };
878baa4732bSCédric Le Goater 
879baa4732bSCédric Le Goater static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data)
880baa4732bSCédric Le Goater {
881baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
882baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
883baa4732bSCédric Le Goater 
884baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Romulus BMC (ARM1176)";
885baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
886baa4732bSCédric Le Goater     amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1;
887baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
888baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
889baa4732bSCédric Le Goater     amc->num_cs    = 2;
890baa4732bSCédric Le Goater     amc->i2c_init  = romulus_bmc_i2c_init;
891baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
892b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
893b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
894baa4732bSCédric Le Goater };
895baa4732bSCédric Le Goater 
896143b040fSPatrick Williams static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data)
897143b040fSPatrick Williams {
898143b040fSPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
899143b040fSPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
900143b040fSPatrick Williams 
901143b040fSPatrick Williams     mc->desc       = "OCP SonoraPass BMC (ARM1176)";
902143b040fSPatrick Williams     amc->soc_name  = "ast2500-a1";
903143b040fSPatrick Williams     amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1;
904143b040fSPatrick Williams     amc->fmc_model = "mx66l1g45g";
905143b040fSPatrick Williams     amc->spi_model = "mx66l1g45g";
906143b040fSPatrick Williams     amc->num_cs    = 2;
907143b040fSPatrick Williams     amc->i2c_init  = sonorapass_bmc_i2c_init;
908143b040fSPatrick Williams     mc->default_ram_size       = 512 * MiB;
909b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
910b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
911143b040fSPatrick Williams };
912143b040fSPatrick Williams 
913baa4732bSCédric Le Goater static void aspeed_machine_swift_class_init(ObjectClass *oc, void *data)
914baa4732bSCédric Le Goater {
915baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
916baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
917baa4732bSCédric Le Goater 
918baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Swift BMC (ARM1176)";
919baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
920baa4732bSCédric Le Goater     amc->hw_strap1 = SWIFT_BMC_HW_STRAP1;
921baa4732bSCédric Le Goater     amc->fmc_model = "mx66l1g45g";
922baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
923baa4732bSCédric Le Goater     amc->num_cs    = 2;
924baa4732bSCédric Le Goater     amc->i2c_init  = swift_bmc_i2c_init;
925baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
926b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
927b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
92863a9c7e0SCédric Le Goater 
92963a9c7e0SCédric Le Goater     mc->deprecation_reason = "redundant system. Please use a similar "
93063a9c7e0SCédric Le Goater         "OpenPOWER BMC, Witherspoon or Romulus.";
931baa4732bSCédric Le Goater };
932baa4732bSCédric Le Goater 
933baa4732bSCédric Le Goater static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data)
934baa4732bSCédric Le Goater {
935baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
936baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
937baa4732bSCédric Le Goater 
938baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Witherspoon BMC (ARM1176)";
939baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
940baa4732bSCédric Le Goater     amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1;
941baa4732bSCédric Le Goater     amc->fmc_model = "mx25l25635e";
942baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
943baa4732bSCédric Le Goater     amc->num_cs    = 2;
944baa4732bSCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init;
945baa4732bSCédric Le Goater     mc->default_ram_size = 512 * MiB;
946b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
947b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
948baa4732bSCédric Le Goater };
949baa4732bSCédric Le Goater 
950baa4732bSCédric Le Goater static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
951baa4732bSCédric Le Goater {
952baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
953baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
954baa4732bSCédric Le Goater 
955f548f201SPeter Maydell     mc->desc       = "Aspeed AST2600 EVB (Cortex-A7)";
9567582591aSJoel Stanley     amc->soc_name  = "ast2600-a1";
957baa4732bSCédric Le Goater     amc->hw_strap1 = AST2600_EVB_HW_STRAP1;
958baa4732bSCédric Le Goater     amc->hw_strap2 = AST2600_EVB_HW_STRAP2;
959baa4732bSCédric Le Goater     amc->fmc_model = "w25q512jv";
960baa4732bSCédric Le Goater     amc->spi_model = "mx66u51235f";
961baa4732bSCédric Le Goater     amc->num_cs    = 1;
96229193286SGuenter Roeck     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON |
96329193286SGuenter Roeck                      ASPEED_MAC3_ON;
964baa4732bSCédric Le Goater     amc->i2c_init  = ast2600_evb_i2c_init;
965baa4732bSCédric Le Goater     mc->default_ram_size = 1 * GiB;
966b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
967b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
968baa4732bSCédric Le Goater };
969baa4732bSCédric Le Goater 
97063ceb818SCédric Le Goater static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data)
97163ceb818SCédric Le Goater {
97263ceb818SCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
97363ceb818SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
97463ceb818SCédric Le Goater 
975f548f201SPeter Maydell     mc->desc       = "OpenPOWER Tacoma BMC (Cortex-A7)";
9767582591aSJoel Stanley     amc->soc_name  = "ast2600-a1";
97763ceb818SCédric Le Goater     amc->hw_strap1 = TACOMA_BMC_HW_STRAP1;
97863ceb818SCédric Le Goater     amc->hw_strap2 = TACOMA_BMC_HW_STRAP2;
97963ceb818SCédric Le Goater     amc->fmc_model = "mx66l1g45g";
98063ceb818SCédric Le Goater     amc->spi_model = "mx66l1g45g";
98163ceb818SCédric Le Goater     amc->num_cs    = 2;
982d3bad7e7SCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON;
98363ceb818SCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init; /* Same board layout */
98463ceb818SCédric Le Goater     mc->default_ram_size = 1 * GiB;
985b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
986b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
98763ceb818SCédric Le Goater };
98863ceb818SCédric Le Goater 
98995f068c8SJohn Wang static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data)
99095f068c8SJohn Wang {
99195f068c8SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
99295f068c8SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
99395f068c8SJohn Wang 
99495f068c8SJohn Wang     mc->desc       = "Bytedance G220A BMC (ARM1176)";
99595f068c8SJohn Wang     amc->soc_name  = "ast2500-a1";
99695f068c8SJohn Wang     amc->hw_strap1 = G220A_BMC_HW_STRAP1;
99795f068c8SJohn Wang     amc->fmc_model = "n25q512a";
99895f068c8SJohn Wang     amc->spi_model = "mx25l25635e";
99995f068c8SJohn Wang     amc->num_cs    = 2;
1000*5bb825c8SGuenter Roeck     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
100195f068c8SJohn Wang     amc->i2c_init  = g220a_bmc_i2c_init;
100295f068c8SJohn Wang     mc->default_ram_size = 1024 * MiB;
100395f068c8SJohn Wang     mc->default_cpus = mc->min_cpus = mc->max_cpus =
100495f068c8SJohn Wang         aspeed_soc_num_cpus(amc->soc_name);
100595f068c8SJohn Wang };
100695f068c8SJohn Wang 
100758e52bdbSCédric Le Goater static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data)
100858e52bdbSCédric Le Goater {
100958e52bdbSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
101058e52bdbSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
101158e52bdbSCédric Le Goater 
1012f548f201SPeter Maydell     mc->desc       = "IBM Rainier BMC (Cortex-A7)";
101358e52bdbSCédric Le Goater     amc->soc_name  = "ast2600-a1";
101458e52bdbSCédric Le Goater     amc->hw_strap1 = RAINIER_BMC_HW_STRAP1;
101558e52bdbSCédric Le Goater     amc->hw_strap2 = RAINIER_BMC_HW_STRAP2;
101658e52bdbSCédric Le Goater     amc->fmc_model = "mx66l1g45g";
101758e52bdbSCédric Le Goater     amc->spi_model = "mx66l1g45g";
101858e52bdbSCédric Le Goater     amc->num_cs    = 2;
101958e52bdbSCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
102058e52bdbSCédric Le Goater     amc->i2c_init  = rainier_bmc_i2c_init;
102158e52bdbSCédric Le Goater     mc->default_ram_size = 1 * GiB;
102258e52bdbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
102358e52bdbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
102458e52bdbSCédric Le Goater };
102558e52bdbSCédric Le Goater 
1026baa4732bSCédric Le Goater static const TypeInfo aspeed_machine_types[] = {
1027baa4732bSCédric Le Goater     {
1028baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("palmetto-bmc"),
1029baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1030baa4732bSCédric Le Goater         .class_init    = aspeed_machine_palmetto_class_init,
1031baa4732bSCédric Le Goater     }, {
103240a38df5SErik Smit         .name          = MACHINE_TYPE_NAME("supermicrox11-bmc"),
103340a38df5SErik Smit         .parent        = TYPE_ASPEED_MACHINE,
103440a38df5SErik Smit         .class_init    = aspeed_machine_supermicrox11_bmc_class_init,
103540a38df5SErik Smit     }, {
1036baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2500-evb"),
1037baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1038baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2500_evb_class_init,
1039baa4732bSCédric Le Goater     }, {
1040baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("romulus-bmc"),
1041baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1042baa4732bSCédric Le Goater         .class_init    = aspeed_machine_romulus_class_init,
1043baa4732bSCédric Le Goater     }, {
1044baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("swift-bmc"),
1045baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1046baa4732bSCédric Le Goater         .class_init    = aspeed_machine_swift_class_init,
1047baa4732bSCédric Le Goater     }, {
1048143b040fSPatrick Williams         .name          = MACHINE_TYPE_NAME("sonorapass-bmc"),
1049143b040fSPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1050143b040fSPatrick Williams         .class_init    = aspeed_machine_sonorapass_class_init,
1051143b040fSPatrick Williams     }, {
1052baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("witherspoon-bmc"),
1053baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1054baa4732bSCédric Le Goater         .class_init    = aspeed_machine_witherspoon_class_init,
1055baa4732bSCédric Le Goater     }, {
1056baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2600-evb"),
1057baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1058baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2600_evb_class_init,
1059baa4732bSCédric Le Goater     }, {
106063ceb818SCédric Le Goater         .name          = MACHINE_TYPE_NAME("tacoma-bmc"),
106163ceb818SCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
106263ceb818SCédric Le Goater         .class_init    = aspeed_machine_tacoma_class_init,
106363ceb818SCédric Le Goater     }, {
106495f068c8SJohn Wang         .name          = MACHINE_TYPE_NAME("g220a-bmc"),
106595f068c8SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
106695f068c8SJohn Wang         .class_init    = aspeed_machine_g220a_class_init,
106795f068c8SJohn Wang     }, {
10689cccb912SPatrick Venture         .name          = MACHINE_TYPE_NAME("quanta-q71l-bmc"),
10699cccb912SPatrick Venture         .parent        = TYPE_ASPEED_MACHINE,
10709cccb912SPatrick Venture         .class_init    = aspeed_machine_quanta_q71l_class_init,
10719cccb912SPatrick Venture     }, {
107258e52bdbSCédric Le Goater         .name          = MACHINE_TYPE_NAME("rainier-bmc"),
107358e52bdbSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
107458e52bdbSCédric Le Goater         .class_init    = aspeed_machine_rainier_class_init,
107558e52bdbSCédric Le Goater     }, {
1076fca9ca1bSCédric Le Goater         .name          = TYPE_ASPEED_MACHINE,
107762c2c2ebSCédric Le Goater         .parent        = TYPE_MACHINE,
1078888b2b03SPhilippe Mathieu-Daudé         .instance_size = sizeof(AspeedMachineState),
10791a15311aSCédric Le Goater         .instance_init = aspeed_machine_instance_init,
1080fca9ca1bSCédric Le Goater         .class_size    = sizeof(AspeedMachineClass),
1081fca9ca1bSCédric Le Goater         .class_init    = aspeed_machine_class_init,
1082baa4732bSCédric Le Goater         .abstract      = true,
1083baa4732bSCédric Le Goater     }
1084fca9ca1bSCédric Le Goater };
108574fb1f38SCédric Le Goater 
1086baa4732bSCédric Le Goater DEFINE_TYPES(aspeed_machine_types)
1087