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 170*a20c54b1SPatrick Williams /* Bletchley hardware value */ 171*a20c54b1SPatrick Williams /* TODO: Leave same as EVB for now. */ 172*a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP1 AST2600_EVB_HW_STRAP1 173*a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP2 AST2600_EVB_HW_STRAP2 174*a20c54b1SPatrick Williams 175ebe31c0aSCédric Le Goater /* 176ebe31c0aSCédric Le Goater * The max ram region is for firmwares that scan the address space 177ebe31c0aSCédric Le Goater * with load/store to guess how much RAM the SoC has. 178ebe31c0aSCédric Le Goater */ 179ebe31c0aSCédric Le Goater static uint64_t max_ram_read(void *opaque, hwaddr offset, unsigned size) 180ebe31c0aSCédric Le Goater { 181ebe31c0aSCédric Le Goater return 0; 182ebe31c0aSCédric Le Goater } 183ebe31c0aSCédric Le Goater 184ebe31c0aSCédric Le Goater static void max_ram_write(void *opaque, hwaddr offset, uint64_t value, 185ebe31c0aSCédric Le Goater unsigned size) 186ebe31c0aSCédric Le Goater { 187ebe31c0aSCédric Le Goater /* Discard writes */ 188ebe31c0aSCédric Le Goater } 189ebe31c0aSCédric Le Goater 190ebe31c0aSCédric Le Goater static const MemoryRegionOps max_ram_ops = { 191ebe31c0aSCédric Le Goater .read = max_ram_read, 192ebe31c0aSCédric Le Goater .write = max_ram_write, 193ebe31c0aSCédric Le Goater .endianness = DEVICE_NATIVE_ENDIAN, 194ebe31c0aSCédric Le Goater }; 195ebe31c0aSCédric Le Goater 1969bb6d140SJoel Stanley #define AST_SMP_MAILBOX_BASE 0x1e6e2180 1979bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_ENTRY (AST_SMP_MAILBOX_BASE + 0x0) 1989bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_GOSIGN (AST_SMP_MAILBOX_BASE + 0x4) 1999bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_READY (AST_SMP_MAILBOX_BASE + 0x8) 2009bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_POLLINSN (AST_SMP_MAILBOX_BASE + 0xc) 2019bb6d140SJoel Stanley #define AST_SMP_MBOX_CODE (AST_SMP_MAILBOX_BASE + 0x10) 2029bb6d140SJoel Stanley #define AST_SMP_MBOX_GOSIGN 0xabbaab00 2039bb6d140SJoel Stanley 2049bb6d140SJoel Stanley static void aspeed_write_smpboot(ARMCPU *cpu, 2059bb6d140SJoel Stanley const struct arm_boot_info *info) 2069bb6d140SJoel Stanley { 2079bb6d140SJoel Stanley static const uint32_t poll_mailbox_ready[] = { 2089bb6d140SJoel Stanley /* 2099bb6d140SJoel Stanley * r2 = per-cpu go sign value 2109bb6d140SJoel Stanley * r1 = AST_SMP_MBOX_FIELD_ENTRY 2119bb6d140SJoel Stanley * r0 = AST_SMP_MBOX_FIELD_GOSIGN 2129bb6d140SJoel Stanley */ 2139bb6d140SJoel Stanley 0xee100fb0, /* mrc p15, 0, r0, c0, c0, 5 */ 2149bb6d140SJoel Stanley 0xe21000ff, /* ands r0, r0, #255 */ 2159bb6d140SJoel Stanley 0xe59f201c, /* ldr r2, [pc, #28] */ 2169bb6d140SJoel Stanley 0xe1822000, /* orr r2, r2, r0 */ 2179bb6d140SJoel Stanley 2189bb6d140SJoel Stanley 0xe59f1018, /* ldr r1, [pc, #24] */ 2199bb6d140SJoel Stanley 0xe59f0018, /* ldr r0, [pc, #24] */ 2209bb6d140SJoel Stanley 2219bb6d140SJoel Stanley 0xe320f002, /* wfe */ 2229bb6d140SJoel Stanley 0xe5904000, /* ldr r4, [r0] */ 2239bb6d140SJoel Stanley 0xe1520004, /* cmp r2, r4 */ 2249bb6d140SJoel Stanley 0x1afffffb, /* bne <wfe> */ 2259bb6d140SJoel Stanley 0xe591f000, /* ldr pc, [r1] */ 2269bb6d140SJoel Stanley AST_SMP_MBOX_GOSIGN, 2279bb6d140SJoel Stanley AST_SMP_MBOX_FIELD_ENTRY, 2289bb6d140SJoel Stanley AST_SMP_MBOX_FIELD_GOSIGN, 2299bb6d140SJoel Stanley }; 2309bb6d140SJoel Stanley 2319bb6d140SJoel Stanley rom_add_blob_fixed("aspeed.smpboot", poll_mailbox_ready, 2329bb6d140SJoel Stanley sizeof(poll_mailbox_ready), 2339bb6d140SJoel Stanley info->smp_loader_start); 2349bb6d140SJoel Stanley } 2359bb6d140SJoel Stanley 2369bb6d140SJoel Stanley static void aspeed_reset_secondary(ARMCPU *cpu, 2379bb6d140SJoel Stanley const struct arm_boot_info *info) 2389bb6d140SJoel Stanley { 2399bb6d140SJoel Stanley AddressSpace *as = arm_boot_address_space(cpu, info); 2409bb6d140SJoel Stanley CPUState *cs = CPU(cpu); 2419bb6d140SJoel Stanley 2429bb6d140SJoel Stanley /* info->smp_bootreg_addr */ 2439bb6d140SJoel Stanley address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0, 2449bb6d140SJoel Stanley MEMTXATTRS_UNSPECIFIED, NULL); 2459bb6d140SJoel Stanley cpu_set_pc(cs, info->smp_loader_start); 2469bb6d140SJoel Stanley } 2479bb6d140SJoel Stanley 248d769a1daSCédric Le Goater #define FIRMWARE_ADDR 0x0 249d769a1daSCédric Le Goater 250d769a1daSCédric Le Goater static void write_boot_rom(DriveInfo *dinfo, hwaddr addr, size_t rom_size, 251d769a1daSCédric Le Goater Error **errp) 252d769a1daSCédric Le Goater { 253d769a1daSCédric Le Goater BlockBackend *blk = blk_by_legacy_dinfo(dinfo); 25405e6e40aSWentao_Liang g_autofree void *storage = NULL; 2550c7209beSCédric Le Goater int64_t size; 256d769a1daSCédric Le Goater 2570c7209beSCédric Le Goater /* The block backend size should have already been 'validated' by 2580c7209beSCédric Le Goater * the creation of the m25p80 object. 2590c7209beSCédric Le Goater */ 2600c7209beSCédric Le Goater size = blk_getlength(blk); 2610c7209beSCédric Le Goater if (size <= 0) { 2620c7209beSCédric Le Goater error_setg(errp, "failed to get flash size"); 2630c7209beSCédric Le Goater return; 2640c7209beSCédric Le Goater } 2650c7209beSCédric Le Goater 2660c7209beSCédric Le Goater if (rom_size > size) { 2670c7209beSCédric Le Goater rom_size = size; 268d769a1daSCédric Le Goater } 269d769a1daSCédric Le Goater 27005e6e40aSWentao_Liang storage = g_malloc0(rom_size); 271d769a1daSCédric Le Goater if (blk_pread(blk, 0, storage, rom_size) < 0) { 272d769a1daSCédric Le Goater error_setg(errp, "failed to read the initial flash content"); 273d769a1daSCédric Le Goater return; 274d769a1daSCédric Le Goater } 275d769a1daSCédric Le Goater 276d769a1daSCédric Le Goater rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr); 277d769a1daSCédric Le Goater } 278d769a1daSCédric Le Goater 2799bd4ac61SCédric Le Goater static void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype, 2809bd4ac61SCédric Le Goater unsigned int count, int unit0) 281e1ad9bc4SCédric Le Goater { 282e1ad9bc4SCédric Le Goater int i; 283179b2058SPatrick Williams 284179b2058SPatrick Williams if (!flashtype) { 285179b2058SPatrick Williams return; 286179b2058SPatrick Williams } 287e1ad9bc4SCédric Le Goater 2889bd4ac61SCédric Le Goater for (i = 0; i < count; ++i) { 2898ec239f2SMarkus Armbruster DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i); 290e1ad9bc4SCédric Le Goater qemu_irq cs_line; 291a7d78befSCédric Le Goater DeviceState *dev; 292e1ad9bc4SCédric Le Goater 293a7d78befSCédric Le Goater dev = qdev_new(flashtype); 294e1ad9bc4SCédric Le Goater if (dinfo) { 295a7d78befSCédric Le Goater qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo)); 296e1ad9bc4SCédric Le Goater } 297a7d78befSCédric Le Goater qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal); 298e1ad9bc4SCédric Le Goater 299a7d78befSCédric Le Goater cs_line = qdev_get_gpio_in_named(dev, SSI_GPIO_CS, 0); 300e1ad9bc4SCédric Le Goater sysbus_connect_irq(SYS_BUS_DEVICE(s), i + 1, cs_line); 301e1ad9bc4SCédric Le Goater } 302e1ad9bc4SCédric Le Goater } 303e1ad9bc4SCédric Le Goater 304a29e3e12SAndrew Jeffery static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo) 305a29e3e12SAndrew Jeffery { 306a29e3e12SAndrew Jeffery DeviceState *card; 307a29e3e12SAndrew Jeffery 308756f739bSPhilippe Mathieu-Daudé if (!dinfo) { 309756f739bSPhilippe Mathieu-Daudé return; 310756f739bSPhilippe Mathieu-Daudé } 3113e80f690SMarkus Armbruster card = qdev_new(TYPE_SD_CARD); 312934df912SMarkus Armbruster qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo), 313a29e3e12SAndrew Jeffery &error_fatal); 3143e80f690SMarkus Armbruster qdev_realize_and_unref(card, 3153e80f690SMarkus Armbruster qdev_get_child_bus(DEVICE(sdhci), "sd-bus"), 3163e80f690SMarkus Armbruster &error_fatal); 317a29e3e12SAndrew Jeffery } 318a29e3e12SAndrew Jeffery 319baa4732bSCédric Le Goater static void aspeed_machine_init(MachineState *machine) 320327d8e4eSAndrew Jeffery { 321888b2b03SPhilippe Mathieu-Daudé AspeedMachineState *bmc = ASPEED_MACHINE(machine); 322baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine); 323b033271fSCédric Le Goater AspeedSoCClass *sc; 324d769a1daSCédric Le Goater DriveInfo *drive0 = drive_get(IF_MTD, 0, 0); 325ebe31c0aSCédric Le Goater ram_addr_t max_ram_size; 3262bea128cSEddie James int i; 327d3bad7e7SCédric Le Goater NICInfo *nd = &nd_table[0]; 328327d8e4eSAndrew Jeffery 329ad1a9782SCédric Le Goater memory_region_init(&bmc->ram_container, NULL, "aspeed-ram-container", 3307df9f028SPhilippe Mathieu-Daudé 4 * GiB); 331afcbaed6SIgor Mammedov memory_region_add_subregion(&bmc->ram_container, 0, machine->ram); 332ad1a9782SCédric Le Goater 3339fc7fc4dSMarkus Armbruster object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name); 334327d8e4eSAndrew Jeffery 335b033271fSCédric Le Goater sc = ASPEED_SOC_GET_CLASS(&bmc->soc); 336b033271fSCédric Le Goater 337533eb415SIgor Mammedov /* 338533eb415SIgor Mammedov * This will error out if isize is not supported by memory controller. 339533eb415SIgor Mammedov */ 3406e504a98SPaolo Bonzini object_property_set_uint(OBJECT(&bmc->soc), "ram-size", machine->ram_size, 341533eb415SIgor Mammedov &error_fatal); 342533eb415SIgor Mammedov 343d3bad7e7SCédric Le Goater for (i = 0; i < sc->macs_num; i++) { 344d3bad7e7SCédric Le Goater if ((amc->macs_mask & (1 << i)) && nd->used) { 345d3bad7e7SCédric Le Goater qemu_check_nic_model(nd, TYPE_FTGMAC100); 346d3bad7e7SCédric Le Goater qdev_set_nic_properties(DEVICE(&bmc->soc.ftgmac100[i]), nd); 347d3bad7e7SCédric Le Goater nd++; 348d3bad7e7SCédric Le Goater } 349d3bad7e7SCédric Le Goater } 350d3bad7e7SCédric Le Goater 3515325cc34SMarkus Armbruster object_property_set_int(OBJECT(&bmc->soc), "hw-strap1", amc->hw_strap1, 35287e79af0SAndrew Jeffery &error_abort); 3535325cc34SMarkus Armbruster object_property_set_int(OBJECT(&bmc->soc), "hw-strap2", amc->hw_strap2, 354ccc2c418SCédric Le Goater &error_abort); 3555325cc34SMarkus Armbruster object_property_set_link(OBJECT(&bmc->soc), "dram", 3560df2d9a6SCédric Le Goater OBJECT(machine->ram), &error_abort); 357b6e70d1dSJoel Stanley if (machine->kernel_filename) { 358b6e70d1dSJoel Stanley /* 359b6e70d1dSJoel Stanley * When booting with a -kernel command line there is no u-boot 360b6e70d1dSJoel Stanley * that runs to unlock the SCU. In this case set the default to 361b6e70d1dSJoel Stanley * be unlocked as the kernel expects 362b6e70d1dSJoel Stanley */ 3635325cc34SMarkus Armbruster object_property_set_int(OBJECT(&bmc->soc), "hw-prot-key", 3645325cc34SMarkus Armbruster ASPEED_SCU_PROT_KEY, &error_abort); 365b6e70d1dSJoel Stanley } 3665d63d0c7SPeter Delevoryas qdev_prop_set_uint32(DEVICE(&bmc->soc), "uart-default", 3675d63d0c7SPeter Delevoryas amc->uart_default); 368ce189ab2SMarkus Armbruster qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort); 369327d8e4eSAndrew Jeffery 370d783d1feSCédric Le Goater memory_region_add_subregion(get_system_memory(), 371347df6f8SEduardo Habkost sc->memmap[ASPEED_DEV_SDRAM], 372ad1a9782SCédric Le Goater &bmc->ram_container); 373de46f5f4SCédric Le Goater 374ebe31c0aSCédric Le Goater max_ram_size = object_property_get_uint(OBJECT(&bmc->soc), "max-ram-size", 375ebe31c0aSCédric Le Goater &error_abort); 376ebe31c0aSCédric Le Goater memory_region_init_io(&bmc->max_ram, NULL, &max_ram_ops, NULL, 3776e504a98SPaolo Bonzini "max_ram", max_ram_size - machine->ram_size); 3786e504a98SPaolo Bonzini memory_region_add_subregion(&bmc->ram_container, machine->ram_size, &bmc->max_ram); 379ebe31c0aSCédric Le Goater 3808ec239f2SMarkus Armbruster aspeed_board_init_flashes(&bmc->soc.fmc, 3818ec239f2SMarkus Armbruster bmc->fmc_model ? bmc->fmc_model : amc->fmc_model, 3829bd4ac61SCédric Le Goater amc->num_cs, 0); 3838ec239f2SMarkus Armbruster aspeed_board_init_flashes(&bmc->soc.spi[0], 3848ec239f2SMarkus Armbruster bmc->spi_model ? bmc->spi_model : amc->spi_model, 3859bd4ac61SCédric Le Goater 1, amc->num_cs); 386e1ad9bc4SCédric Le Goater 387d769a1daSCédric Le Goater /* Install first FMC flash content as a boot rom. */ 388d769a1daSCédric Le Goater if (drive0) { 389d769a1daSCédric Le Goater AspeedSMCFlash *fl = &bmc->soc.fmc.flashes[0]; 390d769a1daSCédric Le Goater MemoryRegion *boot_rom = g_new(MemoryRegion, 1); 3916bb55e79SCédric Le Goater uint64_t size = memory_region_size(&fl->mmio); 392d769a1daSCédric Le Goater 393d769a1daSCédric Le Goater /* 394d769a1daSCédric Le Goater * create a ROM region using the default mapping window size of 39593bf276dSCédric Le Goater * the flash module. The window size is 64MB for the AST2400 39693bf276dSCédric Le Goater * SoC and 128MB for the AST2500 SoC, which is twice as big as 39793bf276dSCédric Le Goater * needed by the flash modules of the Aspeed machines. 398d769a1daSCédric Le Goater */ 3991a15311aSCédric Le Goater if (ASPEED_MACHINE(machine)->mmio_exec) { 400f489960dSPhilippe Mathieu-Daudé memory_region_init_alias(boot_rom, NULL, "aspeed.boot_rom", 4016bb55e79SCédric Le Goater &fl->mmio, 0, size); 4021a15311aSCédric Le Goater memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR, 4031a15311aSCédric Le Goater boot_rom); 4041a15311aSCédric Le Goater } else { 405f489960dSPhilippe Mathieu-Daudé memory_region_init_rom(boot_rom, NULL, "aspeed.boot_rom", 4066bb55e79SCédric Le Goater size, &error_abort); 407d769a1daSCédric Le Goater memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR, 408d769a1daSCédric Le Goater boot_rom); 4096bb55e79SCédric Le Goater write_boot_rom(drive0, FIRMWARE_ADDR, size, &error_abort); 410d769a1daSCédric Le Goater } 4111a15311aSCédric Le Goater } 412d769a1daSCédric Le Goater 413b7f1a0cbSCédric Le Goater if (machine->kernel_filename && sc->num_cpus > 1) { 4149bb6d140SJoel Stanley /* With no u-boot we must set up a boot stub for the secondary CPU */ 4159bb6d140SJoel Stanley MemoryRegion *smpboot = g_new(MemoryRegion, 1); 416f489960dSPhilippe Mathieu-Daudé memory_region_init_ram(smpboot, NULL, "aspeed.smpboot", 4179bb6d140SJoel Stanley 0x80, &error_abort); 4189bb6d140SJoel Stanley memory_region_add_subregion(get_system_memory(), 4199bb6d140SJoel Stanley AST_SMP_MAILBOX_BASE, smpboot); 4209bb6d140SJoel Stanley 4219bb6d140SJoel Stanley aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot; 4229bb6d140SJoel Stanley aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary; 4239bb6d140SJoel Stanley aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE; 4249bb6d140SJoel Stanley } 4259bb6d140SJoel Stanley 4266e504a98SPaolo Bonzini aspeed_board_binfo.ram_size = machine->ram_size; 427347df6f8SEduardo Habkost aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM]; 428b033271fSCédric Le Goater 429baa4732bSCédric Le Goater if (amc->i2c_init) { 430baa4732bSCédric Le Goater amc->i2c_init(bmc); 4312cf6cb50SCédric Le Goater } 4322cf6cb50SCédric Le Goater 4330e2c24c6SAndrew Jeffery for (i = 0; i < bmc->soc.sdhci.num_slots; i++) { 4348ec239f2SMarkus Armbruster sdhci_attach_drive(&bmc->soc.sdhci.slots[i], 4358ec239f2SMarkus Armbruster drive_get(IF_SD, 0, i)); 436a29e3e12SAndrew Jeffery } 4372bea128cSEddie James 438a29e3e12SAndrew Jeffery if (bmc->soc.emmc.num_slots) { 4398ec239f2SMarkus Armbruster sdhci_attach_drive(&bmc->soc.emmc.slots[0], 4408ec239f2SMarkus Armbruster drive_get(IF_SD, 0, bmc->soc.sdhci.num_slots)); 4412bea128cSEddie James } 4422bea128cSEddie James 4432744ece8STao Xu arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo); 444327d8e4eSAndrew Jeffery } 445327d8e4eSAndrew Jeffery 44682b6a3f6SJohn Wang static void at24c_eeprom_init(I2CBus *bus, uint8_t addr, uint32_t rsize) 44782b6a3f6SJohn Wang { 44882b6a3f6SJohn Wang I2CSlave *i2c_dev = i2c_slave_new("at24c-eeprom", addr); 44982b6a3f6SJohn Wang DeviceState *dev = DEVICE(i2c_dev); 45082b6a3f6SJohn Wang 45182b6a3f6SJohn Wang qdev_prop_set_uint32(dev, "rom-size", rsize); 45282b6a3f6SJohn Wang i2c_slave_realize_and_unref(i2c_dev, bus, &error_abort); 45382b6a3f6SJohn Wang } 45482b6a3f6SJohn Wang 455612b219aSPhilippe Mathieu-Daudé static void palmetto_bmc_i2c_init(AspeedMachineState *bmc) 4562cf6cb50SCédric Le Goater { 4572cf6cb50SCédric Le Goater AspeedSoCState *soc = &bmc->soc; 458a87e81b9SCédric Le Goater DeviceState *dev; 4593d165f12SCédric Le Goater uint8_t *eeprom_buf = g_malloc0(32 * 1024); 4602cf6cb50SCédric Le Goater 4612cf6cb50SCédric Le Goater /* The palmetto platform expects a ds3231 RTC but a ds1338 is 4622cf6cb50SCédric Le Goater * enough to provide basic RTC features. Alarms will be missing */ 4631373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68); 464a87e81b9SCédric Le Goater 4657a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, 4663d165f12SCédric Le Goater eeprom_buf); 4673d165f12SCédric Le Goater 468a87e81b9SCédric Le Goater /* add a TMP423 temperature sensor */ 4691373b15bSPhilippe Mathieu-Daudé dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), 4701373b15bSPhilippe Mathieu-Daudé "tmp423", 0x4c)); 4715325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 4725325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 4735325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 4745325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort); 4752cf6cb50SCédric Le Goater } 4762cf6cb50SCédric Le Goater 4779cccb912SPatrick Venture static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc) 4789cccb912SPatrick Venture { 4799cccb912SPatrick Venture AspeedSoCState *soc = &bmc->soc; 4809cccb912SPatrick Venture 4819cccb912SPatrick Venture /* 4829cccb912SPatrick Venture * The quanta-q71l platform expects tmp75s which are compatible with 4839cccb912SPatrick Venture * tmp105s. 4849cccb912SPatrick Venture */ 4859cccb912SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c); 4869cccb912SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e); 4879cccb912SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f); 4889cccb912SPatrick Venture 4899cccb912SPatrick Venture /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */ 4909cccb912SPatrick Venture /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */ 4919cccb912SPatrick Venture /* TODO: Add Memory Riser i2c mux and eeproms. */ 4929cccb912SPatrick Venture 4933ec75e39SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74); 4943ec75e39SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77); 4953ec75e39SPatrick Venture 4969cccb912SPatrick Venture /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */ 4973ec75e39SPatrick Venture 4983ec75e39SPatrick Venture /* i2c-7 */ 4993ec75e39SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70); 5009cccb912SPatrick Venture /* - i2c@0: pmbus@59 */ 5019cccb912SPatrick Venture /* - i2c@1: pmbus@58 */ 5029cccb912SPatrick Venture /* - i2c@2: pmbus@58 */ 5039cccb912SPatrick Venture /* - i2c@3: pmbus@59 */ 5043ec75e39SPatrick Venture 5059cccb912SPatrick Venture /* TODO: i2c-7: Add PDB FRU eeprom@52 */ 5069cccb912SPatrick Venture /* TODO: i2c-8: Add BMC FRU eeprom@50 */ 5079cccb912SPatrick Venture } 5089cccb912SPatrick Venture 509612b219aSPhilippe Mathieu-Daudé static void ast2500_evb_i2c_init(AspeedMachineState *bmc) 5102cf6cb50SCédric Le Goater { 5112cf6cb50SCédric Le Goater AspeedSoCState *soc = &bmc->soc; 5123d165f12SCédric Le Goater uint8_t *eeprom_buf = g_malloc0(8 * 1024); 5133d165f12SCédric Le Goater 5147a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50, 5153d165f12SCédric Le Goater eeprom_buf); 5162cf6cb50SCédric Le Goater 5172cf6cb50SCédric Le Goater /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */ 5181373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), 519044475f3SPhilippe Mathieu-Daudé TYPE_TMP105, 0x4d); 5206c4567c7SCédric Le Goater 5216c4567c7SCédric Le Goater /* The AST2500 EVB does not have an RTC. Let's pretend that one is 5226c4567c7SCédric Le Goater * plugged on the I2C bus header */ 5231373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32); 5242cf6cb50SCédric Le Goater } 5252cf6cb50SCédric Le Goater 526612b219aSPhilippe Mathieu-Daudé static void ast2600_evb_i2c_init(AspeedMachineState *bmc) 527ccc2c418SCédric Le Goater { 528ccc2c418SCédric Le Goater /* Start with some devices on our I2C busses */ 529ccc2c418SCédric Le Goater ast2500_evb_i2c_init(bmc); 530ccc2c418SCédric Le Goater } 531ccc2c418SCédric Le Goater 532612b219aSPhilippe Mathieu-Daudé static void romulus_bmc_i2c_init(AspeedMachineState *bmc) 5336c4567c7SCédric Le Goater { 5346c4567c7SCédric Le Goater AspeedSoCState *soc = &bmc->soc; 5356c4567c7SCédric Le Goater 5366c4567c7SCédric Le Goater /* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is 5376c4567c7SCédric Le Goater * good enough */ 5381373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32); 5396c4567c7SCédric Le Goater } 5406c4567c7SCédric Le Goater 541f4aec252SCédric Le Goater static void create_pca9552(AspeedSoCState *soc, int bus_id, int addr) 542f4aec252SCédric Le Goater { 543f4aec252SCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, bus_id), 544f4aec252SCédric Le Goater TYPE_PCA9552, addr); 545f4aec252SCédric Le Goater } 546f4aec252SCédric Le Goater 547612b219aSPhilippe Mathieu-Daudé static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc) 548143b040fSPatrick Williams { 549143b040fSPatrick Williams AspeedSoCState *soc = &bmc->soc; 550143b040fSPatrick Williams 551143b040fSPatrick Williams /* bus 2 : */ 5521373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48); 5531373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49); 554143b040fSPatrick Williams /* bus 2 : pca9546 @ 0x73 */ 555143b040fSPatrick Williams 556143b040fSPatrick Williams /* bus 3 : pca9548 @ 0x70 */ 557143b040fSPatrick Williams 558143b040fSPatrick Williams /* bus 4 : */ 559143b040fSPatrick Williams uint8_t *eeprom4_54 = g_malloc0(8 * 1024); 5607a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 561143b040fSPatrick Williams eeprom4_54); 562143b040fSPatrick Williams /* PCA9539 @ 0x76, but PCA9552 is compatible */ 563f4aec252SCédric Le Goater create_pca9552(soc, 4, 0x76); 564143b040fSPatrick Williams /* PCA9539 @ 0x77, but PCA9552 is compatible */ 565f4aec252SCédric Le Goater create_pca9552(soc, 4, 0x77); 566143b040fSPatrick Williams 567143b040fSPatrick Williams /* bus 6 : */ 5681373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48); 5691373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49); 570143b040fSPatrick Williams /* bus 6 : pca9546 @ 0x73 */ 571143b040fSPatrick Williams 572143b040fSPatrick Williams /* bus 8 : */ 573143b040fSPatrick Williams uint8_t *eeprom8_56 = g_malloc0(8 * 1024); 5747a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56, 575143b040fSPatrick Williams eeprom8_56); 576f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x60); 577f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x61); 578143b040fSPatrick Williams /* bus 8 : adc128d818 @ 0x1d */ 579143b040fSPatrick Williams /* bus 8 : adc128d818 @ 0x1f */ 580143b040fSPatrick Williams 581143b040fSPatrick Williams /* 582143b040fSPatrick Williams * bus 13 : pca9548 @ 0x71 583143b040fSPatrick Williams * - channel 3: 584143b040fSPatrick Williams * - tmm421 @ 0x4c 585143b040fSPatrick Williams * - tmp421 @ 0x4e 586143b040fSPatrick Williams * - tmp421 @ 0x4f 587143b040fSPatrick Williams */ 588143b040fSPatrick Williams 589143b040fSPatrick Williams } 590143b040fSPatrick Williams 591612b219aSPhilippe Mathieu-Daudé static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc) 59262c2c2ebSCédric Le Goater { 5937cfbde5eSPhilippe Mathieu-Daudé static const struct { 5947cfbde5eSPhilippe Mathieu-Daudé unsigned gpio_id; 5957cfbde5eSPhilippe Mathieu-Daudé LEDColor color; 5967cfbde5eSPhilippe Mathieu-Daudé const char *description; 5977cfbde5eSPhilippe Mathieu-Daudé bool gpio_polarity; 5987cfbde5eSPhilippe Mathieu-Daudé } pca1_leds[] = { 5997cfbde5eSPhilippe Mathieu-Daudé {13, LED_COLOR_GREEN, "front-fault-4", GPIO_POLARITY_ACTIVE_LOW}, 6007cfbde5eSPhilippe Mathieu-Daudé {14, LED_COLOR_GREEN, "front-power-3", GPIO_POLARITY_ACTIVE_LOW}, 6017cfbde5eSPhilippe Mathieu-Daudé {15, LED_COLOR_GREEN, "front-id-5", GPIO_POLARITY_ACTIVE_LOW}, 6027cfbde5eSPhilippe Mathieu-Daudé }; 60362c2c2ebSCédric Le Goater AspeedSoCState *soc = &bmc->soc; 6043d165f12SCédric Le Goater uint8_t *eeprom_buf = g_malloc0(8 * 1024); 60515ce12cfSPhilippe Mathieu-Daudé DeviceState *dev; 6067cfbde5eSPhilippe Mathieu-Daudé LEDState *led; 60762c2c2ebSCédric Le Goater 60863ceb818SCédric Le Goater /* Bus 3: TODO bmp280@77 */ 60963ceb818SCédric Le Goater /* Bus 3: TODO max31785@52 */ 610db437ca6SPhilippe Mathieu-Daudé dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60)); 61115ce12cfSPhilippe Mathieu-Daudé qdev_prop_set_string(dev, "description", "pca1"); 6122616f572SPhilippe Mathieu-Daudé i2c_slave_realize_and_unref(I2C_SLAVE(dev), 6132616f572SPhilippe Mathieu-Daudé aspeed_i2c_get_bus(&soc->i2c, 3), 61415ce12cfSPhilippe Mathieu-Daudé &error_fatal); 6158c9a61d7SCédric Le Goater 6167cfbde5eSPhilippe Mathieu-Daudé for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) { 6177cfbde5eSPhilippe Mathieu-Daudé led = led_create_simple(OBJECT(bmc), 6187cfbde5eSPhilippe Mathieu-Daudé pca1_leds[i].gpio_polarity, 6197cfbde5eSPhilippe Mathieu-Daudé pca1_leds[i].color, 6207cfbde5eSPhilippe Mathieu-Daudé pca1_leds[i].description); 6217cfbde5eSPhilippe Mathieu-Daudé qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id, 6227cfbde5eSPhilippe Mathieu-Daudé qdev_get_gpio_in(DEVICE(led), 0)); 6237cfbde5eSPhilippe Mathieu-Daudé } 624b61ea6e7SJoel Stanley i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76); 6251373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c); 6261373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c); 62762c2c2ebSCédric Le Goater 62862c2c2ebSCédric Le Goater /* The Witherspoon expects a TMP275 but a TMP105 is compatible */ 6291373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105, 630044475f3SPhilippe Mathieu-Daudé 0x4a); 6316c4567c7SCédric Le Goater 6326c4567c7SCédric Le Goater /* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is 6336c4567c7SCédric Le Goater * good enough */ 6341373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32); 6353d165f12SCédric Le Goater 6367a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51, 6373d165f12SCédric Le Goater eeprom_buf); 638db437ca6SPhilippe Mathieu-Daudé dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60)); 63915ce12cfSPhilippe Mathieu-Daudé qdev_prop_set_string(dev, "description", "pca0"); 6402616f572SPhilippe Mathieu-Daudé i2c_slave_realize_and_unref(I2C_SLAVE(dev), 6412616f572SPhilippe Mathieu-Daudé aspeed_i2c_get_bus(&soc->i2c, 11), 64215ce12cfSPhilippe Mathieu-Daudé &error_fatal); 64363ceb818SCédric Le Goater /* Bus 11: TODO ucd90160@64 */ 64462c2c2ebSCédric Le Goater } 64562c2c2ebSCédric Le Goater 64695f068c8SJohn Wang static void g220a_bmc_i2c_init(AspeedMachineState *bmc) 64795f068c8SJohn Wang { 64895f068c8SJohn Wang AspeedSoCState *soc = &bmc->soc; 64995f068c8SJohn Wang DeviceState *dev; 65095f068c8SJohn Wang 65195f068c8SJohn Wang dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), 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, 12), 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); 66295f068c8SJohn Wang 66395f068c8SJohn Wang dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13), 66495f068c8SJohn Wang "emc1413", 0x4c)); 66595f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 66695f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 66795f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 6686f5f6507SJohn Wang 6696f5f6507SJohn Wang static uint8_t eeprom_buf[2 * 1024] = { 6706f5f6507SJohn Wang 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe, 6716f5f6507SJohn Wang 0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65, 6726f5f6507SJohn Wang 0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32, 6736f5f6507SJohn Wang 0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42, 6746f5f6507SJohn Wang 0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45, 6756f5f6507SJohn Wang 0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1, 6766f5f6507SJohn Wang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, 6776f5f6507SJohn Wang }; 6786f5f6507SJohn Wang smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57, 6796f5f6507SJohn Wang eeprom_buf); 68095f068c8SJohn Wang } 68195f068c8SJohn Wang 682fa6d98c0SJoel Stanley static void aspeed_eeprom_init(I2CBus *bus, uint8_t addr, uint32_t rsize) 683fa6d98c0SJoel Stanley { 684fa6d98c0SJoel Stanley I2CSlave *i2c_dev = i2c_slave_new("at24c-eeprom", addr); 685fa6d98c0SJoel Stanley DeviceState *dev = DEVICE(i2c_dev); 686fa6d98c0SJoel Stanley 687fa6d98c0SJoel Stanley qdev_prop_set_uint32(dev, "rom-size", rsize); 688fa6d98c0SJoel Stanley i2c_slave_realize_and_unref(i2c_dev, bus, &error_abort); 689fa6d98c0SJoel Stanley } 690fa6d98c0SJoel Stanley 69182b6a3f6SJohn Wang static void fp5280g2_bmc_i2c_init(AspeedMachineState *bmc) 69282b6a3f6SJohn Wang { 69382b6a3f6SJohn Wang AspeedSoCState *soc = &bmc->soc; 69482b6a3f6SJohn Wang I2CSlave *i2c_mux; 69582b6a3f6SJohn Wang 69682b6a3f6SJohn Wang /* The at24c256 */ 69782b6a3f6SJohn Wang at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 1), 0x50, 32768); 69882b6a3f6SJohn Wang 69982b6a3f6SJohn Wang /* The fp5280g2 expects a TMP112 but a TMP105 is compatible */ 70082b6a3f6SJohn Wang i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105, 70182b6a3f6SJohn Wang 0x48); 70282b6a3f6SJohn Wang i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105, 70382b6a3f6SJohn Wang 0x49); 70482b6a3f6SJohn Wang 70582b6a3f6SJohn Wang i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), 70682b6a3f6SJohn Wang "pca9546", 0x70); 70782b6a3f6SJohn Wang /* It expects a TMP112 but a TMP105 is compatible */ 70882b6a3f6SJohn Wang i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0), TYPE_TMP105, 70982b6a3f6SJohn Wang 0x4a); 71082b6a3f6SJohn Wang 71182b6a3f6SJohn Wang /* It expects a ds3232 but a ds1338 is good enough */ 71282b6a3f6SJohn Wang i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "ds1338", 0x68); 71382b6a3f6SJohn Wang 71482b6a3f6SJohn Wang /* It expects a pca9555 but a pca9552 is compatible */ 715f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x30); 71682b6a3f6SJohn Wang } 71782b6a3f6SJohn Wang 71858e52bdbSCédric Le Goater static void rainier_bmc_i2c_init(AspeedMachineState *bmc) 71958e52bdbSCédric Le Goater { 72058e52bdbSCédric Le Goater AspeedSoCState *soc = &bmc->soc; 721fa6d98c0SJoel Stanley I2CSlave *i2c_mux; 722fa6d98c0SJoel Stanley 723fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB); 72458e52bdbSCédric Le Goater 725f4aec252SCédric Le Goater create_pca9552(soc, 3, 0x61); 726bcb122f8SJoel Stanley 72758e52bdbSCédric Le Goater /* The rainier expects a TMP275 but a TMP105 is compatible */ 72858e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105, 72958e52bdbSCédric Le Goater 0x48); 73058e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105, 73158e52bdbSCédric Le Goater 0x49); 73258e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105, 73358e52bdbSCédric Le Goater 0x4a); 734fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), 735fa6d98c0SJoel Stanley "pca9546", 0x70); 736fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 737fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 738fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB); 739f4aec252SCédric Le Goater create_pca9552(soc, 4, 0x60); 74058e52bdbSCédric Le Goater 74158e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105, 74258e52bdbSCédric Le Goater 0x48); 74358e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105, 74458e52bdbSCédric Le Goater 0x49); 745f4aec252SCédric Le Goater create_pca9552(soc, 5, 0x60); 746f4aec252SCédric Le Goater create_pca9552(soc, 5, 0x61); 747fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), 748fa6d98c0SJoel Stanley "pca9546", 0x70); 749fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 750fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 75158e52bdbSCédric Le Goater 75258e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105, 75358e52bdbSCédric Le Goater 0x48); 75458e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105, 75558e52bdbSCédric Le Goater 0x4a); 75658e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105, 75758e52bdbSCédric Le Goater 0x4b); 758fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), 759fa6d98c0SJoel Stanley "pca9546", 0x70); 760fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 761fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 762fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB); 763fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB); 76458e52bdbSCédric Le Goater 765f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x30); 766f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x31); 767f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x32); 768f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x33); 76958e52bdbSCédric Le Goater /* Bus 7: TODO max31785@52 */ 770f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x60); 771f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x61); 772b61ea6e7SJoel Stanley i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76); 77358e52bdbSCédric Le Goater /* Bus 7: TODO si7021-a20@20 */ 77458e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105, 77558e52bdbSCédric Le Goater 0x48); 776fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB); 777fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB); 77858e52bdbSCédric Le Goater 77958e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105, 78058e52bdbSCédric Le Goater 0x48); 78158e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105, 78258e52bdbSCédric Le Goater 0x4a); 783fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50, 64 * KiB); 784fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 64 * KiB); 785f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x60); 786f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x61); 78758e52bdbSCédric Le Goater /* Bus 8: ucd90320@11 */ 78858e52bdbSCédric Le Goater /* Bus 8: ucd90320@b */ 78958e52bdbSCédric Le Goater /* Bus 8: ucd90320@c */ 79058e52bdbSCédric Le Goater 79158e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c); 79258e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d); 793fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB); 79458e52bdbSCédric Le Goater 79558e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c); 79658e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d); 797fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB); 79858e52bdbSCédric Le Goater 79958e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105, 80058e52bdbSCédric Le Goater 0x48); 80158e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105, 80258e52bdbSCédric Le Goater 0x49); 803fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), 804fa6d98c0SJoel Stanley "pca9546", 0x70); 805fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 806fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 807f4aec252SCédric Le Goater create_pca9552(soc, 11, 0x60); 808fa6d98c0SJoel Stanley 809fa6d98c0SJoel Stanley 810fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB); 811f4aec252SCédric Le Goater create_pca9552(soc, 13, 0x60); 812fa6d98c0SJoel Stanley 813fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB); 814f4aec252SCédric Le Goater create_pca9552(soc, 14, 0x60); 815fa6d98c0SJoel Stanley 816fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB); 817f4aec252SCédric Le Goater create_pca9552(soc, 15, 0x60); 81858e52bdbSCédric Le Goater } 81958e52bdbSCédric Le Goater 820febbe308SPeter Delevoryas static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr, 821febbe308SPeter Delevoryas I2CBus **channels) 822febbe308SPeter Delevoryas { 823febbe308SPeter Delevoryas I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr); 824febbe308SPeter Delevoryas for (int i = 0; i < 8; i++) { 825febbe308SPeter Delevoryas channels[i] = pca954x_i2c_get_bus(mux, i); 826febbe308SPeter Delevoryas } 827febbe308SPeter Delevoryas } 828febbe308SPeter Delevoryas 829febbe308SPeter Delevoryas #define TYPE_LM75 TYPE_TMP105 830febbe308SPeter Delevoryas #define TYPE_TMP75 TYPE_TMP105 831febbe308SPeter Delevoryas #define TYPE_TMP422 "tmp422" 832febbe308SPeter Delevoryas 833febbe308SPeter Delevoryas static void fuji_bmc_i2c_init(AspeedMachineState *bmc) 834febbe308SPeter Delevoryas { 835febbe308SPeter Delevoryas AspeedSoCState *soc = &bmc->soc; 836febbe308SPeter Delevoryas I2CBus *i2c[144] = {}; 837febbe308SPeter Delevoryas 838febbe308SPeter Delevoryas for (int i = 0; i < 16; i++) { 839febbe308SPeter Delevoryas i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i); 840febbe308SPeter Delevoryas } 841febbe308SPeter Delevoryas I2CBus *i2c180 = i2c[2]; 842febbe308SPeter Delevoryas I2CBus *i2c480 = i2c[8]; 843febbe308SPeter Delevoryas I2CBus *i2c600 = i2c[11]; 844febbe308SPeter Delevoryas 845febbe308SPeter Delevoryas get_pca9548_channels(i2c180, 0x70, &i2c[16]); 846febbe308SPeter Delevoryas get_pca9548_channels(i2c480, 0x70, &i2c[24]); 847febbe308SPeter Delevoryas /* NOTE: The device tree skips [32, 40) in the alias numbering */ 848febbe308SPeter Delevoryas get_pca9548_channels(i2c600, 0x77, &i2c[40]); 849febbe308SPeter Delevoryas get_pca9548_channels(i2c[24], 0x71, &i2c[48]); 850febbe308SPeter Delevoryas get_pca9548_channels(i2c[25], 0x72, &i2c[56]); 851febbe308SPeter Delevoryas get_pca9548_channels(i2c[26], 0x76, &i2c[64]); 852febbe308SPeter Delevoryas get_pca9548_channels(i2c[27], 0x76, &i2c[72]); 853febbe308SPeter Delevoryas for (int i = 0; i < 8; i++) { 854febbe308SPeter Delevoryas get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]); 855febbe308SPeter Delevoryas } 856febbe308SPeter Delevoryas 857febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c); 858febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d); 859febbe308SPeter Delevoryas 860febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[19], 0x52, 64 * KiB); 861febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[20], 0x50, 2 * KiB); 862febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[22], 0x52, 2 * KiB); 863febbe308SPeter Delevoryas 864febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x48); 865febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x49); 866febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x4a); 867febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_TMP422, 0x4c); 868febbe308SPeter Delevoryas 869febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[8], 0x51, 64 * KiB); 870febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a); 871febbe308SPeter Delevoryas 872febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[50], TYPE_LM75, 0x4c); 873febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[50], 0x52, 64 * KiB); 874febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[51], TYPE_TMP75, 0x48); 875febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[52], TYPE_TMP75, 0x49); 876febbe308SPeter Delevoryas 877febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[59], TYPE_TMP75, 0x48); 878febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[60], TYPE_TMP75, 0x49); 879febbe308SPeter Delevoryas 880febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[65], 0x53, 64 * KiB); 881febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x49); 882febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x48); 883febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[68], 0x52, 64 * KiB); 884febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[69], 0x52, 64 * KiB); 885febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[70], 0x52, 64 * KiB); 886febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[71], 0x52, 64 * KiB); 887febbe308SPeter Delevoryas 888febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[73], 0x53, 64 * KiB); 889febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x49); 890febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x48); 891febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[76], 0x52, 64 * KiB); 892febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[77], 0x52, 64 * KiB); 893febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[78], 0x52, 64 * KiB); 894febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[79], 0x52, 64 * KiB); 895febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[28], 0x50, 2 * KiB); 896febbe308SPeter Delevoryas 897febbe308SPeter Delevoryas for (int i = 0; i < 8; i++) { 898febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB); 899febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[82 + i * 8], TYPE_TMP75, 0x48); 900febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[83 + i * 8], TYPE_TMP75, 0x4b); 901febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[84 + i * 8], TYPE_TMP75, 0x4a); 902febbe308SPeter Delevoryas } 903febbe308SPeter Delevoryas } 904febbe308SPeter Delevoryas 905*a20c54b1SPatrick Williams #define TYPE_TMP421 "tmp421" 906*a20c54b1SPatrick Williams 907*a20c54b1SPatrick Williams static void bletchley_bmc_i2c_init(AspeedMachineState *bmc) 908*a20c54b1SPatrick Williams { 909*a20c54b1SPatrick Williams AspeedSoCState *soc = &bmc->soc; 910*a20c54b1SPatrick Williams I2CBus *i2c[13] = {}; 911*a20c54b1SPatrick Williams for (int i = 0; i < 13; i++) { 912*a20c54b1SPatrick Williams if ((i == 8) || (i == 11)) { 913*a20c54b1SPatrick Williams continue; 914*a20c54b1SPatrick Williams } 915*a20c54b1SPatrick Williams i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i); 916*a20c54b1SPatrick Williams } 917*a20c54b1SPatrick Williams 918*a20c54b1SPatrick Williams /* Bus 0 - 5 all have the same config. */ 919*a20c54b1SPatrick Williams for (int i = 0; i < 6; i++) { 920*a20c54b1SPatrick Williams /* Missing model: ti,ina230 @ 0x45 */ 921*a20c54b1SPatrick Williams /* Missing model: mps,mp5023 @ 0x40 */ 922*a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[i], TYPE_TMP421, 0x4f); 923*a20c54b1SPatrick Williams /* Missing model: nxp,pca9539 @ 0x76, but PCA9552 works enough */ 924*a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x76); 925*a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x67); 926*a20c54b1SPatrick Williams /* Missing model: fsc,fusb302 @ 0x22 */ 927*a20c54b1SPatrick Williams } 928*a20c54b1SPatrick Williams 929*a20c54b1SPatrick Williams /* Bus 6 */ 930*a20c54b1SPatrick Williams at24c_eeprom_init(i2c[6], 0x56, 65536); 931*a20c54b1SPatrick Williams /* Missing model: nxp,pcf85263 @ 0x51 , but ds1338 works enough */ 932*a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[6], "ds1338", 0x51); 933*a20c54b1SPatrick Williams 934*a20c54b1SPatrick Williams 935*a20c54b1SPatrick Williams /* Bus 7 */ 936*a20c54b1SPatrick Williams at24c_eeprom_init(i2c[7], 0x54, 65536); 937*a20c54b1SPatrick Williams 938*a20c54b1SPatrick Williams /* Bus 9 */ 939*a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[9], TYPE_TMP421, 0x4f); 940*a20c54b1SPatrick Williams 941*a20c54b1SPatrick Williams /* Bus 10 */ 942*a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[10], TYPE_TMP421, 0x4f); 943*a20c54b1SPatrick Williams /* Missing model: ti,hdc1080 @ 0x40 */ 944*a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[10], TYPE_PCA9552, 0x67); 945*a20c54b1SPatrick Williams 946*a20c54b1SPatrick Williams /* Bus 12 */ 947*a20c54b1SPatrick Williams /* Missing model: adi,adm1278 @ 0x11 */ 948*a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4c); 949*a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4d); 950*a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[12], TYPE_PCA9552, 0x67); 951*a20c54b1SPatrick Williams } 952*a20c54b1SPatrick Williams 9531a15311aSCédric Le Goater static bool aspeed_get_mmio_exec(Object *obj, Error **errp) 9541a15311aSCédric Le Goater { 9551a15311aSCédric Le Goater return ASPEED_MACHINE(obj)->mmio_exec; 9561a15311aSCédric Le Goater } 9571a15311aSCédric Le Goater 9581a15311aSCédric Le Goater static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp) 9591a15311aSCédric Le Goater { 9601a15311aSCédric Le Goater ASPEED_MACHINE(obj)->mmio_exec = value; 9611a15311aSCédric Le Goater } 9621a15311aSCédric Le Goater 9631a15311aSCédric Le Goater static void aspeed_machine_instance_init(Object *obj) 9641a15311aSCédric Le Goater { 9651a15311aSCédric Le Goater ASPEED_MACHINE(obj)->mmio_exec = false; 9661a15311aSCédric Le Goater } 9671a15311aSCédric Le Goater 9689820e52fSCédric Le Goater static char *aspeed_get_fmc_model(Object *obj, Error **errp) 9699820e52fSCédric Le Goater { 9709820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 9719820e52fSCédric Le Goater return g_strdup(bmc->fmc_model); 9729820e52fSCédric Le Goater } 9739820e52fSCédric Le Goater 9749820e52fSCédric Le Goater static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp) 9759820e52fSCédric Le Goater { 9769820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 9779820e52fSCédric Le Goater 9789820e52fSCédric Le Goater g_free(bmc->fmc_model); 9799820e52fSCédric Le Goater bmc->fmc_model = g_strdup(value); 9809820e52fSCédric Le Goater } 9819820e52fSCédric Le Goater 9829820e52fSCédric Le Goater static char *aspeed_get_spi_model(Object *obj, Error **errp) 9839820e52fSCédric Le Goater { 9849820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 9859820e52fSCédric Le Goater return g_strdup(bmc->spi_model); 9869820e52fSCédric Le Goater } 9879820e52fSCédric Le Goater 9889820e52fSCédric Le Goater static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp) 9899820e52fSCédric Le Goater { 9909820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 9919820e52fSCédric Le Goater 9929820e52fSCédric Le Goater g_free(bmc->spi_model); 9939820e52fSCédric Le Goater bmc->spi_model = g_strdup(value); 9949820e52fSCédric Le Goater } 9959820e52fSCédric Le Goater 9961a15311aSCédric Le Goater static void aspeed_machine_class_props_init(ObjectClass *oc) 9971a15311aSCédric Le Goater { 9981a15311aSCédric Le Goater object_class_property_add_bool(oc, "execute-in-place", 9991a15311aSCédric Le Goater aspeed_get_mmio_exec, 1000d2623129SMarkus Armbruster aspeed_set_mmio_exec); 10011a15311aSCédric Le Goater object_class_property_set_description(oc, "execute-in-place", 10027eecec7dSMarkus Armbruster "boot directly from CE0 flash device"); 10039820e52fSCédric Le Goater 10049820e52fSCédric Le Goater object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model, 10059820e52fSCédric Le Goater aspeed_set_fmc_model); 10069820e52fSCédric Le Goater object_class_property_set_description(oc, "fmc-model", 10079820e52fSCédric Le Goater "Change the FMC Flash model"); 10089820e52fSCédric Le Goater object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model, 10099820e52fSCédric Le Goater aspeed_set_spi_model); 10109820e52fSCédric Le Goater object_class_property_set_description(oc, "spi-model", 10119820e52fSCédric Le Goater "Change the SPI Flash model"); 10121a15311aSCédric Le Goater } 10131a15311aSCédric Le Goater 1014b7f1a0cbSCédric Le Goater static int aspeed_soc_num_cpus(const char *soc_name) 1015b7f1a0cbSCédric Le Goater { 1016b7f1a0cbSCédric Le Goater AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(soc_name)); 1017b7f1a0cbSCédric Le Goater return sc->num_cpus; 1018b7f1a0cbSCédric Le Goater } 1019b7f1a0cbSCédric Le Goater 1020fca9ca1bSCédric Le Goater static void aspeed_machine_class_init(ObjectClass *oc, void *data) 102162c2c2ebSCédric Le Goater { 102262c2c2ebSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1023d3bad7e7SCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 102462c2c2ebSCédric Le Goater 1025fca9ca1bSCédric Le Goater mc->init = aspeed_machine_init; 102662c2c2ebSCédric Le Goater mc->no_floppy = 1; 102762c2c2ebSCédric Le Goater mc->no_cdrom = 1; 102862c2c2ebSCédric Le Goater mc->no_parallel = 1; 1029afcbaed6SIgor Mammedov mc->default_ram_id = "ram"; 1030d3bad7e7SCédric Le Goater amc->macs_mask = ASPEED_MAC0_ON; 10315d63d0c7SPeter Delevoryas amc->uart_default = ASPEED_DEV_UART5; 10321a15311aSCédric Le Goater 10331a15311aSCédric Le Goater aspeed_machine_class_props_init(oc); 103462c2c2ebSCédric Le Goater } 103562c2c2ebSCédric Le Goater 1036baa4732bSCédric Le Goater static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data) 1037baa4732bSCédric Le Goater { 1038baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1039baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1040baa4732bSCédric Le Goater 1041baa4732bSCédric Le Goater mc->desc = "OpenPOWER Palmetto BMC (ARM926EJ-S)"; 1042baa4732bSCédric Le Goater amc->soc_name = "ast2400-a1"; 1043baa4732bSCédric Le Goater amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1; 1044baa4732bSCédric Le Goater amc->fmc_model = "n25q256a"; 1045baa4732bSCédric Le Goater amc->spi_model = "mx25l25635e"; 1046baa4732bSCédric Le Goater amc->num_cs = 1; 1047baa4732bSCédric Le Goater amc->i2c_init = palmetto_bmc_i2c_init; 1048baa4732bSCédric Le Goater mc->default_ram_size = 256 * MiB; 1049b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1050b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1051baa4732bSCédric Le Goater }; 1052baa4732bSCédric Le Goater 10539cccb912SPatrick Venture static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data) 10549cccb912SPatrick Venture { 10559cccb912SPatrick Venture MachineClass *mc = MACHINE_CLASS(oc); 10569cccb912SPatrick Venture AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 10579cccb912SPatrick Venture 10589cccb912SPatrick Venture mc->desc = "Quanta-Q71l BMC (ARM926EJ-S)"; 10599cccb912SPatrick Venture amc->soc_name = "ast2400-a1"; 10609cccb912SPatrick Venture amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1; 10619cccb912SPatrick Venture amc->fmc_model = "n25q256a"; 10629cccb912SPatrick Venture amc->spi_model = "mx25l25635e"; 10639cccb912SPatrick Venture amc->num_cs = 1; 10649cccb912SPatrick Venture amc->i2c_init = quanta_q71l_bmc_i2c_init; 10659cccb912SPatrick Venture mc->default_ram_size = 128 * MiB; 10669cccb912SPatrick Venture mc->default_cpus = mc->min_cpus = mc->max_cpus = 10679cccb912SPatrick Venture aspeed_soc_num_cpus(amc->soc_name); 10689cccb912SPatrick Venture } 10699cccb912SPatrick Venture 107040a38df5SErik Smit static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc, 107140a38df5SErik Smit void *data) 107240a38df5SErik Smit { 107340a38df5SErik Smit MachineClass *mc = MACHINE_CLASS(oc); 107440a38df5SErik Smit AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 107540a38df5SErik Smit 107640a38df5SErik Smit mc->desc = "Supermicro X11 BMC (ARM926EJ-S)"; 107740a38df5SErik Smit amc->soc_name = "ast2400-a1"; 107840a38df5SErik Smit amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1; 107940a38df5SErik Smit amc->fmc_model = "mx25l25635e"; 108040a38df5SErik Smit amc->spi_model = "mx25l25635e"; 108140a38df5SErik Smit amc->num_cs = 1; 108240a38df5SErik Smit amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 108340a38df5SErik Smit amc->i2c_init = palmetto_bmc_i2c_init; 108440a38df5SErik Smit mc->default_ram_size = 256 * MiB; 108540a38df5SErik Smit } 108640a38df5SErik Smit 1087baa4732bSCédric Le Goater static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data) 1088baa4732bSCédric Le Goater { 1089baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1090baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1091baa4732bSCédric Le Goater 1092baa4732bSCédric Le Goater mc->desc = "Aspeed AST2500 EVB (ARM1176)"; 1093baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1"; 1094baa4732bSCédric Le Goater amc->hw_strap1 = AST2500_EVB_HW_STRAP1; 1095baa4732bSCédric Le Goater amc->fmc_model = "w25q256"; 1096baa4732bSCédric Le Goater amc->spi_model = "mx25l25635e"; 1097baa4732bSCédric Le Goater amc->num_cs = 1; 1098baa4732bSCédric Le Goater amc->i2c_init = ast2500_evb_i2c_init; 1099baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB; 1100b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1101b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1102baa4732bSCédric Le Goater }; 1103baa4732bSCédric Le Goater 1104baa4732bSCédric Le Goater static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data) 1105baa4732bSCédric Le Goater { 1106baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1107baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1108baa4732bSCédric Le Goater 1109baa4732bSCédric Le Goater mc->desc = "OpenPOWER Romulus BMC (ARM1176)"; 1110baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1"; 1111baa4732bSCédric Le Goater amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1; 1112baa4732bSCédric Le Goater amc->fmc_model = "n25q256a"; 1113baa4732bSCédric Le Goater amc->spi_model = "mx66l1g45g"; 1114baa4732bSCédric Le Goater amc->num_cs = 2; 1115baa4732bSCédric Le Goater amc->i2c_init = romulus_bmc_i2c_init; 1116baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB; 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 1121143b040fSPatrick Williams static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data) 1122143b040fSPatrick Williams { 1123143b040fSPatrick Williams MachineClass *mc = MACHINE_CLASS(oc); 1124143b040fSPatrick Williams AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1125143b040fSPatrick Williams 1126143b040fSPatrick Williams mc->desc = "OCP SonoraPass BMC (ARM1176)"; 1127143b040fSPatrick Williams amc->soc_name = "ast2500-a1"; 1128143b040fSPatrick Williams amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1; 1129143b040fSPatrick Williams amc->fmc_model = "mx66l1g45g"; 1130143b040fSPatrick Williams amc->spi_model = "mx66l1g45g"; 1131143b040fSPatrick Williams amc->num_cs = 2; 1132143b040fSPatrick Williams amc->i2c_init = sonorapass_bmc_i2c_init; 1133143b040fSPatrick Williams mc->default_ram_size = 512 * MiB; 1134b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1135b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1136143b040fSPatrick Williams }; 1137143b040fSPatrick Williams 1138baa4732bSCédric Le Goater static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data) 1139baa4732bSCédric Le Goater { 1140baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1141baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1142baa4732bSCédric Le Goater 1143baa4732bSCédric Le Goater mc->desc = "OpenPOWER Witherspoon BMC (ARM1176)"; 1144baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1"; 1145baa4732bSCédric Le Goater amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1; 1146baa4732bSCédric Le Goater amc->fmc_model = "mx25l25635e"; 1147baa4732bSCédric Le Goater amc->spi_model = "mx66l1g45g"; 1148baa4732bSCédric Le Goater amc->num_cs = 2; 1149baa4732bSCédric Le Goater amc->i2c_init = witherspoon_bmc_i2c_init; 1150baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB; 1151b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1152b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1153baa4732bSCédric Le Goater }; 1154baa4732bSCédric Le Goater 1155baa4732bSCédric Le Goater static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data) 1156baa4732bSCédric Le Goater { 1157baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1158baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1159baa4732bSCédric Le Goater 1160f548f201SPeter Maydell mc->desc = "Aspeed AST2600 EVB (Cortex-A7)"; 1161c5811bb3SJoel Stanley amc->soc_name = "ast2600-a3"; 1162baa4732bSCédric Le Goater amc->hw_strap1 = AST2600_EVB_HW_STRAP1; 1163baa4732bSCédric Le Goater amc->hw_strap2 = AST2600_EVB_HW_STRAP2; 1164baa4732bSCédric Le Goater amc->fmc_model = "w25q512jv"; 1165baa4732bSCédric Le Goater amc->spi_model = "mx66u51235f"; 1166baa4732bSCédric Le Goater amc->num_cs = 1; 116729193286SGuenter Roeck amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON | 116829193286SGuenter Roeck ASPEED_MAC3_ON; 1169baa4732bSCédric Le Goater amc->i2c_init = ast2600_evb_i2c_init; 1170baa4732bSCédric Le Goater mc->default_ram_size = 1 * GiB; 1171b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1172b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1173baa4732bSCédric Le Goater }; 1174baa4732bSCédric Le Goater 117563ceb818SCédric Le Goater static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data) 117663ceb818SCédric Le Goater { 117763ceb818SCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 117863ceb818SCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 117963ceb818SCédric Le Goater 1180f548f201SPeter Maydell mc->desc = "OpenPOWER Tacoma BMC (Cortex-A7)"; 1181c5811bb3SJoel Stanley amc->soc_name = "ast2600-a3"; 118263ceb818SCédric Le Goater amc->hw_strap1 = TACOMA_BMC_HW_STRAP1; 118363ceb818SCédric Le Goater amc->hw_strap2 = TACOMA_BMC_HW_STRAP2; 118463ceb818SCédric Le Goater amc->fmc_model = "mx66l1g45g"; 118563ceb818SCédric Le Goater amc->spi_model = "mx66l1g45g"; 118663ceb818SCédric Le Goater amc->num_cs = 2; 1187d3bad7e7SCédric Le Goater amc->macs_mask = ASPEED_MAC2_ON; 118863ceb818SCédric Le Goater amc->i2c_init = witherspoon_bmc_i2c_init; /* Same board layout */ 118963ceb818SCédric Le Goater mc->default_ram_size = 1 * GiB; 1190b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1191b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 119263ceb818SCédric Le Goater }; 119363ceb818SCédric Le Goater 119495f068c8SJohn Wang static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data) 119595f068c8SJohn Wang { 119695f068c8SJohn Wang MachineClass *mc = MACHINE_CLASS(oc); 119795f068c8SJohn Wang AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 119895f068c8SJohn Wang 119995f068c8SJohn Wang mc->desc = "Bytedance G220A BMC (ARM1176)"; 120095f068c8SJohn Wang amc->soc_name = "ast2500-a1"; 120195f068c8SJohn Wang amc->hw_strap1 = G220A_BMC_HW_STRAP1; 120295f068c8SJohn Wang amc->fmc_model = "n25q512a"; 120395f068c8SJohn Wang amc->spi_model = "mx25l25635e"; 120495f068c8SJohn Wang amc->num_cs = 2; 12055bb825c8SGuenter Roeck amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 120695f068c8SJohn Wang amc->i2c_init = g220a_bmc_i2c_init; 120795f068c8SJohn Wang mc->default_ram_size = 1024 * MiB; 120895f068c8SJohn Wang mc->default_cpus = mc->min_cpus = mc->max_cpus = 120995f068c8SJohn Wang aspeed_soc_num_cpus(amc->soc_name); 121095f068c8SJohn Wang }; 121195f068c8SJohn Wang 121282b6a3f6SJohn Wang static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc, void *data) 121382b6a3f6SJohn Wang { 121482b6a3f6SJohn Wang MachineClass *mc = MACHINE_CLASS(oc); 121582b6a3f6SJohn Wang AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 121682b6a3f6SJohn Wang 121782b6a3f6SJohn Wang mc->desc = "Inspur FP5280G2 BMC (ARM1176)"; 121882b6a3f6SJohn Wang amc->soc_name = "ast2500-a1"; 121982b6a3f6SJohn Wang amc->hw_strap1 = FP5280G2_BMC_HW_STRAP1; 122082b6a3f6SJohn Wang amc->fmc_model = "n25q512a"; 122182b6a3f6SJohn Wang amc->spi_model = "mx25l25635e"; 122282b6a3f6SJohn Wang amc->num_cs = 2; 122382b6a3f6SJohn Wang amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 122482b6a3f6SJohn Wang amc->i2c_init = fp5280g2_bmc_i2c_init; 122582b6a3f6SJohn Wang mc->default_ram_size = 512 * MiB; 122682b6a3f6SJohn Wang mc->default_cpus = mc->min_cpus = mc->max_cpus = 122782b6a3f6SJohn Wang aspeed_soc_num_cpus(amc->soc_name); 122882b6a3f6SJohn Wang }; 122982b6a3f6SJohn Wang 123058e52bdbSCédric Le Goater static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data) 123158e52bdbSCédric Le Goater { 123258e52bdbSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 123358e52bdbSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 123458e52bdbSCédric Le Goater 1235f548f201SPeter Maydell mc->desc = "IBM Rainier BMC (Cortex-A7)"; 1236c5811bb3SJoel Stanley amc->soc_name = "ast2600-a3"; 123758e52bdbSCédric Le Goater amc->hw_strap1 = RAINIER_BMC_HW_STRAP1; 123858e52bdbSCédric Le Goater amc->hw_strap2 = RAINIER_BMC_HW_STRAP2; 123958e52bdbSCédric Le Goater amc->fmc_model = "mx66l1g45g"; 124058e52bdbSCédric Le Goater amc->spi_model = "mx66l1g45g"; 124158e52bdbSCédric Le Goater amc->num_cs = 2; 124258e52bdbSCédric Le Goater amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON; 124358e52bdbSCédric Le Goater amc->i2c_init = rainier_bmc_i2c_init; 124458e52bdbSCédric Le Goater mc->default_ram_size = 1 * GiB; 124558e52bdbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 124658e52bdbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 124758e52bdbSCédric Le Goater }; 124858e52bdbSCédric Le Goater 1249febbe308SPeter Delevoryas /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */ 1250febbe308SPeter Delevoryas #if HOST_LONG_BITS == 32 1251febbe308SPeter Delevoryas #define FUJI_BMC_RAM_SIZE (1 * GiB) 1252febbe308SPeter Delevoryas #else 1253febbe308SPeter Delevoryas #define FUJI_BMC_RAM_SIZE (2 * GiB) 1254febbe308SPeter Delevoryas #endif 1255febbe308SPeter Delevoryas 1256febbe308SPeter Delevoryas static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data) 1257febbe308SPeter Delevoryas { 1258febbe308SPeter Delevoryas MachineClass *mc = MACHINE_CLASS(oc); 1259febbe308SPeter Delevoryas AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1260febbe308SPeter Delevoryas 1261febbe308SPeter Delevoryas mc->desc = "Facebook Fuji BMC (Cortex-A7)"; 1262febbe308SPeter Delevoryas amc->soc_name = "ast2600-a3"; 1263febbe308SPeter Delevoryas amc->hw_strap1 = FUJI_BMC_HW_STRAP1; 1264febbe308SPeter Delevoryas amc->hw_strap2 = FUJI_BMC_HW_STRAP2; 1265febbe308SPeter Delevoryas amc->fmc_model = "mx66l1g45g"; 1266febbe308SPeter Delevoryas amc->spi_model = "mx66l1g45g"; 1267febbe308SPeter Delevoryas amc->num_cs = 2; 1268febbe308SPeter Delevoryas amc->macs_mask = ASPEED_MAC3_ON; 1269febbe308SPeter Delevoryas amc->i2c_init = fuji_bmc_i2c_init; 1270febbe308SPeter Delevoryas amc->uart_default = ASPEED_DEV_UART1; 1271febbe308SPeter Delevoryas mc->default_ram_size = FUJI_BMC_RAM_SIZE; 1272febbe308SPeter Delevoryas mc->default_cpus = mc->min_cpus = mc->max_cpus = 1273febbe308SPeter Delevoryas aspeed_soc_num_cpus(amc->soc_name); 1274febbe308SPeter Delevoryas }; 1275febbe308SPeter Delevoryas 1276*a20c54b1SPatrick Williams static void aspeed_machine_bletchley_class_init(ObjectClass *oc, void *data) 1277*a20c54b1SPatrick Williams { 1278*a20c54b1SPatrick Williams MachineClass *mc = MACHINE_CLASS(oc); 1279*a20c54b1SPatrick Williams AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1280*a20c54b1SPatrick Williams 1281*a20c54b1SPatrick Williams mc->desc = "Facebook Bletchley BMC (Cortex-A7)"; 1282*a20c54b1SPatrick Williams amc->soc_name = "ast2600-a3"; 1283*a20c54b1SPatrick Williams amc->hw_strap1 = BLETCHLEY_BMC_HW_STRAP1; 1284*a20c54b1SPatrick Williams amc->hw_strap2 = BLETCHLEY_BMC_HW_STRAP2; 1285*a20c54b1SPatrick Williams amc->fmc_model = "w25q01jvq"; 1286*a20c54b1SPatrick Williams amc->spi_model = NULL; 1287*a20c54b1SPatrick Williams amc->num_cs = 2; 1288*a20c54b1SPatrick Williams amc->macs_mask = ASPEED_MAC2_ON; 1289*a20c54b1SPatrick Williams amc->i2c_init = bletchley_bmc_i2c_init; 1290*a20c54b1SPatrick Williams mc->default_ram_size = 512 * MiB; 1291*a20c54b1SPatrick Williams mc->default_cpus = mc->min_cpus = mc->max_cpus = 1292*a20c54b1SPatrick Williams aspeed_soc_num_cpus(amc->soc_name); 1293*a20c54b1SPatrick Williams } 1294*a20c54b1SPatrick Williams 1295baa4732bSCédric Le Goater static const TypeInfo aspeed_machine_types[] = { 1296baa4732bSCédric Le Goater { 1297baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("palmetto-bmc"), 1298baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1299baa4732bSCédric Le Goater .class_init = aspeed_machine_palmetto_class_init, 1300baa4732bSCédric Le Goater }, { 130140a38df5SErik Smit .name = MACHINE_TYPE_NAME("supermicrox11-bmc"), 130240a38df5SErik Smit .parent = TYPE_ASPEED_MACHINE, 130340a38df5SErik Smit .class_init = aspeed_machine_supermicrox11_bmc_class_init, 130440a38df5SErik Smit }, { 1305baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("ast2500-evb"), 1306baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1307baa4732bSCédric Le Goater .class_init = aspeed_machine_ast2500_evb_class_init, 1308baa4732bSCédric Le Goater }, { 1309baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("romulus-bmc"), 1310baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1311baa4732bSCédric Le Goater .class_init = aspeed_machine_romulus_class_init, 1312baa4732bSCédric Le Goater }, { 1313143b040fSPatrick Williams .name = MACHINE_TYPE_NAME("sonorapass-bmc"), 1314143b040fSPatrick Williams .parent = TYPE_ASPEED_MACHINE, 1315143b040fSPatrick Williams .class_init = aspeed_machine_sonorapass_class_init, 1316143b040fSPatrick Williams }, { 1317baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("witherspoon-bmc"), 1318baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1319baa4732bSCédric Le Goater .class_init = aspeed_machine_witherspoon_class_init, 1320baa4732bSCédric Le Goater }, { 1321baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("ast2600-evb"), 1322baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1323baa4732bSCédric Le Goater .class_init = aspeed_machine_ast2600_evb_class_init, 1324baa4732bSCédric Le Goater }, { 132563ceb818SCédric Le Goater .name = MACHINE_TYPE_NAME("tacoma-bmc"), 132663ceb818SCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 132763ceb818SCédric Le Goater .class_init = aspeed_machine_tacoma_class_init, 132863ceb818SCédric Le Goater }, { 132995f068c8SJohn Wang .name = MACHINE_TYPE_NAME("g220a-bmc"), 133095f068c8SJohn Wang .parent = TYPE_ASPEED_MACHINE, 133195f068c8SJohn Wang .class_init = aspeed_machine_g220a_class_init, 133295f068c8SJohn Wang }, { 133382b6a3f6SJohn Wang .name = MACHINE_TYPE_NAME("fp5280g2-bmc"), 133482b6a3f6SJohn Wang .parent = TYPE_ASPEED_MACHINE, 133582b6a3f6SJohn Wang .class_init = aspeed_machine_fp5280g2_class_init, 133682b6a3f6SJohn Wang }, { 13379cccb912SPatrick Venture .name = MACHINE_TYPE_NAME("quanta-q71l-bmc"), 13389cccb912SPatrick Venture .parent = TYPE_ASPEED_MACHINE, 13399cccb912SPatrick Venture .class_init = aspeed_machine_quanta_q71l_class_init, 13409cccb912SPatrick Venture }, { 134158e52bdbSCédric Le Goater .name = MACHINE_TYPE_NAME("rainier-bmc"), 134258e52bdbSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 134358e52bdbSCédric Le Goater .class_init = aspeed_machine_rainier_class_init, 134458e52bdbSCédric Le Goater }, { 1345febbe308SPeter Delevoryas .name = MACHINE_TYPE_NAME("fuji-bmc"), 1346febbe308SPeter Delevoryas .parent = TYPE_ASPEED_MACHINE, 1347febbe308SPeter Delevoryas .class_init = aspeed_machine_fuji_class_init, 1348febbe308SPeter Delevoryas }, { 1349*a20c54b1SPatrick Williams .name = MACHINE_TYPE_NAME("bletchley-bmc"), 1350*a20c54b1SPatrick Williams .parent = TYPE_ASPEED_MACHINE, 1351*a20c54b1SPatrick Williams .class_init = aspeed_machine_bletchley_class_init, 1352*a20c54b1SPatrick Williams }, { 1353fca9ca1bSCédric Le Goater .name = TYPE_ASPEED_MACHINE, 135462c2c2ebSCédric Le Goater .parent = TYPE_MACHINE, 1355888b2b03SPhilippe Mathieu-Daudé .instance_size = sizeof(AspeedMachineState), 13561a15311aSCédric Le Goater .instance_init = aspeed_machine_instance_init, 1357fca9ca1bSCédric Le Goater .class_size = sizeof(AspeedMachineClass), 1358fca9ca1bSCédric Le Goater .class_init = aspeed_machine_class_init, 1359baa4732bSCédric Le Goater .abstract = true, 1360baa4732bSCédric Le Goater } 1361fca9ca1bSCédric Le Goater }; 136274fb1f38SCédric Le Goater 1363baa4732bSCédric Le Goater DEFINE_TYPES(aspeed_machine_types) 1364