1327d8e4eSAndrew Jeffery /* 2327d8e4eSAndrew Jeffery * OpenPOWER Palmetto BMC 3327d8e4eSAndrew Jeffery * 4327d8e4eSAndrew Jeffery * Andrew Jeffery <andrew@aj.id.au> 5327d8e4eSAndrew Jeffery * 6327d8e4eSAndrew Jeffery * Copyright 2016 IBM Corp. 7327d8e4eSAndrew Jeffery * 8327d8e4eSAndrew Jeffery * This code is licensed under the GPL version 2 or later. See 9327d8e4eSAndrew Jeffery * the COPYING file in the top-level directory. 10327d8e4eSAndrew Jeffery */ 11327d8e4eSAndrew Jeffery 12327d8e4eSAndrew Jeffery #include "qemu/osdep.h" 13da34e65cSMarkus Armbruster #include "qapi/error.h" 1412ec8bd5SPeter Maydell #include "hw/arm/boot.h" 15fca9ca1bSCédric Le Goater #include "hw/arm/aspeed.h" 1600442402SCédric Le Goater #include "hw/arm/aspeed_soc.h" 173ec75e39SPatrick Venture #include "hw/i2c/i2c_mux_pca954x.h" 1893198b6cSCorey Minyard #include "hw/i2c/smbus_eeprom.h" 19044475f3SPhilippe Mathieu-Daudé #include "hw/misc/pca9552.h" 205e9ae4b1SCorey Minyard #include "hw/sensor/tmp105.h" 217cfbde5eSPhilippe Mathieu-Daudé #include "hw/misc/led.h" 22a27bd6c7SMarkus Armbruster #include "hw/qdev-properties.h" 23e1ad9bc4SCédric Le Goater #include "sysemu/block-backend.h" 24d769a1daSCédric Le Goater #include "hw/loader.h" 25d769a1daSCédric Le Goater #include "qemu/error-report.h" 26a9df9622SJoel Stanley #include "qemu/units.h" 27327d8e4eSAndrew Jeffery 2874fb1f38SCédric Le Goater static struct arm_boot_info aspeed_board_binfo = { 29b033271fSCédric Le Goater .board_id = -1, /* device-tree-only board */ 30327d8e4eSAndrew Jeffery }; 31327d8e4eSAndrew Jeffery 32612b219aSPhilippe Mathieu-Daudé struct AspeedMachineState { 33888b2b03SPhilippe Mathieu-Daudé /* Private */ 34888b2b03SPhilippe Mathieu-Daudé MachineState parent_obj; 35888b2b03SPhilippe Mathieu-Daudé /* Public */ 36888b2b03SPhilippe Mathieu-Daudé 37ff90606fSCédric Le Goater AspeedSoCState soc; 38ad1a9782SCédric Le Goater MemoryRegion ram_container; 39ebe31c0aSCédric Le Goater MemoryRegion max_ram; 40888b2b03SPhilippe Mathieu-Daudé bool mmio_exec; 419820e52fSCédric Le Goater char *fmc_model; 429820e52fSCédric Le Goater char *spi_model; 43ea066d39SThomas Huth }; 44327d8e4eSAndrew Jeffery 45ef17f836SCédric Le Goater /* Palmetto hardware value: 0x120CE416 */ 468da33ef7SCédric Le Goater #define PALMETTO_BMC_HW_STRAP1 ( \ 478da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_256MB) | \ 488da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_DRAM_CONFIG(2 /* DDR3 with CL=6, CWL=5 */) | \ 498da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_ACPI_DIS | \ 508da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) | \ 518da33ef7SCédric Le Goater SCU_HW_STRAP_VGA_CLASS_CODE | \ 528da33ef7SCédric Le Goater SCU_HW_STRAP_LPC_RESET_PIN | \ 538da33ef7SCédric Le Goater SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) | \ 548da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \ 558da33ef7SCédric Le Goater SCU_HW_STRAP_SPI_WIDTH | \ 568da33ef7SCédric Le Goater SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \ 578da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT)) 588da33ef7SCédric Le Goater 5940a38df5SErik Smit /* TODO: Find the actual hardware value */ 6040a38df5SErik Smit #define SUPERMICROX11_BMC_HW_STRAP1 ( \ 6140a38df5SErik Smit SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) | \ 6240a38df5SErik Smit SCU_AST2400_HW_STRAP_DRAM_CONFIG(2) | \ 6340a38df5SErik Smit SCU_AST2400_HW_STRAP_ACPI_DIS | \ 6440a38df5SErik Smit SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) | \ 6540a38df5SErik Smit SCU_HW_STRAP_VGA_CLASS_CODE | \ 6640a38df5SErik Smit SCU_HW_STRAP_LPC_RESET_PIN | \ 6740a38df5SErik Smit SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) | \ 6840a38df5SErik Smit SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \ 6940a38df5SErik Smit SCU_HW_STRAP_SPI_WIDTH | \ 7040a38df5SErik Smit SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \ 7140a38df5SErik Smit SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT)) 7240a38df5SErik Smit 73ef17f836SCédric Le Goater /* AST2500 evb hardware value: 0xF100C2E6 */ 749a7c1750SCédric Le Goater #define AST2500_EVB_HW_STRAP1 (( \ 759a7c1750SCédric Le Goater AST2500_HW_STRAP1_DEFAULTS | \ 769a7c1750SCédric Le Goater SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 779a7c1750SCédric Le Goater SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 789a7c1750SCédric Le Goater SCU_AST2500_HW_STRAP_UART_DEBUG | \ 799a7c1750SCédric Le Goater SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 809a7c1750SCédric Le Goater SCU_HW_STRAP_MAC1_RGMII | \ 819a7c1750SCédric Le Goater SCU_HW_STRAP_MAC0_RGMII) & \ 829a7c1750SCédric Le Goater ~SCU_HW_STRAP_2ND_BOOT_WDT) 839a7c1750SCédric Le Goater 84ef17f836SCédric Le Goater /* Romulus hardware value: 0xF10AD206 */ 85ef17f836SCédric Le Goater #define ROMULUS_BMC_HW_STRAP1 ( \ 86ef17f836SCédric Le Goater AST2500_HW_STRAP1_DEFAULTS | \ 87ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 88ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 89ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_UART_DEBUG | \ 90ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 91ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_ACPI_ENABLE | \ 92ef17f836SCédric Le Goater SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER)) 93ef17f836SCédric Le Goater 94143b040fSPatrick Williams /* Sonorapass hardware value: 0xF100D216 */ 95143b040fSPatrick Williams #define SONORAPASS_BMC_HW_STRAP1 ( \ 96143b040fSPatrick Williams SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 97143b040fSPatrick Williams SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 98143b040fSPatrick Williams SCU_AST2500_HW_STRAP_UART_DEBUG | \ 99143b040fSPatrick Williams SCU_AST2500_HW_STRAP_RESERVED28 | \ 100143b040fSPatrick Williams SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 101143b040fSPatrick Williams SCU_HW_STRAP_VGA_CLASS_CODE | \ 102143b040fSPatrick Williams SCU_HW_STRAP_LPC_RESET_PIN | \ 103143b040fSPatrick Williams SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \ 104143b040fSPatrick Williams SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \ 105143b040fSPatrick Williams SCU_HW_STRAP_VGA_BIOS_ROM | \ 106143b040fSPatrick Williams SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \ 107143b040fSPatrick Williams SCU_AST2500_HW_STRAP_RESERVED1) 108143b040fSPatrick Williams 10995f068c8SJohn Wang #define G220A_BMC_HW_STRAP1 ( \ 11095f068c8SJohn Wang SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 11195f068c8SJohn Wang SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 11295f068c8SJohn Wang SCU_AST2500_HW_STRAP_UART_DEBUG | \ 11395f068c8SJohn Wang SCU_AST2500_HW_STRAP_RESERVED28 | \ 11495f068c8SJohn Wang SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 11595f068c8SJohn Wang SCU_HW_STRAP_2ND_BOOT_WDT | \ 11695f068c8SJohn Wang SCU_HW_STRAP_VGA_CLASS_CODE | \ 11795f068c8SJohn Wang SCU_HW_STRAP_LPC_RESET_PIN | \ 11895f068c8SJohn Wang SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \ 11995f068c8SJohn Wang SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \ 12095f068c8SJohn Wang SCU_HW_STRAP_VGA_SIZE_SET(VGA_64M_DRAM) | \ 12195f068c8SJohn Wang SCU_AST2500_HW_STRAP_RESERVED1) 12295f068c8SJohn Wang 12382b6a3f6SJohn Wang /* FP5280G2 hardware value: 0XF100D286 */ 12482b6a3f6SJohn Wang #define FP5280G2_BMC_HW_STRAP1 ( \ 12582b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 12682b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 12782b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_UART_DEBUG | \ 12882b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_RESERVED28 | \ 12982b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 13082b6a3f6SJohn Wang SCU_HW_STRAP_VGA_CLASS_CODE | \ 13182b6a3f6SJohn Wang SCU_HW_STRAP_LPC_RESET_PIN | \ 13282b6a3f6SJohn Wang SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \ 13382b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \ 13482b6a3f6SJohn Wang SCU_HW_STRAP_MAC1_RGMII | \ 13582b6a3f6SJohn Wang SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \ 13682b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_RESERVED1) 13782b6a3f6SJohn Wang 13862c2c2ebSCédric Le Goater /* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */ 13962c2c2ebSCédric Le Goater #define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1 14062c2c2ebSCédric Le Goater 1419cccb912SPatrick Venture /* Quanta-Q71l hardware value */ 1429cccb912SPatrick Venture #define QUANTA_Q71L_BMC_HW_STRAP1 ( \ 1439cccb912SPatrick Venture SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) | \ 1449cccb912SPatrick Venture SCU_AST2400_HW_STRAP_DRAM_CONFIG(2/* DDR3 with CL=6, CWL=5 */) | \ 1459cccb912SPatrick Venture SCU_AST2400_HW_STRAP_ACPI_DIS | \ 1469cccb912SPatrick Venture SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_24M_IN) | \ 1479cccb912SPatrick Venture SCU_HW_STRAP_VGA_CLASS_CODE | \ 1489cccb912SPatrick Venture SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_PASS_THROUGH) | \ 1499cccb912SPatrick Venture SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \ 1509cccb912SPatrick Venture SCU_HW_STRAP_SPI_WIDTH | \ 1519cccb912SPatrick Venture SCU_HW_STRAP_VGA_SIZE_SET(VGA_8M_DRAM) | \ 1529cccb912SPatrick Venture SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT)) 1539cccb912SPatrick Venture 154ccc2c418SCédric Le Goater /* AST2600 evb hardware value */ 155ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP1 0x000000C0 156ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP2 0x00000003 157ccc2c418SCédric Le Goater 15863ceb818SCédric Le Goater /* Tacoma hardware value */ 15963ceb818SCédric Le Goater #define TACOMA_BMC_HW_STRAP1 0x00000000 1607582591aSJoel Stanley #define TACOMA_BMC_HW_STRAP2 0x00000040 16163ceb818SCédric Le Goater 16258e52bdbSCédric Le Goater /* Rainier hardware value: (QEMU prototype) */ 163b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP1 0x00422016 164b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP2 0x80000848 16558e52bdbSCédric Le Goater 166febbe308SPeter Delevoryas /* Fuji hardware value */ 167febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP1 0x00000000 168febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP2 0x00000000 169febbe308SPeter Delevoryas 170ebe31c0aSCédric Le Goater /* 171ebe31c0aSCédric Le Goater * The max ram region is for firmwares that scan the address space 172ebe31c0aSCédric Le Goater * with load/store to guess how much RAM the SoC has. 173ebe31c0aSCédric Le Goater */ 174ebe31c0aSCédric Le Goater static uint64_t max_ram_read(void *opaque, hwaddr offset, unsigned size) 175ebe31c0aSCédric Le Goater { 176ebe31c0aSCédric Le Goater return 0; 177ebe31c0aSCédric Le Goater } 178ebe31c0aSCédric Le Goater 179ebe31c0aSCédric Le Goater static void max_ram_write(void *opaque, hwaddr offset, uint64_t value, 180ebe31c0aSCédric Le Goater unsigned size) 181ebe31c0aSCédric Le Goater { 182ebe31c0aSCédric Le Goater /* Discard writes */ 183ebe31c0aSCédric Le Goater } 184ebe31c0aSCédric Le Goater 185ebe31c0aSCédric Le Goater static const MemoryRegionOps max_ram_ops = { 186ebe31c0aSCédric Le Goater .read = max_ram_read, 187ebe31c0aSCédric Le Goater .write = max_ram_write, 188ebe31c0aSCédric Le Goater .endianness = DEVICE_NATIVE_ENDIAN, 189ebe31c0aSCédric Le Goater }; 190ebe31c0aSCédric Le Goater 1919bb6d140SJoel Stanley #define AST_SMP_MAILBOX_BASE 0x1e6e2180 1929bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_ENTRY (AST_SMP_MAILBOX_BASE + 0x0) 1939bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_GOSIGN (AST_SMP_MAILBOX_BASE + 0x4) 1949bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_READY (AST_SMP_MAILBOX_BASE + 0x8) 1959bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_POLLINSN (AST_SMP_MAILBOX_BASE + 0xc) 1969bb6d140SJoel Stanley #define AST_SMP_MBOX_CODE (AST_SMP_MAILBOX_BASE + 0x10) 1979bb6d140SJoel Stanley #define AST_SMP_MBOX_GOSIGN 0xabbaab00 1989bb6d140SJoel Stanley 1999bb6d140SJoel Stanley static void aspeed_write_smpboot(ARMCPU *cpu, 2009bb6d140SJoel Stanley const struct arm_boot_info *info) 2019bb6d140SJoel Stanley { 2029bb6d140SJoel Stanley static const uint32_t poll_mailbox_ready[] = { 2039bb6d140SJoel Stanley /* 2049bb6d140SJoel Stanley * r2 = per-cpu go sign value 2059bb6d140SJoel Stanley * r1 = AST_SMP_MBOX_FIELD_ENTRY 2069bb6d140SJoel Stanley * r0 = AST_SMP_MBOX_FIELD_GOSIGN 2079bb6d140SJoel Stanley */ 2089bb6d140SJoel Stanley 0xee100fb0, /* mrc p15, 0, r0, c0, c0, 5 */ 2099bb6d140SJoel Stanley 0xe21000ff, /* ands r0, r0, #255 */ 2109bb6d140SJoel Stanley 0xe59f201c, /* ldr r2, [pc, #28] */ 2119bb6d140SJoel Stanley 0xe1822000, /* orr r2, r2, r0 */ 2129bb6d140SJoel Stanley 2139bb6d140SJoel Stanley 0xe59f1018, /* ldr r1, [pc, #24] */ 2149bb6d140SJoel Stanley 0xe59f0018, /* ldr r0, [pc, #24] */ 2159bb6d140SJoel Stanley 2169bb6d140SJoel Stanley 0xe320f002, /* wfe */ 2179bb6d140SJoel Stanley 0xe5904000, /* ldr r4, [r0] */ 2189bb6d140SJoel Stanley 0xe1520004, /* cmp r2, r4 */ 2199bb6d140SJoel Stanley 0x1afffffb, /* bne <wfe> */ 2209bb6d140SJoel Stanley 0xe591f000, /* ldr pc, [r1] */ 2219bb6d140SJoel Stanley AST_SMP_MBOX_GOSIGN, 2229bb6d140SJoel Stanley AST_SMP_MBOX_FIELD_ENTRY, 2239bb6d140SJoel Stanley AST_SMP_MBOX_FIELD_GOSIGN, 2249bb6d140SJoel Stanley }; 2259bb6d140SJoel Stanley 2269bb6d140SJoel Stanley rom_add_blob_fixed("aspeed.smpboot", poll_mailbox_ready, 2279bb6d140SJoel Stanley sizeof(poll_mailbox_ready), 2289bb6d140SJoel Stanley info->smp_loader_start); 2299bb6d140SJoel Stanley } 2309bb6d140SJoel Stanley 2319bb6d140SJoel Stanley static void aspeed_reset_secondary(ARMCPU *cpu, 2329bb6d140SJoel Stanley const struct arm_boot_info *info) 2339bb6d140SJoel Stanley { 2349bb6d140SJoel Stanley AddressSpace *as = arm_boot_address_space(cpu, info); 2359bb6d140SJoel Stanley CPUState *cs = CPU(cpu); 2369bb6d140SJoel Stanley 2379bb6d140SJoel Stanley /* info->smp_bootreg_addr */ 2389bb6d140SJoel Stanley address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0, 2399bb6d140SJoel Stanley MEMTXATTRS_UNSPECIFIED, NULL); 2409bb6d140SJoel Stanley cpu_set_pc(cs, info->smp_loader_start); 2419bb6d140SJoel Stanley } 2429bb6d140SJoel Stanley 243d769a1daSCédric Le Goater #define FIRMWARE_ADDR 0x0 244d769a1daSCédric Le Goater 245d769a1daSCédric Le Goater static void write_boot_rom(DriveInfo *dinfo, hwaddr addr, size_t rom_size, 246d769a1daSCédric Le Goater Error **errp) 247d769a1daSCédric Le Goater { 248d769a1daSCédric Le Goater BlockBackend *blk = blk_by_legacy_dinfo(dinfo); 249*05e6e40aSWentao_Liang g_autofree void *storage = NULL; 2500c7209beSCédric Le Goater int64_t size; 251d769a1daSCédric Le Goater 2520c7209beSCédric Le Goater /* The block backend size should have already been 'validated' by 2530c7209beSCédric Le Goater * the creation of the m25p80 object. 2540c7209beSCédric Le Goater */ 2550c7209beSCédric Le Goater size = blk_getlength(blk); 2560c7209beSCédric Le Goater if (size <= 0) { 2570c7209beSCédric Le Goater error_setg(errp, "failed to get flash size"); 2580c7209beSCédric Le Goater return; 2590c7209beSCédric Le Goater } 2600c7209beSCédric Le Goater 2610c7209beSCédric Le Goater if (rom_size > size) { 2620c7209beSCédric Le Goater rom_size = size; 263d769a1daSCédric Le Goater } 264d769a1daSCédric Le Goater 265*05e6e40aSWentao_Liang storage = g_malloc0(rom_size); 266d769a1daSCédric Le Goater if (blk_pread(blk, 0, storage, rom_size) < 0) { 267d769a1daSCédric Le Goater error_setg(errp, "failed to read the initial flash content"); 268d769a1daSCédric Le Goater return; 269d769a1daSCédric Le Goater } 270d769a1daSCédric Le Goater 271d769a1daSCédric Le Goater rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr); 272d769a1daSCédric Le Goater } 273d769a1daSCédric Le Goater 274c20b4cccSMarkus Armbruster static void aspeed_board_init_flashes(AspeedSMCState *s, 2758ec239f2SMarkus Armbruster const char *flashtype, 2768ec239f2SMarkus Armbruster int unit0) 277e1ad9bc4SCédric Le Goater { 278e1ad9bc4SCédric Le Goater int i ; 279e1ad9bc4SCédric Le Goater 280e1ad9bc4SCédric Le Goater for (i = 0; i < s->num_cs; ++i) { 2818ec239f2SMarkus Armbruster DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i); 282e1ad9bc4SCédric Le Goater qemu_irq cs_line; 283a7d78befSCédric Le Goater DeviceState *dev; 284e1ad9bc4SCédric Le Goater 285a7d78befSCédric Le Goater dev = qdev_new(flashtype); 286e1ad9bc4SCédric Le Goater if (dinfo) { 287a7d78befSCédric Le Goater qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo)); 288e1ad9bc4SCédric Le Goater } 289a7d78befSCédric Le Goater qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal); 290e1ad9bc4SCédric Le Goater 291a7d78befSCédric Le Goater cs_line = qdev_get_gpio_in_named(dev, SSI_GPIO_CS, 0); 292e1ad9bc4SCédric Le Goater sysbus_connect_irq(SYS_BUS_DEVICE(s), i + 1, cs_line); 293e1ad9bc4SCédric Le Goater } 294e1ad9bc4SCédric Le Goater } 295e1ad9bc4SCédric Le Goater 296a29e3e12SAndrew Jeffery static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo) 297a29e3e12SAndrew Jeffery { 298a29e3e12SAndrew Jeffery DeviceState *card; 299a29e3e12SAndrew Jeffery 300756f739bSPhilippe Mathieu-Daudé if (!dinfo) { 301756f739bSPhilippe Mathieu-Daudé return; 302756f739bSPhilippe Mathieu-Daudé } 3033e80f690SMarkus Armbruster card = qdev_new(TYPE_SD_CARD); 304934df912SMarkus Armbruster qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo), 305a29e3e12SAndrew Jeffery &error_fatal); 3063e80f690SMarkus Armbruster qdev_realize_and_unref(card, 3073e80f690SMarkus Armbruster qdev_get_child_bus(DEVICE(sdhci), "sd-bus"), 3083e80f690SMarkus Armbruster &error_fatal); 309a29e3e12SAndrew Jeffery } 310a29e3e12SAndrew Jeffery 311baa4732bSCédric Le Goater static void aspeed_machine_init(MachineState *machine) 312327d8e4eSAndrew Jeffery { 313888b2b03SPhilippe Mathieu-Daudé AspeedMachineState *bmc = ASPEED_MACHINE(machine); 314baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine); 315b033271fSCédric Le Goater AspeedSoCClass *sc; 316d769a1daSCédric Le Goater DriveInfo *drive0 = drive_get(IF_MTD, 0, 0); 317ebe31c0aSCédric Le Goater ram_addr_t max_ram_size; 3182bea128cSEddie James int i; 319d3bad7e7SCédric Le Goater NICInfo *nd = &nd_table[0]; 320327d8e4eSAndrew Jeffery 321ad1a9782SCédric Le Goater memory_region_init(&bmc->ram_container, NULL, "aspeed-ram-container", 3227df9f028SPhilippe Mathieu-Daudé 4 * GiB); 323afcbaed6SIgor Mammedov memory_region_add_subregion(&bmc->ram_container, 0, machine->ram); 324ad1a9782SCédric Le Goater 3259fc7fc4dSMarkus Armbruster object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name); 326327d8e4eSAndrew Jeffery 327b033271fSCédric Le Goater sc = ASPEED_SOC_GET_CLASS(&bmc->soc); 328b033271fSCédric Le Goater 329533eb415SIgor Mammedov /* 330533eb415SIgor Mammedov * This will error out if isize is not supported by memory controller. 331533eb415SIgor Mammedov */ 3326e504a98SPaolo Bonzini object_property_set_uint(OBJECT(&bmc->soc), "ram-size", machine->ram_size, 333533eb415SIgor Mammedov &error_fatal); 334533eb415SIgor Mammedov 335d3bad7e7SCédric Le Goater for (i = 0; i < sc->macs_num; i++) { 336d3bad7e7SCédric Le Goater if ((amc->macs_mask & (1 << i)) && nd->used) { 337d3bad7e7SCédric Le Goater qemu_check_nic_model(nd, TYPE_FTGMAC100); 338d3bad7e7SCédric Le Goater qdev_set_nic_properties(DEVICE(&bmc->soc.ftgmac100[i]), nd); 339d3bad7e7SCédric Le Goater nd++; 340d3bad7e7SCédric Le Goater } 341d3bad7e7SCédric Le Goater } 342d3bad7e7SCédric Le Goater 3435325cc34SMarkus Armbruster object_property_set_int(OBJECT(&bmc->soc), "hw-strap1", amc->hw_strap1, 34487e79af0SAndrew Jeffery &error_abort); 3455325cc34SMarkus Armbruster object_property_set_int(OBJECT(&bmc->soc), "hw-strap2", amc->hw_strap2, 346ccc2c418SCédric Le Goater &error_abort); 3475325cc34SMarkus Armbruster object_property_set_int(OBJECT(&bmc->soc), "num-cs", amc->num_cs, 34826d5df95SCédric Le Goater &error_abort); 3495325cc34SMarkus Armbruster object_property_set_link(OBJECT(&bmc->soc), "dram", 3500df2d9a6SCédric Le Goater OBJECT(machine->ram), &error_abort); 351b6e70d1dSJoel Stanley if (machine->kernel_filename) { 352b6e70d1dSJoel Stanley /* 353b6e70d1dSJoel Stanley * When booting with a -kernel command line there is no u-boot 354b6e70d1dSJoel Stanley * that runs to unlock the SCU. In this case set the default to 355b6e70d1dSJoel Stanley * be unlocked as the kernel expects 356b6e70d1dSJoel Stanley */ 3575325cc34SMarkus Armbruster object_property_set_int(OBJECT(&bmc->soc), "hw-prot-key", 3585325cc34SMarkus Armbruster ASPEED_SCU_PROT_KEY, &error_abort); 359b6e70d1dSJoel Stanley } 3605d63d0c7SPeter Delevoryas qdev_prop_set_uint32(DEVICE(&bmc->soc), "uart-default", 3615d63d0c7SPeter Delevoryas amc->uart_default); 362ce189ab2SMarkus Armbruster qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort); 363327d8e4eSAndrew Jeffery 364d783d1feSCédric Le Goater memory_region_add_subregion(get_system_memory(), 365347df6f8SEduardo Habkost sc->memmap[ASPEED_DEV_SDRAM], 366ad1a9782SCédric Le Goater &bmc->ram_container); 367de46f5f4SCédric Le Goater 368ebe31c0aSCédric Le Goater max_ram_size = object_property_get_uint(OBJECT(&bmc->soc), "max-ram-size", 369ebe31c0aSCédric Le Goater &error_abort); 370ebe31c0aSCédric Le Goater memory_region_init_io(&bmc->max_ram, NULL, &max_ram_ops, NULL, 3716e504a98SPaolo Bonzini "max_ram", max_ram_size - machine->ram_size); 3726e504a98SPaolo Bonzini memory_region_add_subregion(&bmc->ram_container, machine->ram_size, &bmc->max_ram); 373ebe31c0aSCédric Le Goater 3748ec239f2SMarkus Armbruster aspeed_board_init_flashes(&bmc->soc.fmc, 3758ec239f2SMarkus Armbruster bmc->fmc_model ? bmc->fmc_model : amc->fmc_model, 3768ec239f2SMarkus Armbruster 0); 3778ec239f2SMarkus Armbruster aspeed_board_init_flashes(&bmc->soc.spi[0], 3788ec239f2SMarkus Armbruster bmc->spi_model ? bmc->spi_model : amc->spi_model, 3798ec239f2SMarkus Armbruster bmc->soc.fmc.num_cs); 380e1ad9bc4SCédric Le Goater 381d769a1daSCédric Le Goater /* Install first FMC flash content as a boot rom. */ 382d769a1daSCédric Le Goater if (drive0) { 383d769a1daSCédric Le Goater AspeedSMCFlash *fl = &bmc->soc.fmc.flashes[0]; 384d769a1daSCédric Le Goater MemoryRegion *boot_rom = g_new(MemoryRegion, 1); 3856bb55e79SCédric Le Goater uint64_t size = memory_region_size(&fl->mmio); 386d769a1daSCédric Le Goater 387d769a1daSCédric Le Goater /* 388d769a1daSCédric Le Goater * create a ROM region using the default mapping window size of 38993bf276dSCédric Le Goater * the flash module. The window size is 64MB for the AST2400 39093bf276dSCédric Le Goater * SoC and 128MB for the AST2500 SoC, which is twice as big as 39193bf276dSCédric Le Goater * needed by the flash modules of the Aspeed machines. 392d769a1daSCédric Le Goater */ 3931a15311aSCédric Le Goater if (ASPEED_MACHINE(machine)->mmio_exec) { 394f489960dSPhilippe Mathieu-Daudé memory_region_init_alias(boot_rom, NULL, "aspeed.boot_rom", 3956bb55e79SCédric Le Goater &fl->mmio, 0, size); 3961a15311aSCédric Le Goater memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR, 3971a15311aSCédric Le Goater boot_rom); 3981a15311aSCédric Le Goater } else { 399f489960dSPhilippe Mathieu-Daudé memory_region_init_rom(boot_rom, NULL, "aspeed.boot_rom", 4006bb55e79SCédric Le Goater size, &error_abort); 401d769a1daSCédric Le Goater memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR, 402d769a1daSCédric Le Goater boot_rom); 4036bb55e79SCédric Le Goater write_boot_rom(drive0, FIRMWARE_ADDR, size, &error_abort); 404d769a1daSCédric Le Goater } 4051a15311aSCédric Le Goater } 406d769a1daSCédric Le Goater 407b7f1a0cbSCédric Le Goater if (machine->kernel_filename && sc->num_cpus > 1) { 4089bb6d140SJoel Stanley /* With no u-boot we must set up a boot stub for the secondary CPU */ 4099bb6d140SJoel Stanley MemoryRegion *smpboot = g_new(MemoryRegion, 1); 410f489960dSPhilippe Mathieu-Daudé memory_region_init_ram(smpboot, NULL, "aspeed.smpboot", 4119bb6d140SJoel Stanley 0x80, &error_abort); 4129bb6d140SJoel Stanley memory_region_add_subregion(get_system_memory(), 4139bb6d140SJoel Stanley AST_SMP_MAILBOX_BASE, smpboot); 4149bb6d140SJoel Stanley 4159bb6d140SJoel Stanley aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot; 4169bb6d140SJoel Stanley aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary; 4179bb6d140SJoel Stanley aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE; 4189bb6d140SJoel Stanley } 4199bb6d140SJoel Stanley 4206e504a98SPaolo Bonzini aspeed_board_binfo.ram_size = machine->ram_size; 421347df6f8SEduardo Habkost aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM]; 422b033271fSCédric Le Goater 423baa4732bSCédric Le Goater if (amc->i2c_init) { 424baa4732bSCédric Le Goater amc->i2c_init(bmc); 4252cf6cb50SCédric Le Goater } 4262cf6cb50SCédric Le Goater 4270e2c24c6SAndrew Jeffery for (i = 0; i < bmc->soc.sdhci.num_slots; i++) { 4288ec239f2SMarkus Armbruster sdhci_attach_drive(&bmc->soc.sdhci.slots[i], 4298ec239f2SMarkus Armbruster drive_get(IF_SD, 0, i)); 430a29e3e12SAndrew Jeffery } 4312bea128cSEddie James 432a29e3e12SAndrew Jeffery if (bmc->soc.emmc.num_slots) { 4338ec239f2SMarkus Armbruster sdhci_attach_drive(&bmc->soc.emmc.slots[0], 4348ec239f2SMarkus Armbruster drive_get(IF_SD, 0, bmc->soc.sdhci.num_slots)); 4352bea128cSEddie James } 4362bea128cSEddie James 4372744ece8STao Xu arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo); 438327d8e4eSAndrew Jeffery } 439327d8e4eSAndrew Jeffery 44082b6a3f6SJohn Wang static void at24c_eeprom_init(I2CBus *bus, uint8_t addr, uint32_t rsize) 44182b6a3f6SJohn Wang { 44282b6a3f6SJohn Wang I2CSlave *i2c_dev = i2c_slave_new("at24c-eeprom", addr); 44382b6a3f6SJohn Wang DeviceState *dev = DEVICE(i2c_dev); 44482b6a3f6SJohn Wang 44582b6a3f6SJohn Wang qdev_prop_set_uint32(dev, "rom-size", rsize); 44682b6a3f6SJohn Wang i2c_slave_realize_and_unref(i2c_dev, bus, &error_abort); 44782b6a3f6SJohn Wang } 44882b6a3f6SJohn Wang 449612b219aSPhilippe Mathieu-Daudé static void palmetto_bmc_i2c_init(AspeedMachineState *bmc) 4502cf6cb50SCédric Le Goater { 4512cf6cb50SCédric Le Goater AspeedSoCState *soc = &bmc->soc; 452a87e81b9SCédric Le Goater DeviceState *dev; 4533d165f12SCédric Le Goater uint8_t *eeprom_buf = g_malloc0(32 * 1024); 4542cf6cb50SCédric Le Goater 4552cf6cb50SCédric Le Goater /* The palmetto platform expects a ds3231 RTC but a ds1338 is 4562cf6cb50SCédric Le Goater * enough to provide basic RTC features. Alarms will be missing */ 4571373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68); 458a87e81b9SCédric Le Goater 4597a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, 4603d165f12SCédric Le Goater eeprom_buf); 4613d165f12SCédric Le Goater 462a87e81b9SCédric Le Goater /* add a TMP423 temperature sensor */ 4631373b15bSPhilippe Mathieu-Daudé dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), 4641373b15bSPhilippe Mathieu-Daudé "tmp423", 0x4c)); 4655325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 4665325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 4675325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 4685325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort); 4692cf6cb50SCédric Le Goater } 4702cf6cb50SCédric Le Goater 4719cccb912SPatrick Venture static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc) 4729cccb912SPatrick Venture { 4739cccb912SPatrick Venture AspeedSoCState *soc = &bmc->soc; 4749cccb912SPatrick Venture 4759cccb912SPatrick Venture /* 4769cccb912SPatrick Venture * The quanta-q71l platform expects tmp75s which are compatible with 4779cccb912SPatrick Venture * tmp105s. 4789cccb912SPatrick Venture */ 4799cccb912SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c); 4809cccb912SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e); 4819cccb912SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f); 4829cccb912SPatrick Venture 4839cccb912SPatrick Venture /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */ 4849cccb912SPatrick Venture /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */ 4859cccb912SPatrick Venture /* TODO: Add Memory Riser i2c mux and eeproms. */ 4869cccb912SPatrick Venture 4873ec75e39SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74); 4883ec75e39SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77); 4893ec75e39SPatrick Venture 4909cccb912SPatrick Venture /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */ 4913ec75e39SPatrick Venture 4923ec75e39SPatrick Venture /* i2c-7 */ 4933ec75e39SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70); 4949cccb912SPatrick Venture /* - i2c@0: pmbus@59 */ 4959cccb912SPatrick Venture /* - i2c@1: pmbus@58 */ 4969cccb912SPatrick Venture /* - i2c@2: pmbus@58 */ 4979cccb912SPatrick Venture /* - i2c@3: pmbus@59 */ 4983ec75e39SPatrick Venture 4999cccb912SPatrick Venture /* TODO: i2c-7: Add PDB FRU eeprom@52 */ 5009cccb912SPatrick Venture /* TODO: i2c-8: Add BMC FRU eeprom@50 */ 5019cccb912SPatrick Venture } 5029cccb912SPatrick Venture 503612b219aSPhilippe Mathieu-Daudé static void ast2500_evb_i2c_init(AspeedMachineState *bmc) 5042cf6cb50SCédric Le Goater { 5052cf6cb50SCédric Le Goater AspeedSoCState *soc = &bmc->soc; 5063d165f12SCédric Le Goater uint8_t *eeprom_buf = g_malloc0(8 * 1024); 5073d165f12SCédric Le Goater 5087a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50, 5093d165f12SCédric Le Goater eeprom_buf); 5102cf6cb50SCédric Le Goater 5112cf6cb50SCédric Le Goater /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */ 5121373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), 513044475f3SPhilippe Mathieu-Daudé TYPE_TMP105, 0x4d); 5146c4567c7SCédric Le Goater 5156c4567c7SCédric Le Goater /* The AST2500 EVB does not have an RTC. Let's pretend that one is 5166c4567c7SCédric Le Goater * plugged on the I2C bus header */ 5171373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32); 5182cf6cb50SCédric Le Goater } 5192cf6cb50SCédric Le Goater 520612b219aSPhilippe Mathieu-Daudé static void ast2600_evb_i2c_init(AspeedMachineState *bmc) 521ccc2c418SCédric Le Goater { 522ccc2c418SCédric Le Goater /* Start with some devices on our I2C busses */ 523ccc2c418SCédric Le Goater ast2500_evb_i2c_init(bmc); 524ccc2c418SCédric Le Goater } 525ccc2c418SCédric Le Goater 526612b219aSPhilippe Mathieu-Daudé static void romulus_bmc_i2c_init(AspeedMachineState *bmc) 5276c4567c7SCédric Le Goater { 5286c4567c7SCédric Le Goater AspeedSoCState *soc = &bmc->soc; 5296c4567c7SCédric Le Goater 5306c4567c7SCédric Le Goater /* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is 5316c4567c7SCédric Le Goater * good enough */ 5321373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32); 5336c4567c7SCédric Le Goater } 5346c4567c7SCédric Le Goater 535f4aec252SCédric Le Goater static void create_pca9552(AspeedSoCState *soc, int bus_id, int addr) 536f4aec252SCédric Le Goater { 537f4aec252SCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, bus_id), 538f4aec252SCédric Le Goater TYPE_PCA9552, addr); 539f4aec252SCédric Le Goater } 540f4aec252SCédric Le Goater 541612b219aSPhilippe Mathieu-Daudé static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc) 542143b040fSPatrick Williams { 543143b040fSPatrick Williams AspeedSoCState *soc = &bmc->soc; 544143b040fSPatrick Williams 545143b040fSPatrick Williams /* bus 2 : */ 5461373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48); 5471373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49); 548143b040fSPatrick Williams /* bus 2 : pca9546 @ 0x73 */ 549143b040fSPatrick Williams 550143b040fSPatrick Williams /* bus 3 : pca9548 @ 0x70 */ 551143b040fSPatrick Williams 552143b040fSPatrick Williams /* bus 4 : */ 553143b040fSPatrick Williams uint8_t *eeprom4_54 = g_malloc0(8 * 1024); 5547a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 555143b040fSPatrick Williams eeprom4_54); 556143b040fSPatrick Williams /* PCA9539 @ 0x76, but PCA9552 is compatible */ 557f4aec252SCédric Le Goater create_pca9552(soc, 4, 0x76); 558143b040fSPatrick Williams /* PCA9539 @ 0x77, but PCA9552 is compatible */ 559f4aec252SCédric Le Goater create_pca9552(soc, 4, 0x77); 560143b040fSPatrick Williams 561143b040fSPatrick Williams /* bus 6 : */ 5621373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48); 5631373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49); 564143b040fSPatrick Williams /* bus 6 : pca9546 @ 0x73 */ 565143b040fSPatrick Williams 566143b040fSPatrick Williams /* bus 8 : */ 567143b040fSPatrick Williams uint8_t *eeprom8_56 = g_malloc0(8 * 1024); 5687a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56, 569143b040fSPatrick Williams eeprom8_56); 570f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x60); 571f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x61); 572143b040fSPatrick Williams /* bus 8 : adc128d818 @ 0x1d */ 573143b040fSPatrick Williams /* bus 8 : adc128d818 @ 0x1f */ 574143b040fSPatrick Williams 575143b040fSPatrick Williams /* 576143b040fSPatrick Williams * bus 13 : pca9548 @ 0x71 577143b040fSPatrick Williams * - channel 3: 578143b040fSPatrick Williams * - tmm421 @ 0x4c 579143b040fSPatrick Williams * - tmp421 @ 0x4e 580143b040fSPatrick Williams * - tmp421 @ 0x4f 581143b040fSPatrick Williams */ 582143b040fSPatrick Williams 583143b040fSPatrick Williams } 584143b040fSPatrick Williams 585612b219aSPhilippe Mathieu-Daudé static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc) 58662c2c2ebSCédric Le Goater { 5877cfbde5eSPhilippe Mathieu-Daudé static const struct { 5887cfbde5eSPhilippe Mathieu-Daudé unsigned gpio_id; 5897cfbde5eSPhilippe Mathieu-Daudé LEDColor color; 5907cfbde5eSPhilippe Mathieu-Daudé const char *description; 5917cfbde5eSPhilippe Mathieu-Daudé bool gpio_polarity; 5927cfbde5eSPhilippe Mathieu-Daudé } pca1_leds[] = { 5937cfbde5eSPhilippe Mathieu-Daudé {13, LED_COLOR_GREEN, "front-fault-4", GPIO_POLARITY_ACTIVE_LOW}, 5947cfbde5eSPhilippe Mathieu-Daudé {14, LED_COLOR_GREEN, "front-power-3", GPIO_POLARITY_ACTIVE_LOW}, 5957cfbde5eSPhilippe Mathieu-Daudé {15, LED_COLOR_GREEN, "front-id-5", GPIO_POLARITY_ACTIVE_LOW}, 5967cfbde5eSPhilippe Mathieu-Daudé }; 59762c2c2ebSCédric Le Goater AspeedSoCState *soc = &bmc->soc; 5983d165f12SCédric Le Goater uint8_t *eeprom_buf = g_malloc0(8 * 1024); 59915ce12cfSPhilippe Mathieu-Daudé DeviceState *dev; 6007cfbde5eSPhilippe Mathieu-Daudé LEDState *led; 60162c2c2ebSCédric Le Goater 60263ceb818SCédric Le Goater /* Bus 3: TODO bmp280@77 */ 60363ceb818SCédric Le Goater /* Bus 3: TODO max31785@52 */ 604db437ca6SPhilippe Mathieu-Daudé dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60)); 60515ce12cfSPhilippe Mathieu-Daudé qdev_prop_set_string(dev, "description", "pca1"); 6062616f572SPhilippe Mathieu-Daudé i2c_slave_realize_and_unref(I2C_SLAVE(dev), 6072616f572SPhilippe Mathieu-Daudé aspeed_i2c_get_bus(&soc->i2c, 3), 60815ce12cfSPhilippe Mathieu-Daudé &error_fatal); 6098c9a61d7SCédric Le Goater 6107cfbde5eSPhilippe Mathieu-Daudé for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) { 6117cfbde5eSPhilippe Mathieu-Daudé led = led_create_simple(OBJECT(bmc), 6127cfbde5eSPhilippe Mathieu-Daudé pca1_leds[i].gpio_polarity, 6137cfbde5eSPhilippe Mathieu-Daudé pca1_leds[i].color, 6147cfbde5eSPhilippe Mathieu-Daudé pca1_leds[i].description); 6157cfbde5eSPhilippe Mathieu-Daudé qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id, 6167cfbde5eSPhilippe Mathieu-Daudé qdev_get_gpio_in(DEVICE(led), 0)); 6177cfbde5eSPhilippe Mathieu-Daudé } 618b61ea6e7SJoel Stanley i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76); 6191373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c); 6201373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c); 62162c2c2ebSCédric Le Goater 62262c2c2ebSCédric Le Goater /* The Witherspoon expects a TMP275 but a TMP105 is compatible */ 6231373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105, 624044475f3SPhilippe Mathieu-Daudé 0x4a); 6256c4567c7SCédric Le Goater 6266c4567c7SCédric Le Goater /* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is 6276c4567c7SCédric Le Goater * good enough */ 6281373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32); 6293d165f12SCédric Le Goater 6307a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51, 6313d165f12SCédric Le Goater eeprom_buf); 632db437ca6SPhilippe Mathieu-Daudé dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60)); 63315ce12cfSPhilippe Mathieu-Daudé qdev_prop_set_string(dev, "description", "pca0"); 6342616f572SPhilippe Mathieu-Daudé i2c_slave_realize_and_unref(I2C_SLAVE(dev), 6352616f572SPhilippe Mathieu-Daudé aspeed_i2c_get_bus(&soc->i2c, 11), 63615ce12cfSPhilippe Mathieu-Daudé &error_fatal); 63763ceb818SCédric Le Goater /* Bus 11: TODO ucd90160@64 */ 63862c2c2ebSCédric Le Goater } 63962c2c2ebSCédric Le Goater 64095f068c8SJohn Wang static void g220a_bmc_i2c_init(AspeedMachineState *bmc) 64195f068c8SJohn Wang { 64295f068c8SJohn Wang AspeedSoCState *soc = &bmc->soc; 64395f068c8SJohn Wang DeviceState *dev; 64495f068c8SJohn Wang 64595f068c8SJohn Wang dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), 64695f068c8SJohn Wang "emc1413", 0x4c)); 64795f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 64895f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 64995f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 65095f068c8SJohn Wang 65195f068c8SJohn Wang dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12), 65295f068c8SJohn Wang "emc1413", 0x4c)); 65395f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 65495f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 65595f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 65695f068c8SJohn Wang 65795f068c8SJohn Wang dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13), 65895f068c8SJohn Wang "emc1413", 0x4c)); 65995f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 66095f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 66195f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 6626f5f6507SJohn Wang 6636f5f6507SJohn Wang static uint8_t eeprom_buf[2 * 1024] = { 6646f5f6507SJohn Wang 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe, 6656f5f6507SJohn Wang 0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65, 6666f5f6507SJohn Wang 0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32, 6676f5f6507SJohn Wang 0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42, 6686f5f6507SJohn Wang 0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45, 6696f5f6507SJohn Wang 0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1, 6706f5f6507SJohn Wang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, 6716f5f6507SJohn Wang }; 6726f5f6507SJohn Wang smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57, 6736f5f6507SJohn Wang eeprom_buf); 67495f068c8SJohn Wang } 67595f068c8SJohn Wang 676fa6d98c0SJoel Stanley static void aspeed_eeprom_init(I2CBus *bus, uint8_t addr, uint32_t rsize) 677fa6d98c0SJoel Stanley { 678fa6d98c0SJoel Stanley I2CSlave *i2c_dev = i2c_slave_new("at24c-eeprom", addr); 679fa6d98c0SJoel Stanley DeviceState *dev = DEVICE(i2c_dev); 680fa6d98c0SJoel Stanley 681fa6d98c0SJoel Stanley qdev_prop_set_uint32(dev, "rom-size", rsize); 682fa6d98c0SJoel Stanley i2c_slave_realize_and_unref(i2c_dev, bus, &error_abort); 683fa6d98c0SJoel Stanley } 684fa6d98c0SJoel Stanley 68582b6a3f6SJohn Wang static void fp5280g2_bmc_i2c_init(AspeedMachineState *bmc) 68682b6a3f6SJohn Wang { 68782b6a3f6SJohn Wang AspeedSoCState *soc = &bmc->soc; 68882b6a3f6SJohn Wang I2CSlave *i2c_mux; 68982b6a3f6SJohn Wang 69082b6a3f6SJohn Wang /* The at24c256 */ 69182b6a3f6SJohn Wang at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 1), 0x50, 32768); 69282b6a3f6SJohn Wang 69382b6a3f6SJohn Wang /* The fp5280g2 expects a TMP112 but a TMP105 is compatible */ 69482b6a3f6SJohn Wang i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105, 69582b6a3f6SJohn Wang 0x48); 69682b6a3f6SJohn Wang i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105, 69782b6a3f6SJohn Wang 0x49); 69882b6a3f6SJohn Wang 69982b6a3f6SJohn Wang i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), 70082b6a3f6SJohn Wang "pca9546", 0x70); 70182b6a3f6SJohn Wang /* It expects a TMP112 but a TMP105 is compatible */ 70282b6a3f6SJohn Wang i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0), TYPE_TMP105, 70382b6a3f6SJohn Wang 0x4a); 70482b6a3f6SJohn Wang 70582b6a3f6SJohn Wang /* It expects a ds3232 but a ds1338 is good enough */ 70682b6a3f6SJohn Wang i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "ds1338", 0x68); 70782b6a3f6SJohn Wang 70882b6a3f6SJohn Wang /* It expects a pca9555 but a pca9552 is compatible */ 709f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x30); 71082b6a3f6SJohn Wang } 71182b6a3f6SJohn Wang 71258e52bdbSCédric Le Goater static void rainier_bmc_i2c_init(AspeedMachineState *bmc) 71358e52bdbSCédric Le Goater { 71458e52bdbSCédric Le Goater AspeedSoCState *soc = &bmc->soc; 715fa6d98c0SJoel Stanley I2CSlave *i2c_mux; 716fa6d98c0SJoel Stanley 717fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB); 71858e52bdbSCédric Le Goater 719f4aec252SCédric Le Goater create_pca9552(soc, 3, 0x61); 720bcb122f8SJoel Stanley 72158e52bdbSCédric Le Goater /* The rainier expects a TMP275 but a TMP105 is compatible */ 72258e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105, 72358e52bdbSCédric Le Goater 0x48); 72458e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105, 72558e52bdbSCédric Le Goater 0x49); 72658e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105, 72758e52bdbSCédric Le Goater 0x4a); 728fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), 729fa6d98c0SJoel Stanley "pca9546", 0x70); 730fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 731fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 732fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB); 733f4aec252SCédric Le Goater create_pca9552(soc, 4, 0x60); 73458e52bdbSCédric Le Goater 73558e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105, 73658e52bdbSCédric Le Goater 0x48); 73758e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105, 73858e52bdbSCédric Le Goater 0x49); 739f4aec252SCédric Le Goater create_pca9552(soc, 5, 0x60); 740f4aec252SCédric Le Goater create_pca9552(soc, 5, 0x61); 741fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), 742fa6d98c0SJoel Stanley "pca9546", 0x70); 743fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 744fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 74558e52bdbSCédric Le Goater 74658e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105, 74758e52bdbSCédric Le Goater 0x48); 74858e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105, 74958e52bdbSCédric Le Goater 0x4a); 75058e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105, 75158e52bdbSCédric Le Goater 0x4b); 752fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), 753fa6d98c0SJoel Stanley "pca9546", 0x70); 754fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 755fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 756fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB); 757fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB); 75858e52bdbSCédric Le Goater 759f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x30); 760f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x31); 761f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x32); 762f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x33); 76358e52bdbSCédric Le Goater /* Bus 7: TODO max31785@52 */ 764f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x60); 765f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x61); 766b61ea6e7SJoel Stanley i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76); 76758e52bdbSCédric Le Goater /* Bus 7: TODO si7021-a20@20 */ 76858e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105, 76958e52bdbSCédric Le Goater 0x48); 770fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB); 771fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB); 77258e52bdbSCédric Le Goater 77358e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105, 77458e52bdbSCédric Le Goater 0x48); 77558e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105, 77658e52bdbSCédric Le Goater 0x4a); 777fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50, 64 * KiB); 778fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 64 * KiB); 779f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x60); 780f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x61); 78158e52bdbSCédric Le Goater /* Bus 8: ucd90320@11 */ 78258e52bdbSCédric Le Goater /* Bus 8: ucd90320@b */ 78358e52bdbSCédric Le Goater /* Bus 8: ucd90320@c */ 78458e52bdbSCédric Le Goater 78558e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c); 78658e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d); 787fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB); 78858e52bdbSCédric Le Goater 78958e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c); 79058e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d); 791fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB); 79258e52bdbSCédric Le Goater 79358e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105, 79458e52bdbSCédric Le Goater 0x48); 79558e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105, 79658e52bdbSCédric Le Goater 0x49); 797fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), 798fa6d98c0SJoel Stanley "pca9546", 0x70); 799fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 800fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 801f4aec252SCédric Le Goater create_pca9552(soc, 11, 0x60); 802fa6d98c0SJoel Stanley 803fa6d98c0SJoel Stanley 804fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB); 805f4aec252SCédric Le Goater create_pca9552(soc, 13, 0x60); 806fa6d98c0SJoel Stanley 807fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB); 808f4aec252SCédric Le Goater create_pca9552(soc, 14, 0x60); 809fa6d98c0SJoel Stanley 810fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB); 811f4aec252SCédric Le Goater create_pca9552(soc, 15, 0x60); 81258e52bdbSCédric Le Goater } 81358e52bdbSCédric Le Goater 814febbe308SPeter Delevoryas static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr, 815febbe308SPeter Delevoryas I2CBus **channels) 816febbe308SPeter Delevoryas { 817febbe308SPeter Delevoryas I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr); 818febbe308SPeter Delevoryas for (int i = 0; i < 8; i++) { 819febbe308SPeter Delevoryas channels[i] = pca954x_i2c_get_bus(mux, i); 820febbe308SPeter Delevoryas } 821febbe308SPeter Delevoryas } 822febbe308SPeter Delevoryas 823febbe308SPeter Delevoryas #define TYPE_LM75 TYPE_TMP105 824febbe308SPeter Delevoryas #define TYPE_TMP75 TYPE_TMP105 825febbe308SPeter Delevoryas #define TYPE_TMP422 "tmp422" 826febbe308SPeter Delevoryas 827febbe308SPeter Delevoryas static void fuji_bmc_i2c_init(AspeedMachineState *bmc) 828febbe308SPeter Delevoryas { 829febbe308SPeter Delevoryas AspeedSoCState *soc = &bmc->soc; 830febbe308SPeter Delevoryas I2CBus *i2c[144] = {}; 831febbe308SPeter Delevoryas 832febbe308SPeter Delevoryas for (int i = 0; i < 16; i++) { 833febbe308SPeter Delevoryas i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i); 834febbe308SPeter Delevoryas } 835febbe308SPeter Delevoryas I2CBus *i2c180 = i2c[2]; 836febbe308SPeter Delevoryas I2CBus *i2c480 = i2c[8]; 837febbe308SPeter Delevoryas I2CBus *i2c600 = i2c[11]; 838febbe308SPeter Delevoryas 839febbe308SPeter Delevoryas get_pca9548_channels(i2c180, 0x70, &i2c[16]); 840febbe308SPeter Delevoryas get_pca9548_channels(i2c480, 0x70, &i2c[24]); 841febbe308SPeter Delevoryas /* NOTE: The device tree skips [32, 40) in the alias numbering */ 842febbe308SPeter Delevoryas get_pca9548_channels(i2c600, 0x77, &i2c[40]); 843febbe308SPeter Delevoryas get_pca9548_channels(i2c[24], 0x71, &i2c[48]); 844febbe308SPeter Delevoryas get_pca9548_channels(i2c[25], 0x72, &i2c[56]); 845febbe308SPeter Delevoryas get_pca9548_channels(i2c[26], 0x76, &i2c[64]); 846febbe308SPeter Delevoryas get_pca9548_channels(i2c[27], 0x76, &i2c[72]); 847febbe308SPeter Delevoryas for (int i = 0; i < 8; i++) { 848febbe308SPeter Delevoryas get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]); 849febbe308SPeter Delevoryas } 850febbe308SPeter Delevoryas 851febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c); 852febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d); 853febbe308SPeter Delevoryas 854febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[19], 0x52, 64 * KiB); 855febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[20], 0x50, 2 * KiB); 856febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[22], 0x52, 2 * KiB); 857febbe308SPeter Delevoryas 858febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x48); 859febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x49); 860febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x4a); 861febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_TMP422, 0x4c); 862febbe308SPeter Delevoryas 863febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[8], 0x51, 64 * KiB); 864febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a); 865febbe308SPeter Delevoryas 866febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[50], TYPE_LM75, 0x4c); 867febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[50], 0x52, 64 * KiB); 868febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[51], TYPE_TMP75, 0x48); 869febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[52], TYPE_TMP75, 0x49); 870febbe308SPeter Delevoryas 871febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[59], TYPE_TMP75, 0x48); 872febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[60], TYPE_TMP75, 0x49); 873febbe308SPeter Delevoryas 874febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[65], 0x53, 64 * KiB); 875febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x49); 876febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x48); 877febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[68], 0x52, 64 * KiB); 878febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[69], 0x52, 64 * KiB); 879febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[70], 0x52, 64 * KiB); 880febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[71], 0x52, 64 * KiB); 881febbe308SPeter Delevoryas 882febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[73], 0x53, 64 * KiB); 883febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x49); 884febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x48); 885febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[76], 0x52, 64 * KiB); 886febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[77], 0x52, 64 * KiB); 887febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[78], 0x52, 64 * KiB); 888febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[79], 0x52, 64 * KiB); 889febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[28], 0x50, 2 * KiB); 890febbe308SPeter Delevoryas 891febbe308SPeter Delevoryas for (int i = 0; i < 8; i++) { 892febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB); 893febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[82 + i * 8], TYPE_TMP75, 0x48); 894febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[83 + i * 8], TYPE_TMP75, 0x4b); 895febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[84 + i * 8], TYPE_TMP75, 0x4a); 896febbe308SPeter Delevoryas } 897febbe308SPeter Delevoryas } 898febbe308SPeter Delevoryas 8991a15311aSCédric Le Goater static bool aspeed_get_mmio_exec(Object *obj, Error **errp) 9001a15311aSCédric Le Goater { 9011a15311aSCédric Le Goater return ASPEED_MACHINE(obj)->mmio_exec; 9021a15311aSCédric Le Goater } 9031a15311aSCédric Le Goater 9041a15311aSCédric Le Goater static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp) 9051a15311aSCédric Le Goater { 9061a15311aSCédric Le Goater ASPEED_MACHINE(obj)->mmio_exec = value; 9071a15311aSCédric Le Goater } 9081a15311aSCédric Le Goater 9091a15311aSCédric Le Goater static void aspeed_machine_instance_init(Object *obj) 9101a15311aSCédric Le Goater { 9111a15311aSCédric Le Goater ASPEED_MACHINE(obj)->mmio_exec = false; 9121a15311aSCédric Le Goater } 9131a15311aSCédric Le Goater 9149820e52fSCédric Le Goater static char *aspeed_get_fmc_model(Object *obj, Error **errp) 9159820e52fSCédric Le Goater { 9169820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 9179820e52fSCédric Le Goater return g_strdup(bmc->fmc_model); 9189820e52fSCédric Le Goater } 9199820e52fSCédric Le Goater 9209820e52fSCédric Le Goater static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp) 9219820e52fSCédric Le Goater { 9229820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 9239820e52fSCédric Le Goater 9249820e52fSCédric Le Goater g_free(bmc->fmc_model); 9259820e52fSCédric Le Goater bmc->fmc_model = g_strdup(value); 9269820e52fSCédric Le Goater } 9279820e52fSCédric Le Goater 9289820e52fSCédric Le Goater static char *aspeed_get_spi_model(Object *obj, Error **errp) 9299820e52fSCédric Le Goater { 9309820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 9319820e52fSCédric Le Goater return g_strdup(bmc->spi_model); 9329820e52fSCédric Le Goater } 9339820e52fSCédric Le Goater 9349820e52fSCédric Le Goater static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp) 9359820e52fSCédric Le Goater { 9369820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 9379820e52fSCédric Le Goater 9389820e52fSCédric Le Goater g_free(bmc->spi_model); 9399820e52fSCédric Le Goater bmc->spi_model = g_strdup(value); 9409820e52fSCédric Le Goater } 9419820e52fSCédric Le Goater 9421a15311aSCédric Le Goater static void aspeed_machine_class_props_init(ObjectClass *oc) 9431a15311aSCédric Le Goater { 9441a15311aSCédric Le Goater object_class_property_add_bool(oc, "execute-in-place", 9451a15311aSCédric Le Goater aspeed_get_mmio_exec, 946d2623129SMarkus Armbruster aspeed_set_mmio_exec); 9471a15311aSCédric Le Goater object_class_property_set_description(oc, "execute-in-place", 9487eecec7dSMarkus Armbruster "boot directly from CE0 flash device"); 9499820e52fSCédric Le Goater 9509820e52fSCédric Le Goater object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model, 9519820e52fSCédric Le Goater aspeed_set_fmc_model); 9529820e52fSCédric Le Goater object_class_property_set_description(oc, "fmc-model", 9539820e52fSCédric Le Goater "Change the FMC Flash model"); 9549820e52fSCédric Le Goater object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model, 9559820e52fSCédric Le Goater aspeed_set_spi_model); 9569820e52fSCédric Le Goater object_class_property_set_description(oc, "spi-model", 9579820e52fSCédric Le Goater "Change the SPI Flash model"); 9581a15311aSCédric Le Goater } 9591a15311aSCédric Le Goater 960b7f1a0cbSCédric Le Goater static int aspeed_soc_num_cpus(const char *soc_name) 961b7f1a0cbSCédric Le Goater { 962b7f1a0cbSCédric Le Goater AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(soc_name)); 963b7f1a0cbSCédric Le Goater return sc->num_cpus; 964b7f1a0cbSCédric Le Goater } 965b7f1a0cbSCédric Le Goater 966fca9ca1bSCédric Le Goater static void aspeed_machine_class_init(ObjectClass *oc, void *data) 96762c2c2ebSCédric Le Goater { 96862c2c2ebSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 969d3bad7e7SCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 97062c2c2ebSCédric Le Goater 971fca9ca1bSCédric Le Goater mc->init = aspeed_machine_init; 97262c2c2ebSCédric Le Goater mc->no_floppy = 1; 97362c2c2ebSCédric Le Goater mc->no_cdrom = 1; 97462c2c2ebSCédric Le Goater mc->no_parallel = 1; 975afcbaed6SIgor Mammedov mc->default_ram_id = "ram"; 976d3bad7e7SCédric Le Goater amc->macs_mask = ASPEED_MAC0_ON; 9775d63d0c7SPeter Delevoryas amc->uart_default = ASPEED_DEV_UART5; 9781a15311aSCédric Le Goater 9791a15311aSCédric Le Goater aspeed_machine_class_props_init(oc); 98062c2c2ebSCédric Le Goater } 98162c2c2ebSCédric Le Goater 982baa4732bSCédric Le Goater static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data) 983baa4732bSCédric Le Goater { 984baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 985baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 986baa4732bSCédric Le Goater 987baa4732bSCédric Le Goater mc->desc = "OpenPOWER Palmetto BMC (ARM926EJ-S)"; 988baa4732bSCédric Le Goater amc->soc_name = "ast2400-a1"; 989baa4732bSCédric Le Goater amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1; 990baa4732bSCédric Le Goater amc->fmc_model = "n25q256a"; 991baa4732bSCédric Le Goater amc->spi_model = "mx25l25635e"; 992baa4732bSCédric Le Goater amc->num_cs = 1; 993baa4732bSCédric Le Goater amc->i2c_init = palmetto_bmc_i2c_init; 994baa4732bSCédric Le Goater mc->default_ram_size = 256 * MiB; 995b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 996b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 997baa4732bSCédric Le Goater }; 998baa4732bSCédric Le Goater 9999cccb912SPatrick Venture static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data) 10009cccb912SPatrick Venture { 10019cccb912SPatrick Venture MachineClass *mc = MACHINE_CLASS(oc); 10029cccb912SPatrick Venture AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 10039cccb912SPatrick Venture 10049cccb912SPatrick Venture mc->desc = "Quanta-Q71l BMC (ARM926EJ-S)"; 10059cccb912SPatrick Venture amc->soc_name = "ast2400-a1"; 10069cccb912SPatrick Venture amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1; 10079cccb912SPatrick Venture amc->fmc_model = "n25q256a"; 10089cccb912SPatrick Venture amc->spi_model = "mx25l25635e"; 10099cccb912SPatrick Venture amc->num_cs = 1; 10109cccb912SPatrick Venture amc->i2c_init = quanta_q71l_bmc_i2c_init; 10119cccb912SPatrick Venture mc->default_ram_size = 128 * MiB; 10129cccb912SPatrick Venture mc->default_cpus = mc->min_cpus = mc->max_cpus = 10139cccb912SPatrick Venture aspeed_soc_num_cpus(amc->soc_name); 10149cccb912SPatrick Venture } 10159cccb912SPatrick Venture 101640a38df5SErik Smit static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc, 101740a38df5SErik Smit void *data) 101840a38df5SErik Smit { 101940a38df5SErik Smit MachineClass *mc = MACHINE_CLASS(oc); 102040a38df5SErik Smit AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 102140a38df5SErik Smit 102240a38df5SErik Smit mc->desc = "Supermicro X11 BMC (ARM926EJ-S)"; 102340a38df5SErik Smit amc->soc_name = "ast2400-a1"; 102440a38df5SErik Smit amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1; 102540a38df5SErik Smit amc->fmc_model = "mx25l25635e"; 102640a38df5SErik Smit amc->spi_model = "mx25l25635e"; 102740a38df5SErik Smit amc->num_cs = 1; 102840a38df5SErik Smit amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 102940a38df5SErik Smit amc->i2c_init = palmetto_bmc_i2c_init; 103040a38df5SErik Smit mc->default_ram_size = 256 * MiB; 103140a38df5SErik Smit } 103240a38df5SErik Smit 1033baa4732bSCédric Le Goater static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data) 1034baa4732bSCédric Le Goater { 1035baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1036baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1037baa4732bSCédric Le Goater 1038baa4732bSCédric Le Goater mc->desc = "Aspeed AST2500 EVB (ARM1176)"; 1039baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1"; 1040baa4732bSCédric Le Goater amc->hw_strap1 = AST2500_EVB_HW_STRAP1; 1041baa4732bSCédric Le Goater amc->fmc_model = "w25q256"; 1042baa4732bSCédric Le Goater amc->spi_model = "mx25l25635e"; 1043baa4732bSCédric Le Goater amc->num_cs = 1; 1044baa4732bSCédric Le Goater amc->i2c_init = ast2500_evb_i2c_init; 1045baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB; 1046b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1047b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1048baa4732bSCédric Le Goater }; 1049baa4732bSCédric Le Goater 1050baa4732bSCédric Le Goater static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data) 1051baa4732bSCédric Le Goater { 1052baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1053baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1054baa4732bSCédric Le Goater 1055baa4732bSCédric Le Goater mc->desc = "OpenPOWER Romulus BMC (ARM1176)"; 1056baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1"; 1057baa4732bSCédric Le Goater amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1; 1058baa4732bSCédric Le Goater amc->fmc_model = "n25q256a"; 1059baa4732bSCédric Le Goater amc->spi_model = "mx66l1g45g"; 1060baa4732bSCédric Le Goater amc->num_cs = 2; 1061baa4732bSCédric Le Goater amc->i2c_init = romulus_bmc_i2c_init; 1062baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB; 1063b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1064b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1065baa4732bSCédric Le Goater }; 1066baa4732bSCédric Le Goater 1067143b040fSPatrick Williams static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data) 1068143b040fSPatrick Williams { 1069143b040fSPatrick Williams MachineClass *mc = MACHINE_CLASS(oc); 1070143b040fSPatrick Williams AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1071143b040fSPatrick Williams 1072143b040fSPatrick Williams mc->desc = "OCP SonoraPass BMC (ARM1176)"; 1073143b040fSPatrick Williams amc->soc_name = "ast2500-a1"; 1074143b040fSPatrick Williams amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1; 1075143b040fSPatrick Williams amc->fmc_model = "mx66l1g45g"; 1076143b040fSPatrick Williams amc->spi_model = "mx66l1g45g"; 1077143b040fSPatrick Williams amc->num_cs = 2; 1078143b040fSPatrick Williams amc->i2c_init = sonorapass_bmc_i2c_init; 1079143b040fSPatrick Williams mc->default_ram_size = 512 * MiB; 1080b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1081b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1082143b040fSPatrick Williams }; 1083143b040fSPatrick Williams 1084baa4732bSCédric Le Goater static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data) 1085baa4732bSCédric Le Goater { 1086baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1087baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1088baa4732bSCédric Le Goater 1089baa4732bSCédric Le Goater mc->desc = "OpenPOWER Witherspoon BMC (ARM1176)"; 1090baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1"; 1091baa4732bSCédric Le Goater amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1; 1092baa4732bSCédric Le Goater amc->fmc_model = "mx25l25635e"; 1093baa4732bSCédric Le Goater amc->spi_model = "mx66l1g45g"; 1094baa4732bSCédric Le Goater amc->num_cs = 2; 1095baa4732bSCédric Le Goater amc->i2c_init = witherspoon_bmc_i2c_init; 1096baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB; 1097b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1098b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1099baa4732bSCédric Le Goater }; 1100baa4732bSCédric Le Goater 1101baa4732bSCédric Le Goater static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data) 1102baa4732bSCédric Le Goater { 1103baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1104baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1105baa4732bSCédric Le Goater 1106f548f201SPeter Maydell mc->desc = "Aspeed AST2600 EVB (Cortex-A7)"; 1107c5811bb3SJoel Stanley amc->soc_name = "ast2600-a3"; 1108baa4732bSCédric Le Goater amc->hw_strap1 = AST2600_EVB_HW_STRAP1; 1109baa4732bSCédric Le Goater amc->hw_strap2 = AST2600_EVB_HW_STRAP2; 1110baa4732bSCédric Le Goater amc->fmc_model = "w25q512jv"; 1111baa4732bSCédric Le Goater amc->spi_model = "mx66u51235f"; 1112baa4732bSCédric Le Goater amc->num_cs = 1; 111329193286SGuenter Roeck amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON | 111429193286SGuenter Roeck ASPEED_MAC3_ON; 1115baa4732bSCédric Le Goater amc->i2c_init = ast2600_evb_i2c_init; 1116baa4732bSCédric Le Goater mc->default_ram_size = 1 * GiB; 1117b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1118b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1119baa4732bSCédric Le Goater }; 1120baa4732bSCédric Le Goater 112163ceb818SCédric Le Goater static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data) 112263ceb818SCédric Le Goater { 112363ceb818SCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 112463ceb818SCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 112563ceb818SCédric Le Goater 1126f548f201SPeter Maydell mc->desc = "OpenPOWER Tacoma BMC (Cortex-A7)"; 1127c5811bb3SJoel Stanley amc->soc_name = "ast2600-a3"; 112863ceb818SCédric Le Goater amc->hw_strap1 = TACOMA_BMC_HW_STRAP1; 112963ceb818SCédric Le Goater amc->hw_strap2 = TACOMA_BMC_HW_STRAP2; 113063ceb818SCédric Le Goater amc->fmc_model = "mx66l1g45g"; 113163ceb818SCédric Le Goater amc->spi_model = "mx66l1g45g"; 113263ceb818SCédric Le Goater amc->num_cs = 2; 1133d3bad7e7SCédric Le Goater amc->macs_mask = ASPEED_MAC2_ON; 113463ceb818SCédric Le Goater amc->i2c_init = witherspoon_bmc_i2c_init; /* Same board layout */ 113563ceb818SCédric Le Goater mc->default_ram_size = 1 * GiB; 1136b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1137b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 113863ceb818SCédric Le Goater }; 113963ceb818SCédric Le Goater 114095f068c8SJohn Wang static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data) 114195f068c8SJohn Wang { 114295f068c8SJohn Wang MachineClass *mc = MACHINE_CLASS(oc); 114395f068c8SJohn Wang AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 114495f068c8SJohn Wang 114595f068c8SJohn Wang mc->desc = "Bytedance G220A BMC (ARM1176)"; 114695f068c8SJohn Wang amc->soc_name = "ast2500-a1"; 114795f068c8SJohn Wang amc->hw_strap1 = G220A_BMC_HW_STRAP1; 114895f068c8SJohn Wang amc->fmc_model = "n25q512a"; 114995f068c8SJohn Wang amc->spi_model = "mx25l25635e"; 115095f068c8SJohn Wang amc->num_cs = 2; 11515bb825c8SGuenter Roeck amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 115295f068c8SJohn Wang amc->i2c_init = g220a_bmc_i2c_init; 115395f068c8SJohn Wang mc->default_ram_size = 1024 * MiB; 115495f068c8SJohn Wang mc->default_cpus = mc->min_cpus = mc->max_cpus = 115595f068c8SJohn Wang aspeed_soc_num_cpus(amc->soc_name); 115695f068c8SJohn Wang }; 115795f068c8SJohn Wang 115882b6a3f6SJohn Wang static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc, void *data) 115982b6a3f6SJohn Wang { 116082b6a3f6SJohn Wang MachineClass *mc = MACHINE_CLASS(oc); 116182b6a3f6SJohn Wang AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 116282b6a3f6SJohn Wang 116382b6a3f6SJohn Wang mc->desc = "Inspur FP5280G2 BMC (ARM1176)"; 116482b6a3f6SJohn Wang amc->soc_name = "ast2500-a1"; 116582b6a3f6SJohn Wang amc->hw_strap1 = FP5280G2_BMC_HW_STRAP1; 116682b6a3f6SJohn Wang amc->fmc_model = "n25q512a"; 116782b6a3f6SJohn Wang amc->spi_model = "mx25l25635e"; 116882b6a3f6SJohn Wang amc->num_cs = 2; 116982b6a3f6SJohn Wang amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 117082b6a3f6SJohn Wang amc->i2c_init = fp5280g2_bmc_i2c_init; 117182b6a3f6SJohn Wang mc->default_ram_size = 512 * MiB; 117282b6a3f6SJohn Wang mc->default_cpus = mc->min_cpus = mc->max_cpus = 117382b6a3f6SJohn Wang aspeed_soc_num_cpus(amc->soc_name); 117482b6a3f6SJohn Wang }; 117582b6a3f6SJohn Wang 117658e52bdbSCédric Le Goater static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data) 117758e52bdbSCédric Le Goater { 117858e52bdbSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 117958e52bdbSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 118058e52bdbSCédric Le Goater 1181f548f201SPeter Maydell mc->desc = "IBM Rainier BMC (Cortex-A7)"; 1182c5811bb3SJoel Stanley amc->soc_name = "ast2600-a3"; 118358e52bdbSCédric Le Goater amc->hw_strap1 = RAINIER_BMC_HW_STRAP1; 118458e52bdbSCédric Le Goater amc->hw_strap2 = RAINIER_BMC_HW_STRAP2; 118558e52bdbSCédric Le Goater amc->fmc_model = "mx66l1g45g"; 118658e52bdbSCédric Le Goater amc->spi_model = "mx66l1g45g"; 118758e52bdbSCédric Le Goater amc->num_cs = 2; 118858e52bdbSCédric Le Goater amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON; 118958e52bdbSCédric Le Goater amc->i2c_init = rainier_bmc_i2c_init; 119058e52bdbSCédric Le Goater mc->default_ram_size = 1 * GiB; 119158e52bdbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 119258e52bdbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 119358e52bdbSCédric Le Goater }; 119458e52bdbSCédric Le Goater 1195febbe308SPeter Delevoryas /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */ 1196febbe308SPeter Delevoryas #if HOST_LONG_BITS == 32 1197febbe308SPeter Delevoryas #define FUJI_BMC_RAM_SIZE (1 * GiB) 1198febbe308SPeter Delevoryas #else 1199febbe308SPeter Delevoryas #define FUJI_BMC_RAM_SIZE (2 * GiB) 1200febbe308SPeter Delevoryas #endif 1201febbe308SPeter Delevoryas 1202febbe308SPeter Delevoryas static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data) 1203febbe308SPeter Delevoryas { 1204febbe308SPeter Delevoryas MachineClass *mc = MACHINE_CLASS(oc); 1205febbe308SPeter Delevoryas AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1206febbe308SPeter Delevoryas 1207febbe308SPeter Delevoryas mc->desc = "Facebook Fuji BMC (Cortex-A7)"; 1208febbe308SPeter Delevoryas amc->soc_name = "ast2600-a3"; 1209febbe308SPeter Delevoryas amc->hw_strap1 = FUJI_BMC_HW_STRAP1; 1210febbe308SPeter Delevoryas amc->hw_strap2 = FUJI_BMC_HW_STRAP2; 1211febbe308SPeter Delevoryas amc->fmc_model = "mx66l1g45g"; 1212febbe308SPeter Delevoryas amc->spi_model = "mx66l1g45g"; 1213febbe308SPeter Delevoryas amc->num_cs = 2; 1214febbe308SPeter Delevoryas amc->macs_mask = ASPEED_MAC3_ON; 1215febbe308SPeter Delevoryas amc->i2c_init = fuji_bmc_i2c_init; 1216febbe308SPeter Delevoryas amc->uart_default = ASPEED_DEV_UART1; 1217febbe308SPeter Delevoryas mc->default_ram_size = FUJI_BMC_RAM_SIZE; 1218febbe308SPeter Delevoryas mc->default_cpus = mc->min_cpus = mc->max_cpus = 1219febbe308SPeter Delevoryas aspeed_soc_num_cpus(amc->soc_name); 1220febbe308SPeter Delevoryas }; 1221febbe308SPeter Delevoryas 1222baa4732bSCédric Le Goater static const TypeInfo aspeed_machine_types[] = { 1223baa4732bSCédric Le Goater { 1224baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("palmetto-bmc"), 1225baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1226baa4732bSCédric Le Goater .class_init = aspeed_machine_palmetto_class_init, 1227baa4732bSCédric Le Goater }, { 122840a38df5SErik Smit .name = MACHINE_TYPE_NAME("supermicrox11-bmc"), 122940a38df5SErik Smit .parent = TYPE_ASPEED_MACHINE, 123040a38df5SErik Smit .class_init = aspeed_machine_supermicrox11_bmc_class_init, 123140a38df5SErik Smit }, { 1232baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("ast2500-evb"), 1233baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1234baa4732bSCédric Le Goater .class_init = aspeed_machine_ast2500_evb_class_init, 1235baa4732bSCédric Le Goater }, { 1236baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("romulus-bmc"), 1237baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1238baa4732bSCédric Le Goater .class_init = aspeed_machine_romulus_class_init, 1239baa4732bSCédric Le Goater }, { 1240143b040fSPatrick Williams .name = MACHINE_TYPE_NAME("sonorapass-bmc"), 1241143b040fSPatrick Williams .parent = TYPE_ASPEED_MACHINE, 1242143b040fSPatrick Williams .class_init = aspeed_machine_sonorapass_class_init, 1243143b040fSPatrick Williams }, { 1244baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("witherspoon-bmc"), 1245baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1246baa4732bSCédric Le Goater .class_init = aspeed_machine_witherspoon_class_init, 1247baa4732bSCédric Le Goater }, { 1248baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("ast2600-evb"), 1249baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1250baa4732bSCédric Le Goater .class_init = aspeed_machine_ast2600_evb_class_init, 1251baa4732bSCédric Le Goater }, { 125263ceb818SCédric Le Goater .name = MACHINE_TYPE_NAME("tacoma-bmc"), 125363ceb818SCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 125463ceb818SCédric Le Goater .class_init = aspeed_machine_tacoma_class_init, 125563ceb818SCédric Le Goater }, { 125695f068c8SJohn Wang .name = MACHINE_TYPE_NAME("g220a-bmc"), 125795f068c8SJohn Wang .parent = TYPE_ASPEED_MACHINE, 125895f068c8SJohn Wang .class_init = aspeed_machine_g220a_class_init, 125995f068c8SJohn Wang }, { 126082b6a3f6SJohn Wang .name = MACHINE_TYPE_NAME("fp5280g2-bmc"), 126182b6a3f6SJohn Wang .parent = TYPE_ASPEED_MACHINE, 126282b6a3f6SJohn Wang .class_init = aspeed_machine_fp5280g2_class_init, 126382b6a3f6SJohn Wang }, { 12649cccb912SPatrick Venture .name = MACHINE_TYPE_NAME("quanta-q71l-bmc"), 12659cccb912SPatrick Venture .parent = TYPE_ASPEED_MACHINE, 12669cccb912SPatrick Venture .class_init = aspeed_machine_quanta_q71l_class_init, 12679cccb912SPatrick Venture }, { 126858e52bdbSCédric Le Goater .name = MACHINE_TYPE_NAME("rainier-bmc"), 126958e52bdbSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 127058e52bdbSCédric Le Goater .class_init = aspeed_machine_rainier_class_init, 127158e52bdbSCédric Le Goater }, { 1272febbe308SPeter Delevoryas .name = MACHINE_TYPE_NAME("fuji-bmc"), 1273febbe308SPeter Delevoryas .parent = TYPE_ASPEED_MACHINE, 1274febbe308SPeter Delevoryas .class_init = aspeed_machine_fuji_class_init, 1275febbe308SPeter Delevoryas }, { 1276fca9ca1bSCédric Le Goater .name = TYPE_ASPEED_MACHINE, 127762c2c2ebSCédric Le Goater .parent = TYPE_MACHINE, 1278888b2b03SPhilippe Mathieu-Daudé .instance_size = sizeof(AspeedMachineState), 12791a15311aSCédric Le Goater .instance_init = aspeed_machine_instance_init, 1280fca9ca1bSCédric Le Goater .class_size = sizeof(AspeedMachineClass), 1281fca9ca1bSCédric Le Goater .class_init = aspeed_machine_class_init, 1282baa4732bSCédric Le Goater .abstract = true, 1283baa4732bSCédric Le Goater } 1284fca9ca1bSCédric Le Goater }; 128574fb1f38SCédric Le Goater 1286baa4732bSCédric Le Goater DEFINE_TYPES(aspeed_machine_types) 1287