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" 20*9618ebaeSPeter Delevoryas #include "hw/nvram/eeprom_at24c.h" 215e9ae4b1SCorey Minyard #include "hw/sensor/tmp105.h" 227cfbde5eSPhilippe Mathieu-Daudé #include "hw/misc/led.h" 23a27bd6c7SMarkus Armbruster #include "hw/qdev-properties.h" 24e1ad9bc4SCédric Le Goater #include "sysemu/block-backend.h" 25fa699e80SPeter Delevoryas #include "sysemu/reset.h" 26d769a1daSCédric Le Goater #include "hw/loader.h" 27d769a1daSCédric Le Goater #include "qemu/error-report.h" 28a9df9622SJoel Stanley #include "qemu/units.h" 2966c895b8SJamin Lin #include "hw/qdev-clock.h" 30d2b3eaefSPeter Delevoryas #include "sysemu/sysemu.h" 31327d8e4eSAndrew Jeffery 3274fb1f38SCédric Le Goater static struct arm_boot_info aspeed_board_binfo = { 33b033271fSCédric Le Goater .board_id = -1, /* device-tree-only board */ 34327d8e4eSAndrew Jeffery }; 35327d8e4eSAndrew Jeffery 36612b219aSPhilippe Mathieu-Daudé struct AspeedMachineState { 37888b2b03SPhilippe Mathieu-Daudé /* Private */ 38888b2b03SPhilippe Mathieu-Daudé MachineState parent_obj; 39888b2b03SPhilippe Mathieu-Daudé /* Public */ 40888b2b03SPhilippe Mathieu-Daudé 41ff90606fSCédric Le Goater AspeedSoCState soc; 42888b2b03SPhilippe Mathieu-Daudé bool mmio_exec; 439820e52fSCédric Le Goater char *fmc_model; 449820e52fSCédric Le Goater char *spi_model; 45ea066d39SThomas Huth }; 46327d8e4eSAndrew Jeffery 47ef17f836SCédric Le Goater /* Palmetto hardware value: 0x120CE416 */ 488da33ef7SCédric Le Goater #define PALMETTO_BMC_HW_STRAP1 ( \ 498da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_256MB) | \ 508da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_DRAM_CONFIG(2 /* DDR3 with CL=6, CWL=5 */) | \ 518da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_ACPI_DIS | \ 528da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) | \ 538da33ef7SCédric Le Goater SCU_HW_STRAP_VGA_CLASS_CODE | \ 548da33ef7SCédric Le Goater SCU_HW_STRAP_LPC_RESET_PIN | \ 558da33ef7SCédric Le Goater SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) | \ 568da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \ 578da33ef7SCédric Le Goater SCU_HW_STRAP_SPI_WIDTH | \ 588da33ef7SCédric Le Goater SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \ 598da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT)) 608da33ef7SCédric Le Goater 6140a38df5SErik Smit /* TODO: Find the actual hardware value */ 6240a38df5SErik Smit #define SUPERMICROX11_BMC_HW_STRAP1 ( \ 6340a38df5SErik Smit SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) | \ 6440a38df5SErik Smit SCU_AST2400_HW_STRAP_DRAM_CONFIG(2) | \ 6540a38df5SErik Smit SCU_AST2400_HW_STRAP_ACPI_DIS | \ 6640a38df5SErik Smit SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) | \ 6740a38df5SErik Smit SCU_HW_STRAP_VGA_CLASS_CODE | \ 6840a38df5SErik Smit SCU_HW_STRAP_LPC_RESET_PIN | \ 6940a38df5SErik Smit SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) | \ 7040a38df5SErik Smit SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \ 7140a38df5SErik Smit SCU_HW_STRAP_SPI_WIDTH | \ 7240a38df5SErik Smit SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \ 7340a38df5SErik Smit SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT)) 7440a38df5SErik Smit 7547936597SGuenter Roeck /* TODO: Find the actual hardware value */ 7647936597SGuenter Roeck #define SUPERMICRO_X11SPI_BMC_HW_STRAP1 ( \ 7747936597SGuenter Roeck AST2500_HW_STRAP1_DEFAULTS | \ 7847936597SGuenter Roeck SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 7947936597SGuenter Roeck SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 8047936597SGuenter Roeck SCU_AST2500_HW_STRAP_UART_DEBUG | \ 8147936597SGuenter Roeck SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 8247936597SGuenter Roeck SCU_HW_STRAP_SPI_WIDTH | \ 8347936597SGuenter Roeck SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN)) 8447936597SGuenter Roeck 85ef17f836SCédric Le Goater /* AST2500 evb hardware value: 0xF100C2E6 */ 869a7c1750SCédric Le Goater #define AST2500_EVB_HW_STRAP1 (( \ 879a7c1750SCédric Le Goater AST2500_HW_STRAP1_DEFAULTS | \ 889a7c1750SCédric Le Goater SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 899a7c1750SCédric Le Goater SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 909a7c1750SCédric Le Goater SCU_AST2500_HW_STRAP_UART_DEBUG | \ 919a7c1750SCédric Le Goater SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 929a7c1750SCédric Le Goater SCU_HW_STRAP_MAC1_RGMII | \ 939a7c1750SCédric Le Goater SCU_HW_STRAP_MAC0_RGMII) & \ 949a7c1750SCédric Le Goater ~SCU_HW_STRAP_2ND_BOOT_WDT) 959a7c1750SCédric Le Goater 96ef17f836SCédric Le Goater /* Romulus hardware value: 0xF10AD206 */ 97ef17f836SCédric Le Goater #define ROMULUS_BMC_HW_STRAP1 ( \ 98ef17f836SCédric Le Goater AST2500_HW_STRAP1_DEFAULTS | \ 99ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 100ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 101ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_UART_DEBUG | \ 102ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 103ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_ACPI_ENABLE | \ 104ef17f836SCédric Le Goater SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER)) 105ef17f836SCédric Le Goater 106143b040fSPatrick Williams /* Sonorapass hardware value: 0xF100D216 */ 107143b040fSPatrick Williams #define SONORAPASS_BMC_HW_STRAP1 ( \ 108143b040fSPatrick Williams SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 109143b040fSPatrick Williams SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 110143b040fSPatrick Williams SCU_AST2500_HW_STRAP_UART_DEBUG | \ 111143b040fSPatrick Williams SCU_AST2500_HW_STRAP_RESERVED28 | \ 112143b040fSPatrick Williams SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 113143b040fSPatrick Williams SCU_HW_STRAP_VGA_CLASS_CODE | \ 114143b040fSPatrick Williams SCU_HW_STRAP_LPC_RESET_PIN | \ 115143b040fSPatrick Williams SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \ 116143b040fSPatrick Williams SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \ 117143b040fSPatrick Williams SCU_HW_STRAP_VGA_BIOS_ROM | \ 118143b040fSPatrick Williams SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \ 119143b040fSPatrick Williams SCU_AST2500_HW_STRAP_RESERVED1) 120143b040fSPatrick Williams 12195f068c8SJohn Wang #define G220A_BMC_HW_STRAP1 ( \ 12295f068c8SJohn Wang SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 12395f068c8SJohn Wang SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 12495f068c8SJohn Wang SCU_AST2500_HW_STRAP_UART_DEBUG | \ 12595f068c8SJohn Wang SCU_AST2500_HW_STRAP_RESERVED28 | \ 12695f068c8SJohn Wang SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 12795f068c8SJohn Wang SCU_HW_STRAP_2ND_BOOT_WDT | \ 12895f068c8SJohn Wang SCU_HW_STRAP_VGA_CLASS_CODE | \ 12995f068c8SJohn Wang SCU_HW_STRAP_LPC_RESET_PIN | \ 13095f068c8SJohn Wang SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \ 13195f068c8SJohn Wang SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \ 13295f068c8SJohn Wang SCU_HW_STRAP_VGA_SIZE_SET(VGA_64M_DRAM) | \ 13395f068c8SJohn Wang SCU_AST2500_HW_STRAP_RESERVED1) 13495f068c8SJohn Wang 13582b6a3f6SJohn Wang /* FP5280G2 hardware value: 0XF100D286 */ 13682b6a3f6SJohn Wang #define FP5280G2_BMC_HW_STRAP1 ( \ 13782b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 13882b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 13982b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_UART_DEBUG | \ 14082b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_RESERVED28 | \ 14182b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 14282b6a3f6SJohn Wang SCU_HW_STRAP_VGA_CLASS_CODE | \ 14382b6a3f6SJohn Wang SCU_HW_STRAP_LPC_RESET_PIN | \ 14482b6a3f6SJohn Wang SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \ 14582b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \ 14682b6a3f6SJohn Wang SCU_HW_STRAP_MAC1_RGMII | \ 14782b6a3f6SJohn Wang SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \ 14882b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_RESERVED1) 14982b6a3f6SJohn Wang 15062c2c2ebSCédric Le Goater /* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */ 15162c2c2ebSCédric Le Goater #define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1 15262c2c2ebSCédric Le Goater 1539cccb912SPatrick Venture /* Quanta-Q71l hardware value */ 1549cccb912SPatrick Venture #define QUANTA_Q71L_BMC_HW_STRAP1 ( \ 1559cccb912SPatrick Venture SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) | \ 1569cccb912SPatrick Venture SCU_AST2400_HW_STRAP_DRAM_CONFIG(2/* DDR3 with CL=6, CWL=5 */) | \ 1579cccb912SPatrick Venture SCU_AST2400_HW_STRAP_ACPI_DIS | \ 1589cccb912SPatrick Venture SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_24M_IN) | \ 1599cccb912SPatrick Venture SCU_HW_STRAP_VGA_CLASS_CODE | \ 1609cccb912SPatrick Venture SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_PASS_THROUGH) | \ 1619cccb912SPatrick Venture SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \ 1629cccb912SPatrick Venture SCU_HW_STRAP_SPI_WIDTH | \ 1639cccb912SPatrick Venture SCU_HW_STRAP_VGA_SIZE_SET(VGA_8M_DRAM) | \ 1649cccb912SPatrick Venture SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT)) 1659cccb912SPatrick Venture 166ccc2c418SCédric Le Goater /* AST2600 evb hardware value */ 167ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP1 0x000000C0 168ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP2 0x00000003 169ccc2c418SCédric Le Goater 17063ceb818SCédric Le Goater /* Tacoma hardware value */ 17163ceb818SCédric Le Goater #define TACOMA_BMC_HW_STRAP1 0x00000000 1727582591aSJoel Stanley #define TACOMA_BMC_HW_STRAP2 0x00000040 17363ceb818SCédric Le Goater 17458e52bdbSCédric Le Goater /* Rainier hardware value: (QEMU prototype) */ 175b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP1 0x00422016 176b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP2 0x80000848 17758e52bdbSCédric Le Goater 178febbe308SPeter Delevoryas /* Fuji hardware value */ 179febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP1 0x00000000 180febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP2 0x00000000 181febbe308SPeter Delevoryas 182a20c54b1SPatrick Williams /* Bletchley hardware value */ 183a20c54b1SPatrick Williams /* TODO: Leave same as EVB for now. */ 184a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP1 AST2600_EVB_HW_STRAP1 185a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP2 AST2600_EVB_HW_STRAP2 186a20c54b1SPatrick Williams 187fb6b3c8dSJae Hyun Yoo /* Qualcomm DC-SCM hardware value */ 188fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP1 0x00000000 189fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP2 0x00000041 190fb6b3c8dSJae Hyun Yoo 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); 24905e6e40aSWentao_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 26505e6e40aSWentao_Liang storage = g_malloc0(rom_size); 266a9262f55SAlberto Faria if (blk_pread(blk, 0, rom_size, storage, 0) < 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 2741099ad10SPeter Delevoryas void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype, 2759bd4ac61SCédric Le Goater unsigned int count, int unit0) 276e1ad9bc4SCédric Le Goater { 277e1ad9bc4SCédric Le Goater int i; 278179b2058SPatrick Williams 279179b2058SPatrick Williams if (!flashtype) { 280179b2058SPatrick Williams return; 281179b2058SPatrick Williams } 282e1ad9bc4SCédric Le Goater 2839bd4ac61SCédric Le Goater for (i = 0; i < count; ++i) { 2848ec239f2SMarkus Armbruster DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i); 285e1ad9bc4SCédric Le Goater qemu_irq cs_line; 286a7d78befSCédric Le Goater DeviceState *dev; 287e1ad9bc4SCédric Le Goater 288a7d78befSCédric Le Goater dev = qdev_new(flashtype); 289e1ad9bc4SCédric Le Goater if (dinfo) { 290a7d78befSCédric Le Goater qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo)); 291e1ad9bc4SCédric Le Goater } 292a7d78befSCédric Le Goater qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal); 293e1ad9bc4SCédric Le Goater 294a7d78befSCédric Le Goater cs_line = qdev_get_gpio_in_named(dev, SSI_GPIO_CS, 0); 295e1ad9bc4SCédric Le Goater sysbus_connect_irq(SYS_BUS_DEVICE(s), i + 1, cs_line); 296e1ad9bc4SCédric Le Goater } 297e1ad9bc4SCédric Le Goater } 298e1ad9bc4SCédric Le Goater 299a29e3e12SAndrew Jeffery static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo) 300a29e3e12SAndrew Jeffery { 301a29e3e12SAndrew Jeffery DeviceState *card; 302a29e3e12SAndrew Jeffery 303756f739bSPhilippe Mathieu-Daudé if (!dinfo) { 304756f739bSPhilippe Mathieu-Daudé return; 305756f739bSPhilippe Mathieu-Daudé } 3063e80f690SMarkus Armbruster card = qdev_new(TYPE_SD_CARD); 307934df912SMarkus Armbruster qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo), 308a29e3e12SAndrew Jeffery &error_fatal); 3093e80f690SMarkus Armbruster qdev_realize_and_unref(card, 3103e80f690SMarkus Armbruster qdev_get_child_bus(DEVICE(sdhci), "sd-bus"), 3113e80f690SMarkus Armbruster &error_fatal); 312a29e3e12SAndrew Jeffery } 313a29e3e12SAndrew Jeffery 314d2b3eaefSPeter Delevoryas static void connect_serial_hds_to_uarts(AspeedMachineState *bmc) 315d2b3eaefSPeter Delevoryas { 316d2b3eaefSPeter Delevoryas AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc); 317d2b3eaefSPeter Delevoryas AspeedSoCState *s = &bmc->soc; 318d2b3eaefSPeter Delevoryas AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s); 319d2b3eaefSPeter Delevoryas 320d2b3eaefSPeter Delevoryas aspeed_soc_uart_set_chr(s, amc->uart_default, serial_hd(0)); 321d2b3eaefSPeter Delevoryas for (int i = 1, uart = ASPEED_DEV_UART1; i < sc->uarts_num; i++, uart++) { 322d2b3eaefSPeter Delevoryas if (uart == amc->uart_default) { 323d2b3eaefSPeter Delevoryas continue; 324d2b3eaefSPeter Delevoryas } 325d2b3eaefSPeter Delevoryas aspeed_soc_uart_set_chr(s, uart, serial_hd(i)); 326d2b3eaefSPeter Delevoryas } 327d2b3eaefSPeter Delevoryas } 328d2b3eaefSPeter Delevoryas 329baa4732bSCédric Le Goater static void aspeed_machine_init(MachineState *machine) 330327d8e4eSAndrew Jeffery { 331888b2b03SPhilippe Mathieu-Daudé AspeedMachineState *bmc = ASPEED_MACHINE(machine); 332baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine); 333b033271fSCédric Le Goater AspeedSoCClass *sc; 334d769a1daSCédric Le Goater DriveInfo *drive0 = drive_get(IF_MTD, 0, 0); 3352bea128cSEddie James int i; 336d3bad7e7SCédric Le Goater NICInfo *nd = &nd_table[0]; 337327d8e4eSAndrew Jeffery 3389fc7fc4dSMarkus Armbruster object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name); 339327d8e4eSAndrew Jeffery 340b033271fSCédric Le Goater sc = ASPEED_SOC_GET_CLASS(&bmc->soc); 341b033271fSCédric Le Goater 342533eb415SIgor Mammedov /* 343346160cbSCédric Le Goater * This will error out if the RAM size is not supported by the 344346160cbSCédric Le Goater * memory controller of the SoC. 345533eb415SIgor Mammedov */ 3466e504a98SPaolo Bonzini object_property_set_uint(OBJECT(&bmc->soc), "ram-size", machine->ram_size, 347533eb415SIgor Mammedov &error_fatal); 348533eb415SIgor Mammedov 349d3bad7e7SCédric Le Goater for (i = 0; i < sc->macs_num; i++) { 350d3bad7e7SCédric Le Goater if ((amc->macs_mask & (1 << i)) && nd->used) { 351d3bad7e7SCédric Le Goater qemu_check_nic_model(nd, TYPE_FTGMAC100); 352d3bad7e7SCédric Le Goater qdev_set_nic_properties(DEVICE(&bmc->soc.ftgmac100[i]), nd); 353d3bad7e7SCédric Le Goater nd++; 354d3bad7e7SCédric Le Goater } 355d3bad7e7SCédric Le Goater } 356d3bad7e7SCédric Le Goater 3575325cc34SMarkus Armbruster object_property_set_int(OBJECT(&bmc->soc), "hw-strap1", amc->hw_strap1, 35887e79af0SAndrew Jeffery &error_abort); 3595325cc34SMarkus Armbruster object_property_set_int(OBJECT(&bmc->soc), "hw-strap2", amc->hw_strap2, 360ccc2c418SCédric Le Goater &error_abort); 3614dd9d554SPeter Delevoryas object_property_set_link(OBJECT(&bmc->soc), "memory", 3624dd9d554SPeter Delevoryas OBJECT(get_system_memory()), &error_abort); 3635325cc34SMarkus Armbruster object_property_set_link(OBJECT(&bmc->soc), "dram", 3640df2d9a6SCédric Le Goater OBJECT(machine->ram), &error_abort); 365b6e70d1dSJoel Stanley if (machine->kernel_filename) { 366b6e70d1dSJoel Stanley /* 367b6e70d1dSJoel Stanley * When booting with a -kernel command line there is no u-boot 368b6e70d1dSJoel Stanley * that runs to unlock the SCU. In this case set the default to 369b6e70d1dSJoel Stanley * be unlocked as the kernel expects 370b6e70d1dSJoel Stanley */ 3715325cc34SMarkus Armbruster object_property_set_int(OBJECT(&bmc->soc), "hw-prot-key", 3725325cc34SMarkus Armbruster ASPEED_SCU_PROT_KEY, &error_abort); 373b6e70d1dSJoel Stanley } 374d2b3eaefSPeter Delevoryas connect_serial_hds_to_uarts(bmc); 375ce189ab2SMarkus Armbruster qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort); 376327d8e4eSAndrew Jeffery 3778ec239f2SMarkus Armbruster aspeed_board_init_flashes(&bmc->soc.fmc, 3788ec239f2SMarkus Armbruster bmc->fmc_model ? bmc->fmc_model : amc->fmc_model, 3799bd4ac61SCédric Le Goater amc->num_cs, 0); 3808ec239f2SMarkus Armbruster aspeed_board_init_flashes(&bmc->soc.spi[0], 3818ec239f2SMarkus Armbruster bmc->spi_model ? bmc->spi_model : amc->spi_model, 3829bd4ac61SCédric Le Goater 1, amc->num_cs); 383e1ad9bc4SCédric Le Goater 384d769a1daSCédric Le Goater /* Install first FMC flash content as a boot rom. */ 385d769a1daSCédric Le Goater if (drive0) { 386d769a1daSCédric Le Goater AspeedSMCFlash *fl = &bmc->soc.fmc.flashes[0]; 387d769a1daSCédric Le Goater MemoryRegion *boot_rom = g_new(MemoryRegion, 1); 3886bb55e79SCédric Le Goater uint64_t size = memory_region_size(&fl->mmio); 389d769a1daSCédric Le Goater 390d769a1daSCédric Le Goater /* 391d769a1daSCédric Le Goater * create a ROM region using the default mapping window size of 39293bf276dSCédric Le Goater * the flash module. The window size is 64MB for the AST2400 39393bf276dSCédric Le Goater * SoC and 128MB for the AST2500 SoC, which is twice as big as 39493bf276dSCédric Le Goater * needed by the flash modules of the Aspeed machines. 395d769a1daSCédric Le Goater */ 3961a15311aSCédric Le Goater if (ASPEED_MACHINE(machine)->mmio_exec) { 397f489960dSPhilippe Mathieu-Daudé memory_region_init_alias(boot_rom, NULL, "aspeed.boot_rom", 3986bb55e79SCédric Le Goater &fl->mmio, 0, size); 3991a15311aSCédric Le Goater memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR, 4001a15311aSCédric Le Goater boot_rom); 4011a15311aSCédric Le Goater } else { 402f489960dSPhilippe Mathieu-Daudé memory_region_init_rom(boot_rom, NULL, "aspeed.boot_rom", 4036bb55e79SCédric Le Goater size, &error_abort); 404d769a1daSCédric Le Goater memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR, 405d769a1daSCédric Le Goater boot_rom); 4066bb55e79SCédric Le Goater write_boot_rom(drive0, FIRMWARE_ADDR, size, &error_abort); 407d769a1daSCédric Le Goater } 4081a15311aSCédric Le Goater } 409d769a1daSCédric Le Goater 410b7f1a0cbSCédric Le Goater if (machine->kernel_filename && sc->num_cpus > 1) { 4119bb6d140SJoel Stanley /* With no u-boot we must set up a boot stub for the secondary CPU */ 4129bb6d140SJoel Stanley MemoryRegion *smpboot = g_new(MemoryRegion, 1); 413f489960dSPhilippe Mathieu-Daudé memory_region_init_ram(smpboot, NULL, "aspeed.smpboot", 4149bb6d140SJoel Stanley 0x80, &error_abort); 4159bb6d140SJoel Stanley memory_region_add_subregion(get_system_memory(), 4169bb6d140SJoel Stanley AST_SMP_MAILBOX_BASE, smpboot); 4179bb6d140SJoel Stanley 4189bb6d140SJoel Stanley aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot; 4199bb6d140SJoel Stanley aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary; 4209bb6d140SJoel Stanley aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE; 4219bb6d140SJoel Stanley } 4229bb6d140SJoel Stanley 4236e504a98SPaolo Bonzini aspeed_board_binfo.ram_size = machine->ram_size; 424347df6f8SEduardo Habkost aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM]; 425b033271fSCédric Le Goater 426baa4732bSCédric Le Goater if (amc->i2c_init) { 427baa4732bSCédric Le Goater amc->i2c_init(bmc); 4282cf6cb50SCédric Le Goater } 4292cf6cb50SCédric Le Goater 4300e2c24c6SAndrew Jeffery for (i = 0; i < bmc->soc.sdhci.num_slots; i++) { 4318ec239f2SMarkus Armbruster sdhci_attach_drive(&bmc->soc.sdhci.slots[i], 4328ec239f2SMarkus Armbruster drive_get(IF_SD, 0, i)); 433a29e3e12SAndrew Jeffery } 4342bea128cSEddie James 435a29e3e12SAndrew Jeffery if (bmc->soc.emmc.num_slots) { 4368ec239f2SMarkus Armbruster sdhci_attach_drive(&bmc->soc.emmc.slots[0], 4378ec239f2SMarkus Armbruster drive_get(IF_SD, 0, bmc->soc.sdhci.num_slots)); 4382bea128cSEddie James } 4392bea128cSEddie James 4402744ece8STao Xu arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo); 441327d8e4eSAndrew Jeffery } 442327d8e4eSAndrew Jeffery 443612b219aSPhilippe Mathieu-Daudé static void palmetto_bmc_i2c_init(AspeedMachineState *bmc) 4442cf6cb50SCédric Le Goater { 4452cf6cb50SCédric Le Goater AspeedSoCState *soc = &bmc->soc; 446a87e81b9SCédric Le Goater DeviceState *dev; 4473d165f12SCédric Le Goater uint8_t *eeprom_buf = g_malloc0(32 * 1024); 4482cf6cb50SCédric Le Goater 4492cf6cb50SCédric Le Goater /* The palmetto platform expects a ds3231 RTC but a ds1338 is 4502cf6cb50SCédric Le Goater * enough to provide basic RTC features. Alarms will be missing */ 4511373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68); 452a87e81b9SCédric Le Goater 4537a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, 4543d165f12SCédric Le Goater eeprom_buf); 4553d165f12SCédric Le Goater 456a87e81b9SCédric Le Goater /* add a TMP423 temperature sensor */ 4571373b15bSPhilippe Mathieu-Daudé dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), 4581373b15bSPhilippe Mathieu-Daudé "tmp423", 0x4c)); 4595325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 4605325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 4615325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 4625325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort); 4632cf6cb50SCédric Le Goater } 4642cf6cb50SCédric Le Goater 4659cccb912SPatrick Venture static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc) 4669cccb912SPatrick Venture { 4679cccb912SPatrick Venture AspeedSoCState *soc = &bmc->soc; 4689cccb912SPatrick Venture 4699cccb912SPatrick Venture /* 4709cccb912SPatrick Venture * The quanta-q71l platform expects tmp75s which are compatible with 4719cccb912SPatrick Venture * tmp105s. 4729cccb912SPatrick Venture */ 4739cccb912SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c); 4749cccb912SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e); 4759cccb912SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f); 4769cccb912SPatrick Venture 4779cccb912SPatrick Venture /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */ 4789cccb912SPatrick Venture /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */ 4799cccb912SPatrick Venture /* TODO: Add Memory Riser i2c mux and eeproms. */ 4809cccb912SPatrick Venture 4813ec75e39SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74); 4823ec75e39SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77); 4833ec75e39SPatrick Venture 4849cccb912SPatrick Venture /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */ 4853ec75e39SPatrick Venture 4863ec75e39SPatrick Venture /* i2c-7 */ 4873ec75e39SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70); 4889cccb912SPatrick Venture /* - i2c@0: pmbus@59 */ 4899cccb912SPatrick Venture /* - i2c@1: pmbus@58 */ 4909cccb912SPatrick Venture /* - i2c@2: pmbus@58 */ 4919cccb912SPatrick Venture /* - i2c@3: pmbus@59 */ 4923ec75e39SPatrick Venture 4939cccb912SPatrick Venture /* TODO: i2c-7: Add PDB FRU eeprom@52 */ 4949cccb912SPatrick Venture /* TODO: i2c-8: Add BMC FRU eeprom@50 */ 4959cccb912SPatrick Venture } 4969cccb912SPatrick Venture 497612b219aSPhilippe Mathieu-Daudé static void ast2500_evb_i2c_init(AspeedMachineState *bmc) 4982cf6cb50SCédric Le Goater { 4992cf6cb50SCédric Le Goater AspeedSoCState *soc = &bmc->soc; 5003d165f12SCédric Le Goater uint8_t *eeprom_buf = g_malloc0(8 * 1024); 5013d165f12SCédric Le Goater 5027a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50, 5033d165f12SCédric Le Goater eeprom_buf); 5042cf6cb50SCédric Le Goater 5052cf6cb50SCédric Le Goater /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */ 5061373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), 507044475f3SPhilippe Mathieu-Daudé TYPE_TMP105, 0x4d); 5082cf6cb50SCédric Le Goater } 5092cf6cb50SCédric Le Goater 510612b219aSPhilippe Mathieu-Daudé static void ast2600_evb_i2c_init(AspeedMachineState *bmc) 511ccc2c418SCédric Le Goater { 51252bcd997SHoward Chiu AspeedSoCState *soc = &bmc->soc; 51352bcd997SHoward Chiu uint8_t *eeprom_buf = g_malloc0(8 * 1024); 51452bcd997SHoward Chiu 51552bcd997SHoward Chiu smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 51652bcd997SHoward Chiu eeprom_buf); 51752bcd997SHoward Chiu 51852bcd997SHoward Chiu /* LM75 is compatible with TMP105 driver */ 51952bcd997SHoward Chiu i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), 52052bcd997SHoward Chiu TYPE_TMP105, 0x4d); 521ccc2c418SCédric Le Goater } 522ccc2c418SCédric Le Goater 523612b219aSPhilippe Mathieu-Daudé static void romulus_bmc_i2c_init(AspeedMachineState *bmc) 5246c4567c7SCédric Le Goater { 5256c4567c7SCédric Le Goater AspeedSoCState *soc = &bmc->soc; 5266c4567c7SCédric Le Goater 5276c4567c7SCédric Le Goater /* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is 5286c4567c7SCédric Le Goater * good enough */ 5291373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32); 5306c4567c7SCédric Le Goater } 5316c4567c7SCédric Le Goater 532f4aec252SCédric Le Goater static void create_pca9552(AspeedSoCState *soc, int bus_id, int addr) 533f4aec252SCédric Le Goater { 534f4aec252SCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, bus_id), 535f4aec252SCédric Le Goater TYPE_PCA9552, addr); 536f4aec252SCédric Le Goater } 537f4aec252SCédric Le Goater 538612b219aSPhilippe Mathieu-Daudé static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc) 539143b040fSPatrick Williams { 540143b040fSPatrick Williams AspeedSoCState *soc = &bmc->soc; 541143b040fSPatrick Williams 542143b040fSPatrick Williams /* bus 2 : */ 5431373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48); 5441373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49); 545143b040fSPatrick Williams /* bus 2 : pca9546 @ 0x73 */ 546143b040fSPatrick Williams 547143b040fSPatrick Williams /* bus 3 : pca9548 @ 0x70 */ 548143b040fSPatrick Williams 549143b040fSPatrick Williams /* bus 4 : */ 550143b040fSPatrick Williams uint8_t *eeprom4_54 = g_malloc0(8 * 1024); 5517a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 552143b040fSPatrick Williams eeprom4_54); 553143b040fSPatrick Williams /* PCA9539 @ 0x76, but PCA9552 is compatible */ 554f4aec252SCédric Le Goater create_pca9552(soc, 4, 0x76); 555143b040fSPatrick Williams /* PCA9539 @ 0x77, but PCA9552 is compatible */ 556f4aec252SCédric Le Goater create_pca9552(soc, 4, 0x77); 557143b040fSPatrick Williams 558143b040fSPatrick Williams /* bus 6 : */ 5591373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48); 5601373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49); 561143b040fSPatrick Williams /* bus 6 : pca9546 @ 0x73 */ 562143b040fSPatrick Williams 563143b040fSPatrick Williams /* bus 8 : */ 564143b040fSPatrick Williams uint8_t *eeprom8_56 = g_malloc0(8 * 1024); 5657a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56, 566143b040fSPatrick Williams eeprom8_56); 567f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x60); 568f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x61); 569143b040fSPatrick Williams /* bus 8 : adc128d818 @ 0x1d */ 570143b040fSPatrick Williams /* bus 8 : adc128d818 @ 0x1f */ 571143b040fSPatrick Williams 572143b040fSPatrick Williams /* 573143b040fSPatrick Williams * bus 13 : pca9548 @ 0x71 574143b040fSPatrick Williams * - channel 3: 575143b040fSPatrick Williams * - tmm421 @ 0x4c 576143b040fSPatrick Williams * - tmp421 @ 0x4e 577143b040fSPatrick Williams * - tmp421 @ 0x4f 578143b040fSPatrick Williams */ 579143b040fSPatrick Williams 580143b040fSPatrick Williams } 581143b040fSPatrick Williams 582612b219aSPhilippe Mathieu-Daudé static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc) 58362c2c2ebSCédric Le Goater { 5847cfbde5eSPhilippe Mathieu-Daudé static const struct { 5857cfbde5eSPhilippe Mathieu-Daudé unsigned gpio_id; 5867cfbde5eSPhilippe Mathieu-Daudé LEDColor color; 5877cfbde5eSPhilippe Mathieu-Daudé const char *description; 5887cfbde5eSPhilippe Mathieu-Daudé bool gpio_polarity; 5897cfbde5eSPhilippe Mathieu-Daudé } pca1_leds[] = { 5907cfbde5eSPhilippe Mathieu-Daudé {13, LED_COLOR_GREEN, "front-fault-4", GPIO_POLARITY_ACTIVE_LOW}, 5917cfbde5eSPhilippe Mathieu-Daudé {14, LED_COLOR_GREEN, "front-power-3", GPIO_POLARITY_ACTIVE_LOW}, 5927cfbde5eSPhilippe Mathieu-Daudé {15, LED_COLOR_GREEN, "front-id-5", GPIO_POLARITY_ACTIVE_LOW}, 5937cfbde5eSPhilippe Mathieu-Daudé }; 59462c2c2ebSCédric Le Goater AspeedSoCState *soc = &bmc->soc; 5953d165f12SCédric Le Goater uint8_t *eeprom_buf = g_malloc0(8 * 1024); 59615ce12cfSPhilippe Mathieu-Daudé DeviceState *dev; 5977cfbde5eSPhilippe Mathieu-Daudé LEDState *led; 59862c2c2ebSCédric Le Goater 59963ceb818SCédric Le Goater /* Bus 3: TODO bmp280@77 */ 600db437ca6SPhilippe Mathieu-Daudé dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60)); 60115ce12cfSPhilippe Mathieu-Daudé qdev_prop_set_string(dev, "description", "pca1"); 6022616f572SPhilippe Mathieu-Daudé i2c_slave_realize_and_unref(I2C_SLAVE(dev), 6032616f572SPhilippe Mathieu-Daudé aspeed_i2c_get_bus(&soc->i2c, 3), 60415ce12cfSPhilippe Mathieu-Daudé &error_fatal); 6058c9a61d7SCédric Le Goater 6067cfbde5eSPhilippe Mathieu-Daudé for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) { 6077cfbde5eSPhilippe Mathieu-Daudé led = led_create_simple(OBJECT(bmc), 6087cfbde5eSPhilippe Mathieu-Daudé pca1_leds[i].gpio_polarity, 6097cfbde5eSPhilippe Mathieu-Daudé pca1_leds[i].color, 6107cfbde5eSPhilippe Mathieu-Daudé pca1_leds[i].description); 6117cfbde5eSPhilippe Mathieu-Daudé qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id, 6127cfbde5eSPhilippe Mathieu-Daudé qdev_get_gpio_in(DEVICE(led), 0)); 6137cfbde5eSPhilippe Mathieu-Daudé } 614b61ea6e7SJoel Stanley i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76); 6152a75e8c3SMaheswara Kurapati i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "max31785", 0x52); 6161373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c); 6171373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c); 61862c2c2ebSCédric Le Goater 61962c2c2ebSCédric Le Goater /* The Witherspoon expects a TMP275 but a TMP105 is compatible */ 6201373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105, 621044475f3SPhilippe Mathieu-Daudé 0x4a); 6226c4567c7SCédric Le Goater 6236c4567c7SCédric Le Goater /* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is 6246c4567c7SCédric Le Goater * good enough */ 6251373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32); 6263d165f12SCédric Le Goater 6277a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51, 6283d165f12SCédric Le Goater eeprom_buf); 629db437ca6SPhilippe Mathieu-Daudé dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60)); 63015ce12cfSPhilippe Mathieu-Daudé qdev_prop_set_string(dev, "description", "pca0"); 6312616f572SPhilippe Mathieu-Daudé i2c_slave_realize_and_unref(I2C_SLAVE(dev), 6322616f572SPhilippe Mathieu-Daudé aspeed_i2c_get_bus(&soc->i2c, 11), 63315ce12cfSPhilippe Mathieu-Daudé &error_fatal); 63463ceb818SCédric Le Goater /* Bus 11: TODO ucd90160@64 */ 63562c2c2ebSCédric Le Goater } 63662c2c2ebSCédric Le Goater 63795f068c8SJohn Wang static void g220a_bmc_i2c_init(AspeedMachineState *bmc) 63895f068c8SJohn Wang { 63995f068c8SJohn Wang AspeedSoCState *soc = &bmc->soc; 64095f068c8SJohn Wang DeviceState *dev; 64195f068c8SJohn Wang 64295f068c8SJohn Wang dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), 64395f068c8SJohn Wang "emc1413", 0x4c)); 64495f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 64595f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 64695f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 64795f068c8SJohn Wang 64895f068c8SJohn Wang dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12), 64995f068c8SJohn Wang "emc1413", 0x4c)); 65095f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 65195f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 65295f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 65395f068c8SJohn Wang 65495f068c8SJohn Wang dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13), 65595f068c8SJohn Wang "emc1413", 0x4c)); 65695f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 65795f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 65895f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 6596f5f6507SJohn Wang 6606f5f6507SJohn Wang static uint8_t eeprom_buf[2 * 1024] = { 6616f5f6507SJohn Wang 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe, 6626f5f6507SJohn Wang 0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65, 6636f5f6507SJohn Wang 0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32, 6646f5f6507SJohn Wang 0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42, 6656f5f6507SJohn Wang 0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45, 6666f5f6507SJohn Wang 0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1, 6676f5f6507SJohn Wang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, 6686f5f6507SJohn Wang }; 6696f5f6507SJohn Wang smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57, 6706f5f6507SJohn Wang eeprom_buf); 67195f068c8SJohn Wang } 67295f068c8SJohn Wang 673fa6d98c0SJoel Stanley static void aspeed_eeprom_init(I2CBus *bus, uint8_t addr, uint32_t rsize) 674fa6d98c0SJoel Stanley { 675fa6d98c0SJoel Stanley I2CSlave *i2c_dev = i2c_slave_new("at24c-eeprom", addr); 676fa6d98c0SJoel Stanley DeviceState *dev = DEVICE(i2c_dev); 677fa6d98c0SJoel Stanley 678fa6d98c0SJoel Stanley qdev_prop_set_uint32(dev, "rom-size", rsize); 679fa6d98c0SJoel Stanley i2c_slave_realize_and_unref(i2c_dev, bus, &error_abort); 680fa6d98c0SJoel Stanley } 681fa6d98c0SJoel Stanley 68282b6a3f6SJohn Wang static void fp5280g2_bmc_i2c_init(AspeedMachineState *bmc) 68382b6a3f6SJohn Wang { 68482b6a3f6SJohn Wang AspeedSoCState *soc = &bmc->soc; 68582b6a3f6SJohn Wang I2CSlave *i2c_mux; 68682b6a3f6SJohn Wang 68782b6a3f6SJohn Wang /* The at24c256 */ 68882b6a3f6SJohn Wang at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 1), 0x50, 32768); 68982b6a3f6SJohn Wang 69082b6a3f6SJohn Wang /* The fp5280g2 expects a TMP112 but a TMP105 is compatible */ 69182b6a3f6SJohn Wang i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105, 69282b6a3f6SJohn Wang 0x48); 69382b6a3f6SJohn Wang i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105, 69482b6a3f6SJohn Wang 0x49); 69582b6a3f6SJohn Wang 69682b6a3f6SJohn Wang i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), 69782b6a3f6SJohn Wang "pca9546", 0x70); 69882b6a3f6SJohn Wang /* It expects a TMP112 but a TMP105 is compatible */ 69982b6a3f6SJohn Wang i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0), TYPE_TMP105, 70082b6a3f6SJohn Wang 0x4a); 70182b6a3f6SJohn Wang 70282b6a3f6SJohn Wang /* It expects a ds3232 but a ds1338 is good enough */ 70382b6a3f6SJohn Wang i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "ds1338", 0x68); 70482b6a3f6SJohn Wang 70582b6a3f6SJohn Wang /* It expects a pca9555 but a pca9552 is compatible */ 706f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x30); 70782b6a3f6SJohn Wang } 70882b6a3f6SJohn Wang 70958e52bdbSCédric Le Goater static void rainier_bmc_i2c_init(AspeedMachineState *bmc) 71058e52bdbSCédric Le Goater { 71158e52bdbSCédric Le Goater AspeedSoCState *soc = &bmc->soc; 712fa6d98c0SJoel Stanley I2CSlave *i2c_mux; 713fa6d98c0SJoel Stanley 714fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB); 71558e52bdbSCédric Le Goater 716f4aec252SCédric Le Goater create_pca9552(soc, 3, 0x61); 717bcb122f8SJoel Stanley 71858e52bdbSCédric Le Goater /* The rainier expects a TMP275 but a TMP105 is compatible */ 71958e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105, 72058e52bdbSCédric Le Goater 0x48); 72158e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105, 72258e52bdbSCédric Le Goater 0x49); 72358e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105, 72458e52bdbSCédric Le Goater 0x4a); 725fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), 726fa6d98c0SJoel Stanley "pca9546", 0x70); 727fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 728fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 729fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB); 730f4aec252SCédric Le Goater create_pca9552(soc, 4, 0x60); 73158e52bdbSCédric Le Goater 73258e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105, 73358e52bdbSCédric Le Goater 0x48); 73458e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105, 73558e52bdbSCédric Le Goater 0x49); 736f4aec252SCédric Le Goater create_pca9552(soc, 5, 0x60); 737f4aec252SCédric Le Goater create_pca9552(soc, 5, 0x61); 738fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), 739fa6d98c0SJoel Stanley "pca9546", 0x70); 740fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 741fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 74258e52bdbSCédric Le Goater 74358e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105, 74458e52bdbSCédric Le Goater 0x48); 74558e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105, 74658e52bdbSCédric Le Goater 0x4a); 74758e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105, 74858e52bdbSCédric Le Goater 0x4b); 749fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), 750fa6d98c0SJoel Stanley "pca9546", 0x70); 751fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 752fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 753fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB); 754fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB); 75558e52bdbSCédric Le Goater 756f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x30); 757f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x31); 758f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x32); 759f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x33); 760f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x60); 761f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x61); 762b61ea6e7SJoel Stanley i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76); 76358e52bdbSCédric Le Goater /* Bus 7: TODO si7021-a20@20 */ 76458e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105, 76558e52bdbSCédric Le Goater 0x48); 7662a75e8c3SMaheswara Kurapati i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "max31785", 0x52); 767fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB); 768fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB); 76958e52bdbSCédric Le Goater 77058e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105, 77158e52bdbSCédric Le Goater 0x48); 77258e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105, 77358e52bdbSCédric Le Goater 0x4a); 774fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50, 64 * KiB); 775fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 64 * KiB); 776f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x60); 777f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x61); 77858e52bdbSCédric Le Goater /* Bus 8: ucd90320@11 */ 77958e52bdbSCédric Le Goater /* Bus 8: ucd90320@b */ 78058e52bdbSCédric Le Goater /* Bus 8: ucd90320@c */ 78158e52bdbSCédric Le Goater 78258e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c); 78358e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d); 784fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB); 78558e52bdbSCédric Le Goater 78658e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c); 78758e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d); 788fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB); 78958e52bdbSCédric Le Goater 79058e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105, 79158e52bdbSCédric Le Goater 0x48); 79258e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105, 79358e52bdbSCédric Le Goater 0x49); 794fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), 795fa6d98c0SJoel Stanley "pca9546", 0x70); 796fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 797fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 798f4aec252SCédric Le Goater create_pca9552(soc, 11, 0x60); 799fa6d98c0SJoel Stanley 800fa6d98c0SJoel Stanley 801fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB); 802f4aec252SCédric Le Goater create_pca9552(soc, 13, 0x60); 803fa6d98c0SJoel Stanley 804fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB); 805f4aec252SCédric Le Goater create_pca9552(soc, 14, 0x60); 806fa6d98c0SJoel Stanley 807fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB); 808f4aec252SCédric Le Goater create_pca9552(soc, 15, 0x60); 80958e52bdbSCédric Le Goater } 81058e52bdbSCédric Le Goater 811febbe308SPeter Delevoryas static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr, 812febbe308SPeter Delevoryas I2CBus **channels) 813febbe308SPeter Delevoryas { 814febbe308SPeter Delevoryas I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr); 815febbe308SPeter Delevoryas for (int i = 0; i < 8; i++) { 816febbe308SPeter Delevoryas channels[i] = pca954x_i2c_get_bus(mux, i); 817febbe308SPeter Delevoryas } 818febbe308SPeter Delevoryas } 819febbe308SPeter Delevoryas 820febbe308SPeter Delevoryas #define TYPE_LM75 TYPE_TMP105 821febbe308SPeter Delevoryas #define TYPE_TMP75 TYPE_TMP105 822febbe308SPeter Delevoryas #define TYPE_TMP422 "tmp422" 823febbe308SPeter Delevoryas 824febbe308SPeter Delevoryas static void fuji_bmc_i2c_init(AspeedMachineState *bmc) 825febbe308SPeter Delevoryas { 826febbe308SPeter Delevoryas AspeedSoCState *soc = &bmc->soc; 827febbe308SPeter Delevoryas I2CBus *i2c[144] = {}; 828febbe308SPeter Delevoryas 829febbe308SPeter Delevoryas for (int i = 0; i < 16; i++) { 830febbe308SPeter Delevoryas i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i); 831febbe308SPeter Delevoryas } 832febbe308SPeter Delevoryas I2CBus *i2c180 = i2c[2]; 833febbe308SPeter Delevoryas I2CBus *i2c480 = i2c[8]; 834febbe308SPeter Delevoryas I2CBus *i2c600 = i2c[11]; 835febbe308SPeter Delevoryas 836febbe308SPeter Delevoryas get_pca9548_channels(i2c180, 0x70, &i2c[16]); 837febbe308SPeter Delevoryas get_pca9548_channels(i2c480, 0x70, &i2c[24]); 838febbe308SPeter Delevoryas /* NOTE: The device tree skips [32, 40) in the alias numbering */ 839febbe308SPeter Delevoryas get_pca9548_channels(i2c600, 0x77, &i2c[40]); 840febbe308SPeter Delevoryas get_pca9548_channels(i2c[24], 0x71, &i2c[48]); 841febbe308SPeter Delevoryas get_pca9548_channels(i2c[25], 0x72, &i2c[56]); 842febbe308SPeter Delevoryas get_pca9548_channels(i2c[26], 0x76, &i2c[64]); 843febbe308SPeter Delevoryas get_pca9548_channels(i2c[27], 0x76, &i2c[72]); 844febbe308SPeter Delevoryas for (int i = 0; i < 8; i++) { 845febbe308SPeter Delevoryas get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]); 846febbe308SPeter Delevoryas } 847febbe308SPeter Delevoryas 848febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c); 849febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d); 850febbe308SPeter Delevoryas 851febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[19], 0x52, 64 * KiB); 852febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[20], 0x50, 2 * KiB); 853febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[22], 0x52, 2 * KiB); 854febbe308SPeter Delevoryas 855febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x48); 856febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x49); 857febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x4a); 858febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_TMP422, 0x4c); 859febbe308SPeter Delevoryas 860febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[8], 0x51, 64 * KiB); 861febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a); 862febbe308SPeter Delevoryas 863febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[50], TYPE_LM75, 0x4c); 864febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[50], 0x52, 64 * KiB); 865febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[51], TYPE_TMP75, 0x48); 866febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[52], TYPE_TMP75, 0x49); 867febbe308SPeter Delevoryas 868febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[59], TYPE_TMP75, 0x48); 869febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[60], TYPE_TMP75, 0x49); 870febbe308SPeter Delevoryas 871febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[65], 0x53, 64 * KiB); 872febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x49); 873febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x48); 874febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[68], 0x52, 64 * KiB); 875febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[69], 0x52, 64 * KiB); 876febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[70], 0x52, 64 * KiB); 877febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[71], 0x52, 64 * KiB); 878febbe308SPeter Delevoryas 879febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[73], 0x53, 64 * KiB); 880febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x49); 881febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x48); 882febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[76], 0x52, 64 * KiB); 883febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[77], 0x52, 64 * KiB); 884febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[78], 0x52, 64 * KiB); 885febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[79], 0x52, 64 * KiB); 886febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[28], 0x50, 2 * KiB); 887febbe308SPeter Delevoryas 888febbe308SPeter Delevoryas for (int i = 0; i < 8; i++) { 889febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB); 890febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[82 + i * 8], TYPE_TMP75, 0x48); 891febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[83 + i * 8], TYPE_TMP75, 0x4b); 892febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[84 + i * 8], TYPE_TMP75, 0x4a); 893febbe308SPeter Delevoryas } 894febbe308SPeter Delevoryas } 895febbe308SPeter Delevoryas 896a20c54b1SPatrick Williams #define TYPE_TMP421 "tmp421" 897a20c54b1SPatrick Williams 898a20c54b1SPatrick Williams static void bletchley_bmc_i2c_init(AspeedMachineState *bmc) 899a20c54b1SPatrick Williams { 900a20c54b1SPatrick Williams AspeedSoCState *soc = &bmc->soc; 901a20c54b1SPatrick Williams I2CBus *i2c[13] = {}; 902a20c54b1SPatrick Williams for (int i = 0; i < 13; i++) { 903a20c54b1SPatrick Williams if ((i == 8) || (i == 11)) { 904a20c54b1SPatrick Williams continue; 905a20c54b1SPatrick Williams } 906a20c54b1SPatrick Williams i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i); 907a20c54b1SPatrick Williams } 908a20c54b1SPatrick Williams 909a20c54b1SPatrick Williams /* Bus 0 - 5 all have the same config. */ 910a20c54b1SPatrick Williams for (int i = 0; i < 6; i++) { 911a20c54b1SPatrick Williams /* Missing model: ti,ina230 @ 0x45 */ 912a20c54b1SPatrick Williams /* Missing model: mps,mp5023 @ 0x40 */ 913a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[i], TYPE_TMP421, 0x4f); 914a20c54b1SPatrick Williams /* Missing model: nxp,pca9539 @ 0x76, but PCA9552 works enough */ 915a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x76); 916a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x67); 917a20c54b1SPatrick Williams /* Missing model: fsc,fusb302 @ 0x22 */ 918a20c54b1SPatrick Williams } 919a20c54b1SPatrick Williams 920a20c54b1SPatrick Williams /* Bus 6 */ 921a20c54b1SPatrick Williams at24c_eeprom_init(i2c[6], 0x56, 65536); 922a20c54b1SPatrick Williams /* Missing model: nxp,pcf85263 @ 0x51 , but ds1338 works enough */ 923a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[6], "ds1338", 0x51); 924a20c54b1SPatrick Williams 925a20c54b1SPatrick Williams 926a20c54b1SPatrick Williams /* Bus 7 */ 927a20c54b1SPatrick Williams at24c_eeprom_init(i2c[7], 0x54, 65536); 928a20c54b1SPatrick Williams 929a20c54b1SPatrick Williams /* Bus 9 */ 930a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[9], TYPE_TMP421, 0x4f); 931a20c54b1SPatrick Williams 932a20c54b1SPatrick Williams /* Bus 10 */ 933a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[10], TYPE_TMP421, 0x4f); 934a20c54b1SPatrick Williams /* Missing model: ti,hdc1080 @ 0x40 */ 935a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[10], TYPE_PCA9552, 0x67); 936a20c54b1SPatrick Williams 937a20c54b1SPatrick Williams /* Bus 12 */ 938a20c54b1SPatrick Williams /* Missing model: adi,adm1278 @ 0x11 */ 939a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4c); 940a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4d); 941a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[12], TYPE_PCA9552, 0x67); 942a20c54b1SPatrick Williams } 943a20c54b1SPatrick Williams 944fa699e80SPeter Delevoryas static void fby35_i2c_init(AspeedMachineState *bmc) 945fa699e80SPeter Delevoryas { 946fa699e80SPeter Delevoryas AspeedSoCState *soc = &bmc->soc; 947fa699e80SPeter Delevoryas I2CBus *i2c[16]; 948fa699e80SPeter Delevoryas 949fa699e80SPeter Delevoryas for (int i = 0; i < 16; i++) { 950fa699e80SPeter Delevoryas i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i); 951fa699e80SPeter Delevoryas } 952fa699e80SPeter Delevoryas 953fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[2], TYPE_LM75, 0x4f); 954fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[8], TYPE_TMP421, 0x1f); 955fa699e80SPeter Delevoryas /* Hotswap controller is actually supposed to be mp5920 or ltc4282. */ 956fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[11], "adm1272", 0x44); 957fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4e); 958fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4f); 959fa699e80SPeter Delevoryas 960fa699e80SPeter Delevoryas aspeed_eeprom_init(i2c[4], 0x51, 128 * KiB); 961fa699e80SPeter Delevoryas aspeed_eeprom_init(i2c[6], 0x51, 128 * KiB); 962fa699e80SPeter Delevoryas aspeed_eeprom_init(i2c[8], 0x50, 32 * KiB); 963fa699e80SPeter Delevoryas aspeed_eeprom_init(i2c[11], 0x51, 128 * KiB); 964fa699e80SPeter Delevoryas aspeed_eeprom_init(i2c[11], 0x54, 128 * KiB); 965fa699e80SPeter Delevoryas 966fa699e80SPeter Delevoryas /* 967fa699e80SPeter Delevoryas * TODO: There is a multi-master i2c connection to an AST1030 MiniBMC on 968fa699e80SPeter Delevoryas * buses 0, 1, 2, 3, and 9. Source address 0x10, target address 0x20 on 969fa699e80SPeter Delevoryas * each. 970fa699e80SPeter Delevoryas */ 971fa699e80SPeter Delevoryas } 972fa699e80SPeter Delevoryas 973fb6b3c8dSJae Hyun Yoo static void qcom_dc_scm_bmc_i2c_init(AspeedMachineState *bmc) 974fb6b3c8dSJae Hyun Yoo { 975fb6b3c8dSJae Hyun Yoo AspeedSoCState *soc = &bmc->soc; 976fb6b3c8dSJae Hyun Yoo 977fb6b3c8dSJae Hyun Yoo i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 15), "tmp105", 0x4d); 978fb6b3c8dSJae Hyun Yoo } 979fb6b3c8dSJae Hyun Yoo 980ece4cccdSGraeme Gregory static void qcom_dc_scm_firework_i2c_init(AspeedMachineState *bmc) 981ece4cccdSGraeme Gregory { 982ece4cccdSGraeme Gregory AspeedSoCState *soc = &bmc->soc; 9832a7a5d5cSJae Hyun Yoo I2CSlave *therm_mux, *cpuvr_mux; 984ece4cccdSGraeme Gregory 985ece4cccdSGraeme Gregory /* Create the generic DC-SCM hardware */ 986ece4cccdSGraeme Gregory qcom_dc_scm_bmc_i2c_init(bmc); 987ece4cccdSGraeme Gregory 988ece4cccdSGraeme Gregory /* Now create the Firework specific hardware */ 9892a75e8c3SMaheswara Kurapati 9902a7a5d5cSJae Hyun Yoo /* I2C7 CPUVR MUX */ 9912a7a5d5cSJae Hyun Yoo cpuvr_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), 9922a7a5d5cSJae Hyun Yoo "pca9546", 0x70); 9932a7a5d5cSJae Hyun Yoo i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 0), "pca9548", 0x72); 9942a7a5d5cSJae Hyun Yoo i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 1), "pca9548", 0x72); 9952a7a5d5cSJae Hyun Yoo i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 2), "pca9548", 0x72); 9962a7a5d5cSJae Hyun Yoo i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 3), "pca9548", 0x72); 9972a7a5d5cSJae Hyun Yoo 998cfc68f16SMaheswara Kurapati /* I2C8 Thermal Diodes*/ 999cfc68f16SMaheswara Kurapati therm_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), 1000cfc68f16SMaheswara Kurapati "pca9548", 0x70); 1001cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 0), TYPE_LM75, 0x4C); 1002cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 1), TYPE_LM75, 0x4C); 1003cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 2), TYPE_LM75, 0x48); 1004cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 3), TYPE_LM75, 0x48); 1005cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 4), TYPE_LM75, 0x48); 1006cfc68f16SMaheswara Kurapati 10072a75e8c3SMaheswara Kurapati /* I2C9 Fan Controller (MAX31785) */ 10082a75e8c3SMaheswara Kurapati i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x52); 10092a75e8c3SMaheswara Kurapati i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x54); 1010ece4cccdSGraeme Gregory } 1011ece4cccdSGraeme Gregory 10121a15311aSCédric Le Goater static bool aspeed_get_mmio_exec(Object *obj, Error **errp) 10131a15311aSCédric Le Goater { 10141a15311aSCédric Le Goater return ASPEED_MACHINE(obj)->mmio_exec; 10151a15311aSCédric Le Goater } 10161a15311aSCédric Le Goater 10171a15311aSCédric Le Goater static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp) 10181a15311aSCédric Le Goater { 10191a15311aSCédric Le Goater ASPEED_MACHINE(obj)->mmio_exec = value; 10201a15311aSCédric Le Goater } 10211a15311aSCédric Le Goater 10221a15311aSCédric Le Goater static void aspeed_machine_instance_init(Object *obj) 10231a15311aSCédric Le Goater { 10241a15311aSCédric Le Goater ASPEED_MACHINE(obj)->mmio_exec = false; 10251a15311aSCédric Le Goater } 10261a15311aSCédric Le Goater 10279820e52fSCédric Le Goater static char *aspeed_get_fmc_model(Object *obj, Error **errp) 10289820e52fSCédric Le Goater { 10299820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 10309820e52fSCédric Le Goater return g_strdup(bmc->fmc_model); 10319820e52fSCédric Le Goater } 10329820e52fSCédric Le Goater 10339820e52fSCédric Le Goater static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp) 10349820e52fSCédric Le Goater { 10359820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 10369820e52fSCédric Le Goater 10379820e52fSCédric Le Goater g_free(bmc->fmc_model); 10389820e52fSCédric Le Goater bmc->fmc_model = g_strdup(value); 10399820e52fSCédric Le Goater } 10409820e52fSCédric Le Goater 10419820e52fSCédric Le Goater static char *aspeed_get_spi_model(Object *obj, Error **errp) 10429820e52fSCédric Le Goater { 10439820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 10449820e52fSCédric Le Goater return g_strdup(bmc->spi_model); 10459820e52fSCédric Le Goater } 10469820e52fSCédric Le Goater 10479820e52fSCédric Le Goater static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp) 10489820e52fSCédric Le Goater { 10499820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 10509820e52fSCédric Le Goater 10519820e52fSCédric Le Goater g_free(bmc->spi_model); 10529820e52fSCédric Le Goater bmc->spi_model = g_strdup(value); 10539820e52fSCédric Le Goater } 10549820e52fSCédric Le Goater 10551a15311aSCédric Le Goater static void aspeed_machine_class_props_init(ObjectClass *oc) 10561a15311aSCédric Le Goater { 10571a15311aSCédric Le Goater object_class_property_add_bool(oc, "execute-in-place", 10581a15311aSCédric Le Goater aspeed_get_mmio_exec, 1059d2623129SMarkus Armbruster aspeed_set_mmio_exec); 10601a15311aSCédric Le Goater object_class_property_set_description(oc, "execute-in-place", 10617eecec7dSMarkus Armbruster "boot directly from CE0 flash device"); 10629820e52fSCédric Le Goater 10639820e52fSCédric Le Goater object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model, 10649820e52fSCédric Le Goater aspeed_set_fmc_model); 10659820e52fSCédric Le Goater object_class_property_set_description(oc, "fmc-model", 10669820e52fSCédric Le Goater "Change the FMC Flash model"); 10679820e52fSCédric Le Goater object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model, 10689820e52fSCédric Le Goater aspeed_set_spi_model); 10699820e52fSCédric Le Goater object_class_property_set_description(oc, "spi-model", 10709820e52fSCédric Le Goater "Change the SPI Flash model"); 10711a15311aSCédric Le Goater } 10721a15311aSCédric Le Goater 1073b7f1a0cbSCédric Le Goater static int aspeed_soc_num_cpus(const char *soc_name) 1074b7f1a0cbSCédric Le Goater { 1075b7f1a0cbSCédric Le Goater AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(soc_name)); 1076b7f1a0cbSCédric Le Goater return sc->num_cpus; 1077b7f1a0cbSCédric Le Goater } 1078b7f1a0cbSCédric Le Goater 1079fca9ca1bSCédric Le Goater static void aspeed_machine_class_init(ObjectClass *oc, void *data) 108062c2c2ebSCédric Le Goater { 108162c2c2ebSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1082d3bad7e7SCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 108362c2c2ebSCédric Le Goater 1084fca9ca1bSCédric Le Goater mc->init = aspeed_machine_init; 108562c2c2ebSCédric Le Goater mc->no_floppy = 1; 108662c2c2ebSCédric Le Goater mc->no_cdrom = 1; 108762c2c2ebSCédric Le Goater mc->no_parallel = 1; 1088afcbaed6SIgor Mammedov mc->default_ram_id = "ram"; 1089d3bad7e7SCédric Le Goater amc->macs_mask = ASPEED_MAC0_ON; 10905d63d0c7SPeter Delevoryas amc->uart_default = ASPEED_DEV_UART5; 10911a15311aSCédric Le Goater 10921a15311aSCédric Le Goater aspeed_machine_class_props_init(oc); 109362c2c2ebSCédric Le Goater } 109462c2c2ebSCédric Le Goater 1095baa4732bSCédric Le Goater static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data) 1096baa4732bSCédric Le Goater { 1097baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1098baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1099baa4732bSCédric Le Goater 1100baa4732bSCédric Le Goater mc->desc = "OpenPOWER Palmetto BMC (ARM926EJ-S)"; 1101baa4732bSCédric Le Goater amc->soc_name = "ast2400-a1"; 1102baa4732bSCédric Le Goater amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1; 1103baa4732bSCédric Le Goater amc->fmc_model = "n25q256a"; 110470322913SCédric Le Goater amc->spi_model = "mx25l25635f"; 1105baa4732bSCédric Le Goater amc->num_cs = 1; 1106baa4732bSCédric Le Goater amc->i2c_init = palmetto_bmc_i2c_init; 1107baa4732bSCédric Le Goater mc->default_ram_size = 256 * MiB; 1108b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1109b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1110baa4732bSCédric Le Goater }; 1111baa4732bSCédric Le Goater 11129cccb912SPatrick Venture static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data) 11139cccb912SPatrick Venture { 11149cccb912SPatrick Venture MachineClass *mc = MACHINE_CLASS(oc); 11159cccb912SPatrick Venture AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 11169cccb912SPatrick Venture 11179cccb912SPatrick Venture mc->desc = "Quanta-Q71l BMC (ARM926EJ-S)"; 11189cccb912SPatrick Venture amc->soc_name = "ast2400-a1"; 11199cccb912SPatrick Venture amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1; 11209cccb912SPatrick Venture amc->fmc_model = "n25q256a"; 11219cccb912SPatrick Venture amc->spi_model = "mx25l25635e"; 11229cccb912SPatrick Venture amc->num_cs = 1; 11239cccb912SPatrick Venture amc->i2c_init = quanta_q71l_bmc_i2c_init; 11249cccb912SPatrick Venture mc->default_ram_size = 128 * MiB; 11259cccb912SPatrick Venture mc->default_cpus = mc->min_cpus = mc->max_cpus = 11269cccb912SPatrick Venture aspeed_soc_num_cpus(amc->soc_name); 11279cccb912SPatrick Venture } 11289cccb912SPatrick Venture 112940a38df5SErik Smit static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc, 113040a38df5SErik Smit void *data) 113140a38df5SErik Smit { 113240a38df5SErik Smit MachineClass *mc = MACHINE_CLASS(oc); 113340a38df5SErik Smit AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 113440a38df5SErik Smit 113540a38df5SErik Smit mc->desc = "Supermicro X11 BMC (ARM926EJ-S)"; 113640a38df5SErik Smit amc->soc_name = "ast2400-a1"; 113740a38df5SErik Smit amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1; 113840a38df5SErik Smit amc->fmc_model = "mx25l25635e"; 113940a38df5SErik Smit amc->spi_model = "mx25l25635e"; 114040a38df5SErik Smit amc->num_cs = 1; 114140a38df5SErik Smit amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 114240a38df5SErik Smit amc->i2c_init = palmetto_bmc_i2c_init; 114340a38df5SErik Smit mc->default_ram_size = 256 * MiB; 114440a38df5SErik Smit } 114540a38df5SErik Smit 114647936597SGuenter Roeck static void aspeed_machine_supermicro_x11spi_bmc_class_init(ObjectClass *oc, 114747936597SGuenter Roeck void *data) 114847936597SGuenter Roeck { 114947936597SGuenter Roeck MachineClass *mc = MACHINE_CLASS(oc); 115047936597SGuenter Roeck AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 115147936597SGuenter Roeck 115247936597SGuenter Roeck mc->desc = "Supermicro X11 SPI BMC (ARM1176)"; 115347936597SGuenter Roeck amc->soc_name = "ast2500-a1"; 115447936597SGuenter Roeck amc->hw_strap1 = SUPERMICRO_X11SPI_BMC_HW_STRAP1; 115547936597SGuenter Roeck amc->fmc_model = "mx25l25635e"; 115647936597SGuenter Roeck amc->spi_model = "mx25l25635e"; 115747936597SGuenter Roeck amc->num_cs = 1; 115847936597SGuenter Roeck amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 115947936597SGuenter Roeck amc->i2c_init = palmetto_bmc_i2c_init; 116047936597SGuenter Roeck mc->default_ram_size = 512 * MiB; 116147936597SGuenter Roeck mc->default_cpus = mc->min_cpus = mc->max_cpus = 116247936597SGuenter Roeck aspeed_soc_num_cpus(amc->soc_name); 116347936597SGuenter Roeck } 116447936597SGuenter Roeck 1165baa4732bSCédric Le Goater static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data) 1166baa4732bSCédric Le Goater { 1167baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1168baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1169baa4732bSCédric Le Goater 1170baa4732bSCédric Le Goater mc->desc = "Aspeed AST2500 EVB (ARM1176)"; 1171baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1"; 1172baa4732bSCédric Le Goater amc->hw_strap1 = AST2500_EVB_HW_STRAP1; 1173753abfc4SJae Hyun Yoo amc->fmc_model = "mx25l25635e"; 117470322913SCédric Le Goater amc->spi_model = "mx25l25635f"; 1175baa4732bSCédric Le Goater amc->num_cs = 1; 1176baa4732bSCédric Le Goater amc->i2c_init = ast2500_evb_i2c_init; 1177baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB; 1178b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1179b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1180baa4732bSCédric Le Goater }; 1181baa4732bSCédric Le Goater 1182baa4732bSCédric Le Goater static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data) 1183baa4732bSCédric Le Goater { 1184baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1185baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1186baa4732bSCédric Le Goater 1187baa4732bSCédric Le Goater mc->desc = "OpenPOWER Romulus BMC (ARM1176)"; 1188baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1"; 1189baa4732bSCédric Le Goater amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1; 1190baa4732bSCédric Le Goater amc->fmc_model = "n25q256a"; 1191baa4732bSCédric Le Goater amc->spi_model = "mx66l1g45g"; 1192baa4732bSCédric Le Goater amc->num_cs = 2; 1193baa4732bSCédric Le Goater amc->i2c_init = romulus_bmc_i2c_init; 1194baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB; 1195b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1196b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1197baa4732bSCédric Le Goater }; 1198baa4732bSCédric Le Goater 1199143b040fSPatrick Williams static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data) 1200143b040fSPatrick Williams { 1201143b040fSPatrick Williams MachineClass *mc = MACHINE_CLASS(oc); 1202143b040fSPatrick Williams AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1203143b040fSPatrick Williams 1204143b040fSPatrick Williams mc->desc = "OCP SonoraPass BMC (ARM1176)"; 1205143b040fSPatrick Williams amc->soc_name = "ast2500-a1"; 1206143b040fSPatrick Williams amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1; 1207143b040fSPatrick Williams amc->fmc_model = "mx66l1g45g"; 1208143b040fSPatrick Williams amc->spi_model = "mx66l1g45g"; 1209143b040fSPatrick Williams amc->num_cs = 2; 1210143b040fSPatrick Williams amc->i2c_init = sonorapass_bmc_i2c_init; 1211143b040fSPatrick Williams mc->default_ram_size = 512 * MiB; 1212b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1213b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1214143b040fSPatrick Williams }; 1215143b040fSPatrick Williams 1216baa4732bSCédric Le Goater static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data) 1217baa4732bSCédric Le Goater { 1218baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1219baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1220baa4732bSCédric Le Goater 1221baa4732bSCédric Le Goater mc->desc = "OpenPOWER Witherspoon BMC (ARM1176)"; 1222baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1"; 1223baa4732bSCédric Le Goater amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1; 122470322913SCédric Le Goater amc->fmc_model = "mx25l25635f"; 1225baa4732bSCédric Le Goater amc->spi_model = "mx66l1g45g"; 1226baa4732bSCédric Le Goater amc->num_cs = 2; 1227baa4732bSCédric Le Goater amc->i2c_init = witherspoon_bmc_i2c_init; 1228baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB; 1229b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1230b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1231baa4732bSCédric Le Goater }; 1232baa4732bSCédric Le Goater 1233baa4732bSCédric Le Goater static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data) 1234baa4732bSCédric Le Goater { 1235baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1236baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1237baa4732bSCédric Le Goater 1238f548f201SPeter Maydell mc->desc = "Aspeed AST2600 EVB (Cortex-A7)"; 1239c5811bb3SJoel Stanley amc->soc_name = "ast2600-a3"; 1240baa4732bSCédric Le Goater amc->hw_strap1 = AST2600_EVB_HW_STRAP1; 1241baa4732bSCédric Le Goater amc->hw_strap2 = AST2600_EVB_HW_STRAP2; 1242753abfc4SJae Hyun Yoo amc->fmc_model = "mx66u51235f"; 1243baa4732bSCédric Le Goater amc->spi_model = "mx66u51235f"; 1244baa4732bSCédric Le Goater amc->num_cs = 1; 124529193286SGuenter Roeck amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON | 124629193286SGuenter Roeck ASPEED_MAC3_ON; 1247baa4732bSCédric Le Goater amc->i2c_init = ast2600_evb_i2c_init; 1248baa4732bSCédric Le Goater mc->default_ram_size = 1 * GiB; 1249b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1250b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1251baa4732bSCédric Le Goater }; 1252baa4732bSCédric Le Goater 125363ceb818SCédric Le Goater static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data) 125463ceb818SCédric Le Goater { 125563ceb818SCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 125663ceb818SCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 125763ceb818SCédric Le Goater 1258f548f201SPeter Maydell mc->desc = "OpenPOWER Tacoma BMC (Cortex-A7)"; 1259c5811bb3SJoel Stanley amc->soc_name = "ast2600-a3"; 126063ceb818SCédric Le Goater amc->hw_strap1 = TACOMA_BMC_HW_STRAP1; 126163ceb818SCédric Le Goater amc->hw_strap2 = TACOMA_BMC_HW_STRAP2; 126263ceb818SCédric Le Goater amc->fmc_model = "mx66l1g45g"; 126363ceb818SCédric Le Goater amc->spi_model = "mx66l1g45g"; 126463ceb818SCédric Le Goater amc->num_cs = 2; 1265d3bad7e7SCédric Le Goater amc->macs_mask = ASPEED_MAC2_ON; 126663ceb818SCédric Le Goater amc->i2c_init = witherspoon_bmc_i2c_init; /* Same board layout */ 126763ceb818SCédric Le Goater mc->default_ram_size = 1 * GiB; 1268b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1269b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 127063ceb818SCédric Le Goater }; 127163ceb818SCédric Le Goater 127295f068c8SJohn Wang static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data) 127395f068c8SJohn Wang { 127495f068c8SJohn Wang MachineClass *mc = MACHINE_CLASS(oc); 127595f068c8SJohn Wang AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 127695f068c8SJohn Wang 127795f068c8SJohn Wang mc->desc = "Bytedance G220A BMC (ARM1176)"; 127895f068c8SJohn Wang amc->soc_name = "ast2500-a1"; 127995f068c8SJohn Wang amc->hw_strap1 = G220A_BMC_HW_STRAP1; 128095f068c8SJohn Wang amc->fmc_model = "n25q512a"; 128195f068c8SJohn Wang amc->spi_model = "mx25l25635e"; 128295f068c8SJohn Wang amc->num_cs = 2; 12835bb825c8SGuenter Roeck amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 128495f068c8SJohn Wang amc->i2c_init = g220a_bmc_i2c_init; 128595f068c8SJohn Wang mc->default_ram_size = 1024 * MiB; 128695f068c8SJohn Wang mc->default_cpus = mc->min_cpus = mc->max_cpus = 128795f068c8SJohn Wang aspeed_soc_num_cpus(amc->soc_name); 128895f068c8SJohn Wang }; 128995f068c8SJohn Wang 129082b6a3f6SJohn Wang static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc, void *data) 129182b6a3f6SJohn Wang { 129282b6a3f6SJohn Wang MachineClass *mc = MACHINE_CLASS(oc); 129382b6a3f6SJohn Wang AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 129482b6a3f6SJohn Wang 129582b6a3f6SJohn Wang mc->desc = "Inspur FP5280G2 BMC (ARM1176)"; 129682b6a3f6SJohn Wang amc->soc_name = "ast2500-a1"; 129782b6a3f6SJohn Wang amc->hw_strap1 = FP5280G2_BMC_HW_STRAP1; 129882b6a3f6SJohn Wang amc->fmc_model = "n25q512a"; 129982b6a3f6SJohn Wang amc->spi_model = "mx25l25635e"; 130082b6a3f6SJohn Wang amc->num_cs = 2; 130182b6a3f6SJohn Wang amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 130282b6a3f6SJohn Wang amc->i2c_init = fp5280g2_bmc_i2c_init; 130382b6a3f6SJohn Wang mc->default_ram_size = 512 * MiB; 130482b6a3f6SJohn Wang mc->default_cpus = mc->min_cpus = mc->max_cpus = 130582b6a3f6SJohn Wang aspeed_soc_num_cpus(amc->soc_name); 130682b6a3f6SJohn Wang }; 130782b6a3f6SJohn Wang 130858e52bdbSCédric Le Goater static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data) 130958e52bdbSCédric Le Goater { 131058e52bdbSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 131158e52bdbSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 131258e52bdbSCédric Le Goater 1313f548f201SPeter Maydell mc->desc = "IBM Rainier BMC (Cortex-A7)"; 1314c5811bb3SJoel Stanley amc->soc_name = "ast2600-a3"; 131558e52bdbSCédric Le Goater amc->hw_strap1 = RAINIER_BMC_HW_STRAP1; 131658e52bdbSCédric Le Goater amc->hw_strap2 = RAINIER_BMC_HW_STRAP2; 131758e52bdbSCédric Le Goater amc->fmc_model = "mx66l1g45g"; 131858e52bdbSCédric Le Goater amc->spi_model = "mx66l1g45g"; 131958e52bdbSCédric Le Goater amc->num_cs = 2; 132058e52bdbSCédric Le Goater amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON; 132158e52bdbSCédric Le Goater amc->i2c_init = rainier_bmc_i2c_init; 132258e52bdbSCédric Le Goater mc->default_ram_size = 1 * GiB; 132358e52bdbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 132458e52bdbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 132558e52bdbSCédric Le Goater }; 132658e52bdbSCédric Le Goater 1327febbe308SPeter Delevoryas /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */ 1328febbe308SPeter Delevoryas #if HOST_LONG_BITS == 32 1329febbe308SPeter Delevoryas #define FUJI_BMC_RAM_SIZE (1 * GiB) 1330febbe308SPeter Delevoryas #else 1331febbe308SPeter Delevoryas #define FUJI_BMC_RAM_SIZE (2 * GiB) 1332febbe308SPeter Delevoryas #endif 1333febbe308SPeter Delevoryas 1334febbe308SPeter Delevoryas static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data) 1335febbe308SPeter Delevoryas { 1336febbe308SPeter Delevoryas MachineClass *mc = MACHINE_CLASS(oc); 1337febbe308SPeter Delevoryas AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1338febbe308SPeter Delevoryas 1339febbe308SPeter Delevoryas mc->desc = "Facebook Fuji BMC (Cortex-A7)"; 1340febbe308SPeter Delevoryas amc->soc_name = "ast2600-a3"; 1341febbe308SPeter Delevoryas amc->hw_strap1 = FUJI_BMC_HW_STRAP1; 1342febbe308SPeter Delevoryas amc->hw_strap2 = FUJI_BMC_HW_STRAP2; 1343febbe308SPeter Delevoryas amc->fmc_model = "mx66l1g45g"; 1344febbe308SPeter Delevoryas amc->spi_model = "mx66l1g45g"; 1345febbe308SPeter Delevoryas amc->num_cs = 2; 1346febbe308SPeter Delevoryas amc->macs_mask = ASPEED_MAC3_ON; 1347febbe308SPeter Delevoryas amc->i2c_init = fuji_bmc_i2c_init; 1348febbe308SPeter Delevoryas amc->uart_default = ASPEED_DEV_UART1; 1349febbe308SPeter Delevoryas mc->default_ram_size = FUJI_BMC_RAM_SIZE; 1350febbe308SPeter Delevoryas mc->default_cpus = mc->min_cpus = mc->max_cpus = 1351febbe308SPeter Delevoryas aspeed_soc_num_cpus(amc->soc_name); 1352febbe308SPeter Delevoryas }; 1353febbe308SPeter Delevoryas 1354104bdaffSPatrick Williams /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */ 1355104bdaffSPatrick Williams #if HOST_LONG_BITS == 32 1356104bdaffSPatrick Williams #define BLETCHLEY_BMC_RAM_SIZE (1 * GiB) 1357104bdaffSPatrick Williams #else 1358104bdaffSPatrick Williams #define BLETCHLEY_BMC_RAM_SIZE (2 * GiB) 1359104bdaffSPatrick Williams #endif 1360104bdaffSPatrick Williams 1361a20c54b1SPatrick Williams static void aspeed_machine_bletchley_class_init(ObjectClass *oc, void *data) 1362a20c54b1SPatrick Williams { 1363a20c54b1SPatrick Williams MachineClass *mc = MACHINE_CLASS(oc); 1364a20c54b1SPatrick Williams AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1365a20c54b1SPatrick Williams 1366a20c54b1SPatrick Williams mc->desc = "Facebook Bletchley BMC (Cortex-A7)"; 1367a20c54b1SPatrick Williams amc->soc_name = "ast2600-a3"; 1368a20c54b1SPatrick Williams amc->hw_strap1 = BLETCHLEY_BMC_HW_STRAP1; 1369a20c54b1SPatrick Williams amc->hw_strap2 = BLETCHLEY_BMC_HW_STRAP2; 1370a20c54b1SPatrick Williams amc->fmc_model = "w25q01jvq"; 1371a20c54b1SPatrick Williams amc->spi_model = NULL; 1372a20c54b1SPatrick Williams amc->num_cs = 2; 1373a20c54b1SPatrick Williams amc->macs_mask = ASPEED_MAC2_ON; 1374a20c54b1SPatrick Williams amc->i2c_init = bletchley_bmc_i2c_init; 1375104bdaffSPatrick Williams mc->default_ram_size = BLETCHLEY_BMC_RAM_SIZE; 1376a20c54b1SPatrick Williams mc->default_cpus = mc->min_cpus = mc->max_cpus = 1377a20c54b1SPatrick Williams aspeed_soc_num_cpus(amc->soc_name); 1378a20c54b1SPatrick Williams } 1379a20c54b1SPatrick Williams 13807966d70fSJason A. Donenfeld static void fby35_reset(MachineState *state, ShutdownCause reason) 1381fa699e80SPeter Delevoryas { 1382fa699e80SPeter Delevoryas AspeedMachineState *bmc = ASPEED_MACHINE(state); 1383fa699e80SPeter Delevoryas AspeedGPIOState *gpio = &bmc->soc.gpio; 1384fa699e80SPeter Delevoryas 13857966d70fSJason A. Donenfeld qemu_devices_reset(reason); 1386fa699e80SPeter Delevoryas 1387f0418558SPeter Delevoryas /* Board ID: 7 (Class-1, 4 slots) */ 1388fa699e80SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioV4", true, &error_fatal); 1389fa699e80SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioV5", true, &error_fatal); 1390fa699e80SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioV6", true, &error_fatal); 1391fa699e80SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioV7", false, &error_fatal); 1392f0418558SPeter Delevoryas 1393f0418558SPeter Delevoryas /* Slot presence pins, inverse polarity. (False means present) */ 1394f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioH4", false, &error_fatal); 1395f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioH5", true, &error_fatal); 1396f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioH6", true, &error_fatal); 1397f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioH7", true, &error_fatal); 1398f0418558SPeter Delevoryas 1399f0418558SPeter Delevoryas /* Slot 12v power pins, normal polarity. (True means powered-on) */ 1400f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioB2", true, &error_fatal); 1401f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioB3", false, &error_fatal); 1402f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioB4", false, &error_fatal); 1403f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioB5", false, &error_fatal); 1404fa699e80SPeter Delevoryas } 1405fa699e80SPeter Delevoryas 1406fa699e80SPeter Delevoryas static void aspeed_machine_fby35_class_init(ObjectClass *oc, void *data) 1407fa699e80SPeter Delevoryas { 1408fa699e80SPeter Delevoryas MachineClass *mc = MACHINE_CLASS(oc); 1409fa699e80SPeter Delevoryas AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1410fa699e80SPeter Delevoryas 1411fa699e80SPeter Delevoryas mc->desc = "Facebook fby35 BMC (Cortex-A7)"; 1412fa699e80SPeter Delevoryas mc->reset = fby35_reset; 1413fa699e80SPeter Delevoryas amc->fmc_model = "mx66l1g45g"; 1414fa699e80SPeter Delevoryas amc->num_cs = 2; 1415fa699e80SPeter Delevoryas amc->macs_mask = ASPEED_MAC3_ON; 1416fa699e80SPeter Delevoryas amc->i2c_init = fby35_i2c_init; 1417fa699e80SPeter Delevoryas /* FIXME: Replace this macro with something more general */ 1418fa699e80SPeter Delevoryas mc->default_ram_size = FUJI_BMC_RAM_SIZE; 1419fa699e80SPeter Delevoryas } 1420fa699e80SPeter Delevoryas 142166c895b8SJamin Lin #define AST1030_INTERNAL_FLASH_SIZE (1024 * 1024) 142266c895b8SJamin Lin /* Main SYSCLK frequency in Hz (200MHz) */ 142366c895b8SJamin Lin #define SYSCLK_FRQ 200000000ULL 142466c895b8SJamin Lin 142566c895b8SJamin Lin static void aspeed_minibmc_machine_init(MachineState *machine) 142666c895b8SJamin Lin { 142766c895b8SJamin Lin AspeedMachineState *bmc = ASPEED_MACHINE(machine); 142866c895b8SJamin Lin AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine); 142966c895b8SJamin Lin Clock *sysclk; 143066c895b8SJamin Lin 143166c895b8SJamin Lin sysclk = clock_new(OBJECT(machine), "SYSCLK"); 143266c895b8SJamin Lin clock_set_hz(sysclk, SYSCLK_FRQ); 143366c895b8SJamin Lin 143466c895b8SJamin Lin object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name); 143566c895b8SJamin Lin qdev_connect_clock_in(DEVICE(&bmc->soc), "sysclk", sysclk); 143666c895b8SJamin Lin 14374dd9d554SPeter Delevoryas object_property_set_link(OBJECT(&bmc->soc), "memory", 14384dd9d554SPeter Delevoryas OBJECT(get_system_memory()), &error_abort); 1439d2b3eaefSPeter Delevoryas connect_serial_hds_to_uarts(bmc); 144066c895b8SJamin Lin qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort); 144166c895b8SJamin Lin 144266c895b8SJamin Lin aspeed_board_init_flashes(&bmc->soc.fmc, 144366c895b8SJamin Lin bmc->fmc_model ? bmc->fmc_model : amc->fmc_model, 144466c895b8SJamin Lin amc->num_cs, 144566c895b8SJamin Lin 0); 144666c895b8SJamin Lin 144766c895b8SJamin Lin aspeed_board_init_flashes(&bmc->soc.spi[0], 144866c895b8SJamin Lin bmc->spi_model ? bmc->spi_model : amc->spi_model, 144966c895b8SJamin Lin amc->num_cs, amc->num_cs); 145066c895b8SJamin Lin 145166c895b8SJamin Lin aspeed_board_init_flashes(&bmc->soc.spi[1], 145266c895b8SJamin Lin bmc->spi_model ? bmc->spi_model : amc->spi_model, 145366c895b8SJamin Lin amc->num_cs, (amc->num_cs * 2)); 145466c895b8SJamin Lin 145566c895b8SJamin Lin if (amc->i2c_init) { 145666c895b8SJamin Lin amc->i2c_init(bmc); 145766c895b8SJamin Lin } 145866c895b8SJamin Lin 145966c895b8SJamin Lin armv7m_load_kernel(ARM_CPU(first_cpu), 146066c895b8SJamin Lin machine->kernel_filename, 1461761c532aSPeter Maydell 0, 146266c895b8SJamin Lin AST1030_INTERNAL_FLASH_SIZE); 146366c895b8SJamin Lin } 146466c895b8SJamin Lin 14654c70ab16STroy Lee static void ast1030_evb_i2c_init(AspeedMachineState *bmc) 14664c70ab16STroy Lee { 14674c70ab16STroy Lee AspeedSoCState *soc = &bmc->soc; 14684c70ab16STroy Lee 14694c70ab16STroy Lee /* U10 24C08 connects to SDA/SCL Groupt 1 by default */ 14704c70ab16STroy Lee uint8_t *eeprom_buf = g_malloc0(32 * 1024); 14714c70ab16STroy Lee smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, eeprom_buf); 14724c70ab16STroy Lee 14734c70ab16STroy Lee /* U11 LM75 connects to SDA/SCL Group 2 by default */ 14744c70ab16STroy Lee i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d); 14754c70ab16STroy Lee } 14764c70ab16STroy Lee 147766c895b8SJamin Lin static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc, 147866c895b8SJamin Lin void *data) 147966c895b8SJamin Lin { 148066c895b8SJamin Lin MachineClass *mc = MACHINE_CLASS(oc); 148166c895b8SJamin Lin AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 148266c895b8SJamin Lin 148366c895b8SJamin Lin mc->desc = "Aspeed AST1030 MiniBMC (Cortex-M4)"; 148466c895b8SJamin Lin amc->soc_name = "ast1030-a1"; 148566c895b8SJamin Lin amc->hw_strap1 = 0; 148666c895b8SJamin Lin amc->hw_strap2 = 0; 148766c895b8SJamin Lin mc->init = aspeed_minibmc_machine_init; 14884c70ab16STroy Lee amc->i2c_init = ast1030_evb_i2c_init; 148966c895b8SJamin Lin mc->default_ram_size = 0; 149066c895b8SJamin Lin mc->default_cpus = mc->min_cpus = mc->max_cpus = 1; 149166c895b8SJamin Lin amc->fmc_model = "sst25vf032b"; 149266c895b8SJamin Lin amc->spi_model = "sst25vf032b"; 149366c895b8SJamin Lin amc->num_cs = 2; 149466c895b8SJamin Lin amc->macs_mask = 0; 149566c895b8SJamin Lin } 149666c895b8SJamin Lin 1497fb6b3c8dSJae Hyun Yoo static void aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass *oc, 1498fb6b3c8dSJae Hyun Yoo void *data) 1499fb6b3c8dSJae Hyun Yoo { 1500fb6b3c8dSJae Hyun Yoo MachineClass *mc = MACHINE_CLASS(oc); 1501fb6b3c8dSJae Hyun Yoo AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1502fb6b3c8dSJae Hyun Yoo 1503fb6b3c8dSJae Hyun Yoo mc->desc = "Qualcomm DC-SCM V1 BMC (Cortex A7)"; 1504fb6b3c8dSJae Hyun Yoo amc->soc_name = "ast2600-a3"; 1505fb6b3c8dSJae Hyun Yoo amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1; 1506fb6b3c8dSJae Hyun Yoo amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2; 1507fb6b3c8dSJae Hyun Yoo amc->fmc_model = "n25q512a"; 1508fb6b3c8dSJae Hyun Yoo amc->spi_model = "n25q512a"; 1509fb6b3c8dSJae Hyun Yoo amc->num_cs = 2; 1510fb6b3c8dSJae Hyun Yoo amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON; 1511fb6b3c8dSJae Hyun Yoo amc->i2c_init = qcom_dc_scm_bmc_i2c_init; 1512fb6b3c8dSJae Hyun Yoo mc->default_ram_size = 1 * GiB; 1513fb6b3c8dSJae Hyun Yoo mc->default_cpus = mc->min_cpus = mc->max_cpus = 1514fb6b3c8dSJae Hyun Yoo aspeed_soc_num_cpus(amc->soc_name); 1515fb6b3c8dSJae Hyun Yoo }; 1516fb6b3c8dSJae Hyun Yoo 1517ece4cccdSGraeme Gregory static void aspeed_machine_qcom_firework_class_init(ObjectClass *oc, 1518ece4cccdSGraeme Gregory void *data) 1519ece4cccdSGraeme Gregory { 1520ece4cccdSGraeme Gregory MachineClass *mc = MACHINE_CLASS(oc); 1521ece4cccdSGraeme Gregory AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1522ece4cccdSGraeme Gregory 1523ece4cccdSGraeme Gregory mc->desc = "Qualcomm DC-SCM V1/Firework BMC (Cortex A7)"; 1524ece4cccdSGraeme Gregory amc->soc_name = "ast2600-a3"; 1525ece4cccdSGraeme Gregory amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1; 1526ece4cccdSGraeme Gregory amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2; 1527ece4cccdSGraeme Gregory amc->fmc_model = "n25q512a"; 1528ece4cccdSGraeme Gregory amc->spi_model = "n25q512a"; 1529ece4cccdSGraeme Gregory amc->num_cs = 2; 1530ece4cccdSGraeme Gregory amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON; 1531ece4cccdSGraeme Gregory amc->i2c_init = qcom_dc_scm_firework_i2c_init; 1532ece4cccdSGraeme Gregory mc->default_ram_size = 1 * GiB; 1533ece4cccdSGraeme Gregory mc->default_cpus = mc->min_cpus = mc->max_cpus = 1534ece4cccdSGraeme Gregory aspeed_soc_num_cpus(amc->soc_name); 1535ece4cccdSGraeme Gregory }; 1536ece4cccdSGraeme Gregory 1537baa4732bSCédric Le Goater static const TypeInfo aspeed_machine_types[] = { 1538baa4732bSCédric Le Goater { 1539baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("palmetto-bmc"), 1540baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1541baa4732bSCédric Le Goater .class_init = aspeed_machine_palmetto_class_init, 1542baa4732bSCédric Le Goater }, { 154340a38df5SErik Smit .name = MACHINE_TYPE_NAME("supermicrox11-bmc"), 154440a38df5SErik Smit .parent = TYPE_ASPEED_MACHINE, 154540a38df5SErik Smit .class_init = aspeed_machine_supermicrox11_bmc_class_init, 154640a38df5SErik Smit }, { 154747936597SGuenter Roeck .name = MACHINE_TYPE_NAME("supermicro-x11spi-bmc"), 154847936597SGuenter Roeck .parent = TYPE_ASPEED_MACHINE, 154947936597SGuenter Roeck .class_init = aspeed_machine_supermicro_x11spi_bmc_class_init, 155047936597SGuenter Roeck }, { 1551baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("ast2500-evb"), 1552baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1553baa4732bSCédric Le Goater .class_init = aspeed_machine_ast2500_evb_class_init, 1554baa4732bSCédric Le Goater }, { 1555baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("romulus-bmc"), 1556baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1557baa4732bSCédric Le Goater .class_init = aspeed_machine_romulus_class_init, 1558baa4732bSCédric Le Goater }, { 1559143b040fSPatrick Williams .name = MACHINE_TYPE_NAME("sonorapass-bmc"), 1560143b040fSPatrick Williams .parent = TYPE_ASPEED_MACHINE, 1561143b040fSPatrick Williams .class_init = aspeed_machine_sonorapass_class_init, 1562143b040fSPatrick Williams }, { 1563baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("witherspoon-bmc"), 1564baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1565baa4732bSCédric Le Goater .class_init = aspeed_machine_witherspoon_class_init, 1566baa4732bSCédric Le Goater }, { 1567baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("ast2600-evb"), 1568baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1569baa4732bSCédric Le Goater .class_init = aspeed_machine_ast2600_evb_class_init, 1570baa4732bSCédric Le Goater }, { 157163ceb818SCédric Le Goater .name = MACHINE_TYPE_NAME("tacoma-bmc"), 157263ceb818SCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 157363ceb818SCédric Le Goater .class_init = aspeed_machine_tacoma_class_init, 157463ceb818SCédric Le Goater }, { 157595f068c8SJohn Wang .name = MACHINE_TYPE_NAME("g220a-bmc"), 157695f068c8SJohn Wang .parent = TYPE_ASPEED_MACHINE, 157795f068c8SJohn Wang .class_init = aspeed_machine_g220a_class_init, 157895f068c8SJohn Wang }, { 1579fb6b3c8dSJae Hyun Yoo .name = MACHINE_TYPE_NAME("qcom-dc-scm-v1-bmc"), 1580fb6b3c8dSJae Hyun Yoo .parent = TYPE_ASPEED_MACHINE, 1581fb6b3c8dSJae Hyun Yoo .class_init = aspeed_machine_qcom_dc_scm_v1_class_init, 1582fb6b3c8dSJae Hyun Yoo }, { 1583ece4cccdSGraeme Gregory .name = MACHINE_TYPE_NAME("qcom-firework-bmc"), 1584ece4cccdSGraeme Gregory .parent = TYPE_ASPEED_MACHINE, 1585ece4cccdSGraeme Gregory .class_init = aspeed_machine_qcom_firework_class_init, 1586ece4cccdSGraeme Gregory }, { 158782b6a3f6SJohn Wang .name = MACHINE_TYPE_NAME("fp5280g2-bmc"), 158882b6a3f6SJohn Wang .parent = TYPE_ASPEED_MACHINE, 158982b6a3f6SJohn Wang .class_init = aspeed_machine_fp5280g2_class_init, 159082b6a3f6SJohn Wang }, { 15919cccb912SPatrick Venture .name = MACHINE_TYPE_NAME("quanta-q71l-bmc"), 15929cccb912SPatrick Venture .parent = TYPE_ASPEED_MACHINE, 15939cccb912SPatrick Venture .class_init = aspeed_machine_quanta_q71l_class_init, 15949cccb912SPatrick Venture }, { 159558e52bdbSCédric Le Goater .name = MACHINE_TYPE_NAME("rainier-bmc"), 159658e52bdbSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 159758e52bdbSCédric Le Goater .class_init = aspeed_machine_rainier_class_init, 159858e52bdbSCédric Le Goater }, { 1599febbe308SPeter Delevoryas .name = MACHINE_TYPE_NAME("fuji-bmc"), 1600febbe308SPeter Delevoryas .parent = TYPE_ASPEED_MACHINE, 1601febbe308SPeter Delevoryas .class_init = aspeed_machine_fuji_class_init, 1602febbe308SPeter Delevoryas }, { 1603a20c54b1SPatrick Williams .name = MACHINE_TYPE_NAME("bletchley-bmc"), 1604a20c54b1SPatrick Williams .parent = TYPE_ASPEED_MACHINE, 1605a20c54b1SPatrick Williams .class_init = aspeed_machine_bletchley_class_init, 1606a20c54b1SPatrick Williams }, { 1607fa699e80SPeter Delevoryas .name = MACHINE_TYPE_NAME("fby35-bmc"), 1608fa699e80SPeter Delevoryas .parent = MACHINE_TYPE_NAME("ast2600-evb"), 1609fa699e80SPeter Delevoryas .class_init = aspeed_machine_fby35_class_init, 1610fa699e80SPeter Delevoryas }, { 161166c895b8SJamin Lin .name = MACHINE_TYPE_NAME("ast1030-evb"), 161266c895b8SJamin Lin .parent = TYPE_ASPEED_MACHINE, 161366c895b8SJamin Lin .class_init = aspeed_minibmc_machine_ast1030_evb_class_init, 161466c895b8SJamin Lin }, { 1615fca9ca1bSCédric Le Goater .name = TYPE_ASPEED_MACHINE, 161662c2c2ebSCédric Le Goater .parent = TYPE_MACHINE, 1617888b2b03SPhilippe Mathieu-Daudé .instance_size = sizeof(AspeedMachineState), 16181a15311aSCédric Le Goater .instance_init = aspeed_machine_instance_init, 1619fca9ca1bSCédric Le Goater .class_size = sizeof(AspeedMachineClass), 1620fca9ca1bSCédric Le Goater .class_init = aspeed_machine_class_init, 1621baa4732bSCédric Le Goater .abstract = true, 1622baa4732bSCédric Le Goater } 1623fca9ca1bSCédric Le Goater }; 162474fb1f38SCédric Le Goater 1625baa4732bSCédric Le Goater DEFINE_TYPES(aspeed_machine_types) 1626