xref: /qemu/hw/arm/aspeed.c (revision 0df2d9a673543c4ab06646d9f6bd21153c632a4c)
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"
144771d756SPaolo Bonzini #include "cpu.h"
15327d8e4eSAndrew Jeffery #include "exec/address-spaces.h"
1612ec8bd5SPeter Maydell #include "hw/arm/boot.h"
17fca9ca1bSCédric Le Goater #include "hw/arm/aspeed.h"
1800442402SCédric Le Goater #include "hw/arm/aspeed_soc.h"
19327d8e4eSAndrew Jeffery #include "hw/boards.h"
2093198b6cSCorey Minyard #include "hw/i2c/smbus_eeprom.h"
21044475f3SPhilippe Mathieu-Daudé #include "hw/misc/pca9552.h"
22044475f3SPhilippe Mathieu-Daudé #include "hw/misc/tmp105.h"
237cfbde5eSPhilippe Mathieu-Daudé #include "hw/misc/led.h"
24a27bd6c7SMarkus Armbruster #include "hw/qdev-properties.h"
2503dd024fSPaolo Bonzini #include "qemu/log.h"
26e1ad9bc4SCédric Le Goater #include "sysemu/block-backend.h"
27ece09beeSCédric Le Goater #include "sysemu/sysemu.h"
28d769a1daSCédric Le Goater #include "hw/loader.h"
29d769a1daSCédric Le Goater #include "qemu/error-report.h"
30a9df9622SJoel Stanley #include "qemu/units.h"
31327d8e4eSAndrew Jeffery 
3274fb1f38SCédric Le Goater static struct arm_boot_info aspeed_board_binfo = {
33b033271fSCédric Le Goater     .board_id = -1, /* device-tree-only board */
34327d8e4eSAndrew Jeffery };
35327d8e4eSAndrew Jeffery 
36612b219aSPhilippe Mathieu-Daudé struct AspeedMachineState {
37888b2b03SPhilippe Mathieu-Daudé     /* Private */
38888b2b03SPhilippe Mathieu-Daudé     MachineState parent_obj;
39888b2b03SPhilippe Mathieu-Daudé     /* Public */
40888b2b03SPhilippe Mathieu-Daudé 
41ff90606fSCédric Le Goater     AspeedSoCState soc;
42ad1a9782SCédric Le Goater     MemoryRegion ram_container;
43ebe31c0aSCédric Le Goater     MemoryRegion max_ram;
44888b2b03SPhilippe Mathieu-Daudé     bool mmio_exec;
459820e52fSCédric Le Goater     char *fmc_model;
469820e52fSCédric Le Goater     char *spi_model;
47ea066d39SThomas Huth };
48327d8e4eSAndrew Jeffery 
49ef17f836SCédric Le Goater /* Palmetto hardware value: 0x120CE416 */
508da33ef7SCédric Le Goater #define PALMETTO_BMC_HW_STRAP1 (                                        \
518da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_256MB) |               \
528da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2 /* DDR3 with CL=6, CWL=5 */) | \
538da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
548da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) |       \
558da33ef7SCédric Le Goater         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
568da33ef7SCédric Le Goater         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
578da33ef7SCédric Le Goater         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) |                \
588da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
598da33ef7SCédric Le Goater         SCU_HW_STRAP_SPI_WIDTH |                                        \
608da33ef7SCédric Le Goater         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
618da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
628da33ef7SCédric Le Goater 
6340a38df5SErik Smit /* TODO: Find the actual hardware value */
6440a38df5SErik Smit #define SUPERMICROX11_BMC_HW_STRAP1 (                                   \
6540a38df5SErik Smit         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) |               \
6640a38df5SErik Smit         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2) |                           \
6740a38df5SErik Smit         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
6840a38df5SErik Smit         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) |       \
6940a38df5SErik Smit         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
7040a38df5SErik Smit         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
7140a38df5SErik Smit         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) |                \
7240a38df5SErik Smit         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
7340a38df5SErik Smit         SCU_HW_STRAP_SPI_WIDTH |                                        \
7440a38df5SErik Smit         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
7540a38df5SErik Smit         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
7640a38df5SErik Smit 
77ef17f836SCédric Le Goater /* AST2500 evb hardware value: 0xF100C2E6 */
789a7c1750SCédric Le Goater #define AST2500_EVB_HW_STRAP1 ((                                        \
799a7c1750SCédric Le Goater         AST2500_HW_STRAP1_DEFAULTS |                                    \
809a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
819a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
829a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
839a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
849a7c1750SCédric Le Goater         SCU_HW_STRAP_MAC1_RGMII |                                       \
859a7c1750SCédric Le Goater         SCU_HW_STRAP_MAC0_RGMII) &                                      \
869a7c1750SCédric Le Goater         ~SCU_HW_STRAP_2ND_BOOT_WDT)
879a7c1750SCédric Le Goater 
88ef17f836SCédric Le Goater /* Romulus hardware value: 0xF10AD206 */
89ef17f836SCédric Le Goater #define ROMULUS_BMC_HW_STRAP1 (                                         \
90ef17f836SCédric Le Goater         AST2500_HW_STRAP1_DEFAULTS |                                    \
91ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
92ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
93ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
94ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
95ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_ACPI_ENABLE |                              \
96ef17f836SCédric Le Goater         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER))
97ef17f836SCédric Le Goater 
98143b040fSPatrick Williams /* Sonorapass hardware value: 0xF100D216 */
99143b040fSPatrick Williams #define SONORAPASS_BMC_HW_STRAP1 (                                      \
100143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
101143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
102143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
103143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
104143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
105143b040fSPatrick Williams         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
106143b040fSPatrick Williams         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
107143b040fSPatrick Williams         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
108143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
109143b040fSPatrick Williams         SCU_HW_STRAP_VGA_BIOS_ROM |                                     \
110143b040fSPatrick Williams         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
111143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_RESERVED1)
112143b040fSPatrick Williams 
113aae7a18dSAdriana Kobylak /* Swift hardware value: 0xF11AD206 */
114aae7a18dSAdriana Kobylak #define SWIFT_BMC_HW_STRAP1 (                                           \
115aae7a18dSAdriana Kobylak         AST2500_HW_STRAP1_DEFAULTS |                                    \
116aae7a18dSAdriana Kobylak         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
117aae7a18dSAdriana Kobylak         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
118aae7a18dSAdriana Kobylak         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
119aae7a18dSAdriana Kobylak         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
120aae7a18dSAdriana Kobylak         SCU_H_PLL_BYPASS_EN |                                           \
121aae7a18dSAdriana Kobylak         SCU_AST2500_HW_STRAP_ACPI_ENABLE |                              \
122aae7a18dSAdriana Kobylak         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER))
123aae7a18dSAdriana Kobylak 
12495f068c8SJohn Wang #define G220A_BMC_HW_STRAP1 (                                      \
12595f068c8SJohn Wang         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
12695f068c8SJohn Wang         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
12795f068c8SJohn Wang         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
12895f068c8SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
12995f068c8SJohn Wang         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
13095f068c8SJohn Wang         SCU_HW_STRAP_2ND_BOOT_WDT |                                     \
13195f068c8SJohn Wang         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
13295f068c8SJohn Wang         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
13395f068c8SJohn Wang         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
13495f068c8SJohn Wang         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
13595f068c8SJohn Wang         SCU_HW_STRAP_VGA_SIZE_SET(VGA_64M_DRAM) |                       \
13695f068c8SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED1)
13795f068c8SJohn Wang 
13862c2c2ebSCédric Le Goater /* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */
13962c2c2ebSCédric Le Goater #define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1
14062c2c2ebSCédric Le Goater 
141ccc2c418SCédric Le Goater /* AST2600 evb hardware value */
142ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP1 0x000000C0
143ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP2 0x00000003
144ccc2c418SCédric Le Goater 
14563ceb818SCédric Le Goater /* Tacoma hardware value */
14663ceb818SCédric Le Goater #define TACOMA_BMC_HW_STRAP1  0x00000000
1477582591aSJoel Stanley #define TACOMA_BMC_HW_STRAP2  0x00000040
14863ceb818SCédric Le Goater 
149ebe31c0aSCédric Le Goater /*
150ebe31c0aSCédric Le Goater  * The max ram region is for firmwares that scan the address space
151ebe31c0aSCédric Le Goater  * with load/store to guess how much RAM the SoC has.
152ebe31c0aSCédric Le Goater  */
153ebe31c0aSCédric Le Goater static uint64_t max_ram_read(void *opaque, hwaddr offset, unsigned size)
154ebe31c0aSCédric Le Goater {
155ebe31c0aSCédric Le Goater     return 0;
156ebe31c0aSCédric Le Goater }
157ebe31c0aSCédric Le Goater 
158ebe31c0aSCédric Le Goater static void max_ram_write(void *opaque, hwaddr offset, uint64_t value,
159ebe31c0aSCédric Le Goater                            unsigned size)
160ebe31c0aSCédric Le Goater {
161ebe31c0aSCédric Le Goater     /* Discard writes */
162ebe31c0aSCédric Le Goater }
163ebe31c0aSCédric Le Goater 
164ebe31c0aSCédric Le Goater static const MemoryRegionOps max_ram_ops = {
165ebe31c0aSCédric Le Goater     .read = max_ram_read,
166ebe31c0aSCédric Le Goater     .write = max_ram_write,
167ebe31c0aSCédric Le Goater     .endianness = DEVICE_NATIVE_ENDIAN,
168ebe31c0aSCédric Le Goater };
169ebe31c0aSCédric Le Goater 
1709bb6d140SJoel Stanley #define AST_SMP_MAILBOX_BASE            0x1e6e2180
1719bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_ENTRY        (AST_SMP_MAILBOX_BASE + 0x0)
1729bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_GOSIGN       (AST_SMP_MAILBOX_BASE + 0x4)
1739bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_READY        (AST_SMP_MAILBOX_BASE + 0x8)
1749bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_POLLINSN     (AST_SMP_MAILBOX_BASE + 0xc)
1759bb6d140SJoel Stanley #define AST_SMP_MBOX_CODE               (AST_SMP_MAILBOX_BASE + 0x10)
1769bb6d140SJoel Stanley #define AST_SMP_MBOX_GOSIGN             0xabbaab00
1779bb6d140SJoel Stanley 
1789bb6d140SJoel Stanley static void aspeed_write_smpboot(ARMCPU *cpu,
1799bb6d140SJoel Stanley                                  const struct arm_boot_info *info)
1809bb6d140SJoel Stanley {
1819bb6d140SJoel Stanley     static const uint32_t poll_mailbox_ready[] = {
1829bb6d140SJoel Stanley         /*
1839bb6d140SJoel Stanley          * r2 = per-cpu go sign value
1849bb6d140SJoel Stanley          * r1 = AST_SMP_MBOX_FIELD_ENTRY
1859bb6d140SJoel Stanley          * r0 = AST_SMP_MBOX_FIELD_GOSIGN
1869bb6d140SJoel Stanley          */
1879bb6d140SJoel Stanley         0xee100fb0,  /* mrc     p15, 0, r0, c0, c0, 5 */
1889bb6d140SJoel Stanley         0xe21000ff,  /* ands    r0, r0, #255          */
1899bb6d140SJoel Stanley         0xe59f201c,  /* ldr     r2, [pc, #28]         */
1909bb6d140SJoel Stanley         0xe1822000,  /* orr     r2, r2, r0            */
1919bb6d140SJoel Stanley 
1929bb6d140SJoel Stanley         0xe59f1018,  /* ldr     r1, [pc, #24]         */
1939bb6d140SJoel Stanley         0xe59f0018,  /* ldr     r0, [pc, #24]         */
1949bb6d140SJoel Stanley 
1959bb6d140SJoel Stanley         0xe320f002,  /* wfe                           */
1969bb6d140SJoel Stanley         0xe5904000,  /* ldr     r4, [r0]              */
1979bb6d140SJoel Stanley         0xe1520004,  /* cmp     r2, r4                */
1989bb6d140SJoel Stanley         0x1afffffb,  /* bne     <wfe>                 */
1999bb6d140SJoel Stanley         0xe591f000,  /* ldr     pc, [r1]              */
2009bb6d140SJoel Stanley         AST_SMP_MBOX_GOSIGN,
2019bb6d140SJoel Stanley         AST_SMP_MBOX_FIELD_ENTRY,
2029bb6d140SJoel Stanley         AST_SMP_MBOX_FIELD_GOSIGN,
2039bb6d140SJoel Stanley     };
2049bb6d140SJoel Stanley 
2059bb6d140SJoel Stanley     rom_add_blob_fixed("aspeed.smpboot", poll_mailbox_ready,
2069bb6d140SJoel Stanley                        sizeof(poll_mailbox_ready),
2079bb6d140SJoel Stanley                        info->smp_loader_start);
2089bb6d140SJoel Stanley }
2099bb6d140SJoel Stanley 
2109bb6d140SJoel Stanley static void aspeed_reset_secondary(ARMCPU *cpu,
2119bb6d140SJoel Stanley                                    const struct arm_boot_info *info)
2129bb6d140SJoel Stanley {
2139bb6d140SJoel Stanley     AddressSpace *as = arm_boot_address_space(cpu, info);
2149bb6d140SJoel Stanley     CPUState *cs = CPU(cpu);
2159bb6d140SJoel Stanley 
2169bb6d140SJoel Stanley     /* info->smp_bootreg_addr */
2179bb6d140SJoel Stanley     address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0,
2189bb6d140SJoel Stanley                                MEMTXATTRS_UNSPECIFIED, NULL);
2199bb6d140SJoel Stanley     cpu_set_pc(cs, info->smp_loader_start);
2209bb6d140SJoel Stanley }
2219bb6d140SJoel Stanley 
222d769a1daSCédric Le Goater #define FIRMWARE_ADDR 0x0
223d769a1daSCédric Le Goater 
224d769a1daSCédric Le Goater static void write_boot_rom(DriveInfo *dinfo, hwaddr addr, size_t rom_size,
225d769a1daSCédric Le Goater                            Error **errp)
226d769a1daSCédric Le Goater {
227d769a1daSCédric Le Goater     BlockBackend *blk = blk_by_legacy_dinfo(dinfo);
228d769a1daSCédric Le Goater     uint8_t *storage;
2290c7209beSCédric Le Goater     int64_t size;
230d769a1daSCédric Le Goater 
2310c7209beSCédric Le Goater     /* The block backend size should have already been 'validated' by
2320c7209beSCédric Le Goater      * the creation of the m25p80 object.
2330c7209beSCédric Le Goater      */
2340c7209beSCédric Le Goater     size = blk_getlength(blk);
2350c7209beSCédric Le Goater     if (size <= 0) {
2360c7209beSCédric Le Goater         error_setg(errp, "failed to get flash size");
2370c7209beSCédric Le Goater         return;
2380c7209beSCédric Le Goater     }
2390c7209beSCédric Le Goater 
2400c7209beSCédric Le Goater     if (rom_size > size) {
2410c7209beSCédric Le Goater         rom_size = size;
242d769a1daSCédric Le Goater     }
243d769a1daSCédric Le Goater 
244d769a1daSCédric Le Goater     storage = g_new0(uint8_t, rom_size);
245d769a1daSCédric Le Goater     if (blk_pread(blk, 0, storage, rom_size) < 0) {
246d769a1daSCédric Le Goater         error_setg(errp, "failed to read the initial flash content");
247d769a1daSCédric Le Goater         return;
248d769a1daSCédric Le Goater     }
249d769a1daSCédric Le Goater 
250d769a1daSCédric Le Goater     rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr);
251d769a1daSCédric Le Goater     g_free(storage);
252d769a1daSCédric Le Goater }
253d769a1daSCédric Le Goater 
254c20b4cccSMarkus Armbruster static void aspeed_board_init_flashes(AspeedSMCState *s,
255c20b4cccSMarkus Armbruster                                       const char *flashtype)
256e1ad9bc4SCédric Le Goater {
257e1ad9bc4SCédric Le Goater     int i ;
258e1ad9bc4SCédric Le Goater 
259e1ad9bc4SCédric Le Goater     for (i = 0; i < s->num_cs; ++i) {
260e1ad9bc4SCédric Le Goater         AspeedSMCFlash *fl = &s->flashes[i];
261e1ad9bc4SCédric Le Goater         DriveInfo *dinfo = drive_get_next(IF_MTD);
262e1ad9bc4SCédric Le Goater         qemu_irq cs_line;
263e1ad9bc4SCédric Le Goater 
26457d479c9SMarkus Armbruster         fl->flash = qdev_new(flashtype);
265e1ad9bc4SCédric Le Goater         if (dinfo) {
266c20b4cccSMarkus Armbruster             qdev_prop_set_drive(fl->flash, "drive",
267c20b4cccSMarkus Armbruster                                 blk_by_legacy_dinfo(dinfo));
268e1ad9bc4SCédric Le Goater         }
26957d479c9SMarkus Armbruster         qdev_realize_and_unref(fl->flash, BUS(s->spi), &error_fatal);
270e1ad9bc4SCédric Le Goater 
271e1ad9bc4SCédric Le Goater         cs_line = qdev_get_gpio_in_named(fl->flash, SSI_GPIO_CS, 0);
272e1ad9bc4SCédric Le Goater         sysbus_connect_irq(SYS_BUS_DEVICE(s), i + 1, cs_line);
273e1ad9bc4SCédric Le Goater     }
274e1ad9bc4SCédric Le Goater }
275e1ad9bc4SCédric Le Goater 
276a29e3e12SAndrew Jeffery static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo)
277a29e3e12SAndrew Jeffery {
278a29e3e12SAndrew Jeffery         DeviceState *card;
279a29e3e12SAndrew Jeffery 
280756f739bSPhilippe Mathieu-Daudé         if (!dinfo) {
281756f739bSPhilippe Mathieu-Daudé             return;
282756f739bSPhilippe Mathieu-Daudé         }
2833e80f690SMarkus Armbruster         card = qdev_new(TYPE_SD_CARD);
284934df912SMarkus Armbruster         qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
285a29e3e12SAndrew Jeffery                                 &error_fatal);
2863e80f690SMarkus Armbruster         qdev_realize_and_unref(card,
2873e80f690SMarkus Armbruster                                qdev_get_child_bus(DEVICE(sdhci), "sd-bus"),
2883e80f690SMarkus Armbruster                                &error_fatal);
289a29e3e12SAndrew Jeffery }
290a29e3e12SAndrew Jeffery 
291baa4732bSCédric Le Goater static void aspeed_machine_init(MachineState *machine)
292327d8e4eSAndrew Jeffery {
293888b2b03SPhilippe Mathieu-Daudé     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
294baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
295b033271fSCédric Le Goater     AspeedSoCClass *sc;
296d769a1daSCédric Le Goater     DriveInfo *drive0 = drive_get(IF_MTD, 0, 0);
297ebe31c0aSCédric Le Goater     ram_addr_t max_ram_size;
2982bea128cSEddie James     int i;
299d3bad7e7SCédric Le Goater     NICInfo *nd = &nd_table[0];
300327d8e4eSAndrew Jeffery 
301ad1a9782SCédric Le Goater     memory_region_init(&bmc->ram_container, NULL, "aspeed-ram-container",
3027df9f028SPhilippe Mathieu-Daudé                        4 * GiB);
303afcbaed6SIgor Mammedov     memory_region_add_subregion(&bmc->ram_container, 0, machine->ram);
304ad1a9782SCédric Le Goater 
3059fc7fc4dSMarkus Armbruster     object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
306327d8e4eSAndrew Jeffery 
307b033271fSCédric Le Goater     sc = ASPEED_SOC_GET_CLASS(&bmc->soc);
308b033271fSCédric Le Goater 
309533eb415SIgor Mammedov     /*
310533eb415SIgor Mammedov      * This will error out if isize is not supported by memory controller.
311533eb415SIgor Mammedov      */
3126e504a98SPaolo Bonzini     object_property_set_uint(OBJECT(&bmc->soc), "ram-size", machine->ram_size,
313533eb415SIgor Mammedov                              &error_fatal);
314533eb415SIgor Mammedov 
315d3bad7e7SCédric Le Goater     for (i = 0; i < sc->macs_num; i++) {
316d3bad7e7SCédric Le Goater         if ((amc->macs_mask & (1 << i)) && nd->used) {
317d3bad7e7SCédric Le Goater             qemu_check_nic_model(nd, TYPE_FTGMAC100);
318d3bad7e7SCédric Le Goater             qdev_set_nic_properties(DEVICE(&bmc->soc.ftgmac100[i]), nd);
319d3bad7e7SCédric Le Goater             nd++;
320d3bad7e7SCédric Le Goater         }
321d3bad7e7SCédric Le Goater     }
322d3bad7e7SCédric Le Goater 
3235325cc34SMarkus Armbruster     object_property_set_int(OBJECT(&bmc->soc), "hw-strap1", amc->hw_strap1,
32487e79af0SAndrew Jeffery                             &error_abort);
3255325cc34SMarkus Armbruster     object_property_set_int(OBJECT(&bmc->soc), "hw-strap2", amc->hw_strap2,
326ccc2c418SCédric Le Goater                             &error_abort);
3275325cc34SMarkus Armbruster     object_property_set_int(OBJECT(&bmc->soc), "num-cs", amc->num_cs,
32826d5df95SCédric Le Goater                             &error_abort);
3295325cc34SMarkus Armbruster     object_property_set_link(OBJECT(&bmc->soc), "dram",
330*0df2d9a6SCédric Le Goater                              OBJECT(machine->ram), &error_abort);
331b6e70d1dSJoel Stanley     if (machine->kernel_filename) {
332b6e70d1dSJoel Stanley         /*
333b6e70d1dSJoel Stanley          * When booting with a -kernel command line there is no u-boot
334b6e70d1dSJoel Stanley          * that runs to unlock the SCU. In this case set the default to
335b6e70d1dSJoel Stanley          * be unlocked as the kernel expects
336b6e70d1dSJoel Stanley          */
3375325cc34SMarkus Armbruster         object_property_set_int(OBJECT(&bmc->soc), "hw-prot-key",
3385325cc34SMarkus Armbruster                                 ASPEED_SCU_PROT_KEY, &error_abort);
339b6e70d1dSJoel Stanley     }
340ce189ab2SMarkus Armbruster     qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
341327d8e4eSAndrew Jeffery 
342d783d1feSCédric Le Goater     memory_region_add_subregion(get_system_memory(),
343347df6f8SEduardo Habkost                                 sc->memmap[ASPEED_DEV_SDRAM],
344ad1a9782SCédric Le Goater                                 &bmc->ram_container);
345de46f5f4SCédric Le Goater 
346ebe31c0aSCédric Le Goater     max_ram_size = object_property_get_uint(OBJECT(&bmc->soc), "max-ram-size",
347ebe31c0aSCédric Le Goater                                             &error_abort);
348ebe31c0aSCédric Le Goater     memory_region_init_io(&bmc->max_ram, NULL, &max_ram_ops, NULL,
3496e504a98SPaolo Bonzini                           "max_ram", max_ram_size  - machine->ram_size);
3506e504a98SPaolo Bonzini     memory_region_add_subregion(&bmc->ram_container, machine->ram_size, &bmc->max_ram);
351ebe31c0aSCédric Le Goater 
3529820e52fSCédric Le Goater     aspeed_board_init_flashes(&bmc->soc.fmc, bmc->fmc_model ?
3539820e52fSCédric Le Goater                               bmc->fmc_model : amc->fmc_model);
3549820e52fSCédric Le Goater     aspeed_board_init_flashes(&bmc->soc.spi[0], bmc->spi_model ?
3559820e52fSCédric Le Goater                               bmc->spi_model : amc->spi_model);
356e1ad9bc4SCédric Le Goater 
357d769a1daSCédric Le Goater     /* Install first FMC flash content as a boot rom. */
358d769a1daSCédric Le Goater     if (drive0) {
359d769a1daSCédric Le Goater         AspeedSMCFlash *fl = &bmc->soc.fmc.flashes[0];
360d769a1daSCédric Le Goater         MemoryRegion *boot_rom = g_new(MemoryRegion, 1);
361d769a1daSCédric Le Goater 
362d769a1daSCédric Le Goater         /*
363d769a1daSCédric Le Goater          * create a ROM region using the default mapping window size of
36493bf276dSCédric Le Goater          * the flash module. The window size is 64MB for the AST2400
36593bf276dSCédric Le Goater          * SoC and 128MB for the AST2500 SoC, which is twice as big as
36693bf276dSCédric Le Goater          * needed by the flash modules of the Aspeed machines.
367d769a1daSCédric Le Goater          */
3681a15311aSCédric Le Goater         if (ASPEED_MACHINE(machine)->mmio_exec) {
369f489960dSPhilippe Mathieu-Daudé             memory_region_init_alias(boot_rom, NULL, "aspeed.boot_rom",
3701a15311aSCédric Le Goater                                      &fl->mmio, 0, fl->size);
3711a15311aSCédric Le Goater             memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
3721a15311aSCédric Le Goater                                         boot_rom);
3731a15311aSCédric Le Goater         } else {
374f489960dSPhilippe Mathieu-Daudé             memory_region_init_rom(boot_rom, NULL, "aspeed.boot_rom",
375d769a1daSCédric Le Goater                                    fl->size, &error_abort);
376d769a1daSCédric Le Goater             memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
377d769a1daSCédric Le Goater                                         boot_rom);
378d769a1daSCédric Le Goater             write_boot_rom(drive0, FIRMWARE_ADDR, fl->size, &error_abort);
379d769a1daSCédric Le Goater         }
3801a15311aSCédric Le Goater     }
381d769a1daSCédric Le Goater 
382b7f1a0cbSCédric Le Goater     if (machine->kernel_filename && sc->num_cpus > 1) {
3839bb6d140SJoel Stanley         /* With no u-boot we must set up a boot stub for the secondary CPU */
3849bb6d140SJoel Stanley         MemoryRegion *smpboot = g_new(MemoryRegion, 1);
385f489960dSPhilippe Mathieu-Daudé         memory_region_init_ram(smpboot, NULL, "aspeed.smpboot",
3869bb6d140SJoel Stanley                                0x80, &error_abort);
3879bb6d140SJoel Stanley         memory_region_add_subregion(get_system_memory(),
3889bb6d140SJoel Stanley                                     AST_SMP_MAILBOX_BASE, smpboot);
3899bb6d140SJoel Stanley 
3909bb6d140SJoel Stanley         aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot;
3919bb6d140SJoel Stanley         aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary;
3929bb6d140SJoel Stanley         aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE;
3939bb6d140SJoel Stanley     }
3949bb6d140SJoel Stanley 
3956e504a98SPaolo Bonzini     aspeed_board_binfo.ram_size = machine->ram_size;
396347df6f8SEduardo Habkost     aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM];
397b7f1a0cbSCédric Le Goater     aspeed_board_binfo.nb_cpus = sc->num_cpus;
398b033271fSCédric Le Goater 
399baa4732bSCédric Le Goater     if (amc->i2c_init) {
400baa4732bSCédric Le Goater         amc->i2c_init(bmc);
4012cf6cb50SCédric Le Goater     }
4022cf6cb50SCédric Le Goater 
4030e2c24c6SAndrew Jeffery     for (i = 0; i < bmc->soc.sdhci.num_slots; i++) {
404a29e3e12SAndrew Jeffery         sdhci_attach_drive(&bmc->soc.sdhci.slots[i], drive_get_next(IF_SD));
405a29e3e12SAndrew Jeffery     }
4062bea128cSEddie James 
407a29e3e12SAndrew Jeffery     if (bmc->soc.emmc.num_slots) {
408a29e3e12SAndrew Jeffery         sdhci_attach_drive(&bmc->soc.emmc.slots[0], drive_get_next(IF_SD));
4092bea128cSEddie James     }
4102bea128cSEddie James 
4112744ece8STao Xu     arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo);
412327d8e4eSAndrew Jeffery }
413327d8e4eSAndrew Jeffery 
414612b219aSPhilippe Mathieu-Daudé static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
4152cf6cb50SCédric Le Goater {
4162cf6cb50SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
417a87e81b9SCédric Le Goater     DeviceState *dev;
4183d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
4192cf6cb50SCédric Le Goater 
4202cf6cb50SCédric Le Goater     /* The palmetto platform expects a ds3231 RTC but a ds1338 is
4212cf6cb50SCédric Le Goater      * enough to provide basic RTC features. Alarms will be missing */
4221373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
423a87e81b9SCédric Le Goater 
4247a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
4253d165f12SCédric Le Goater                           eeprom_buf);
4263d165f12SCédric Le Goater 
427a87e81b9SCédric Le Goater     /* add a TMP423 temperature sensor */
4281373b15bSPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
4291373b15bSPhilippe Mathieu-Daudé                                          "tmp423", 0x4c));
4305325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
4315325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
4325325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
4335325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort);
4342cf6cb50SCédric Le Goater }
4352cf6cb50SCédric Le Goater 
436612b219aSPhilippe Mathieu-Daudé static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
4372cf6cb50SCédric Le Goater {
4382cf6cb50SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
4393d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
4403d165f12SCédric Le Goater 
4417a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50,
4423d165f12SCédric Le Goater                           eeprom_buf);
4432cf6cb50SCédric Le Goater 
4442cf6cb50SCédric Le Goater     /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
4451373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
446044475f3SPhilippe Mathieu-Daudé                      TYPE_TMP105, 0x4d);
4476c4567c7SCédric Le Goater 
4486c4567c7SCédric Le Goater     /* The AST2500 EVB does not have an RTC. Let's pretend that one is
4496c4567c7SCédric Le Goater      * plugged on the I2C bus header */
4501373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
4512cf6cb50SCédric Le Goater }
4522cf6cb50SCédric Le Goater 
453612b219aSPhilippe Mathieu-Daudé static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
454ccc2c418SCédric Le Goater {
455ccc2c418SCédric Le Goater     /* Start with some devices on our I2C busses */
456ccc2c418SCédric Le Goater     ast2500_evb_i2c_init(bmc);
457ccc2c418SCédric Le Goater }
458ccc2c418SCédric Le Goater 
459612b219aSPhilippe Mathieu-Daudé static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
4606c4567c7SCédric Le Goater {
4616c4567c7SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
4626c4567c7SCédric Le Goater 
4636c4567c7SCédric Le Goater     /* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
4646c4567c7SCédric Le Goater      * good enough */
4651373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
4666c4567c7SCédric Le Goater }
4676c4567c7SCédric Le Goater 
468612b219aSPhilippe Mathieu-Daudé static void swift_bmc_i2c_init(AspeedMachineState *bmc)
469aae7a18dSAdriana Kobylak {
470aae7a18dSAdriana Kobylak     AspeedSoCState *soc = &bmc->soc;
471aae7a18dSAdriana Kobylak 
4721373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "pca9552", 0x60);
473aae7a18dSAdriana Kobylak 
474aae7a18dSAdriana Kobylak     /* The swift board expects a TMP275 but a TMP105 is compatible */
4751373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "tmp105", 0x48);
476aae7a18dSAdriana Kobylak     /* The swift board expects a pca9551 but a pca9552 is compatible */
4771373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9552", 0x60);
478aae7a18dSAdriana Kobylak 
479aae7a18dSAdriana Kobylak     /* The swift board expects an Epson RX8900 RTC but a ds1338 is compatible */
4801373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "ds1338", 0x32);
4811373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x60);
482aae7a18dSAdriana Kobylak 
4831373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c);
484aae7a18dSAdriana Kobylak     /* The swift board expects a pca9539 but a pca9552 is compatible */
4851373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "pca9552", 0x74);
486aae7a18dSAdriana Kobylak 
4871373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c);
488aae7a18dSAdriana Kobylak     /* The swift board expects a pca9539 but a pca9552 is compatible */
4891373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "pca9552",
490aae7a18dSAdriana Kobylak                      0x74);
491aae7a18dSAdriana Kobylak 
492aae7a18dSAdriana Kobylak     /* The swift board expects a TMP275 but a TMP105 is compatible */
4931373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12), "tmp105", 0x48);
4941373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12), "tmp105", 0x4a);
495aae7a18dSAdriana Kobylak }
496aae7a18dSAdriana Kobylak 
497612b219aSPhilippe Mathieu-Daudé static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc)
498143b040fSPatrick Williams {
499143b040fSPatrick Williams     AspeedSoCState *soc = &bmc->soc;
500143b040fSPatrick Williams 
501143b040fSPatrick Williams     /* bus 2 : */
5021373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48);
5031373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49);
504143b040fSPatrick Williams     /* bus 2 : pca9546 @ 0x73 */
505143b040fSPatrick Williams 
506143b040fSPatrick Williams     /* bus 3 : pca9548 @ 0x70 */
507143b040fSPatrick Williams 
508143b040fSPatrick Williams     /* bus 4 : */
509143b040fSPatrick Williams     uint8_t *eeprom4_54 = g_malloc0(8 * 1024);
5107a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54,
511143b040fSPatrick Williams                           eeprom4_54);
512143b040fSPatrick Williams     /* PCA9539 @ 0x76, but PCA9552 is compatible */
5131373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "pca9552", 0x76);
514143b040fSPatrick Williams     /* PCA9539 @ 0x77, but PCA9552 is compatible */
5151373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "pca9552", 0x77);
516143b040fSPatrick Williams 
517143b040fSPatrick Williams     /* bus 6 : */
5181373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48);
5191373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49);
520143b040fSPatrick Williams     /* bus 6 : pca9546 @ 0x73 */
521143b040fSPatrick Williams 
522143b040fSPatrick Williams     /* bus 8 : */
523143b040fSPatrick Williams     uint8_t *eeprom8_56 = g_malloc0(8 * 1024);
5247a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56,
525143b040fSPatrick Williams                           eeprom8_56);
5261373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x60);
5271373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x61);
528143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1d */
529143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1f */
530143b040fSPatrick Williams 
531143b040fSPatrick Williams     /*
532143b040fSPatrick Williams      * bus 13 : pca9548 @ 0x71
533143b040fSPatrick Williams      *      - channel 3:
534143b040fSPatrick Williams      *          - tmm421 @ 0x4c
535143b040fSPatrick Williams      *          - tmp421 @ 0x4e
536143b040fSPatrick Williams      *          - tmp421 @ 0x4f
537143b040fSPatrick Williams      */
538143b040fSPatrick Williams 
539143b040fSPatrick Williams }
540143b040fSPatrick Williams 
541612b219aSPhilippe Mathieu-Daudé static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
54262c2c2ebSCédric Le Goater {
5437cfbde5eSPhilippe Mathieu-Daudé     static const struct {
5447cfbde5eSPhilippe Mathieu-Daudé         unsigned gpio_id;
5457cfbde5eSPhilippe Mathieu-Daudé         LEDColor color;
5467cfbde5eSPhilippe Mathieu-Daudé         const char *description;
5477cfbde5eSPhilippe Mathieu-Daudé         bool gpio_polarity;
5487cfbde5eSPhilippe Mathieu-Daudé     } pca1_leds[] = {
5497cfbde5eSPhilippe Mathieu-Daudé         {13, LED_COLOR_GREEN, "front-fault-4",  GPIO_POLARITY_ACTIVE_LOW},
5507cfbde5eSPhilippe Mathieu-Daudé         {14, LED_COLOR_GREEN, "front-power-3",  GPIO_POLARITY_ACTIVE_LOW},
5517cfbde5eSPhilippe Mathieu-Daudé         {15, LED_COLOR_GREEN, "front-id-5",     GPIO_POLARITY_ACTIVE_LOW},
5527cfbde5eSPhilippe Mathieu-Daudé     };
55362c2c2ebSCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
5543d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
55515ce12cfSPhilippe Mathieu-Daudé     DeviceState *dev;
5567cfbde5eSPhilippe Mathieu-Daudé     LEDState *led;
55762c2c2ebSCédric Le Goater 
55863ceb818SCédric Le Goater     /* Bus 3: TODO bmp280@77 */
55963ceb818SCédric Le Goater     /* Bus 3: TODO max31785@52 */
56063ceb818SCédric Le Goater     /* Bus 3: TODO dps310@76 */
561db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
56215ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca1");
5632616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
5642616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 3),
56515ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
5668c9a61d7SCédric Le Goater 
5677cfbde5eSPhilippe Mathieu-Daudé     for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) {
5687cfbde5eSPhilippe Mathieu-Daudé         led = led_create_simple(OBJECT(bmc),
5697cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].gpio_polarity,
5707cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].color,
5717cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].description);
5727cfbde5eSPhilippe Mathieu-Daudé         qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id,
5737cfbde5eSPhilippe Mathieu-Daudé                               qdev_get_gpio_in(DEVICE(led), 0));
5747cfbde5eSPhilippe Mathieu-Daudé     }
5751373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c);
5761373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c);
57762c2c2ebSCédric Le Goater 
57862c2c2ebSCédric Le Goater     /* The Witherspoon expects a TMP275 but a TMP105 is compatible */
5791373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105,
580044475f3SPhilippe Mathieu-Daudé                      0x4a);
5816c4567c7SCédric Le Goater 
5826c4567c7SCédric Le Goater     /* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
5836c4567c7SCédric Le Goater      * good enough */
5841373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
5853d165f12SCédric Le Goater 
5867a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51,
5873d165f12SCédric Le Goater                           eeprom_buf);
588db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
58915ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca0");
5902616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
5912616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 11),
59215ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
59363ceb818SCédric Le Goater     /* Bus 11: TODO ucd90160@64 */
59462c2c2ebSCédric Le Goater }
59562c2c2ebSCédric Le Goater 
59695f068c8SJohn Wang static void g220a_bmc_i2c_init(AspeedMachineState *bmc)
59795f068c8SJohn Wang {
59895f068c8SJohn Wang     AspeedSoCState *soc = &bmc->soc;
59995f068c8SJohn Wang     DeviceState *dev;
60095f068c8SJohn Wang 
60195f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3),
60295f068c8SJohn Wang                                          "emc1413", 0x4c));
60395f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
60495f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
60595f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
60695f068c8SJohn Wang 
60795f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12),
60895f068c8SJohn Wang                                          "emc1413", 0x4c));
60995f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
61095f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
61195f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
61295f068c8SJohn Wang 
61395f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13),
61495f068c8SJohn Wang                                          "emc1413", 0x4c));
61595f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
61695f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
61795f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
6186f5f6507SJohn Wang 
6196f5f6507SJohn Wang     static uint8_t eeprom_buf[2 * 1024] = {
6206f5f6507SJohn Wang             0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe,
6216f5f6507SJohn Wang             0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65,
6226f5f6507SJohn Wang             0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32,
6236f5f6507SJohn Wang             0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42,
6246f5f6507SJohn Wang             0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45,
6256f5f6507SJohn Wang             0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1,
6266f5f6507SJohn Wang             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7,
6276f5f6507SJohn Wang     };
6286f5f6507SJohn Wang     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57,
6296f5f6507SJohn Wang                           eeprom_buf);
63095f068c8SJohn Wang }
63195f068c8SJohn Wang 
6321a15311aSCédric Le Goater static bool aspeed_get_mmio_exec(Object *obj, Error **errp)
6331a15311aSCédric Le Goater {
6341a15311aSCédric Le Goater     return ASPEED_MACHINE(obj)->mmio_exec;
6351a15311aSCédric Le Goater }
6361a15311aSCédric Le Goater 
6371a15311aSCédric Le Goater static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp)
6381a15311aSCédric Le Goater {
6391a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = value;
6401a15311aSCédric Le Goater }
6411a15311aSCédric Le Goater 
6421a15311aSCédric Le Goater static void aspeed_machine_instance_init(Object *obj)
6431a15311aSCédric Le Goater {
6441a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = false;
6451a15311aSCédric Le Goater }
6461a15311aSCédric Le Goater 
6479820e52fSCédric Le Goater static char *aspeed_get_fmc_model(Object *obj, Error **errp)
6489820e52fSCédric Le Goater {
6499820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
6509820e52fSCédric Le Goater     return g_strdup(bmc->fmc_model);
6519820e52fSCédric Le Goater }
6529820e52fSCédric Le Goater 
6539820e52fSCédric Le Goater static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp)
6549820e52fSCédric Le Goater {
6559820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
6569820e52fSCédric Le Goater 
6579820e52fSCédric Le Goater     g_free(bmc->fmc_model);
6589820e52fSCédric Le Goater     bmc->fmc_model = g_strdup(value);
6599820e52fSCédric Le Goater }
6609820e52fSCédric Le Goater 
6619820e52fSCédric Le Goater static char *aspeed_get_spi_model(Object *obj, Error **errp)
6629820e52fSCédric Le Goater {
6639820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
6649820e52fSCédric Le Goater     return g_strdup(bmc->spi_model);
6659820e52fSCédric Le Goater }
6669820e52fSCédric Le Goater 
6679820e52fSCédric Le Goater static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp)
6689820e52fSCédric Le Goater {
6699820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
6709820e52fSCédric Le Goater 
6719820e52fSCédric Le Goater     g_free(bmc->spi_model);
6729820e52fSCédric Le Goater     bmc->spi_model = g_strdup(value);
6739820e52fSCédric Le Goater }
6749820e52fSCédric Le Goater 
6751a15311aSCédric Le Goater static void aspeed_machine_class_props_init(ObjectClass *oc)
6761a15311aSCédric Le Goater {
6771a15311aSCédric Le Goater     object_class_property_add_bool(oc, "execute-in-place",
6781a15311aSCédric Le Goater                                    aspeed_get_mmio_exec,
679d2623129SMarkus Armbruster                                    aspeed_set_mmio_exec);
6801a15311aSCédric Le Goater     object_class_property_set_description(oc, "execute-in-place",
6817eecec7dSMarkus Armbruster                            "boot directly from CE0 flash device");
6829820e52fSCédric Le Goater 
6839820e52fSCédric Le Goater     object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model,
6849820e52fSCédric Le Goater                                    aspeed_set_fmc_model);
6859820e52fSCédric Le Goater     object_class_property_set_description(oc, "fmc-model",
6869820e52fSCédric Le Goater                                           "Change the FMC Flash model");
6879820e52fSCédric Le Goater     object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model,
6889820e52fSCédric Le Goater                                    aspeed_set_spi_model);
6899820e52fSCédric Le Goater     object_class_property_set_description(oc, "spi-model",
6909820e52fSCédric Le Goater                                           "Change the SPI Flash model");
6911a15311aSCédric Le Goater }
6921a15311aSCédric Le Goater 
693b7f1a0cbSCédric Le Goater static int aspeed_soc_num_cpus(const char *soc_name)
694b7f1a0cbSCédric Le Goater {
695b7f1a0cbSCédric Le Goater    AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(soc_name));
696b7f1a0cbSCédric Le Goater    return sc->num_cpus;
697b7f1a0cbSCédric Le Goater }
698b7f1a0cbSCédric Le Goater 
699fca9ca1bSCédric Le Goater static void aspeed_machine_class_init(ObjectClass *oc, void *data)
70062c2c2ebSCédric Le Goater {
70162c2c2ebSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
702d3bad7e7SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
70362c2c2ebSCédric Le Goater 
704fca9ca1bSCédric Le Goater     mc->init = aspeed_machine_init;
70562c2c2ebSCédric Le Goater     mc->no_floppy = 1;
70662c2c2ebSCédric Le Goater     mc->no_cdrom = 1;
70762c2c2ebSCédric Le Goater     mc->no_parallel = 1;
708afcbaed6SIgor Mammedov     mc->default_ram_id = "ram";
709d3bad7e7SCédric Le Goater     amc->macs_mask = ASPEED_MAC0_ON;
7101a15311aSCédric Le Goater 
7111a15311aSCédric Le Goater     aspeed_machine_class_props_init(oc);
71262c2c2ebSCédric Le Goater }
71362c2c2ebSCédric Le Goater 
714baa4732bSCédric Le Goater static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
715baa4732bSCédric Le Goater {
716baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
717baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
718baa4732bSCédric Le Goater 
719baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Palmetto BMC (ARM926EJ-S)";
720baa4732bSCédric Le Goater     amc->soc_name  = "ast2400-a1";
721baa4732bSCédric Le Goater     amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1;
722baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
723baa4732bSCédric Le Goater     amc->spi_model = "mx25l25635e";
724baa4732bSCédric Le Goater     amc->num_cs    = 1;
725baa4732bSCédric Le Goater     amc->i2c_init  = palmetto_bmc_i2c_init;
726baa4732bSCédric Le Goater     mc->default_ram_size       = 256 * MiB;
727b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
728b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
729baa4732bSCédric Le Goater };
730baa4732bSCédric Le Goater 
73140a38df5SErik Smit static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc,
73240a38df5SErik Smit                                                         void *data)
73340a38df5SErik Smit {
73440a38df5SErik Smit     MachineClass *mc = MACHINE_CLASS(oc);
73540a38df5SErik Smit     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
73640a38df5SErik Smit 
73740a38df5SErik Smit     mc->desc       = "Supermicro X11 BMC (ARM926EJ-S)";
73840a38df5SErik Smit     amc->soc_name  = "ast2400-a1";
73940a38df5SErik Smit     amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1;
74040a38df5SErik Smit     amc->fmc_model = "mx25l25635e";
74140a38df5SErik Smit     amc->spi_model = "mx25l25635e";
74240a38df5SErik Smit     amc->num_cs    = 1;
74340a38df5SErik Smit     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
74440a38df5SErik Smit     amc->i2c_init  = palmetto_bmc_i2c_init;
74540a38df5SErik Smit     mc->default_ram_size = 256 * MiB;
74640a38df5SErik Smit }
74740a38df5SErik Smit 
748baa4732bSCédric Le Goater static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data)
749baa4732bSCédric Le Goater {
750baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
751baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
752baa4732bSCédric Le Goater 
753baa4732bSCédric Le Goater     mc->desc       = "Aspeed AST2500 EVB (ARM1176)";
754baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
755baa4732bSCédric Le Goater     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
756baa4732bSCédric Le Goater     amc->fmc_model = "w25q256";
757baa4732bSCédric Le Goater     amc->spi_model = "mx25l25635e";
758baa4732bSCédric Le Goater     amc->num_cs    = 1;
759baa4732bSCédric Le Goater     amc->i2c_init  = ast2500_evb_i2c_init;
760baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
761b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
762b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
763baa4732bSCédric Le Goater };
764baa4732bSCédric Le Goater 
765baa4732bSCédric Le Goater static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data)
766baa4732bSCédric Le Goater {
767baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
768baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
769baa4732bSCédric Le Goater 
770baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Romulus BMC (ARM1176)";
771baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
772baa4732bSCédric Le Goater     amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1;
773baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
774baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
775baa4732bSCédric Le Goater     amc->num_cs    = 2;
776baa4732bSCédric Le Goater     amc->i2c_init  = romulus_bmc_i2c_init;
777baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
778b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
779b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
780baa4732bSCédric Le Goater };
781baa4732bSCédric Le Goater 
782143b040fSPatrick Williams static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data)
783143b040fSPatrick Williams {
784143b040fSPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
785143b040fSPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
786143b040fSPatrick Williams 
787143b040fSPatrick Williams     mc->desc       = "OCP SonoraPass BMC (ARM1176)";
788143b040fSPatrick Williams     amc->soc_name  = "ast2500-a1";
789143b040fSPatrick Williams     amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1;
790143b040fSPatrick Williams     amc->fmc_model = "mx66l1g45g";
791143b040fSPatrick Williams     amc->spi_model = "mx66l1g45g";
792143b040fSPatrick Williams     amc->num_cs    = 2;
793143b040fSPatrick Williams     amc->i2c_init  = sonorapass_bmc_i2c_init;
794143b040fSPatrick Williams     mc->default_ram_size       = 512 * MiB;
795b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
796b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
797143b040fSPatrick Williams };
798143b040fSPatrick Williams 
799baa4732bSCédric Le Goater static void aspeed_machine_swift_class_init(ObjectClass *oc, void *data)
800baa4732bSCédric Le Goater {
801baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
802baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
803baa4732bSCédric Le Goater 
804baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Swift BMC (ARM1176)";
805baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
806baa4732bSCédric Le Goater     amc->hw_strap1 = SWIFT_BMC_HW_STRAP1;
807baa4732bSCédric Le Goater     amc->fmc_model = "mx66l1g45g";
808baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
809baa4732bSCédric Le Goater     amc->num_cs    = 2;
810baa4732bSCédric Le Goater     amc->i2c_init  = swift_bmc_i2c_init;
811baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
812b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
813b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
814baa4732bSCédric Le Goater };
815baa4732bSCédric Le Goater 
816baa4732bSCédric Le Goater static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data)
817baa4732bSCédric Le Goater {
818baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
819baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
820baa4732bSCédric Le Goater 
821baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Witherspoon BMC (ARM1176)";
822baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
823baa4732bSCédric Le Goater     amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1;
824baa4732bSCédric Le Goater     amc->fmc_model = "mx25l25635e";
825baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
826baa4732bSCédric Le Goater     amc->num_cs    = 2;
827baa4732bSCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init;
828baa4732bSCédric Le Goater     mc->default_ram_size = 512 * MiB;
829b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
830b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
831baa4732bSCédric Le Goater };
832baa4732bSCédric Le Goater 
833baa4732bSCédric Le Goater static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
834baa4732bSCédric Le Goater {
835baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
836baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
837baa4732bSCédric Le Goater 
838baa4732bSCédric Le Goater     mc->desc       = "Aspeed AST2600 EVB (Cortex A7)";
8397582591aSJoel Stanley     amc->soc_name  = "ast2600-a1";
840baa4732bSCédric Le Goater     amc->hw_strap1 = AST2600_EVB_HW_STRAP1;
841baa4732bSCédric Le Goater     amc->hw_strap2 = AST2600_EVB_HW_STRAP2;
842baa4732bSCédric Le Goater     amc->fmc_model = "w25q512jv";
843baa4732bSCédric Le Goater     amc->spi_model = "mx66u51235f";
844baa4732bSCédric Le Goater     amc->num_cs    = 1;
845d3bad7e7SCédric Le Goater     amc->macs_mask  = ASPEED_MAC1_ON | ASPEED_MAC2_ON | ASPEED_MAC3_ON;
846baa4732bSCédric Le Goater     amc->i2c_init  = ast2600_evb_i2c_init;
847baa4732bSCédric Le Goater     mc->default_ram_size = 1 * GiB;
848b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
849b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
850baa4732bSCédric Le Goater };
851baa4732bSCédric Le Goater 
85263ceb818SCédric Le Goater static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data)
85363ceb818SCédric Le Goater {
85463ceb818SCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
85563ceb818SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
85663ceb818SCédric Le Goater 
8577582591aSJoel Stanley     mc->desc       = "OpenPOWER Tacoma BMC (Cortex A7)";
8587582591aSJoel Stanley     amc->soc_name  = "ast2600-a1";
85963ceb818SCédric Le Goater     amc->hw_strap1 = TACOMA_BMC_HW_STRAP1;
86063ceb818SCédric Le Goater     amc->hw_strap2 = TACOMA_BMC_HW_STRAP2;
86163ceb818SCédric Le Goater     amc->fmc_model = "mx66l1g45g";
86263ceb818SCédric Le Goater     amc->spi_model = "mx66l1g45g";
86363ceb818SCédric Le Goater     amc->num_cs    = 2;
864d3bad7e7SCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON;
86563ceb818SCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init; /* Same board layout */
86663ceb818SCédric Le Goater     mc->default_ram_size = 1 * GiB;
867b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
868b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
86963ceb818SCédric Le Goater };
87063ceb818SCédric Le Goater 
87195f068c8SJohn Wang static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data)
87295f068c8SJohn Wang {
87395f068c8SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
87495f068c8SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
87595f068c8SJohn Wang 
87695f068c8SJohn Wang     mc->desc       = "Bytedance G220A BMC (ARM1176)";
87795f068c8SJohn Wang     amc->soc_name  = "ast2500-a1";
87895f068c8SJohn Wang     amc->hw_strap1 = G220A_BMC_HW_STRAP1;
87995f068c8SJohn Wang     amc->fmc_model = "n25q512a";
88095f068c8SJohn Wang     amc->spi_model = "mx25l25635e";
88195f068c8SJohn Wang     amc->num_cs    = 2;
88295f068c8SJohn Wang     amc->macs_mask  = ASPEED_MAC1_ON | ASPEED_MAC2_ON;
88395f068c8SJohn Wang     amc->i2c_init  = g220a_bmc_i2c_init;
88495f068c8SJohn Wang     mc->default_ram_size = 1024 * MiB;
88595f068c8SJohn Wang     mc->default_cpus = mc->min_cpus = mc->max_cpus =
88695f068c8SJohn Wang         aspeed_soc_num_cpus(amc->soc_name);
88795f068c8SJohn Wang };
88895f068c8SJohn Wang 
889baa4732bSCédric Le Goater static const TypeInfo aspeed_machine_types[] = {
890baa4732bSCédric Le Goater     {
891baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("palmetto-bmc"),
892baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
893baa4732bSCédric Le Goater         .class_init    = aspeed_machine_palmetto_class_init,
894baa4732bSCédric Le Goater     }, {
89540a38df5SErik Smit         .name          = MACHINE_TYPE_NAME("supermicrox11-bmc"),
89640a38df5SErik Smit         .parent        = TYPE_ASPEED_MACHINE,
89740a38df5SErik Smit         .class_init    = aspeed_machine_supermicrox11_bmc_class_init,
89840a38df5SErik Smit     }, {
899baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2500-evb"),
900baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
901baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2500_evb_class_init,
902baa4732bSCédric Le Goater     }, {
903baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("romulus-bmc"),
904baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
905baa4732bSCédric Le Goater         .class_init    = aspeed_machine_romulus_class_init,
906baa4732bSCédric Le Goater     }, {
907baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("swift-bmc"),
908baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
909baa4732bSCédric Le Goater         .class_init    = aspeed_machine_swift_class_init,
910baa4732bSCédric Le Goater     }, {
911143b040fSPatrick Williams         .name          = MACHINE_TYPE_NAME("sonorapass-bmc"),
912143b040fSPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
913143b040fSPatrick Williams         .class_init    = aspeed_machine_sonorapass_class_init,
914143b040fSPatrick Williams     }, {
915baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("witherspoon-bmc"),
916baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
917baa4732bSCédric Le Goater         .class_init    = aspeed_machine_witherspoon_class_init,
918baa4732bSCédric Le Goater     }, {
919baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2600-evb"),
920baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
921baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2600_evb_class_init,
922baa4732bSCédric Le Goater     }, {
92363ceb818SCédric Le Goater         .name          = MACHINE_TYPE_NAME("tacoma-bmc"),
92463ceb818SCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
92563ceb818SCédric Le Goater         .class_init    = aspeed_machine_tacoma_class_init,
92663ceb818SCédric Le Goater     }, {
92795f068c8SJohn Wang         .name          = MACHINE_TYPE_NAME("g220a-bmc"),
92895f068c8SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
92995f068c8SJohn Wang         .class_init    = aspeed_machine_g220a_class_init,
93095f068c8SJohn Wang     }, {
931fca9ca1bSCédric Le Goater         .name          = TYPE_ASPEED_MACHINE,
93262c2c2ebSCédric Le Goater         .parent        = TYPE_MACHINE,
933888b2b03SPhilippe Mathieu-Daudé         .instance_size = sizeof(AspeedMachineState),
9341a15311aSCédric Le Goater         .instance_init = aspeed_machine_instance_init,
935fca9ca1bSCédric Le Goater         .class_size    = sizeof(AspeedMachineClass),
936fca9ca1bSCédric Le Goater         .class_init    = aspeed_machine_class_init,
937baa4732bSCédric Le Goater         .abstract      = true,
938baa4732bSCédric Le Goater     }
939fca9ca1bSCédric Le Goater };
94074fb1f38SCédric Le Goater 
941baa4732bSCédric Le Goater DEFINE_TYPES(aspeed_machine_types)
942