xref: /qemu/hw/arm/aspeed.c (revision 1099ad10b0ec66406d419765428eef0738267035)
1327d8e4eSAndrew Jeffery /*
2327d8e4eSAndrew Jeffery  * OpenPOWER Palmetto BMC
3327d8e4eSAndrew Jeffery  *
4327d8e4eSAndrew Jeffery  * Andrew Jeffery <andrew@aj.id.au>
5327d8e4eSAndrew Jeffery  *
6327d8e4eSAndrew Jeffery  * Copyright 2016 IBM Corp.
7327d8e4eSAndrew Jeffery  *
8327d8e4eSAndrew Jeffery  * This code is licensed under the GPL version 2 or later.  See
9327d8e4eSAndrew Jeffery  * the COPYING file in the top-level directory.
10327d8e4eSAndrew Jeffery  */
11327d8e4eSAndrew Jeffery 
12327d8e4eSAndrew Jeffery #include "qemu/osdep.h"
13da34e65cSMarkus Armbruster #include "qapi/error.h"
1412ec8bd5SPeter Maydell #include "hw/arm/boot.h"
15fca9ca1bSCédric Le Goater #include "hw/arm/aspeed.h"
1600442402SCédric Le Goater #include "hw/arm/aspeed_soc.h"
173ec75e39SPatrick Venture #include "hw/i2c/i2c_mux_pca954x.h"
1893198b6cSCorey Minyard #include "hw/i2c/smbus_eeprom.h"
19044475f3SPhilippe Mathieu-Daudé #include "hw/misc/pca9552.h"
205e9ae4b1SCorey Minyard #include "hw/sensor/tmp105.h"
217cfbde5eSPhilippe Mathieu-Daudé #include "hw/misc/led.h"
22a27bd6c7SMarkus Armbruster #include "hw/qdev-properties.h"
23e1ad9bc4SCédric Le Goater #include "sysemu/block-backend.h"
24fa699e80SPeter Delevoryas #include "sysemu/reset.h"
25d769a1daSCédric Le Goater #include "hw/loader.h"
26d769a1daSCédric Le Goater #include "qemu/error-report.h"
27a9df9622SJoel Stanley #include "qemu/units.h"
2866c895b8SJamin Lin #include "hw/qdev-clock.h"
29d2b3eaefSPeter Delevoryas #include "sysemu/sysemu.h"
30327d8e4eSAndrew Jeffery 
3174fb1f38SCédric Le Goater static struct arm_boot_info aspeed_board_binfo = {
32b033271fSCédric Le Goater     .board_id = -1, /* device-tree-only board */
33327d8e4eSAndrew Jeffery };
34327d8e4eSAndrew Jeffery 
35612b219aSPhilippe Mathieu-Daudé struct AspeedMachineState {
36888b2b03SPhilippe Mathieu-Daudé     /* Private */
37888b2b03SPhilippe Mathieu-Daudé     MachineState parent_obj;
38888b2b03SPhilippe Mathieu-Daudé     /* Public */
39888b2b03SPhilippe Mathieu-Daudé 
40ff90606fSCédric Le Goater     AspeedSoCState soc;
41ad1a9782SCédric Le Goater     MemoryRegion ram_container;
42ebe31c0aSCédric Le Goater     MemoryRegion max_ram;
43888b2b03SPhilippe Mathieu-Daudé     bool mmio_exec;
449820e52fSCédric Le Goater     char *fmc_model;
459820e52fSCédric Le Goater     char *spi_model;
46ea066d39SThomas Huth };
47327d8e4eSAndrew Jeffery 
48ef17f836SCédric Le Goater /* Palmetto hardware value: 0x120CE416 */
498da33ef7SCédric Le Goater #define PALMETTO_BMC_HW_STRAP1 (                                        \
508da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_256MB) |               \
518da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2 /* DDR3 with CL=6, CWL=5 */) | \
528da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
538da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) |       \
548da33ef7SCédric Le Goater         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
558da33ef7SCédric Le Goater         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
568da33ef7SCédric Le Goater         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) |                \
578da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
588da33ef7SCédric Le Goater         SCU_HW_STRAP_SPI_WIDTH |                                        \
598da33ef7SCédric Le Goater         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
608da33ef7SCédric Le Goater         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
618da33ef7SCédric Le Goater 
6240a38df5SErik Smit /* TODO: Find the actual hardware value */
6340a38df5SErik Smit #define SUPERMICROX11_BMC_HW_STRAP1 (                                   \
6440a38df5SErik Smit         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) |               \
6540a38df5SErik Smit         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2) |                           \
6640a38df5SErik Smit         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
6740a38df5SErik Smit         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) |       \
6840a38df5SErik Smit         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
6940a38df5SErik Smit         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
7040a38df5SErik Smit         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) |                \
7140a38df5SErik Smit         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
7240a38df5SErik Smit         SCU_HW_STRAP_SPI_WIDTH |                                        \
7340a38df5SErik Smit         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
7440a38df5SErik Smit         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
7540a38df5SErik Smit 
76ef17f836SCédric Le Goater /* AST2500 evb hardware value: 0xF100C2E6 */
779a7c1750SCédric Le Goater #define AST2500_EVB_HW_STRAP1 ((                                        \
789a7c1750SCédric Le Goater         AST2500_HW_STRAP1_DEFAULTS |                                    \
799a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
809a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
819a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
829a7c1750SCédric Le Goater         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
839a7c1750SCédric Le Goater         SCU_HW_STRAP_MAC1_RGMII |                                       \
849a7c1750SCédric Le Goater         SCU_HW_STRAP_MAC0_RGMII) &                                      \
859a7c1750SCédric Le Goater         ~SCU_HW_STRAP_2ND_BOOT_WDT)
869a7c1750SCédric Le Goater 
87ef17f836SCédric Le Goater /* Romulus hardware value: 0xF10AD206 */
88ef17f836SCédric Le Goater #define ROMULUS_BMC_HW_STRAP1 (                                         \
89ef17f836SCédric Le Goater         AST2500_HW_STRAP1_DEFAULTS |                                    \
90ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
91ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
92ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
93ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
94ef17f836SCédric Le Goater         SCU_AST2500_HW_STRAP_ACPI_ENABLE |                              \
95ef17f836SCédric Le Goater         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER))
96ef17f836SCédric Le Goater 
97143b040fSPatrick Williams /* Sonorapass hardware value: 0xF100D216 */
98143b040fSPatrick Williams #define SONORAPASS_BMC_HW_STRAP1 (                                      \
99143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
100143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
101143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
102143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
103143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
104143b040fSPatrick Williams         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
105143b040fSPatrick Williams         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
106143b040fSPatrick Williams         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
107143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
108143b040fSPatrick Williams         SCU_HW_STRAP_VGA_BIOS_ROM |                                     \
109143b040fSPatrick Williams         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
110143b040fSPatrick Williams         SCU_AST2500_HW_STRAP_RESERVED1)
111143b040fSPatrick Williams 
11295f068c8SJohn Wang #define G220A_BMC_HW_STRAP1 (                                      \
11395f068c8SJohn Wang         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
11495f068c8SJohn Wang         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
11595f068c8SJohn Wang         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
11695f068c8SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
11795f068c8SJohn Wang         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
11895f068c8SJohn Wang         SCU_HW_STRAP_2ND_BOOT_WDT |                                     \
11995f068c8SJohn Wang         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
12095f068c8SJohn Wang         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
12195f068c8SJohn Wang         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
12295f068c8SJohn Wang         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
12395f068c8SJohn Wang         SCU_HW_STRAP_VGA_SIZE_SET(VGA_64M_DRAM) |                       \
12495f068c8SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED1)
12595f068c8SJohn Wang 
12682b6a3f6SJohn Wang /* FP5280G2 hardware value: 0XF100D286 */
12782b6a3f6SJohn Wang #define FP5280G2_BMC_HW_STRAP1 (                                      \
12882b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE |                     \
12982b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE |                        \
13082b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_UART_DEBUG |                               \
13182b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED28 |                               \
13282b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_DDR4_ENABLE |                              \
13382b6a3f6SJohn Wang         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
13482b6a3f6SJohn Wang         SCU_HW_STRAP_LPC_RESET_PIN |                                    \
13582b6a3f6SJohn Wang         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) |                \
13682b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) |     \
13782b6a3f6SJohn Wang         SCU_HW_STRAP_MAC1_RGMII |                                       \
13882b6a3f6SJohn Wang         SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) |                       \
13982b6a3f6SJohn Wang         SCU_AST2500_HW_STRAP_RESERVED1)
14082b6a3f6SJohn Wang 
14162c2c2ebSCédric Le Goater /* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */
14262c2c2ebSCédric Le Goater #define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1
14362c2c2ebSCédric Le Goater 
1449cccb912SPatrick Venture /* Quanta-Q71l hardware value */
1459cccb912SPatrick Venture #define QUANTA_Q71L_BMC_HW_STRAP1 (                                     \
1469cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) |               \
1479cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_DRAM_CONFIG(2/* DDR3 with CL=6, CWL=5 */) | \
1489cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_ACPI_DIS |                                 \
1499cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_24M_IN) |       \
1509cccb912SPatrick Venture         SCU_HW_STRAP_VGA_CLASS_CODE |                                   \
1519cccb912SPatrick Venture         SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_PASS_THROUGH) |          \
1529cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
1539cccb912SPatrick Venture         SCU_HW_STRAP_SPI_WIDTH |                                        \
1549cccb912SPatrick Venture         SCU_HW_STRAP_VGA_SIZE_SET(VGA_8M_DRAM) |                        \
1559cccb912SPatrick Venture         SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
1569cccb912SPatrick Venture 
157ccc2c418SCédric Le Goater /* AST2600 evb hardware value */
158ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP1 0x000000C0
159ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP2 0x00000003
160ccc2c418SCédric Le Goater 
16163ceb818SCédric Le Goater /* Tacoma hardware value */
16263ceb818SCédric Le Goater #define TACOMA_BMC_HW_STRAP1  0x00000000
1637582591aSJoel Stanley #define TACOMA_BMC_HW_STRAP2  0x00000040
16463ceb818SCédric Le Goater 
16558e52bdbSCédric Le Goater /* Rainier hardware value: (QEMU prototype) */
166b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP1 0x00422016
167b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP2 0x80000848
16858e52bdbSCédric Le Goater 
169febbe308SPeter Delevoryas /* Fuji hardware value */
170febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP1    0x00000000
171febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP2    0x00000000
172febbe308SPeter Delevoryas 
173a20c54b1SPatrick Williams /* Bletchley hardware value */
174a20c54b1SPatrick Williams /* TODO: Leave same as EVB for now. */
175a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP1 AST2600_EVB_HW_STRAP1
176a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP2 AST2600_EVB_HW_STRAP2
177a20c54b1SPatrick Williams 
178fb6b3c8dSJae Hyun Yoo /* Qualcomm DC-SCM hardware value */
179fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP1  0x00000000
180fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP2  0x00000041
181fb6b3c8dSJae Hyun Yoo 
1829bb6d140SJoel Stanley #define AST_SMP_MAILBOX_BASE            0x1e6e2180
1839bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_ENTRY        (AST_SMP_MAILBOX_BASE + 0x0)
1849bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_GOSIGN       (AST_SMP_MAILBOX_BASE + 0x4)
1859bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_READY        (AST_SMP_MAILBOX_BASE + 0x8)
1869bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_POLLINSN     (AST_SMP_MAILBOX_BASE + 0xc)
1879bb6d140SJoel Stanley #define AST_SMP_MBOX_CODE               (AST_SMP_MAILBOX_BASE + 0x10)
1889bb6d140SJoel Stanley #define AST_SMP_MBOX_GOSIGN             0xabbaab00
1899bb6d140SJoel Stanley 
1909bb6d140SJoel Stanley static void aspeed_write_smpboot(ARMCPU *cpu,
1919bb6d140SJoel Stanley                                  const struct arm_boot_info *info)
1929bb6d140SJoel Stanley {
1939bb6d140SJoel Stanley     static const uint32_t poll_mailbox_ready[] = {
1949bb6d140SJoel Stanley         /*
1959bb6d140SJoel Stanley          * r2 = per-cpu go sign value
1969bb6d140SJoel Stanley          * r1 = AST_SMP_MBOX_FIELD_ENTRY
1979bb6d140SJoel Stanley          * r0 = AST_SMP_MBOX_FIELD_GOSIGN
1989bb6d140SJoel Stanley          */
1999bb6d140SJoel Stanley         0xee100fb0,  /* mrc     p15, 0, r0, c0, c0, 5 */
2009bb6d140SJoel Stanley         0xe21000ff,  /* ands    r0, r0, #255          */
2019bb6d140SJoel Stanley         0xe59f201c,  /* ldr     r2, [pc, #28]         */
2029bb6d140SJoel Stanley         0xe1822000,  /* orr     r2, r2, r0            */
2039bb6d140SJoel Stanley 
2049bb6d140SJoel Stanley         0xe59f1018,  /* ldr     r1, [pc, #24]         */
2059bb6d140SJoel Stanley         0xe59f0018,  /* ldr     r0, [pc, #24]         */
2069bb6d140SJoel Stanley 
2079bb6d140SJoel Stanley         0xe320f002,  /* wfe                           */
2089bb6d140SJoel Stanley         0xe5904000,  /* ldr     r4, [r0]              */
2099bb6d140SJoel Stanley         0xe1520004,  /* cmp     r2, r4                */
2109bb6d140SJoel Stanley         0x1afffffb,  /* bne     <wfe>                 */
2119bb6d140SJoel Stanley         0xe591f000,  /* ldr     pc, [r1]              */
2129bb6d140SJoel Stanley         AST_SMP_MBOX_GOSIGN,
2139bb6d140SJoel Stanley         AST_SMP_MBOX_FIELD_ENTRY,
2149bb6d140SJoel Stanley         AST_SMP_MBOX_FIELD_GOSIGN,
2159bb6d140SJoel Stanley     };
2169bb6d140SJoel Stanley 
2179bb6d140SJoel Stanley     rom_add_blob_fixed("aspeed.smpboot", poll_mailbox_ready,
2189bb6d140SJoel Stanley                        sizeof(poll_mailbox_ready),
2199bb6d140SJoel Stanley                        info->smp_loader_start);
2209bb6d140SJoel Stanley }
2219bb6d140SJoel Stanley 
2229bb6d140SJoel Stanley static void aspeed_reset_secondary(ARMCPU *cpu,
2239bb6d140SJoel Stanley                                    const struct arm_boot_info *info)
2249bb6d140SJoel Stanley {
2259bb6d140SJoel Stanley     AddressSpace *as = arm_boot_address_space(cpu, info);
2269bb6d140SJoel Stanley     CPUState *cs = CPU(cpu);
2279bb6d140SJoel Stanley 
2289bb6d140SJoel Stanley     /* info->smp_bootreg_addr */
2299bb6d140SJoel Stanley     address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0,
2309bb6d140SJoel Stanley                                MEMTXATTRS_UNSPECIFIED, NULL);
2319bb6d140SJoel Stanley     cpu_set_pc(cs, info->smp_loader_start);
2329bb6d140SJoel Stanley }
2339bb6d140SJoel Stanley 
234d769a1daSCédric Le Goater #define FIRMWARE_ADDR 0x0
235d769a1daSCédric Le Goater 
236d769a1daSCédric Le Goater static void write_boot_rom(DriveInfo *dinfo, hwaddr addr, size_t rom_size,
237d769a1daSCédric Le Goater                            Error **errp)
238d769a1daSCédric Le Goater {
239d769a1daSCédric Le Goater     BlockBackend *blk = blk_by_legacy_dinfo(dinfo);
24005e6e40aSWentao_Liang     g_autofree void *storage = NULL;
2410c7209beSCédric Le Goater     int64_t size;
242d769a1daSCédric Le Goater 
2430c7209beSCédric Le Goater     /* The block backend size should have already been 'validated' by
2440c7209beSCédric Le Goater      * the creation of the m25p80 object.
2450c7209beSCédric Le Goater      */
2460c7209beSCédric Le Goater     size = blk_getlength(blk);
2470c7209beSCédric Le Goater     if (size <= 0) {
2480c7209beSCédric Le Goater         error_setg(errp, "failed to get flash size");
2490c7209beSCédric Le Goater         return;
2500c7209beSCédric Le Goater     }
2510c7209beSCédric Le Goater 
2520c7209beSCédric Le Goater     if (rom_size > size) {
2530c7209beSCédric Le Goater         rom_size = size;
254d769a1daSCédric Le Goater     }
255d769a1daSCédric Le Goater 
25605e6e40aSWentao_Liang     storage = g_malloc0(rom_size);
257a9262f55SAlberto Faria     if (blk_pread(blk, 0, rom_size, storage, 0) < 0) {
258d769a1daSCédric Le Goater         error_setg(errp, "failed to read the initial flash content");
259d769a1daSCédric Le Goater         return;
260d769a1daSCédric Le Goater     }
261d769a1daSCédric Le Goater 
262d769a1daSCédric Le Goater     rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr);
263d769a1daSCédric Le Goater }
264d769a1daSCédric Le Goater 
265*1099ad10SPeter Delevoryas void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
2669bd4ac61SCédric Le Goater                                       unsigned int count, int unit0)
267e1ad9bc4SCédric Le Goater {
268e1ad9bc4SCédric Le Goater     int i;
269179b2058SPatrick Williams 
270179b2058SPatrick Williams     if (!flashtype) {
271179b2058SPatrick Williams         return;
272179b2058SPatrick Williams     }
273e1ad9bc4SCédric Le Goater 
2749bd4ac61SCédric Le Goater     for (i = 0; i < count; ++i) {
2758ec239f2SMarkus Armbruster         DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i);
276e1ad9bc4SCédric Le Goater         qemu_irq cs_line;
277a7d78befSCédric Le Goater         DeviceState *dev;
278e1ad9bc4SCédric Le Goater 
279a7d78befSCédric Le Goater         dev = qdev_new(flashtype);
280e1ad9bc4SCédric Le Goater         if (dinfo) {
281a7d78befSCédric Le Goater             qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo));
282e1ad9bc4SCédric Le Goater         }
283a7d78befSCédric Le Goater         qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal);
284e1ad9bc4SCédric Le Goater 
285a7d78befSCédric Le Goater         cs_line = qdev_get_gpio_in_named(dev, SSI_GPIO_CS, 0);
286e1ad9bc4SCédric Le Goater         sysbus_connect_irq(SYS_BUS_DEVICE(s), i + 1, cs_line);
287e1ad9bc4SCédric Le Goater     }
288e1ad9bc4SCédric Le Goater }
289e1ad9bc4SCédric Le Goater 
290a29e3e12SAndrew Jeffery static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo)
291a29e3e12SAndrew Jeffery {
292a29e3e12SAndrew Jeffery         DeviceState *card;
293a29e3e12SAndrew Jeffery 
294756f739bSPhilippe Mathieu-Daudé         if (!dinfo) {
295756f739bSPhilippe Mathieu-Daudé             return;
296756f739bSPhilippe Mathieu-Daudé         }
2973e80f690SMarkus Armbruster         card = qdev_new(TYPE_SD_CARD);
298934df912SMarkus Armbruster         qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
299a29e3e12SAndrew Jeffery                                 &error_fatal);
3003e80f690SMarkus Armbruster         qdev_realize_and_unref(card,
3013e80f690SMarkus Armbruster                                qdev_get_child_bus(DEVICE(sdhci), "sd-bus"),
3023e80f690SMarkus Armbruster                                &error_fatal);
303a29e3e12SAndrew Jeffery }
304a29e3e12SAndrew Jeffery 
305d2b3eaefSPeter Delevoryas static void connect_serial_hds_to_uarts(AspeedMachineState *bmc)
306d2b3eaefSPeter Delevoryas {
307d2b3eaefSPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
308d2b3eaefSPeter Delevoryas     AspeedSoCState *s = &bmc->soc;
309d2b3eaefSPeter Delevoryas     AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
310d2b3eaefSPeter Delevoryas 
311d2b3eaefSPeter Delevoryas     aspeed_soc_uart_set_chr(s, amc->uart_default, serial_hd(0));
312d2b3eaefSPeter Delevoryas     for (int i = 1, uart = ASPEED_DEV_UART1; i < sc->uarts_num; i++, uart++) {
313d2b3eaefSPeter Delevoryas         if (uart == amc->uart_default) {
314d2b3eaefSPeter Delevoryas             continue;
315d2b3eaefSPeter Delevoryas         }
316d2b3eaefSPeter Delevoryas         aspeed_soc_uart_set_chr(s, uart, serial_hd(i));
317d2b3eaefSPeter Delevoryas     }
318d2b3eaefSPeter Delevoryas }
319d2b3eaefSPeter Delevoryas 
320baa4732bSCédric Le Goater static void aspeed_machine_init(MachineState *machine)
321327d8e4eSAndrew Jeffery {
322888b2b03SPhilippe Mathieu-Daudé     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
323baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
324b033271fSCédric Le Goater     AspeedSoCClass *sc;
325d769a1daSCédric Le Goater     DriveInfo *drive0 = drive_get(IF_MTD, 0, 0);
3262bea128cSEddie James     int i;
327d3bad7e7SCédric Le Goater     NICInfo *nd = &nd_table[0];
328327d8e4eSAndrew Jeffery 
3299fc7fc4dSMarkus Armbruster     object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
330327d8e4eSAndrew Jeffery 
331b033271fSCédric Le Goater     sc = ASPEED_SOC_GET_CLASS(&bmc->soc);
332b033271fSCédric Le Goater 
333533eb415SIgor Mammedov     /*
334346160cbSCédric Le Goater      * This will error out if the RAM size is not supported by the
335346160cbSCédric Le Goater      * memory controller of the SoC.
336533eb415SIgor Mammedov      */
3376e504a98SPaolo Bonzini     object_property_set_uint(OBJECT(&bmc->soc), "ram-size", machine->ram_size,
338533eb415SIgor Mammedov                              &error_fatal);
339533eb415SIgor Mammedov 
340d3bad7e7SCédric Le Goater     for (i = 0; i < sc->macs_num; i++) {
341d3bad7e7SCédric Le Goater         if ((amc->macs_mask & (1 << i)) && nd->used) {
342d3bad7e7SCédric Le Goater             qemu_check_nic_model(nd, TYPE_FTGMAC100);
343d3bad7e7SCédric Le Goater             qdev_set_nic_properties(DEVICE(&bmc->soc.ftgmac100[i]), nd);
344d3bad7e7SCédric Le Goater             nd++;
345d3bad7e7SCédric Le Goater         }
346d3bad7e7SCédric Le Goater     }
347d3bad7e7SCédric Le Goater 
3485325cc34SMarkus Armbruster     object_property_set_int(OBJECT(&bmc->soc), "hw-strap1", amc->hw_strap1,
34987e79af0SAndrew Jeffery                             &error_abort);
3505325cc34SMarkus Armbruster     object_property_set_int(OBJECT(&bmc->soc), "hw-strap2", amc->hw_strap2,
351ccc2c418SCédric Le Goater                             &error_abort);
3524dd9d554SPeter Delevoryas     object_property_set_link(OBJECT(&bmc->soc), "memory",
3534dd9d554SPeter Delevoryas                              OBJECT(get_system_memory()), &error_abort);
3545325cc34SMarkus Armbruster     object_property_set_link(OBJECT(&bmc->soc), "dram",
3550df2d9a6SCédric Le Goater                              OBJECT(machine->ram), &error_abort);
356b6e70d1dSJoel Stanley     if (machine->kernel_filename) {
357b6e70d1dSJoel Stanley         /*
358b6e70d1dSJoel Stanley          * When booting with a -kernel command line there is no u-boot
359b6e70d1dSJoel Stanley          * that runs to unlock the SCU. In this case set the default to
360b6e70d1dSJoel Stanley          * be unlocked as the kernel expects
361b6e70d1dSJoel Stanley          */
3625325cc34SMarkus Armbruster         object_property_set_int(OBJECT(&bmc->soc), "hw-prot-key",
3635325cc34SMarkus Armbruster                                 ASPEED_SCU_PROT_KEY, &error_abort);
364b6e70d1dSJoel Stanley     }
365d2b3eaefSPeter Delevoryas     connect_serial_hds_to_uarts(bmc);
366ce189ab2SMarkus Armbruster     qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
367327d8e4eSAndrew Jeffery 
3688ec239f2SMarkus Armbruster     aspeed_board_init_flashes(&bmc->soc.fmc,
3698ec239f2SMarkus Armbruster                               bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
3709bd4ac61SCédric Le Goater                               amc->num_cs, 0);
3718ec239f2SMarkus Armbruster     aspeed_board_init_flashes(&bmc->soc.spi[0],
3728ec239f2SMarkus Armbruster                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
3739bd4ac61SCédric Le Goater                               1, amc->num_cs);
374e1ad9bc4SCédric Le Goater 
375d769a1daSCédric Le Goater     /* Install first FMC flash content as a boot rom. */
376d769a1daSCédric Le Goater     if (drive0) {
377d769a1daSCédric Le Goater         AspeedSMCFlash *fl = &bmc->soc.fmc.flashes[0];
378d769a1daSCédric Le Goater         MemoryRegion *boot_rom = g_new(MemoryRegion, 1);
3796bb55e79SCédric Le Goater         uint64_t size = memory_region_size(&fl->mmio);
380d769a1daSCédric Le Goater 
381d769a1daSCédric Le Goater         /*
382d769a1daSCédric Le Goater          * create a ROM region using the default mapping window size of
38393bf276dSCédric Le Goater          * the flash module. The window size is 64MB for the AST2400
38493bf276dSCédric Le Goater          * SoC and 128MB for the AST2500 SoC, which is twice as big as
38593bf276dSCédric Le Goater          * needed by the flash modules of the Aspeed machines.
386d769a1daSCédric Le Goater          */
3871a15311aSCédric Le Goater         if (ASPEED_MACHINE(machine)->mmio_exec) {
388f489960dSPhilippe Mathieu-Daudé             memory_region_init_alias(boot_rom, NULL, "aspeed.boot_rom",
3896bb55e79SCédric Le Goater                                      &fl->mmio, 0, size);
3901a15311aSCédric Le Goater             memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
3911a15311aSCédric Le Goater                                         boot_rom);
3921a15311aSCédric Le Goater         } else {
393f489960dSPhilippe Mathieu-Daudé             memory_region_init_rom(boot_rom, NULL, "aspeed.boot_rom",
3946bb55e79SCédric Le Goater                                    size, &error_abort);
395d769a1daSCédric Le Goater             memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
396d769a1daSCédric Le Goater                                         boot_rom);
3976bb55e79SCédric Le Goater             write_boot_rom(drive0, FIRMWARE_ADDR, size, &error_abort);
398d769a1daSCédric Le Goater         }
3991a15311aSCédric Le Goater     }
400d769a1daSCédric Le Goater 
401b7f1a0cbSCédric Le Goater     if (machine->kernel_filename && sc->num_cpus > 1) {
4029bb6d140SJoel Stanley         /* With no u-boot we must set up a boot stub for the secondary CPU */
4039bb6d140SJoel Stanley         MemoryRegion *smpboot = g_new(MemoryRegion, 1);
404f489960dSPhilippe Mathieu-Daudé         memory_region_init_ram(smpboot, NULL, "aspeed.smpboot",
4059bb6d140SJoel Stanley                                0x80, &error_abort);
4069bb6d140SJoel Stanley         memory_region_add_subregion(get_system_memory(),
4079bb6d140SJoel Stanley                                     AST_SMP_MAILBOX_BASE, smpboot);
4089bb6d140SJoel Stanley 
4099bb6d140SJoel Stanley         aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot;
4109bb6d140SJoel Stanley         aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary;
4119bb6d140SJoel Stanley         aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE;
4129bb6d140SJoel Stanley     }
4139bb6d140SJoel Stanley 
4146e504a98SPaolo Bonzini     aspeed_board_binfo.ram_size = machine->ram_size;
415347df6f8SEduardo Habkost     aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM];
416b033271fSCédric Le Goater 
417baa4732bSCédric Le Goater     if (amc->i2c_init) {
418baa4732bSCédric Le Goater         amc->i2c_init(bmc);
4192cf6cb50SCédric Le Goater     }
4202cf6cb50SCédric Le Goater 
4210e2c24c6SAndrew Jeffery     for (i = 0; i < bmc->soc.sdhci.num_slots; i++) {
4228ec239f2SMarkus Armbruster         sdhci_attach_drive(&bmc->soc.sdhci.slots[i],
4238ec239f2SMarkus Armbruster                            drive_get(IF_SD, 0, i));
424a29e3e12SAndrew Jeffery     }
4252bea128cSEddie James 
426a29e3e12SAndrew Jeffery     if (bmc->soc.emmc.num_slots) {
4278ec239f2SMarkus Armbruster         sdhci_attach_drive(&bmc->soc.emmc.slots[0],
4288ec239f2SMarkus Armbruster                            drive_get(IF_SD, 0, bmc->soc.sdhci.num_slots));
4292bea128cSEddie James     }
4302bea128cSEddie James 
4312744ece8STao Xu     arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo);
432327d8e4eSAndrew Jeffery }
433327d8e4eSAndrew Jeffery 
43482b6a3f6SJohn Wang static void at24c_eeprom_init(I2CBus *bus, uint8_t addr, uint32_t rsize)
43582b6a3f6SJohn Wang {
43682b6a3f6SJohn Wang     I2CSlave *i2c_dev = i2c_slave_new("at24c-eeprom", addr);
43782b6a3f6SJohn Wang     DeviceState *dev = DEVICE(i2c_dev);
43882b6a3f6SJohn Wang 
43982b6a3f6SJohn Wang     qdev_prop_set_uint32(dev, "rom-size", rsize);
44082b6a3f6SJohn Wang     i2c_slave_realize_and_unref(i2c_dev, bus, &error_abort);
44182b6a3f6SJohn Wang }
44282b6a3f6SJohn Wang 
443612b219aSPhilippe Mathieu-Daudé static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
4442cf6cb50SCédric Le Goater {
4452cf6cb50SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
446a87e81b9SCédric Le Goater     DeviceState *dev;
4473d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
4482cf6cb50SCédric Le Goater 
4492cf6cb50SCédric Le Goater     /* The palmetto platform expects a ds3231 RTC but a ds1338 is
4502cf6cb50SCédric Le Goater      * enough to provide basic RTC features. Alarms will be missing */
4511373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
452a87e81b9SCédric Le Goater 
4537a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
4543d165f12SCédric Le Goater                           eeprom_buf);
4553d165f12SCédric Le Goater 
456a87e81b9SCédric Le Goater     /* add a TMP423 temperature sensor */
4571373b15bSPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
4581373b15bSPhilippe Mathieu-Daudé                                          "tmp423", 0x4c));
4595325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
4605325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
4615325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
4625325cc34SMarkus Armbruster     object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort);
4632cf6cb50SCédric Le Goater }
4642cf6cb50SCédric Le Goater 
4659cccb912SPatrick Venture static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc)
4669cccb912SPatrick Venture {
4679cccb912SPatrick Venture     AspeedSoCState *soc = &bmc->soc;
4689cccb912SPatrick Venture 
4699cccb912SPatrick Venture     /*
4709cccb912SPatrick Venture      * The quanta-q71l platform expects tmp75s which are compatible with
4719cccb912SPatrick Venture      * tmp105s.
4729cccb912SPatrick Venture      */
4739cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c);
4749cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e);
4759cccb912SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f);
4769cccb912SPatrick Venture 
4779cccb912SPatrick Venture     /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */
4789cccb912SPatrick Venture     /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */
4799cccb912SPatrick Venture     /* TODO: Add Memory Riser i2c mux and eeproms. */
4809cccb912SPatrick Venture 
4813ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74);
4823ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77);
4833ec75e39SPatrick Venture 
4849cccb912SPatrick Venture     /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */
4853ec75e39SPatrick Venture 
4863ec75e39SPatrick Venture     /* i2c-7 */
4873ec75e39SPatrick Venture     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70);
4889cccb912SPatrick Venture     /*        - i2c@0: pmbus@59 */
4899cccb912SPatrick Venture     /*        - i2c@1: pmbus@58 */
4909cccb912SPatrick Venture     /*        - i2c@2: pmbus@58 */
4919cccb912SPatrick Venture     /*        - i2c@3: pmbus@59 */
4923ec75e39SPatrick Venture 
4939cccb912SPatrick Venture     /* TODO: i2c-7: Add PDB FRU eeprom@52 */
4949cccb912SPatrick Venture     /* TODO: i2c-8: Add BMC FRU eeprom@50 */
4959cccb912SPatrick Venture }
4969cccb912SPatrick Venture 
497612b219aSPhilippe Mathieu-Daudé static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
4982cf6cb50SCédric Le Goater {
4992cf6cb50SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
5003d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
5013d165f12SCédric Le Goater 
5027a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50,
5033d165f12SCédric Le Goater                           eeprom_buf);
5042cf6cb50SCédric Le Goater 
5052cf6cb50SCédric Le Goater     /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
5061373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
507044475f3SPhilippe Mathieu-Daudé                      TYPE_TMP105, 0x4d);
5082cf6cb50SCédric Le Goater }
5092cf6cb50SCédric Le Goater 
510612b219aSPhilippe Mathieu-Daudé static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
511ccc2c418SCédric Le Goater {
51252bcd997SHoward Chiu     AspeedSoCState *soc = &bmc->soc;
51352bcd997SHoward Chiu     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
51452bcd997SHoward Chiu 
51552bcd997SHoward Chiu     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50,
51652bcd997SHoward Chiu                           eeprom_buf);
51752bcd997SHoward Chiu 
51852bcd997SHoward Chiu     /* LM75 is compatible with TMP105 driver */
51952bcd997SHoward Chiu     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
52052bcd997SHoward Chiu                      TYPE_TMP105, 0x4d);
521ccc2c418SCédric Le Goater }
522ccc2c418SCédric Le Goater 
523612b219aSPhilippe Mathieu-Daudé static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
5246c4567c7SCédric Le Goater {
5256c4567c7SCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
5266c4567c7SCédric Le Goater 
5276c4567c7SCédric Le Goater     /* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
5286c4567c7SCédric Le Goater      * good enough */
5291373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
5306c4567c7SCédric Le Goater }
5316c4567c7SCédric Le Goater 
532f4aec252SCédric Le Goater static void create_pca9552(AspeedSoCState *soc, int bus_id, int addr)
533f4aec252SCédric Le Goater {
534f4aec252SCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, bus_id),
535f4aec252SCédric Le Goater                             TYPE_PCA9552, addr);
536f4aec252SCédric Le Goater }
537f4aec252SCédric Le Goater 
538612b219aSPhilippe Mathieu-Daudé static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc)
539143b040fSPatrick Williams {
540143b040fSPatrick Williams     AspeedSoCState *soc = &bmc->soc;
541143b040fSPatrick Williams 
542143b040fSPatrick Williams     /* bus 2 : */
5431373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48);
5441373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49);
545143b040fSPatrick Williams     /* bus 2 : pca9546 @ 0x73 */
546143b040fSPatrick Williams 
547143b040fSPatrick Williams     /* bus 3 : pca9548 @ 0x70 */
548143b040fSPatrick Williams 
549143b040fSPatrick Williams     /* bus 4 : */
550143b040fSPatrick Williams     uint8_t *eeprom4_54 = g_malloc0(8 * 1024);
5517a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54,
552143b040fSPatrick Williams                           eeprom4_54);
553143b040fSPatrick Williams     /* PCA9539 @ 0x76, but PCA9552 is compatible */
554f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x76);
555143b040fSPatrick Williams     /* PCA9539 @ 0x77, but PCA9552 is compatible */
556f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x77);
557143b040fSPatrick Williams 
558143b040fSPatrick Williams     /* bus 6 : */
5591373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48);
5601373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49);
561143b040fSPatrick Williams     /* bus 6 : pca9546 @ 0x73 */
562143b040fSPatrick Williams 
563143b040fSPatrick Williams     /* bus 8 : */
564143b040fSPatrick Williams     uint8_t *eeprom8_56 = g_malloc0(8 * 1024);
5657a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56,
566143b040fSPatrick Williams                           eeprom8_56);
567f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x60);
568f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x61);
569143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1d */
570143b040fSPatrick Williams     /* bus 8 : adc128d818 @ 0x1f */
571143b040fSPatrick Williams 
572143b040fSPatrick Williams     /*
573143b040fSPatrick Williams      * bus 13 : pca9548 @ 0x71
574143b040fSPatrick Williams      *      - channel 3:
575143b040fSPatrick Williams      *          - tmm421 @ 0x4c
576143b040fSPatrick Williams      *          - tmp421 @ 0x4e
577143b040fSPatrick Williams      *          - tmp421 @ 0x4f
578143b040fSPatrick Williams      */
579143b040fSPatrick Williams 
580143b040fSPatrick Williams }
581143b040fSPatrick Williams 
582612b219aSPhilippe Mathieu-Daudé static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
58362c2c2ebSCédric Le Goater {
5847cfbde5eSPhilippe Mathieu-Daudé     static const struct {
5857cfbde5eSPhilippe Mathieu-Daudé         unsigned gpio_id;
5867cfbde5eSPhilippe Mathieu-Daudé         LEDColor color;
5877cfbde5eSPhilippe Mathieu-Daudé         const char *description;
5887cfbde5eSPhilippe Mathieu-Daudé         bool gpio_polarity;
5897cfbde5eSPhilippe Mathieu-Daudé     } pca1_leds[] = {
5907cfbde5eSPhilippe Mathieu-Daudé         {13, LED_COLOR_GREEN, "front-fault-4",  GPIO_POLARITY_ACTIVE_LOW},
5917cfbde5eSPhilippe Mathieu-Daudé         {14, LED_COLOR_GREEN, "front-power-3",  GPIO_POLARITY_ACTIVE_LOW},
5927cfbde5eSPhilippe Mathieu-Daudé         {15, LED_COLOR_GREEN, "front-id-5",     GPIO_POLARITY_ACTIVE_LOW},
5937cfbde5eSPhilippe Mathieu-Daudé     };
59462c2c2ebSCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
5953d165f12SCédric Le Goater     uint8_t *eeprom_buf = g_malloc0(8 * 1024);
59615ce12cfSPhilippe Mathieu-Daudé     DeviceState *dev;
5977cfbde5eSPhilippe Mathieu-Daudé     LEDState *led;
59862c2c2ebSCédric Le Goater 
59963ceb818SCédric Le Goater     /* Bus 3: TODO bmp280@77 */
600db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
60115ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca1");
6022616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
6032616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 3),
60415ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
6058c9a61d7SCédric Le Goater 
6067cfbde5eSPhilippe Mathieu-Daudé     for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) {
6077cfbde5eSPhilippe Mathieu-Daudé         led = led_create_simple(OBJECT(bmc),
6087cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].gpio_polarity,
6097cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].color,
6107cfbde5eSPhilippe Mathieu-Daudé                                 pca1_leds[i].description);
6117cfbde5eSPhilippe Mathieu-Daudé         qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id,
6127cfbde5eSPhilippe Mathieu-Daudé                               qdev_get_gpio_in(DEVICE(led), 0));
6137cfbde5eSPhilippe Mathieu-Daudé     }
614b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76);
6152a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "max31785", 0x52);
6161373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c);
6171373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c);
61862c2c2ebSCédric Le Goater 
61962c2c2ebSCédric Le Goater     /* The Witherspoon expects a TMP275 but a TMP105 is compatible */
6201373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105,
621044475f3SPhilippe Mathieu-Daudé                      0x4a);
6226c4567c7SCédric Le Goater 
6236c4567c7SCédric Le Goater     /* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
6246c4567c7SCédric Le Goater      * good enough */
6251373b15bSPhilippe Mathieu-Daudé     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
6263d165f12SCédric Le Goater 
6277a204cbdSPhilippe Mathieu-Daudé     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51,
6283d165f12SCédric Le Goater                           eeprom_buf);
629db437ca6SPhilippe Mathieu-Daudé     dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
63015ce12cfSPhilippe Mathieu-Daudé     qdev_prop_set_string(dev, "description", "pca0");
6312616f572SPhilippe Mathieu-Daudé     i2c_slave_realize_and_unref(I2C_SLAVE(dev),
6322616f572SPhilippe Mathieu-Daudé                                 aspeed_i2c_get_bus(&soc->i2c, 11),
63315ce12cfSPhilippe Mathieu-Daudé                                 &error_fatal);
63463ceb818SCédric Le Goater     /* Bus 11: TODO ucd90160@64 */
63562c2c2ebSCédric Le Goater }
63662c2c2ebSCédric Le Goater 
63795f068c8SJohn Wang static void g220a_bmc_i2c_init(AspeedMachineState *bmc)
63895f068c8SJohn Wang {
63995f068c8SJohn Wang     AspeedSoCState *soc = &bmc->soc;
64095f068c8SJohn Wang     DeviceState *dev;
64195f068c8SJohn Wang 
64295f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3),
64395f068c8SJohn Wang                                          "emc1413", 0x4c));
64495f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
64595f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
64695f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
64795f068c8SJohn Wang 
64895f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12),
64995f068c8SJohn Wang                                          "emc1413", 0x4c));
65095f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
65195f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
65295f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
65395f068c8SJohn Wang 
65495f068c8SJohn Wang     dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13),
65595f068c8SJohn Wang                                          "emc1413", 0x4c));
65695f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
65795f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
65895f068c8SJohn Wang     object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
6596f5f6507SJohn Wang 
6606f5f6507SJohn Wang     static uint8_t eeprom_buf[2 * 1024] = {
6616f5f6507SJohn Wang             0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe,
6626f5f6507SJohn Wang             0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65,
6636f5f6507SJohn Wang             0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32,
6646f5f6507SJohn Wang             0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42,
6656f5f6507SJohn Wang             0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45,
6666f5f6507SJohn Wang             0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1,
6676f5f6507SJohn Wang             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7,
6686f5f6507SJohn Wang     };
6696f5f6507SJohn Wang     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57,
6706f5f6507SJohn Wang                           eeprom_buf);
67195f068c8SJohn Wang }
67295f068c8SJohn Wang 
673fa6d98c0SJoel Stanley static void aspeed_eeprom_init(I2CBus *bus, uint8_t addr, uint32_t rsize)
674fa6d98c0SJoel Stanley {
675fa6d98c0SJoel Stanley     I2CSlave *i2c_dev = i2c_slave_new("at24c-eeprom", addr);
676fa6d98c0SJoel Stanley     DeviceState *dev = DEVICE(i2c_dev);
677fa6d98c0SJoel Stanley 
678fa6d98c0SJoel Stanley     qdev_prop_set_uint32(dev, "rom-size", rsize);
679fa6d98c0SJoel Stanley     i2c_slave_realize_and_unref(i2c_dev, bus, &error_abort);
680fa6d98c0SJoel Stanley }
681fa6d98c0SJoel Stanley 
68282b6a3f6SJohn Wang static void fp5280g2_bmc_i2c_init(AspeedMachineState *bmc)
68382b6a3f6SJohn Wang {
68482b6a3f6SJohn Wang     AspeedSoCState *soc = &bmc->soc;
68582b6a3f6SJohn Wang     I2CSlave *i2c_mux;
68682b6a3f6SJohn Wang 
68782b6a3f6SJohn Wang     /* The at24c256 */
68882b6a3f6SJohn Wang     at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 1), 0x50, 32768);
68982b6a3f6SJohn Wang 
69082b6a3f6SJohn Wang     /* The fp5280g2 expects a TMP112 but a TMP105 is compatible */
69182b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
69282b6a3f6SJohn Wang                      0x48);
69382b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105,
69482b6a3f6SJohn Wang                      0x49);
69582b6a3f6SJohn Wang 
69682b6a3f6SJohn Wang     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
69782b6a3f6SJohn Wang                      "pca9546", 0x70);
69882b6a3f6SJohn Wang     /* It expects a TMP112 but a TMP105 is compatible */
69982b6a3f6SJohn Wang     i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0), TYPE_TMP105,
70082b6a3f6SJohn Wang                      0x4a);
70182b6a3f6SJohn Wang 
70282b6a3f6SJohn Wang     /* It expects a ds3232 but a ds1338 is good enough */
70382b6a3f6SJohn Wang     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "ds1338", 0x68);
70482b6a3f6SJohn Wang 
70582b6a3f6SJohn Wang     /* It expects a pca9555 but a pca9552 is compatible */
706f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x30);
70782b6a3f6SJohn Wang }
70882b6a3f6SJohn Wang 
70958e52bdbSCédric Le Goater static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
71058e52bdbSCédric Le Goater {
71158e52bdbSCédric Le Goater     AspeedSoCState *soc = &bmc->soc;
712fa6d98c0SJoel Stanley     I2CSlave *i2c_mux;
713fa6d98c0SJoel Stanley 
714fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB);
71558e52bdbSCédric Le Goater 
716f4aec252SCédric Le Goater     create_pca9552(soc, 3, 0x61);
717bcb122f8SJoel Stanley 
71858e52bdbSCédric Le Goater     /* The rainier expects a TMP275 but a TMP105 is compatible */
71958e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
72058e52bdbSCédric Le Goater                      0x48);
72158e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
72258e52bdbSCédric Le Goater                      0x49);
72358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
72458e52bdbSCédric Le Goater                      0x4a);
725fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4),
726fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
727fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
728fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
729fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB);
730f4aec252SCédric Le Goater     create_pca9552(soc, 4, 0x60);
73158e52bdbSCédric Le Goater 
73258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
73358e52bdbSCédric Le Goater                      0x48);
73458e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
73558e52bdbSCédric Le Goater                      0x49);
736f4aec252SCédric Le Goater     create_pca9552(soc, 5, 0x60);
737f4aec252SCédric Le Goater     create_pca9552(soc, 5, 0x61);
738fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5),
739fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
740fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
741fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
74258e52bdbSCédric Le Goater 
74358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
74458e52bdbSCédric Le Goater                      0x48);
74558e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
74658e52bdbSCédric Le Goater                      0x4a);
74758e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
74858e52bdbSCédric Le Goater                      0x4b);
749fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6),
750fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
751fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
752fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
753fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB);
754fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB);
75558e52bdbSCédric Le Goater 
756f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x30);
757f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x31);
758f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x32);
759f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x33);
760f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x60);
761f4aec252SCédric Le Goater     create_pca9552(soc, 7, 0x61);
762b61ea6e7SJoel Stanley     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76);
76358e52bdbSCédric Le Goater     /* Bus 7: TODO si7021-a20@20 */
76458e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105,
76558e52bdbSCédric Le Goater                      0x48);
7662a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "max31785", 0x52);
767fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB);
768fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB);
76958e52bdbSCédric Le Goater 
77058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
77158e52bdbSCédric Le Goater                      0x48);
77258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
77358e52bdbSCédric Le Goater                      0x4a);
774fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50, 64 * KiB);
775fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 64 * KiB);
776f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x60);
777f4aec252SCédric Le Goater     create_pca9552(soc, 8, 0x61);
77858e52bdbSCédric Le Goater     /* Bus 8: ucd90320@11 */
77958e52bdbSCédric Le Goater     /* Bus 8: ucd90320@b */
78058e52bdbSCédric Le Goater     /* Bus 8: ucd90320@c */
78158e52bdbSCédric Le Goater 
78258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c);
78358e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d);
784fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB);
78558e52bdbSCédric Le Goater 
78658e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c);
78758e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d);
788fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB);
78958e52bdbSCédric Le Goater 
79058e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
79158e52bdbSCédric Le Goater                      0x48);
79258e52bdbSCédric Le Goater     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
79358e52bdbSCédric Le Goater                      0x49);
794fa6d98c0SJoel Stanley     i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11),
795fa6d98c0SJoel Stanley                                       "pca9546", 0x70);
796fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
797fa6d98c0SJoel Stanley     aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
798f4aec252SCédric Le Goater     create_pca9552(soc, 11, 0x60);
799fa6d98c0SJoel Stanley 
800fa6d98c0SJoel Stanley 
801fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB);
802f4aec252SCédric Le Goater     create_pca9552(soc, 13, 0x60);
803fa6d98c0SJoel Stanley 
804fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB);
805f4aec252SCédric Le Goater     create_pca9552(soc, 14, 0x60);
806fa6d98c0SJoel Stanley 
807fa6d98c0SJoel Stanley     aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB);
808f4aec252SCédric Le Goater     create_pca9552(soc, 15, 0x60);
80958e52bdbSCédric Le Goater }
81058e52bdbSCédric Le Goater 
811febbe308SPeter Delevoryas static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr,
812febbe308SPeter Delevoryas                                  I2CBus **channels)
813febbe308SPeter Delevoryas {
814febbe308SPeter Delevoryas     I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr);
815febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
816febbe308SPeter Delevoryas         channels[i] = pca954x_i2c_get_bus(mux, i);
817febbe308SPeter Delevoryas     }
818febbe308SPeter Delevoryas }
819febbe308SPeter Delevoryas 
820febbe308SPeter Delevoryas #define TYPE_LM75 TYPE_TMP105
821febbe308SPeter Delevoryas #define TYPE_TMP75 TYPE_TMP105
822febbe308SPeter Delevoryas #define TYPE_TMP422 "tmp422"
823febbe308SPeter Delevoryas 
824febbe308SPeter Delevoryas static void fuji_bmc_i2c_init(AspeedMachineState *bmc)
825febbe308SPeter Delevoryas {
826febbe308SPeter Delevoryas     AspeedSoCState *soc = &bmc->soc;
827febbe308SPeter Delevoryas     I2CBus *i2c[144] = {};
828febbe308SPeter Delevoryas 
829febbe308SPeter Delevoryas     for (int i = 0; i < 16; i++) {
830febbe308SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
831febbe308SPeter Delevoryas     }
832febbe308SPeter Delevoryas     I2CBus *i2c180 = i2c[2];
833febbe308SPeter Delevoryas     I2CBus *i2c480 = i2c[8];
834febbe308SPeter Delevoryas     I2CBus *i2c600 = i2c[11];
835febbe308SPeter Delevoryas 
836febbe308SPeter Delevoryas     get_pca9548_channels(i2c180, 0x70, &i2c[16]);
837febbe308SPeter Delevoryas     get_pca9548_channels(i2c480, 0x70, &i2c[24]);
838febbe308SPeter Delevoryas     /* NOTE: The device tree skips [32, 40) in the alias numbering */
839febbe308SPeter Delevoryas     get_pca9548_channels(i2c600, 0x77, &i2c[40]);
840febbe308SPeter Delevoryas     get_pca9548_channels(i2c[24], 0x71, &i2c[48]);
841febbe308SPeter Delevoryas     get_pca9548_channels(i2c[25], 0x72, &i2c[56]);
842febbe308SPeter Delevoryas     get_pca9548_channels(i2c[26], 0x76, &i2c[64]);
843febbe308SPeter Delevoryas     get_pca9548_channels(i2c[27], 0x76, &i2c[72]);
844febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
845febbe308SPeter Delevoryas         get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]);
846febbe308SPeter Delevoryas     }
847febbe308SPeter Delevoryas 
848febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c);
849febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d);
850febbe308SPeter Delevoryas 
851febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[19], 0x52, 64 * KiB);
852febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[20], 0x50, 2 * KiB);
853febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[22], 0x52, 2 * KiB);
854febbe308SPeter Delevoryas 
855febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x48);
856febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x49);
857febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x4a);
858febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[3], TYPE_TMP422, 0x4c);
859febbe308SPeter Delevoryas 
860febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[8], 0x51, 64 * KiB);
861febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a);
862febbe308SPeter Delevoryas 
863febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[50], TYPE_LM75, 0x4c);
864febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[50], 0x52, 64 * KiB);
865febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[51], TYPE_TMP75, 0x48);
866febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[52], TYPE_TMP75, 0x49);
867febbe308SPeter Delevoryas 
868febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[59], TYPE_TMP75, 0x48);
869febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[60], TYPE_TMP75, 0x49);
870febbe308SPeter Delevoryas 
871febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[65], 0x53, 64 * KiB);
872febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x49);
873febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x48);
874febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[68], 0x52, 64 * KiB);
875febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[69], 0x52, 64 * KiB);
876febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[70], 0x52, 64 * KiB);
877febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[71], 0x52, 64 * KiB);
878febbe308SPeter Delevoryas 
879febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[73], 0x53, 64 * KiB);
880febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x49);
881febbe308SPeter Delevoryas     i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x48);
882febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[76], 0x52, 64 * KiB);
883febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[77], 0x52, 64 * KiB);
884febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[78], 0x52, 64 * KiB);
885febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[79], 0x52, 64 * KiB);
886febbe308SPeter Delevoryas     aspeed_eeprom_init(i2c[28], 0x50, 2 * KiB);
887febbe308SPeter Delevoryas 
888febbe308SPeter Delevoryas     for (int i = 0; i < 8; i++) {
889febbe308SPeter Delevoryas         aspeed_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB);
890febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[82 + i * 8], TYPE_TMP75, 0x48);
891febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[83 + i * 8], TYPE_TMP75, 0x4b);
892febbe308SPeter Delevoryas         i2c_slave_create_simple(i2c[84 + i * 8], TYPE_TMP75, 0x4a);
893febbe308SPeter Delevoryas     }
894febbe308SPeter Delevoryas }
895febbe308SPeter Delevoryas 
896a20c54b1SPatrick Williams #define TYPE_TMP421 "tmp421"
897a20c54b1SPatrick Williams 
898a20c54b1SPatrick Williams static void bletchley_bmc_i2c_init(AspeedMachineState *bmc)
899a20c54b1SPatrick Williams {
900a20c54b1SPatrick Williams     AspeedSoCState *soc = &bmc->soc;
901a20c54b1SPatrick Williams     I2CBus *i2c[13] = {};
902a20c54b1SPatrick Williams     for (int i = 0; i < 13; i++) {
903a20c54b1SPatrick Williams         if ((i == 8) || (i == 11)) {
904a20c54b1SPatrick Williams             continue;
905a20c54b1SPatrick Williams         }
906a20c54b1SPatrick Williams         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
907a20c54b1SPatrick Williams     }
908a20c54b1SPatrick Williams 
909a20c54b1SPatrick Williams     /* Bus 0 - 5 all have the same config. */
910a20c54b1SPatrick Williams     for (int i = 0; i < 6; i++) {
911a20c54b1SPatrick Williams         /* Missing model: ti,ina230 @ 0x45 */
912a20c54b1SPatrick Williams         /* Missing model: mps,mp5023 @ 0x40 */
913a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_TMP421, 0x4f);
914a20c54b1SPatrick Williams         /* Missing model: nxp,pca9539 @ 0x76, but PCA9552 works enough */
915a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x76);
916a20c54b1SPatrick Williams         i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x67);
917a20c54b1SPatrick Williams         /* Missing model: fsc,fusb302 @ 0x22 */
918a20c54b1SPatrick Williams     }
919a20c54b1SPatrick Williams 
920a20c54b1SPatrick Williams     /* Bus 6 */
921a20c54b1SPatrick Williams     at24c_eeprom_init(i2c[6], 0x56, 65536);
922a20c54b1SPatrick Williams     /* Missing model: nxp,pcf85263 @ 0x51 , but ds1338 works enough */
923a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[6], "ds1338", 0x51);
924a20c54b1SPatrick Williams 
925a20c54b1SPatrick Williams 
926a20c54b1SPatrick Williams     /* Bus 7 */
927a20c54b1SPatrick Williams     at24c_eeprom_init(i2c[7], 0x54, 65536);
928a20c54b1SPatrick Williams 
929a20c54b1SPatrick Williams     /* Bus 9 */
930a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[9], TYPE_TMP421, 0x4f);
931a20c54b1SPatrick Williams 
932a20c54b1SPatrick Williams     /* Bus 10 */
933a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[10], TYPE_TMP421, 0x4f);
934a20c54b1SPatrick Williams     /* Missing model: ti,hdc1080 @ 0x40 */
935a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[10], TYPE_PCA9552, 0x67);
936a20c54b1SPatrick Williams 
937a20c54b1SPatrick Williams     /* Bus 12 */
938a20c54b1SPatrick Williams     /* Missing model: adi,adm1278 @ 0x11 */
939a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4c);
940a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4d);
941a20c54b1SPatrick Williams     i2c_slave_create_simple(i2c[12], TYPE_PCA9552, 0x67);
942a20c54b1SPatrick Williams }
943a20c54b1SPatrick Williams 
944fa699e80SPeter Delevoryas static void fby35_i2c_init(AspeedMachineState *bmc)
945fa699e80SPeter Delevoryas {
946fa699e80SPeter Delevoryas     AspeedSoCState *soc = &bmc->soc;
947fa699e80SPeter Delevoryas     I2CBus *i2c[16];
948fa699e80SPeter Delevoryas 
949fa699e80SPeter Delevoryas     for (int i = 0; i < 16; i++) {
950fa699e80SPeter Delevoryas         i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
951fa699e80SPeter Delevoryas     }
952fa699e80SPeter Delevoryas 
953fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[2], TYPE_LM75, 0x4f);
954fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[8], TYPE_TMP421, 0x1f);
955fa699e80SPeter Delevoryas     /* Hotswap controller is actually supposed to be mp5920 or ltc4282. */
956fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[11], "adm1272", 0x44);
957fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4e);
958fa699e80SPeter Delevoryas     i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4f);
959fa699e80SPeter Delevoryas 
960fa699e80SPeter Delevoryas     aspeed_eeprom_init(i2c[4], 0x51, 128 * KiB);
961fa699e80SPeter Delevoryas     aspeed_eeprom_init(i2c[6], 0x51, 128 * KiB);
962fa699e80SPeter Delevoryas     aspeed_eeprom_init(i2c[8], 0x50, 32 * KiB);
963fa699e80SPeter Delevoryas     aspeed_eeprom_init(i2c[11], 0x51, 128 * KiB);
964fa699e80SPeter Delevoryas     aspeed_eeprom_init(i2c[11], 0x54, 128 * KiB);
965fa699e80SPeter Delevoryas 
966fa699e80SPeter Delevoryas     /*
967fa699e80SPeter Delevoryas      * TODO: There is a multi-master i2c connection to an AST1030 MiniBMC on
968fa699e80SPeter Delevoryas      * buses 0, 1, 2, 3, and 9. Source address 0x10, target address 0x20 on
969fa699e80SPeter Delevoryas      * each.
970fa699e80SPeter Delevoryas      */
971fa699e80SPeter Delevoryas }
972fa699e80SPeter Delevoryas 
973fb6b3c8dSJae Hyun Yoo static void qcom_dc_scm_bmc_i2c_init(AspeedMachineState *bmc)
974fb6b3c8dSJae Hyun Yoo {
975fb6b3c8dSJae Hyun Yoo     AspeedSoCState *soc = &bmc->soc;
976fb6b3c8dSJae Hyun Yoo 
977fb6b3c8dSJae Hyun Yoo     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 15), "tmp105", 0x4d);
978fb6b3c8dSJae Hyun Yoo }
979fb6b3c8dSJae Hyun Yoo 
980ece4cccdSGraeme Gregory static void qcom_dc_scm_firework_i2c_init(AspeedMachineState *bmc)
981ece4cccdSGraeme Gregory {
982ece4cccdSGraeme Gregory     AspeedSoCState *soc = &bmc->soc;
9832a7a5d5cSJae Hyun Yoo     I2CSlave *therm_mux, *cpuvr_mux;
984ece4cccdSGraeme Gregory 
985ece4cccdSGraeme Gregory     /* Create the generic DC-SCM hardware */
986ece4cccdSGraeme Gregory     qcom_dc_scm_bmc_i2c_init(bmc);
987ece4cccdSGraeme Gregory 
988ece4cccdSGraeme Gregory     /* Now create the Firework specific hardware */
9892a75e8c3SMaheswara Kurapati 
9902a7a5d5cSJae Hyun Yoo     /* I2C7 CPUVR MUX */
9912a7a5d5cSJae Hyun Yoo     cpuvr_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
9922a7a5d5cSJae Hyun Yoo                                         "pca9546", 0x70);
9932a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 0), "pca9548", 0x72);
9942a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 1), "pca9548", 0x72);
9952a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 2), "pca9548", 0x72);
9962a7a5d5cSJae Hyun Yoo     i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 3), "pca9548", 0x72);
9972a7a5d5cSJae Hyun Yoo 
998cfc68f16SMaheswara Kurapati     /* I2C8 Thermal Diodes*/
999cfc68f16SMaheswara Kurapati     therm_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
1000cfc68f16SMaheswara Kurapati                                         "pca9548", 0x70);
1001cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 0), TYPE_LM75, 0x4C);
1002cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 1), TYPE_LM75, 0x4C);
1003cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 2), TYPE_LM75, 0x48);
1004cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 3), TYPE_LM75, 0x48);
1005cfc68f16SMaheswara Kurapati     i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 4), TYPE_LM75, 0x48);
1006cfc68f16SMaheswara Kurapati 
10072a75e8c3SMaheswara Kurapati     /* I2C9 Fan Controller (MAX31785) */
10082a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x52);
10092a75e8c3SMaheswara Kurapati     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x54);
1010ece4cccdSGraeme Gregory }
1011ece4cccdSGraeme Gregory 
10121a15311aSCédric Le Goater static bool aspeed_get_mmio_exec(Object *obj, Error **errp)
10131a15311aSCédric Le Goater {
10141a15311aSCédric Le Goater     return ASPEED_MACHINE(obj)->mmio_exec;
10151a15311aSCédric Le Goater }
10161a15311aSCédric Le Goater 
10171a15311aSCédric Le Goater static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp)
10181a15311aSCédric Le Goater {
10191a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = value;
10201a15311aSCédric Le Goater }
10211a15311aSCédric Le Goater 
10221a15311aSCédric Le Goater static void aspeed_machine_instance_init(Object *obj)
10231a15311aSCédric Le Goater {
10241a15311aSCédric Le Goater     ASPEED_MACHINE(obj)->mmio_exec = false;
10251a15311aSCédric Le Goater }
10261a15311aSCédric Le Goater 
10279820e52fSCédric Le Goater static char *aspeed_get_fmc_model(Object *obj, Error **errp)
10289820e52fSCédric Le Goater {
10299820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10309820e52fSCédric Le Goater     return g_strdup(bmc->fmc_model);
10319820e52fSCédric Le Goater }
10329820e52fSCédric Le Goater 
10339820e52fSCédric Le Goater static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp)
10349820e52fSCédric Le Goater {
10359820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10369820e52fSCédric Le Goater 
10379820e52fSCédric Le Goater     g_free(bmc->fmc_model);
10389820e52fSCédric Le Goater     bmc->fmc_model = g_strdup(value);
10399820e52fSCédric Le Goater }
10409820e52fSCédric Le Goater 
10419820e52fSCédric Le Goater static char *aspeed_get_spi_model(Object *obj, Error **errp)
10429820e52fSCédric Le Goater {
10439820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10449820e52fSCédric Le Goater     return g_strdup(bmc->spi_model);
10459820e52fSCédric Le Goater }
10469820e52fSCédric Le Goater 
10479820e52fSCédric Le Goater static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp)
10489820e52fSCédric Le Goater {
10499820e52fSCédric Le Goater     AspeedMachineState *bmc = ASPEED_MACHINE(obj);
10509820e52fSCédric Le Goater 
10519820e52fSCédric Le Goater     g_free(bmc->spi_model);
10529820e52fSCédric Le Goater     bmc->spi_model = g_strdup(value);
10539820e52fSCédric Le Goater }
10549820e52fSCédric Le Goater 
10551a15311aSCédric Le Goater static void aspeed_machine_class_props_init(ObjectClass *oc)
10561a15311aSCédric Le Goater {
10571a15311aSCédric Le Goater     object_class_property_add_bool(oc, "execute-in-place",
10581a15311aSCédric Le Goater                                    aspeed_get_mmio_exec,
1059d2623129SMarkus Armbruster                                    aspeed_set_mmio_exec);
10601a15311aSCédric Le Goater     object_class_property_set_description(oc, "execute-in-place",
10617eecec7dSMarkus Armbruster                            "boot directly from CE0 flash device");
10629820e52fSCédric Le Goater 
10639820e52fSCédric Le Goater     object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model,
10649820e52fSCédric Le Goater                                    aspeed_set_fmc_model);
10659820e52fSCédric Le Goater     object_class_property_set_description(oc, "fmc-model",
10669820e52fSCédric Le Goater                                           "Change the FMC Flash model");
10679820e52fSCédric Le Goater     object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model,
10689820e52fSCédric Le Goater                                    aspeed_set_spi_model);
10699820e52fSCédric Le Goater     object_class_property_set_description(oc, "spi-model",
10709820e52fSCédric Le Goater                                           "Change the SPI Flash model");
10711a15311aSCédric Le Goater }
10721a15311aSCédric Le Goater 
1073b7f1a0cbSCédric Le Goater static int aspeed_soc_num_cpus(const char *soc_name)
1074b7f1a0cbSCédric Le Goater {
1075b7f1a0cbSCédric Le Goater    AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(soc_name));
1076b7f1a0cbSCédric Le Goater    return sc->num_cpus;
1077b7f1a0cbSCédric Le Goater }
1078b7f1a0cbSCédric Le Goater 
1079fca9ca1bSCédric Le Goater static void aspeed_machine_class_init(ObjectClass *oc, void *data)
108062c2c2ebSCédric Le Goater {
108162c2c2ebSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1082d3bad7e7SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
108362c2c2ebSCédric Le Goater 
1084fca9ca1bSCédric Le Goater     mc->init = aspeed_machine_init;
108562c2c2ebSCédric Le Goater     mc->no_floppy = 1;
108662c2c2ebSCédric Le Goater     mc->no_cdrom = 1;
108762c2c2ebSCédric Le Goater     mc->no_parallel = 1;
1088afcbaed6SIgor Mammedov     mc->default_ram_id = "ram";
1089d3bad7e7SCédric Le Goater     amc->macs_mask = ASPEED_MAC0_ON;
10905d63d0c7SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART5;
10911a15311aSCédric Le Goater 
10921a15311aSCédric Le Goater     aspeed_machine_class_props_init(oc);
109362c2c2ebSCédric Le Goater }
109462c2c2ebSCédric Le Goater 
1095baa4732bSCédric Le Goater static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
1096baa4732bSCédric Le Goater {
1097baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1098baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1099baa4732bSCédric Le Goater 
1100baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Palmetto BMC (ARM926EJ-S)";
1101baa4732bSCédric Le Goater     amc->soc_name  = "ast2400-a1";
1102baa4732bSCédric Le Goater     amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1;
1103baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
1104baa4732bSCédric Le Goater     amc->spi_model = "mx25l25635e";
1105baa4732bSCédric Le Goater     amc->num_cs    = 1;
1106baa4732bSCédric Le Goater     amc->i2c_init  = palmetto_bmc_i2c_init;
1107baa4732bSCédric Le Goater     mc->default_ram_size       = 256 * MiB;
1108b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1109b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1110baa4732bSCédric Le Goater };
1111baa4732bSCédric Le Goater 
11129cccb912SPatrick Venture static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data)
11139cccb912SPatrick Venture {
11149cccb912SPatrick Venture     MachineClass *mc = MACHINE_CLASS(oc);
11159cccb912SPatrick Venture     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
11169cccb912SPatrick Venture 
11179cccb912SPatrick Venture     mc->desc       = "Quanta-Q71l BMC (ARM926EJ-S)";
11189cccb912SPatrick Venture     amc->soc_name  = "ast2400-a1";
11199cccb912SPatrick Venture     amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1;
11209cccb912SPatrick Venture     amc->fmc_model = "n25q256a";
11219cccb912SPatrick Venture     amc->spi_model = "mx25l25635e";
11229cccb912SPatrick Venture     amc->num_cs    = 1;
11239cccb912SPatrick Venture     amc->i2c_init  = quanta_q71l_bmc_i2c_init;
11249cccb912SPatrick Venture     mc->default_ram_size       = 128 * MiB;
11259cccb912SPatrick Venture     mc->default_cpus = mc->min_cpus = mc->max_cpus =
11269cccb912SPatrick Venture         aspeed_soc_num_cpus(amc->soc_name);
11279cccb912SPatrick Venture }
11289cccb912SPatrick Venture 
112940a38df5SErik Smit static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc,
113040a38df5SErik Smit                                                         void *data)
113140a38df5SErik Smit {
113240a38df5SErik Smit     MachineClass *mc = MACHINE_CLASS(oc);
113340a38df5SErik Smit     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
113440a38df5SErik Smit 
113540a38df5SErik Smit     mc->desc       = "Supermicro X11 BMC (ARM926EJ-S)";
113640a38df5SErik Smit     amc->soc_name  = "ast2400-a1";
113740a38df5SErik Smit     amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1;
113840a38df5SErik Smit     amc->fmc_model = "mx25l25635e";
113940a38df5SErik Smit     amc->spi_model = "mx25l25635e";
114040a38df5SErik Smit     amc->num_cs    = 1;
114140a38df5SErik Smit     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
114240a38df5SErik Smit     amc->i2c_init  = palmetto_bmc_i2c_init;
114340a38df5SErik Smit     mc->default_ram_size = 256 * MiB;
114440a38df5SErik Smit }
114540a38df5SErik Smit 
1146baa4732bSCédric Le Goater static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data)
1147baa4732bSCédric Le Goater {
1148baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1149baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1150baa4732bSCédric Le Goater 
1151baa4732bSCédric Le Goater     mc->desc       = "Aspeed AST2500 EVB (ARM1176)";
1152baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1153baa4732bSCédric Le Goater     amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
1154753abfc4SJae Hyun Yoo     amc->fmc_model = "mx25l25635e";
1155baa4732bSCédric Le Goater     amc->spi_model = "mx25l25635e";
1156baa4732bSCédric Le Goater     amc->num_cs    = 1;
1157baa4732bSCédric Le Goater     amc->i2c_init  = ast2500_evb_i2c_init;
1158baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
1159b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1160b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1161baa4732bSCédric Le Goater };
1162baa4732bSCédric Le Goater 
1163baa4732bSCédric Le Goater static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data)
1164baa4732bSCédric Le Goater {
1165baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1166baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1167baa4732bSCédric Le Goater 
1168baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Romulus BMC (ARM1176)";
1169baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1170baa4732bSCédric Le Goater     amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1;
1171baa4732bSCédric Le Goater     amc->fmc_model = "n25q256a";
1172baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1173baa4732bSCédric Le Goater     amc->num_cs    = 2;
1174baa4732bSCédric Le Goater     amc->i2c_init  = romulus_bmc_i2c_init;
1175baa4732bSCédric Le Goater     mc->default_ram_size       = 512 * MiB;
1176b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1177b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1178baa4732bSCédric Le Goater };
1179baa4732bSCédric Le Goater 
1180143b040fSPatrick Williams static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data)
1181143b040fSPatrick Williams {
1182143b040fSPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1183143b040fSPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1184143b040fSPatrick Williams 
1185143b040fSPatrick Williams     mc->desc       = "OCP SonoraPass BMC (ARM1176)";
1186143b040fSPatrick Williams     amc->soc_name  = "ast2500-a1";
1187143b040fSPatrick Williams     amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1;
1188143b040fSPatrick Williams     amc->fmc_model = "mx66l1g45g";
1189143b040fSPatrick Williams     amc->spi_model = "mx66l1g45g";
1190143b040fSPatrick Williams     amc->num_cs    = 2;
1191143b040fSPatrick Williams     amc->i2c_init  = sonorapass_bmc_i2c_init;
1192143b040fSPatrick Williams     mc->default_ram_size       = 512 * MiB;
1193b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1194b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1195143b040fSPatrick Williams };
1196143b040fSPatrick Williams 
1197baa4732bSCédric Le Goater static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data)
1198baa4732bSCédric Le Goater {
1199baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1200baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1201baa4732bSCédric Le Goater 
1202baa4732bSCédric Le Goater     mc->desc       = "OpenPOWER Witherspoon BMC (ARM1176)";
1203baa4732bSCédric Le Goater     amc->soc_name  = "ast2500-a1";
1204baa4732bSCédric Le Goater     amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1;
1205baa4732bSCédric Le Goater     amc->fmc_model = "mx25l25635e";
1206baa4732bSCédric Le Goater     amc->spi_model = "mx66l1g45g";
1207baa4732bSCédric Le Goater     amc->num_cs    = 2;
1208baa4732bSCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init;
1209baa4732bSCédric Le Goater     mc->default_ram_size = 512 * MiB;
1210b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1211b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1212baa4732bSCédric Le Goater };
1213baa4732bSCédric Le Goater 
1214baa4732bSCédric Le Goater static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
1215baa4732bSCédric Le Goater {
1216baa4732bSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
1217baa4732bSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1218baa4732bSCédric Le Goater 
1219f548f201SPeter Maydell     mc->desc       = "Aspeed AST2600 EVB (Cortex-A7)";
1220c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
1221baa4732bSCédric Le Goater     amc->hw_strap1 = AST2600_EVB_HW_STRAP1;
1222baa4732bSCédric Le Goater     amc->hw_strap2 = AST2600_EVB_HW_STRAP2;
1223753abfc4SJae Hyun Yoo     amc->fmc_model = "mx66u51235f";
1224baa4732bSCédric Le Goater     amc->spi_model = "mx66u51235f";
1225baa4732bSCédric Le Goater     amc->num_cs    = 1;
122629193286SGuenter Roeck     amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON |
122729193286SGuenter Roeck                      ASPEED_MAC3_ON;
1228baa4732bSCédric Le Goater     amc->i2c_init  = ast2600_evb_i2c_init;
1229baa4732bSCédric Le Goater     mc->default_ram_size = 1 * GiB;
1230b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1231b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
1232baa4732bSCédric Le Goater };
1233baa4732bSCédric Le Goater 
123463ceb818SCédric Le Goater static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data)
123563ceb818SCédric Le Goater {
123663ceb818SCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
123763ceb818SCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
123863ceb818SCédric Le Goater 
1239f548f201SPeter Maydell     mc->desc       = "OpenPOWER Tacoma BMC (Cortex-A7)";
1240c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
124163ceb818SCédric Le Goater     amc->hw_strap1 = TACOMA_BMC_HW_STRAP1;
124263ceb818SCédric Le Goater     amc->hw_strap2 = TACOMA_BMC_HW_STRAP2;
124363ceb818SCédric Le Goater     amc->fmc_model = "mx66l1g45g";
124463ceb818SCédric Le Goater     amc->spi_model = "mx66l1g45g";
124563ceb818SCédric Le Goater     amc->num_cs    = 2;
1246d3bad7e7SCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON;
124763ceb818SCédric Le Goater     amc->i2c_init  = witherspoon_bmc_i2c_init; /* Same board layout */
124863ceb818SCédric Le Goater     mc->default_ram_size = 1 * GiB;
1249b7f1a0cbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1250b7f1a0cbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
125163ceb818SCédric Le Goater };
125263ceb818SCédric Le Goater 
125395f068c8SJohn Wang static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data)
125495f068c8SJohn Wang {
125595f068c8SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
125695f068c8SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
125795f068c8SJohn Wang 
125895f068c8SJohn Wang     mc->desc       = "Bytedance G220A BMC (ARM1176)";
125995f068c8SJohn Wang     amc->soc_name  = "ast2500-a1";
126095f068c8SJohn Wang     amc->hw_strap1 = G220A_BMC_HW_STRAP1;
126195f068c8SJohn Wang     amc->fmc_model = "n25q512a";
126295f068c8SJohn Wang     amc->spi_model = "mx25l25635e";
126395f068c8SJohn Wang     amc->num_cs    = 2;
12645bb825c8SGuenter Roeck     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
126595f068c8SJohn Wang     amc->i2c_init  = g220a_bmc_i2c_init;
126695f068c8SJohn Wang     mc->default_ram_size = 1024 * MiB;
126795f068c8SJohn Wang     mc->default_cpus = mc->min_cpus = mc->max_cpus =
126895f068c8SJohn Wang         aspeed_soc_num_cpus(amc->soc_name);
126995f068c8SJohn Wang };
127095f068c8SJohn Wang 
127182b6a3f6SJohn Wang static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc, void *data)
127282b6a3f6SJohn Wang {
127382b6a3f6SJohn Wang     MachineClass *mc = MACHINE_CLASS(oc);
127482b6a3f6SJohn Wang     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
127582b6a3f6SJohn Wang 
127682b6a3f6SJohn Wang     mc->desc       = "Inspur FP5280G2 BMC (ARM1176)";
127782b6a3f6SJohn Wang     amc->soc_name  = "ast2500-a1";
127882b6a3f6SJohn Wang     amc->hw_strap1 = FP5280G2_BMC_HW_STRAP1;
127982b6a3f6SJohn Wang     amc->fmc_model = "n25q512a";
128082b6a3f6SJohn Wang     amc->spi_model = "mx25l25635e";
128182b6a3f6SJohn Wang     amc->num_cs    = 2;
128282b6a3f6SJohn Wang     amc->macs_mask  = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
128382b6a3f6SJohn Wang     amc->i2c_init  = fp5280g2_bmc_i2c_init;
128482b6a3f6SJohn Wang     mc->default_ram_size = 512 * MiB;
128582b6a3f6SJohn Wang     mc->default_cpus = mc->min_cpus = mc->max_cpus =
128682b6a3f6SJohn Wang         aspeed_soc_num_cpus(amc->soc_name);
128782b6a3f6SJohn Wang };
128882b6a3f6SJohn Wang 
128958e52bdbSCédric Le Goater static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data)
129058e52bdbSCédric Le Goater {
129158e52bdbSCédric Le Goater     MachineClass *mc = MACHINE_CLASS(oc);
129258e52bdbSCédric Le Goater     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
129358e52bdbSCédric Le Goater 
1294f548f201SPeter Maydell     mc->desc       = "IBM Rainier BMC (Cortex-A7)";
1295c5811bb3SJoel Stanley     amc->soc_name  = "ast2600-a3";
129658e52bdbSCédric Le Goater     amc->hw_strap1 = RAINIER_BMC_HW_STRAP1;
129758e52bdbSCédric Le Goater     amc->hw_strap2 = RAINIER_BMC_HW_STRAP2;
129858e52bdbSCédric Le Goater     amc->fmc_model = "mx66l1g45g";
129958e52bdbSCédric Le Goater     amc->spi_model = "mx66l1g45g";
130058e52bdbSCédric Le Goater     amc->num_cs    = 2;
130158e52bdbSCédric Le Goater     amc->macs_mask  = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
130258e52bdbSCédric Le Goater     amc->i2c_init  = rainier_bmc_i2c_init;
130358e52bdbSCédric Le Goater     mc->default_ram_size = 1 * GiB;
130458e52bdbSCédric Le Goater     mc->default_cpus = mc->min_cpus = mc->max_cpus =
130558e52bdbSCédric Le Goater         aspeed_soc_num_cpus(amc->soc_name);
130658e52bdbSCédric Le Goater };
130758e52bdbSCédric Le Goater 
1308febbe308SPeter Delevoryas /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */
1309febbe308SPeter Delevoryas #if HOST_LONG_BITS == 32
1310febbe308SPeter Delevoryas #define FUJI_BMC_RAM_SIZE (1 * GiB)
1311febbe308SPeter Delevoryas #else
1312febbe308SPeter Delevoryas #define FUJI_BMC_RAM_SIZE (2 * GiB)
1313febbe308SPeter Delevoryas #endif
1314febbe308SPeter Delevoryas 
1315febbe308SPeter Delevoryas static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data)
1316febbe308SPeter Delevoryas {
1317febbe308SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1318febbe308SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1319febbe308SPeter Delevoryas 
1320febbe308SPeter Delevoryas     mc->desc = "Facebook Fuji BMC (Cortex-A7)";
1321febbe308SPeter Delevoryas     amc->soc_name = "ast2600-a3";
1322febbe308SPeter Delevoryas     amc->hw_strap1 = FUJI_BMC_HW_STRAP1;
1323febbe308SPeter Delevoryas     amc->hw_strap2 = FUJI_BMC_HW_STRAP2;
1324febbe308SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1325febbe308SPeter Delevoryas     amc->spi_model = "mx66l1g45g";
1326febbe308SPeter Delevoryas     amc->num_cs = 2;
1327febbe308SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1328febbe308SPeter Delevoryas     amc->i2c_init = fuji_bmc_i2c_init;
1329febbe308SPeter Delevoryas     amc->uart_default = ASPEED_DEV_UART1;
1330febbe308SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
1331febbe308SPeter Delevoryas     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1332febbe308SPeter Delevoryas         aspeed_soc_num_cpus(amc->soc_name);
1333febbe308SPeter Delevoryas };
1334febbe308SPeter Delevoryas 
1335a20c54b1SPatrick Williams static void aspeed_machine_bletchley_class_init(ObjectClass *oc, void *data)
1336a20c54b1SPatrick Williams {
1337a20c54b1SPatrick Williams     MachineClass *mc = MACHINE_CLASS(oc);
1338a20c54b1SPatrick Williams     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1339a20c54b1SPatrick Williams 
1340a20c54b1SPatrick Williams     mc->desc       = "Facebook Bletchley BMC (Cortex-A7)";
1341a20c54b1SPatrick Williams     amc->soc_name  = "ast2600-a3";
1342a20c54b1SPatrick Williams     amc->hw_strap1 = BLETCHLEY_BMC_HW_STRAP1;
1343a20c54b1SPatrick Williams     amc->hw_strap2 = BLETCHLEY_BMC_HW_STRAP2;
1344a20c54b1SPatrick Williams     amc->fmc_model = "w25q01jvq";
1345a20c54b1SPatrick Williams     amc->spi_model = NULL;
1346a20c54b1SPatrick Williams     amc->num_cs    = 2;
1347a20c54b1SPatrick Williams     amc->macs_mask = ASPEED_MAC2_ON;
1348a20c54b1SPatrick Williams     amc->i2c_init  = bletchley_bmc_i2c_init;
1349a20c54b1SPatrick Williams     mc->default_ram_size = 512 * MiB;
1350a20c54b1SPatrick Williams     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1351a20c54b1SPatrick Williams         aspeed_soc_num_cpus(amc->soc_name);
1352a20c54b1SPatrick Williams }
1353a20c54b1SPatrick Williams 
1354fa699e80SPeter Delevoryas static void fby35_reset(MachineState *state)
1355fa699e80SPeter Delevoryas {
1356fa699e80SPeter Delevoryas     AspeedMachineState *bmc = ASPEED_MACHINE(state);
1357fa699e80SPeter Delevoryas     AspeedGPIOState *gpio = &bmc->soc.gpio;
1358fa699e80SPeter Delevoryas 
1359fa699e80SPeter Delevoryas     qemu_devices_reset();
1360fa699e80SPeter Delevoryas 
1361fa699e80SPeter Delevoryas     /* Board ID */
1362fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV4", true, &error_fatal);
1363fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV5", true, &error_fatal);
1364fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV6", true, &error_fatal);
1365fa699e80SPeter Delevoryas     object_property_set_bool(OBJECT(gpio), "gpioV7", false, &error_fatal);
1366fa699e80SPeter Delevoryas }
1367fa699e80SPeter Delevoryas 
1368fa699e80SPeter Delevoryas static void aspeed_machine_fby35_class_init(ObjectClass *oc, void *data)
1369fa699e80SPeter Delevoryas {
1370fa699e80SPeter Delevoryas     MachineClass *mc = MACHINE_CLASS(oc);
1371fa699e80SPeter Delevoryas     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1372fa699e80SPeter Delevoryas 
1373fa699e80SPeter Delevoryas     mc->desc       = "Facebook fby35 BMC (Cortex-A7)";
1374fa699e80SPeter Delevoryas     mc->reset      = fby35_reset;
1375fa699e80SPeter Delevoryas     amc->fmc_model = "mx66l1g45g";
1376fa699e80SPeter Delevoryas     amc->num_cs    = 2;
1377fa699e80SPeter Delevoryas     amc->macs_mask = ASPEED_MAC3_ON;
1378fa699e80SPeter Delevoryas     amc->i2c_init  = fby35_i2c_init;
1379fa699e80SPeter Delevoryas     /* FIXME: Replace this macro with something more general */
1380fa699e80SPeter Delevoryas     mc->default_ram_size = FUJI_BMC_RAM_SIZE;
1381fa699e80SPeter Delevoryas }
1382fa699e80SPeter Delevoryas 
138366c895b8SJamin Lin #define AST1030_INTERNAL_FLASH_SIZE (1024 * 1024)
138466c895b8SJamin Lin /* Main SYSCLK frequency in Hz (200MHz) */
138566c895b8SJamin Lin #define SYSCLK_FRQ 200000000ULL
138666c895b8SJamin Lin 
138766c895b8SJamin Lin static void aspeed_minibmc_machine_init(MachineState *machine)
138866c895b8SJamin Lin {
138966c895b8SJamin Lin     AspeedMachineState *bmc = ASPEED_MACHINE(machine);
139066c895b8SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
139166c895b8SJamin Lin     Clock *sysclk;
139266c895b8SJamin Lin 
139366c895b8SJamin Lin     sysclk = clock_new(OBJECT(machine), "SYSCLK");
139466c895b8SJamin Lin     clock_set_hz(sysclk, SYSCLK_FRQ);
139566c895b8SJamin Lin 
139666c895b8SJamin Lin     object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
139766c895b8SJamin Lin     qdev_connect_clock_in(DEVICE(&bmc->soc), "sysclk", sysclk);
139866c895b8SJamin Lin 
13994dd9d554SPeter Delevoryas     object_property_set_link(OBJECT(&bmc->soc), "memory",
14004dd9d554SPeter Delevoryas                              OBJECT(get_system_memory()), &error_abort);
1401d2b3eaefSPeter Delevoryas     connect_serial_hds_to_uarts(bmc);
140266c895b8SJamin Lin     qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
140366c895b8SJamin Lin 
140466c895b8SJamin Lin     aspeed_board_init_flashes(&bmc->soc.fmc,
140566c895b8SJamin Lin                               bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
140666c895b8SJamin Lin                               amc->num_cs,
140766c895b8SJamin Lin                               0);
140866c895b8SJamin Lin 
140966c895b8SJamin Lin     aspeed_board_init_flashes(&bmc->soc.spi[0],
141066c895b8SJamin Lin                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
141166c895b8SJamin Lin                               amc->num_cs, amc->num_cs);
141266c895b8SJamin Lin 
141366c895b8SJamin Lin     aspeed_board_init_flashes(&bmc->soc.spi[1],
141466c895b8SJamin Lin                               bmc->spi_model ? bmc->spi_model : amc->spi_model,
141566c895b8SJamin Lin                               amc->num_cs, (amc->num_cs * 2));
141666c895b8SJamin Lin 
141766c895b8SJamin Lin     if (amc->i2c_init) {
141866c895b8SJamin Lin         amc->i2c_init(bmc);
141966c895b8SJamin Lin     }
142066c895b8SJamin Lin 
142166c895b8SJamin Lin     armv7m_load_kernel(ARM_CPU(first_cpu),
142266c895b8SJamin Lin                        machine->kernel_filename,
142366c895b8SJamin Lin                        AST1030_INTERNAL_FLASH_SIZE);
142466c895b8SJamin Lin }
142566c895b8SJamin Lin 
14264c70ab16STroy Lee static void ast1030_evb_i2c_init(AspeedMachineState *bmc)
14274c70ab16STroy Lee {
14284c70ab16STroy Lee     AspeedSoCState *soc = &bmc->soc;
14294c70ab16STroy Lee 
14304c70ab16STroy Lee     /* U10 24C08 connects to SDA/SCL Groupt 1 by default */
14314c70ab16STroy Lee     uint8_t *eeprom_buf = g_malloc0(32 * 1024);
14324c70ab16STroy Lee     smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, eeprom_buf);
14334c70ab16STroy Lee 
14344c70ab16STroy Lee     /* U11 LM75 connects to SDA/SCL Group 2 by default */
14354c70ab16STroy Lee     i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d);
14364c70ab16STroy Lee }
14374c70ab16STroy Lee 
143866c895b8SJamin Lin static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc,
143966c895b8SJamin Lin                                                           void *data)
144066c895b8SJamin Lin {
144166c895b8SJamin Lin     MachineClass *mc = MACHINE_CLASS(oc);
144266c895b8SJamin Lin     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
144366c895b8SJamin Lin 
144466c895b8SJamin Lin     mc->desc = "Aspeed AST1030 MiniBMC (Cortex-M4)";
144566c895b8SJamin Lin     amc->soc_name = "ast1030-a1";
144666c895b8SJamin Lin     amc->hw_strap1 = 0;
144766c895b8SJamin Lin     amc->hw_strap2 = 0;
144866c895b8SJamin Lin     mc->init = aspeed_minibmc_machine_init;
14494c70ab16STroy Lee     amc->i2c_init = ast1030_evb_i2c_init;
145066c895b8SJamin Lin     mc->default_ram_size = 0;
145166c895b8SJamin Lin     mc->default_cpus = mc->min_cpus = mc->max_cpus = 1;
145266c895b8SJamin Lin     amc->fmc_model = "sst25vf032b";
145366c895b8SJamin Lin     amc->spi_model = "sst25vf032b";
145466c895b8SJamin Lin     amc->num_cs = 2;
145566c895b8SJamin Lin     amc->macs_mask = 0;
145666c895b8SJamin Lin }
145766c895b8SJamin Lin 
1458fb6b3c8dSJae Hyun Yoo static void aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass *oc,
1459fb6b3c8dSJae Hyun Yoo                                                      void *data)
1460fb6b3c8dSJae Hyun Yoo {
1461fb6b3c8dSJae Hyun Yoo     MachineClass *mc = MACHINE_CLASS(oc);
1462fb6b3c8dSJae Hyun Yoo     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1463fb6b3c8dSJae Hyun Yoo 
1464fb6b3c8dSJae Hyun Yoo     mc->desc       = "Qualcomm DC-SCM V1 BMC (Cortex A7)";
1465fb6b3c8dSJae Hyun Yoo     amc->soc_name  = "ast2600-a3";
1466fb6b3c8dSJae Hyun Yoo     amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1467fb6b3c8dSJae Hyun Yoo     amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1468fb6b3c8dSJae Hyun Yoo     amc->fmc_model = "n25q512a";
1469fb6b3c8dSJae Hyun Yoo     amc->spi_model = "n25q512a";
1470fb6b3c8dSJae Hyun Yoo     amc->num_cs    = 2;
1471fb6b3c8dSJae Hyun Yoo     amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1472fb6b3c8dSJae Hyun Yoo     amc->i2c_init  = qcom_dc_scm_bmc_i2c_init;
1473fb6b3c8dSJae Hyun Yoo     mc->default_ram_size = 1 * GiB;
1474fb6b3c8dSJae Hyun Yoo     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1475fb6b3c8dSJae Hyun Yoo         aspeed_soc_num_cpus(amc->soc_name);
1476fb6b3c8dSJae Hyun Yoo };
1477fb6b3c8dSJae Hyun Yoo 
1478ece4cccdSGraeme Gregory static void aspeed_machine_qcom_firework_class_init(ObjectClass *oc,
1479ece4cccdSGraeme Gregory                                                     void *data)
1480ece4cccdSGraeme Gregory {
1481ece4cccdSGraeme Gregory     MachineClass *mc = MACHINE_CLASS(oc);
1482ece4cccdSGraeme Gregory     AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
1483ece4cccdSGraeme Gregory 
1484ece4cccdSGraeme Gregory     mc->desc       = "Qualcomm DC-SCM V1/Firework BMC (Cortex A7)";
1485ece4cccdSGraeme Gregory     amc->soc_name  = "ast2600-a3";
1486ece4cccdSGraeme Gregory     amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1;
1487ece4cccdSGraeme Gregory     amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2;
1488ece4cccdSGraeme Gregory     amc->fmc_model = "n25q512a";
1489ece4cccdSGraeme Gregory     amc->spi_model = "n25q512a";
1490ece4cccdSGraeme Gregory     amc->num_cs    = 2;
1491ece4cccdSGraeme Gregory     amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
1492ece4cccdSGraeme Gregory     amc->i2c_init  = qcom_dc_scm_firework_i2c_init;
1493ece4cccdSGraeme Gregory     mc->default_ram_size = 1 * GiB;
1494ece4cccdSGraeme Gregory     mc->default_cpus = mc->min_cpus = mc->max_cpus =
1495ece4cccdSGraeme Gregory         aspeed_soc_num_cpus(amc->soc_name);
1496ece4cccdSGraeme Gregory };
1497ece4cccdSGraeme Gregory 
1498baa4732bSCédric Le Goater static const TypeInfo aspeed_machine_types[] = {
1499baa4732bSCédric Le Goater     {
1500baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("palmetto-bmc"),
1501baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1502baa4732bSCédric Le Goater         .class_init    = aspeed_machine_palmetto_class_init,
1503baa4732bSCédric Le Goater     }, {
150440a38df5SErik Smit         .name          = MACHINE_TYPE_NAME("supermicrox11-bmc"),
150540a38df5SErik Smit         .parent        = TYPE_ASPEED_MACHINE,
150640a38df5SErik Smit         .class_init    = aspeed_machine_supermicrox11_bmc_class_init,
150740a38df5SErik Smit     }, {
1508baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2500-evb"),
1509baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1510baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2500_evb_class_init,
1511baa4732bSCédric Le Goater     }, {
1512baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("romulus-bmc"),
1513baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1514baa4732bSCédric Le Goater         .class_init    = aspeed_machine_romulus_class_init,
1515baa4732bSCédric Le Goater     }, {
1516143b040fSPatrick Williams         .name          = MACHINE_TYPE_NAME("sonorapass-bmc"),
1517143b040fSPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1518143b040fSPatrick Williams         .class_init    = aspeed_machine_sonorapass_class_init,
1519143b040fSPatrick Williams     }, {
1520baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("witherspoon-bmc"),
1521baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1522baa4732bSCédric Le Goater         .class_init    = aspeed_machine_witherspoon_class_init,
1523baa4732bSCédric Le Goater     }, {
1524baa4732bSCédric Le Goater         .name          = MACHINE_TYPE_NAME("ast2600-evb"),
1525baa4732bSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
1526baa4732bSCédric Le Goater         .class_init    = aspeed_machine_ast2600_evb_class_init,
1527baa4732bSCédric Le Goater     }, {
152863ceb818SCédric Le Goater         .name          = MACHINE_TYPE_NAME("tacoma-bmc"),
152963ceb818SCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
153063ceb818SCédric Le Goater         .class_init    = aspeed_machine_tacoma_class_init,
153163ceb818SCédric Le Goater     }, {
153295f068c8SJohn Wang         .name          = MACHINE_TYPE_NAME("g220a-bmc"),
153395f068c8SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
153495f068c8SJohn Wang         .class_init    = aspeed_machine_g220a_class_init,
153595f068c8SJohn Wang     }, {
1536fb6b3c8dSJae Hyun Yoo         .name          = MACHINE_TYPE_NAME("qcom-dc-scm-v1-bmc"),
1537fb6b3c8dSJae Hyun Yoo         .parent        = TYPE_ASPEED_MACHINE,
1538fb6b3c8dSJae Hyun Yoo         .class_init    = aspeed_machine_qcom_dc_scm_v1_class_init,
1539fb6b3c8dSJae Hyun Yoo     }, {
1540ece4cccdSGraeme Gregory         .name          = MACHINE_TYPE_NAME("qcom-firework-bmc"),
1541ece4cccdSGraeme Gregory         .parent        = TYPE_ASPEED_MACHINE,
1542ece4cccdSGraeme Gregory         .class_init    = aspeed_machine_qcom_firework_class_init,
1543ece4cccdSGraeme Gregory     }, {
154482b6a3f6SJohn Wang         .name          = MACHINE_TYPE_NAME("fp5280g2-bmc"),
154582b6a3f6SJohn Wang         .parent        = TYPE_ASPEED_MACHINE,
154682b6a3f6SJohn Wang         .class_init    = aspeed_machine_fp5280g2_class_init,
154782b6a3f6SJohn Wang     }, {
15489cccb912SPatrick Venture         .name          = MACHINE_TYPE_NAME("quanta-q71l-bmc"),
15499cccb912SPatrick Venture         .parent        = TYPE_ASPEED_MACHINE,
15509cccb912SPatrick Venture         .class_init    = aspeed_machine_quanta_q71l_class_init,
15519cccb912SPatrick Venture     }, {
155258e52bdbSCédric Le Goater         .name          = MACHINE_TYPE_NAME("rainier-bmc"),
155358e52bdbSCédric Le Goater         .parent        = TYPE_ASPEED_MACHINE,
155458e52bdbSCédric Le Goater         .class_init    = aspeed_machine_rainier_class_init,
155558e52bdbSCédric Le Goater     }, {
1556febbe308SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fuji-bmc"),
1557febbe308SPeter Delevoryas         .parent        = TYPE_ASPEED_MACHINE,
1558febbe308SPeter Delevoryas         .class_init    = aspeed_machine_fuji_class_init,
1559febbe308SPeter Delevoryas     }, {
1560a20c54b1SPatrick Williams         .name          = MACHINE_TYPE_NAME("bletchley-bmc"),
1561a20c54b1SPatrick Williams         .parent        = TYPE_ASPEED_MACHINE,
1562a20c54b1SPatrick Williams         .class_init    = aspeed_machine_bletchley_class_init,
1563a20c54b1SPatrick Williams     }, {
1564fa699e80SPeter Delevoryas         .name          = MACHINE_TYPE_NAME("fby35-bmc"),
1565fa699e80SPeter Delevoryas         .parent        = MACHINE_TYPE_NAME("ast2600-evb"),
1566fa699e80SPeter Delevoryas         .class_init    = aspeed_machine_fby35_class_init,
1567fa699e80SPeter Delevoryas     }, {
156866c895b8SJamin Lin         .name           = MACHINE_TYPE_NAME("ast1030-evb"),
156966c895b8SJamin Lin         .parent         = TYPE_ASPEED_MACHINE,
157066c895b8SJamin Lin         .class_init     = aspeed_minibmc_machine_ast1030_evb_class_init,
157166c895b8SJamin Lin     }, {
1572fca9ca1bSCédric Le Goater         .name          = TYPE_ASPEED_MACHINE,
157362c2c2ebSCédric Le Goater         .parent        = TYPE_MACHINE,
1574888b2b03SPhilippe Mathieu-Daudé         .instance_size = sizeof(AspeedMachineState),
15751a15311aSCédric Le Goater         .instance_init = aspeed_machine_instance_init,
1576fca9ca1bSCédric Le Goater         .class_size    = sizeof(AspeedMachineClass),
1577fca9ca1bSCédric Le Goater         .class_init    = aspeed_machine_class_init,
1578baa4732bSCédric Le Goater         .abstract      = true,
1579baa4732bSCédric Le Goater     }
1580fca9ca1bSCédric Le Goater };
158174fb1f38SCédric Le Goater 
1582baa4732bSCédric Le Goater DEFINE_TYPES(aspeed_machine_types)
1583