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" 17c0216b94SPeter Delevoryas #include "hw/arm/aspeed_eeprom.h" 188285490bSCédric Le Goater #include "hw/block/flash.h" 193ec75e39SPatrick Venture #include "hw/i2c/i2c_mux_pca954x.h" 2093198b6cSCorey Minyard #include "hw/i2c/smbus_eeprom.h" 216328d8ffSCédric Le Goater #include "hw/gpio/pca9552.h" 229618ebaeSPeter Delevoryas #include "hw/nvram/eeprom_at24c.h" 235e9ae4b1SCorey Minyard #include "hw/sensor/tmp105.h" 247cfbde5eSPhilippe Mathieu-Daudé #include "hw/misc/led.h" 25a27bd6c7SMarkus Armbruster #include "hw/qdev-properties.h" 26e1ad9bc4SCédric Le Goater #include "sysemu/block-backend.h" 27fa699e80SPeter Delevoryas #include "sysemu/reset.h" 28d769a1daSCédric Le Goater #include "hw/loader.h" 29d769a1daSCédric Le Goater #include "qemu/error-report.h" 30a9df9622SJoel Stanley #include "qemu/units.h" 3166c895b8SJamin Lin #include "hw/qdev-clock.h" 32d2b3eaefSPeter Delevoryas #include "sysemu/sysemu.h" 33327d8e4eSAndrew Jeffery 3474fb1f38SCédric Le Goater static struct arm_boot_info aspeed_board_binfo = { 35b033271fSCédric Le Goater .board_id = -1, /* device-tree-only board */ 36327d8e4eSAndrew Jeffery }; 37327d8e4eSAndrew Jeffery 38612b219aSPhilippe Mathieu-Daudé struct AspeedMachineState { 39888b2b03SPhilippe Mathieu-Daudé /* Private */ 40888b2b03SPhilippe Mathieu-Daudé MachineState parent_obj; 41888b2b03SPhilippe Mathieu-Daudé /* Public */ 42888b2b03SPhilippe Mathieu-Daudé 433c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc; 44262259eaSCédric Le Goater MemoryRegion boot_rom; 45888b2b03SPhilippe Mathieu-Daudé bool mmio_exec; 46f65f6ad5SCédric Le Goater uint32_t uart_chosen; 479820e52fSCédric Le Goater char *fmc_model; 489820e52fSCédric Le Goater char *spi_model; 49621845a9SCédric Le Goater uint32_t hw_strap1; 50ea066d39SThomas Huth }; 51327d8e4eSAndrew Jeffery 521e2c22c9SCédric Le Goater /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */ 531e2c22c9SCédric Le Goater #if HOST_LONG_BITS == 32 541e2c22c9SCédric Le Goater #define ASPEED_RAM_SIZE(sz) MIN((sz), 1 * GiB) 551e2c22c9SCédric Le Goater #else 561e2c22c9SCédric Le Goater #define ASPEED_RAM_SIZE(sz) (sz) 571e2c22c9SCédric Le Goater #endif 581e2c22c9SCédric Le Goater 59ef17f836SCédric Le Goater /* Palmetto hardware value: 0x120CE416 */ 608da33ef7SCédric Le Goater #define PALMETTO_BMC_HW_STRAP1 ( \ 618da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_256MB) | \ 628da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_DRAM_CONFIG(2 /* DDR3 with CL=6, CWL=5 */) | \ 638da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_ACPI_DIS | \ 648da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) | \ 658da33ef7SCédric Le Goater SCU_HW_STRAP_VGA_CLASS_CODE | \ 668da33ef7SCédric Le Goater SCU_HW_STRAP_LPC_RESET_PIN | \ 678da33ef7SCédric Le Goater SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) | \ 688da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \ 698da33ef7SCédric Le Goater SCU_HW_STRAP_SPI_WIDTH | \ 708da33ef7SCédric Le Goater SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \ 718da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT)) 728da33ef7SCédric Le Goater 7340a38df5SErik Smit /* TODO: Find the actual hardware value */ 7440a38df5SErik Smit #define SUPERMICROX11_BMC_HW_STRAP1 ( \ 7540a38df5SErik Smit SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) | \ 7640a38df5SErik Smit SCU_AST2400_HW_STRAP_DRAM_CONFIG(2) | \ 7740a38df5SErik Smit SCU_AST2400_HW_STRAP_ACPI_DIS | \ 7840a38df5SErik Smit SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) | \ 7940a38df5SErik Smit SCU_HW_STRAP_VGA_CLASS_CODE | \ 8040a38df5SErik Smit SCU_HW_STRAP_LPC_RESET_PIN | \ 8140a38df5SErik Smit SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) | \ 8240a38df5SErik Smit SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \ 8340a38df5SErik Smit SCU_HW_STRAP_SPI_WIDTH | \ 8440a38df5SErik Smit SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \ 8540a38df5SErik Smit SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT)) 8640a38df5SErik Smit 8747936597SGuenter Roeck /* TODO: Find the actual hardware value */ 8847936597SGuenter Roeck #define SUPERMICRO_X11SPI_BMC_HW_STRAP1 ( \ 8947936597SGuenter Roeck AST2500_HW_STRAP1_DEFAULTS | \ 9047936597SGuenter Roeck SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 9147936597SGuenter Roeck SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 9247936597SGuenter Roeck SCU_AST2500_HW_STRAP_UART_DEBUG | \ 9347936597SGuenter Roeck SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 9447936597SGuenter Roeck SCU_HW_STRAP_SPI_WIDTH | \ 9547936597SGuenter Roeck SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN)) 9647936597SGuenter Roeck 97ef17f836SCédric Le Goater /* AST2500 evb hardware value: 0xF100C2E6 */ 989a7c1750SCédric Le Goater #define AST2500_EVB_HW_STRAP1 (( \ 999a7c1750SCédric Le Goater AST2500_HW_STRAP1_DEFAULTS | \ 1009a7c1750SCédric Le Goater SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 1019a7c1750SCédric Le Goater SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 1029a7c1750SCédric Le Goater SCU_AST2500_HW_STRAP_UART_DEBUG | \ 1039a7c1750SCédric Le Goater SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 1049a7c1750SCédric Le Goater SCU_HW_STRAP_MAC1_RGMII | \ 1059a7c1750SCédric Le Goater SCU_HW_STRAP_MAC0_RGMII) & \ 1069a7c1750SCédric Le Goater ~SCU_HW_STRAP_2ND_BOOT_WDT) 1079a7c1750SCédric Le Goater 108ef17f836SCédric Le Goater /* Romulus hardware value: 0xF10AD206 */ 109ef17f836SCédric Le Goater #define ROMULUS_BMC_HW_STRAP1 ( \ 110ef17f836SCédric Le Goater AST2500_HW_STRAP1_DEFAULTS | \ 111ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 112ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 113ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_UART_DEBUG | \ 114ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 115ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_ACPI_ENABLE | \ 116ef17f836SCédric Le Goater SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER)) 117ef17f836SCédric Le Goater 118143b040fSPatrick Williams /* Sonorapass hardware value: 0xF100D216 */ 119143b040fSPatrick Williams #define SONORAPASS_BMC_HW_STRAP1 ( \ 120143b040fSPatrick Williams SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 121143b040fSPatrick Williams SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 122143b040fSPatrick Williams SCU_AST2500_HW_STRAP_UART_DEBUG | \ 123143b040fSPatrick Williams SCU_AST2500_HW_STRAP_RESERVED28 | \ 124143b040fSPatrick Williams SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 125143b040fSPatrick Williams SCU_HW_STRAP_VGA_CLASS_CODE | \ 126143b040fSPatrick Williams SCU_HW_STRAP_LPC_RESET_PIN | \ 127143b040fSPatrick Williams SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \ 128143b040fSPatrick Williams SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \ 129143b040fSPatrick Williams SCU_HW_STRAP_VGA_BIOS_ROM | \ 130143b040fSPatrick Williams SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \ 131143b040fSPatrick Williams SCU_AST2500_HW_STRAP_RESERVED1) 132143b040fSPatrick Williams 13395f068c8SJohn Wang #define G220A_BMC_HW_STRAP1 ( \ 13495f068c8SJohn Wang SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 13595f068c8SJohn Wang SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 13695f068c8SJohn Wang SCU_AST2500_HW_STRAP_UART_DEBUG | \ 13795f068c8SJohn Wang SCU_AST2500_HW_STRAP_RESERVED28 | \ 13895f068c8SJohn Wang SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 13995f068c8SJohn Wang SCU_HW_STRAP_2ND_BOOT_WDT | \ 14095f068c8SJohn Wang SCU_HW_STRAP_VGA_CLASS_CODE | \ 14195f068c8SJohn Wang SCU_HW_STRAP_LPC_RESET_PIN | \ 14295f068c8SJohn Wang SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \ 14395f068c8SJohn Wang SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \ 14495f068c8SJohn Wang SCU_HW_STRAP_VGA_SIZE_SET(VGA_64M_DRAM) | \ 14595f068c8SJohn Wang SCU_AST2500_HW_STRAP_RESERVED1) 14695f068c8SJohn Wang 14782b6a3f6SJohn Wang /* FP5280G2 hardware value: 0XF100D286 */ 14882b6a3f6SJohn Wang #define FP5280G2_BMC_HW_STRAP1 ( \ 14982b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 15082b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 15182b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_UART_DEBUG | \ 15282b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_RESERVED28 | \ 15382b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 15482b6a3f6SJohn Wang SCU_HW_STRAP_VGA_CLASS_CODE | \ 15582b6a3f6SJohn Wang SCU_HW_STRAP_LPC_RESET_PIN | \ 15682b6a3f6SJohn Wang SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \ 15782b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \ 15882b6a3f6SJohn Wang SCU_HW_STRAP_MAC1_RGMII | \ 15982b6a3f6SJohn Wang SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \ 16082b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_RESERVED1) 16182b6a3f6SJohn Wang 16262c2c2ebSCédric Le Goater /* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */ 16362c2c2ebSCédric Le Goater #define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1 16462c2c2ebSCédric Le Goater 1659cccb912SPatrick Venture /* Quanta-Q71l hardware value */ 1669cccb912SPatrick Venture #define QUANTA_Q71L_BMC_HW_STRAP1 ( \ 1679cccb912SPatrick Venture SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) | \ 1689cccb912SPatrick Venture SCU_AST2400_HW_STRAP_DRAM_CONFIG(2/* DDR3 with CL=6, CWL=5 */) | \ 1699cccb912SPatrick Venture SCU_AST2400_HW_STRAP_ACPI_DIS | \ 1709cccb912SPatrick Venture SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_24M_IN) | \ 1719cccb912SPatrick Venture SCU_HW_STRAP_VGA_CLASS_CODE | \ 1729cccb912SPatrick Venture SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_PASS_THROUGH) | \ 1739cccb912SPatrick Venture SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \ 1749cccb912SPatrick Venture SCU_HW_STRAP_SPI_WIDTH | \ 1759cccb912SPatrick Venture SCU_HW_STRAP_VGA_SIZE_SET(VGA_8M_DRAM) | \ 1769cccb912SPatrick Venture SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT)) 1779cccb912SPatrick Venture 178ccc2c418SCédric Le Goater /* AST2600 evb hardware value */ 179ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP1 0x000000C0 180ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP2 0x00000003 181ccc2c418SCédric Le Goater 18292707992SJamin Lin #ifdef TARGET_AARCH64 18392707992SJamin Lin /* AST2700 evb hardware value */ 18492707992SJamin Lin #define AST2700_EVB_HW_STRAP1 0x000000C0 18592707992SJamin Lin #define AST2700_EVB_HW_STRAP2 0x00000003 18692707992SJamin Lin #endif 18792707992SJamin Lin 18863ceb818SCédric Le Goater /* Tacoma hardware value */ 18963ceb818SCédric Le Goater #define TACOMA_BMC_HW_STRAP1 0x00000000 1907582591aSJoel Stanley #define TACOMA_BMC_HW_STRAP2 0x00000040 19163ceb818SCédric Le Goater 19258e52bdbSCédric Le Goater /* Rainier hardware value: (QEMU prototype) */ 19301ea09ebSCédric Le Goater #define RAINIER_BMC_HW_STRAP1 (0x00422016 | SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC) 194b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP2 0x80000848 19558e52bdbSCédric Le Goater 196febbe308SPeter Delevoryas /* Fuji hardware value */ 197febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP1 0x00000000 198febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP2 0x00000000 199febbe308SPeter Delevoryas 200a20c54b1SPatrick Williams /* Bletchley hardware value */ 201a20c54b1SPatrick Williams /* TODO: Leave same as EVB for now. */ 202a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP1 AST2600_EVB_HW_STRAP1 203a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP2 AST2600_EVB_HW_STRAP2 204a20c54b1SPatrick Williams 205fb6b3c8dSJae Hyun Yoo /* Qualcomm DC-SCM hardware value */ 206fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP1 0x00000000 207fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP2 0x00000041 208fb6b3c8dSJae Hyun Yoo 2099bb6d140SJoel Stanley #define AST_SMP_MAILBOX_BASE 0x1e6e2180 2109bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_ENTRY (AST_SMP_MAILBOX_BASE + 0x0) 2119bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_GOSIGN (AST_SMP_MAILBOX_BASE + 0x4) 2129bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_READY (AST_SMP_MAILBOX_BASE + 0x8) 2139bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_POLLINSN (AST_SMP_MAILBOX_BASE + 0xc) 2149bb6d140SJoel Stanley #define AST_SMP_MBOX_CODE (AST_SMP_MAILBOX_BASE + 0x10) 2159bb6d140SJoel Stanley #define AST_SMP_MBOX_GOSIGN 0xabbaab00 2169bb6d140SJoel Stanley 2179bb6d140SJoel Stanley static void aspeed_write_smpboot(ARMCPU *cpu, 2189bb6d140SJoel Stanley const struct arm_boot_info *info) 2199bb6d140SJoel Stanley { 220902bba54SCédric Le Goater AddressSpace *as = arm_boot_address_space(cpu, info); 221902bba54SCédric Le Goater static const ARMInsnFixup poll_mailbox_ready[] = { 2229bb6d140SJoel Stanley /* 2239bb6d140SJoel Stanley * r2 = per-cpu go sign value 2249bb6d140SJoel Stanley * r1 = AST_SMP_MBOX_FIELD_ENTRY 2259bb6d140SJoel Stanley * r0 = AST_SMP_MBOX_FIELD_GOSIGN 2269bb6d140SJoel Stanley */ 227902bba54SCédric Le Goater { 0xee100fb0 }, /* mrc p15, 0, r0, c0, c0, 5 */ 228902bba54SCédric Le Goater { 0xe21000ff }, /* ands r0, r0, #255 */ 229902bba54SCédric Le Goater { 0xe59f201c }, /* ldr r2, [pc, #28] */ 230902bba54SCédric Le Goater { 0xe1822000 }, /* orr r2, r2, r0 */ 2319bb6d140SJoel Stanley 232902bba54SCédric Le Goater { 0xe59f1018 }, /* ldr r1, [pc, #24] */ 233902bba54SCédric Le Goater { 0xe59f0018 }, /* ldr r0, [pc, #24] */ 2349bb6d140SJoel Stanley 235902bba54SCédric Le Goater { 0xe320f002 }, /* wfe */ 236902bba54SCédric Le Goater { 0xe5904000 }, /* ldr r4, [r0] */ 237902bba54SCédric Le Goater { 0xe1520004 }, /* cmp r2, r4 */ 238902bba54SCédric Le Goater { 0x1afffffb }, /* bne <wfe> */ 239902bba54SCédric Le Goater { 0xe591f000 }, /* ldr pc, [r1] */ 240902bba54SCédric Le Goater { AST_SMP_MBOX_GOSIGN }, 241902bba54SCédric Le Goater { AST_SMP_MBOX_FIELD_ENTRY }, 242902bba54SCédric Le Goater { AST_SMP_MBOX_FIELD_GOSIGN }, 243902bba54SCédric Le Goater { 0, FIXUP_TERMINATOR } 2449bb6d140SJoel Stanley }; 245902bba54SCédric Le Goater static const uint32_t fixupcontext[FIXUP_MAX] = { 0 }; 2469bb6d140SJoel Stanley 247902bba54SCédric Le Goater arm_write_bootloader("aspeed.smpboot", as, info->smp_loader_start, 248902bba54SCédric Le Goater poll_mailbox_ready, fixupcontext); 2499bb6d140SJoel Stanley } 2509bb6d140SJoel Stanley 2519bb6d140SJoel Stanley static void aspeed_reset_secondary(ARMCPU *cpu, 2529bb6d140SJoel Stanley const struct arm_boot_info *info) 2539bb6d140SJoel Stanley { 2549bb6d140SJoel Stanley AddressSpace *as = arm_boot_address_space(cpu, info); 2559bb6d140SJoel Stanley CPUState *cs = CPU(cpu); 2569bb6d140SJoel Stanley 2579bb6d140SJoel Stanley /* info->smp_bootreg_addr */ 2589bb6d140SJoel Stanley address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0, 2599bb6d140SJoel Stanley MEMTXATTRS_UNSPECIFIED, NULL); 2609bb6d140SJoel Stanley cpu_set_pc(cs, info->smp_loader_start); 2619bb6d140SJoel Stanley } 2629bb6d140SJoel Stanley 2638b744a6aSCédric Le Goater static void write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size, 264d769a1daSCédric Le Goater Error **errp) 265d769a1daSCédric Le Goater { 26605e6e40aSWentao_Liang g_autofree void *storage = NULL; 2670c7209beSCédric Le Goater int64_t size; 268d769a1daSCédric Le Goater 2694db1c164SJamin Lin /* 2704db1c164SJamin Lin * The block backend size should have already been 'validated' by 2710c7209beSCédric Le Goater * the creation of the m25p80 object. 2720c7209beSCédric Le Goater */ 2730c7209beSCédric Le Goater size = blk_getlength(blk); 2740c7209beSCédric Le Goater if (size <= 0) { 2750c7209beSCédric Le Goater error_setg(errp, "failed to get flash size"); 2760c7209beSCédric Le Goater return; 2770c7209beSCédric Le Goater } 2780c7209beSCédric Le Goater 2790c7209beSCédric Le Goater if (rom_size > size) { 2800c7209beSCédric Le Goater rom_size = size; 281d769a1daSCédric Le Goater } 282d769a1daSCédric Le Goater 28305e6e40aSWentao_Liang storage = g_malloc0(rom_size); 284a9262f55SAlberto Faria if (blk_pread(blk, 0, rom_size, storage, 0) < 0) { 285d769a1daSCédric Le Goater error_setg(errp, "failed to read the initial flash content"); 286d769a1daSCédric Le Goater return; 287d769a1daSCédric Le Goater } 288d769a1daSCédric Le Goater 289d769a1daSCédric Le Goater rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr); 290d769a1daSCédric Le Goater } 291d769a1daSCédric Le Goater 2928b744a6aSCédric Le Goater /* 2938b744a6aSCédric Le Goater * Create a ROM and copy the flash contents at the expected address 2948b744a6aSCédric Le Goater * (0x0). Boots faster than execute-in-place. 2958b744a6aSCédric Le Goater */ 296262259eaSCédric Le Goater static void aspeed_install_boot_rom(AspeedMachineState *bmc, BlockBackend *blk, 2978b744a6aSCédric Le Goater uint64_t rom_size) 2988b744a6aSCédric Le Goater { 2993c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 300db052d0eSJamin Lin AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(soc); 3018b744a6aSCédric Le Goater 302262259eaSCédric Le Goater memory_region_init_rom(&bmc->boot_rom, NULL, "aspeed.boot_rom", rom_size, 3038b744a6aSCédric Le Goater &error_abort); 3048b744a6aSCédric Le Goater memory_region_add_subregion_overlap(&soc->spi_boot_container, 0, 305262259eaSCédric Le Goater &bmc->boot_rom, 1); 306db052d0eSJamin Lin write_boot_rom(blk, sc->memmap[ASPEED_DEV_SPI_BOOT], 307db052d0eSJamin Lin rom_size, &error_abort); 3088b744a6aSCédric Le Goater } 3098b744a6aSCédric Le Goater 3101099ad10SPeter Delevoryas void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype, 3119bd4ac61SCédric Le Goater unsigned int count, int unit0) 312e1ad9bc4SCédric Le Goater { 313e1ad9bc4SCédric Le Goater int i; 314179b2058SPatrick Williams 315179b2058SPatrick Williams if (!flashtype) { 316179b2058SPatrick Williams return; 317179b2058SPatrick Williams } 318e1ad9bc4SCédric Le Goater 3199bd4ac61SCédric Le Goater for (i = 0; i < count; ++i) { 3208ec239f2SMarkus Armbruster DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i); 321a7d78befSCédric Le Goater DeviceState *dev; 322e1ad9bc4SCédric Le Goater 323a7d78befSCédric Le Goater dev = qdev_new(flashtype); 324e1ad9bc4SCédric Le Goater if (dinfo) { 325a7d78befSCédric Le Goater qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo)); 326e1ad9bc4SCédric Le Goater } 32727a2c66cSCédric Le Goater qdev_prop_set_uint8(dev, "cs", i); 328a7d78befSCédric Le Goater qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal); 329e1ad9bc4SCédric Le Goater } 330e1ad9bc4SCédric Le Goater } 331e1ad9bc4SCédric Le Goater 332e554e45bSCédric Le Goater static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo, bool emmc, 333e554e45bSCédric Le Goater bool boot_emmc) 334a29e3e12SAndrew Jeffery { 335a29e3e12SAndrew Jeffery DeviceState *card; 336a29e3e12SAndrew Jeffery 337756f739bSPhilippe Mathieu-Daudé if (!dinfo) { 338756f739bSPhilippe Mathieu-Daudé return; 339756f739bSPhilippe Mathieu-Daudé } 340dddfc771SCédric Le Goater card = qdev_new(emmc ? TYPE_EMMC : TYPE_SD_CARD); 341*e8f3acdbSCédric Le Goater 342*e8f3acdbSCédric Le Goater /* 343*e8f3acdbSCédric Le Goater * Force the boot properties of the eMMC device only when the 344*e8f3acdbSCédric Le Goater * machine is strapped to boot from eMMC. Without these 345*e8f3acdbSCédric Le Goater * settings, the machine would not boot. 346*e8f3acdbSCédric Le Goater * 347*e8f3acdbSCédric Le Goater * This also allows the machine to use an eMMC device without 348*e8f3acdbSCédric Le Goater * boot areas when booting from the flash device (or -kernel) 349*e8f3acdbSCédric Le Goater * Ideally, the device and its properties should be defined on 350*e8f3acdbSCédric Le Goater * the command line. 351*e8f3acdbSCédric Le Goater */ 352*e8f3acdbSCédric Le Goater if (emmc && boot_emmc) { 353e554e45bSCédric Le Goater qdev_prop_set_uint64(card, "boot-partition-size", 1 * MiB); 354*e8f3acdbSCédric Le Goater qdev_prop_set_uint8(card, "boot-config", 0x1 << 3); 355e554e45bSCédric Le Goater } 356934df912SMarkus Armbruster qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo), 357a29e3e12SAndrew Jeffery &error_fatal); 3583e80f690SMarkus Armbruster qdev_realize_and_unref(card, 3593e80f690SMarkus Armbruster qdev_get_child_bus(DEVICE(sdhci), "sd-bus"), 3603e80f690SMarkus Armbruster &error_fatal); 361a29e3e12SAndrew Jeffery } 362a29e3e12SAndrew Jeffery 363d2b3eaefSPeter Delevoryas static void connect_serial_hds_to_uarts(AspeedMachineState *bmc) 364d2b3eaefSPeter Delevoryas { 365d2b3eaefSPeter Delevoryas AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc); 3663c392e87SPhilippe Mathieu-Daudé AspeedSoCState *s = bmc->soc; 367d2b3eaefSPeter Delevoryas AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s); 368f65f6ad5SCédric Le Goater int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default; 369d2b3eaefSPeter Delevoryas 370f65f6ad5SCédric Le Goater aspeed_soc_uart_set_chr(s, uart_chosen, serial_hd(0)); 371944128eeSJamin Lin for (int i = 1, uart = sc->uarts_base; i < sc->uarts_num; i++, uart++) { 372f65f6ad5SCédric Le Goater if (uart == uart_chosen) { 373d2b3eaefSPeter Delevoryas continue; 374d2b3eaefSPeter Delevoryas } 375d2b3eaefSPeter Delevoryas aspeed_soc_uart_set_chr(s, uart, serial_hd(i)); 376d2b3eaefSPeter Delevoryas } 377d2b3eaefSPeter Delevoryas } 378d2b3eaefSPeter Delevoryas 379baa4732bSCédric Le Goater static void aspeed_machine_init(MachineState *machine) 380327d8e4eSAndrew Jeffery { 381888b2b03SPhilippe Mathieu-Daudé AspeedMachineState *bmc = ASPEED_MACHINE(machine); 382baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine); 383b033271fSCédric Le Goater AspeedSoCClass *sc; 3842bea128cSEddie James int i; 385255aed81SCédric Le Goater DriveInfo *emmc0 = NULL; 386e554e45bSCédric Le Goater bool boot_emmc; 387327d8e4eSAndrew Jeffery 3883c392e87SPhilippe Mathieu-Daudé bmc->soc = ASPEED_SOC(object_new(amc->soc_name)); 3893c392e87SPhilippe Mathieu-Daudé object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc)); 3903c392e87SPhilippe Mathieu-Daudé object_unref(OBJECT(bmc->soc)); 3913c392e87SPhilippe Mathieu-Daudé sc = ASPEED_SOC_GET_CLASS(bmc->soc); 392b033271fSCédric Le Goater 393533eb415SIgor Mammedov /* 394346160cbSCédric Le Goater * This will error out if the RAM size is not supported by the 395346160cbSCédric Le Goater * memory controller of the SoC. 396533eb415SIgor Mammedov */ 3973c392e87SPhilippe Mathieu-Daudé object_property_set_uint(OBJECT(bmc->soc), "ram-size", machine->ram_size, 398533eb415SIgor Mammedov &error_fatal); 399533eb415SIgor Mammedov 400d3bad7e7SCédric Le Goater for (i = 0; i < sc->macs_num; i++) { 401b3cfec5bSDavid Woodhouse if ((amc->macs_mask & (1 << i)) && 402b3cfec5bSDavid Woodhouse !qemu_configure_nic_device(DEVICE(&bmc->soc->ftgmac100[i]), 403b3cfec5bSDavid Woodhouse true, NULL)) { 404b3cfec5bSDavid Woodhouse break; /* No configs left; stop asking */ 405d3bad7e7SCédric Le Goater } 406d3bad7e7SCédric Le Goater } 407d3bad7e7SCédric Le Goater 408621845a9SCédric Le Goater object_property_set_int(OBJECT(bmc->soc), "hw-strap1", bmc->hw_strap1, 40987e79af0SAndrew Jeffery &error_abort); 4103c392e87SPhilippe Mathieu-Daudé object_property_set_int(OBJECT(bmc->soc), "hw-strap2", amc->hw_strap2, 411ccc2c418SCédric Le Goater &error_abort); 4123c392e87SPhilippe Mathieu-Daudé object_property_set_link(OBJECT(bmc->soc), "memory", 4134dd9d554SPeter Delevoryas OBJECT(get_system_memory()), &error_abort); 4143c392e87SPhilippe Mathieu-Daudé object_property_set_link(OBJECT(bmc->soc), "dram", 4150df2d9a6SCédric Le Goater OBJECT(machine->ram), &error_abort); 416b6e70d1dSJoel Stanley if (machine->kernel_filename) { 417b6e70d1dSJoel Stanley /* 418b6e70d1dSJoel Stanley * When booting with a -kernel command line there is no u-boot 419b6e70d1dSJoel Stanley * that runs to unlock the SCU. In this case set the default to 420b6e70d1dSJoel Stanley * be unlocked as the kernel expects 421b6e70d1dSJoel Stanley */ 4223c392e87SPhilippe Mathieu-Daudé object_property_set_int(OBJECT(bmc->soc), "hw-prot-key", 4235325cc34SMarkus Armbruster ASPEED_SCU_PROT_KEY, &error_abort); 424b6e70d1dSJoel Stanley } 425d2b3eaefSPeter Delevoryas connect_serial_hds_to_uarts(bmc); 4263c392e87SPhilippe Mathieu-Daudé qdev_realize(DEVICE(bmc->soc), NULL, &error_abort); 427327d8e4eSAndrew Jeffery 428c7e313aeSCédric Le Goater if (defaults_enabled()) { 4293c392e87SPhilippe Mathieu-Daudé aspeed_board_init_flashes(&bmc->soc->fmc, 4308ec239f2SMarkus Armbruster bmc->fmc_model ? bmc->fmc_model : amc->fmc_model, 4319bd4ac61SCédric Le Goater amc->num_cs, 0); 4323c392e87SPhilippe Mathieu-Daudé aspeed_board_init_flashes(&bmc->soc->spi[0], 4338ec239f2SMarkus Armbruster bmc->spi_model ? bmc->spi_model : amc->spi_model, 4349bd4ac61SCédric Le Goater 1, amc->num_cs); 435c7e313aeSCédric Le Goater } 436e1ad9bc4SCédric Le Goater 437b7f1a0cbSCédric Le Goater if (machine->kernel_filename && sc->num_cpus > 1) { 4389bb6d140SJoel Stanley /* With no u-boot we must set up a boot stub for the secondary CPU */ 4399bb6d140SJoel Stanley MemoryRegion *smpboot = g_new(MemoryRegion, 1); 440f489960dSPhilippe Mathieu-Daudé memory_region_init_ram(smpboot, NULL, "aspeed.smpboot", 4419bb6d140SJoel Stanley 0x80, &error_abort); 4429bb6d140SJoel Stanley memory_region_add_subregion(get_system_memory(), 4439bb6d140SJoel Stanley AST_SMP_MAILBOX_BASE, smpboot); 4449bb6d140SJoel Stanley 4459bb6d140SJoel Stanley aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot; 4469bb6d140SJoel Stanley aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary; 4479bb6d140SJoel Stanley aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE; 4489bb6d140SJoel Stanley } 4499bb6d140SJoel Stanley 4506e504a98SPaolo Bonzini aspeed_board_binfo.ram_size = machine->ram_size; 451347df6f8SEduardo Habkost aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM]; 452b033271fSCédric Le Goater 453baa4732bSCédric Le Goater if (amc->i2c_init) { 454baa4732bSCédric Le Goater amc->i2c_init(bmc); 4552cf6cb50SCédric Le Goater } 4562cf6cb50SCédric Le Goater 4573c392e87SPhilippe Mathieu-Daudé for (i = 0; i < bmc->soc->sdhci.num_slots; i++) { 4583c392e87SPhilippe Mathieu-Daudé sdhci_attach_drive(&bmc->soc->sdhci.slots[i], 459e554e45bSCédric Le Goater drive_get(IF_SD, 0, i), false, false); 460a29e3e12SAndrew Jeffery } 4612bea128cSEddie James 462e554e45bSCédric Le Goater boot_emmc = sc->boot_from_emmc(bmc->soc); 463e554e45bSCédric Le Goater 4643c392e87SPhilippe Mathieu-Daudé if (bmc->soc->emmc.num_slots) { 465255aed81SCédric Le Goater emmc0 = drive_get(IF_SD, 0, bmc->soc->sdhci.num_slots); 466e554e45bSCédric Le Goater sdhci_attach_drive(&bmc->soc->emmc.slots[0], emmc0, true, boot_emmc); 4672bea128cSEddie James } 4682bea128cSEddie James 4698b744a6aSCédric Le Goater if (!bmc->mmio_exec) { 4703c392e87SPhilippe Mathieu-Daudé DeviceState *dev = ssi_get_cs(bmc->soc->fmc.spi, 0); 4718285490bSCédric Le Goater BlockBackend *fmc0 = dev ? m25p80_get_blk(dev) : NULL; 4728b744a6aSCédric Le Goater 473e554e45bSCédric Le Goater if (fmc0 && !boot_emmc) { 4743c392e87SPhilippe Mathieu-Daudé uint64_t rom_size = memory_region_size(&bmc->soc->spi_boot); 4758285490bSCédric Le Goater aspeed_install_boot_rom(bmc, fmc0, rom_size); 476255aed81SCédric Le Goater } else if (emmc0) { 477255aed81SCédric Le Goater aspeed_install_boot_rom(bmc, blk_by_legacy_dinfo(emmc0), 64 * KiB); 4788b744a6aSCédric Le Goater } 4798b744a6aSCédric Le Goater } 4808b744a6aSCédric Le Goater 4812744ece8STao Xu arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo); 482327d8e4eSAndrew Jeffery } 483327d8e4eSAndrew Jeffery 484612b219aSPhilippe Mathieu-Daudé static void palmetto_bmc_i2c_init(AspeedMachineState *bmc) 4852cf6cb50SCédric Le Goater { 4863c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 487a87e81b9SCédric Le Goater DeviceState *dev; 4883d165f12SCédric Le Goater uint8_t *eeprom_buf = g_malloc0(32 * 1024); 4892cf6cb50SCédric Le Goater 4904db1c164SJamin Lin /* 4914db1c164SJamin Lin * The palmetto platform expects a ds3231 RTC but a ds1338 is 4924db1c164SJamin Lin * enough to provide basic RTC features. Alarms will be missing 4934db1c164SJamin Lin */ 4941373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68); 495a87e81b9SCédric Le Goater 4967a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, 4973d165f12SCédric Le Goater eeprom_buf); 4983d165f12SCédric Le Goater 499a87e81b9SCédric Le Goater /* add a TMP423 temperature sensor */ 5001373b15bSPhilippe Mathieu-Daudé dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), 5011373b15bSPhilippe Mathieu-Daudé "tmp423", 0x4c)); 5025325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 5035325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 5045325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 5055325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort); 5062cf6cb50SCédric Le Goater } 5072cf6cb50SCédric Le Goater 5089cccb912SPatrick Venture static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc) 5099cccb912SPatrick Venture { 5103c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 5119cccb912SPatrick Venture 5129cccb912SPatrick Venture /* 5139cccb912SPatrick Venture * The quanta-q71l platform expects tmp75s which are compatible with 5149cccb912SPatrick Venture * tmp105s. 5159cccb912SPatrick Venture */ 5169cccb912SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c); 5179cccb912SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e); 5189cccb912SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f); 5199cccb912SPatrick Venture 5209cccb912SPatrick Venture /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */ 5219cccb912SPatrick Venture /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */ 5229cccb912SPatrick Venture /* TODO: Add Memory Riser i2c mux and eeproms. */ 5239cccb912SPatrick Venture 5243ec75e39SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74); 5253ec75e39SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77); 5263ec75e39SPatrick Venture 5279cccb912SPatrick Venture /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */ 5283ec75e39SPatrick Venture 5293ec75e39SPatrick Venture /* i2c-7 */ 5303ec75e39SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70); 5319cccb912SPatrick Venture /* - i2c@0: pmbus@59 */ 5329cccb912SPatrick Venture /* - i2c@1: pmbus@58 */ 5339cccb912SPatrick Venture /* - i2c@2: pmbus@58 */ 5349cccb912SPatrick Venture /* - i2c@3: pmbus@59 */ 5353ec75e39SPatrick Venture 5369cccb912SPatrick Venture /* TODO: i2c-7: Add PDB FRU eeprom@52 */ 5379cccb912SPatrick Venture /* TODO: i2c-8: Add BMC FRU eeprom@50 */ 5389cccb912SPatrick Venture } 5399cccb912SPatrick Venture 540612b219aSPhilippe Mathieu-Daudé static void ast2500_evb_i2c_init(AspeedMachineState *bmc) 5412cf6cb50SCédric Le Goater { 5423c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 5433d165f12SCédric Le Goater uint8_t *eeprom_buf = g_malloc0(8 * 1024); 5443d165f12SCédric Le Goater 5457a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50, 5463d165f12SCédric Le Goater eeprom_buf); 5472cf6cb50SCédric Le Goater 5482cf6cb50SCédric Le Goater /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */ 5491373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), 550044475f3SPhilippe Mathieu-Daudé TYPE_TMP105, 0x4d); 5512cf6cb50SCédric Le Goater } 5522cf6cb50SCédric Le Goater 553612b219aSPhilippe Mathieu-Daudé static void ast2600_evb_i2c_init(AspeedMachineState *bmc) 554ccc2c418SCédric Le Goater { 5553c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 55652bcd997SHoward Chiu uint8_t *eeprom_buf = g_malloc0(8 * 1024); 55752bcd997SHoward Chiu 55852bcd997SHoward Chiu smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 55952bcd997SHoward Chiu eeprom_buf); 56052bcd997SHoward Chiu 56152bcd997SHoward Chiu /* LM75 is compatible with TMP105 driver */ 56252bcd997SHoward Chiu i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), 56352bcd997SHoward Chiu TYPE_TMP105, 0x4d); 564ccc2c418SCédric Le Goater } 565ccc2c418SCédric Le Goater 56634f73a81SKarthikeyan Pasupathi static void yosemitev2_bmc_i2c_init(AspeedMachineState *bmc) 56734f73a81SKarthikeyan Pasupathi { 5683c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 56934f73a81SKarthikeyan Pasupathi 57034f73a81SKarthikeyan Pasupathi at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x51, 128 * KiB); 57134f73a81SKarthikeyan Pasupathi at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 128 * KiB, 57234f73a81SKarthikeyan Pasupathi yosemitev2_bmc_fruid, yosemitev2_bmc_fruid_len); 5730a1f86baSKarthikeyan Pasupathi /* TMP421 */ 5740a1f86baSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "tmp421", 0x1f); 5750a1f86baSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4e); 5760a1f86baSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4f); 5770a1f86baSKarthikeyan Pasupathi 57834f73a81SKarthikeyan Pasupathi } 57934f73a81SKarthikeyan Pasupathi 580612b219aSPhilippe Mathieu-Daudé static void romulus_bmc_i2c_init(AspeedMachineState *bmc) 5816c4567c7SCédric Le Goater { 5823c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 5836c4567c7SCédric Le Goater 5844db1c164SJamin Lin /* 5854db1c164SJamin Lin * The romulus board expects Epson RX8900 I2C RTC but a ds1338 is 5864db1c164SJamin Lin * good enough 5874db1c164SJamin Lin */ 5881373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32); 5896c4567c7SCédric Le Goater } 5906c4567c7SCédric Le Goater 5916c323abaSKarthikeyan Pasupathi static void tiogapass_bmc_i2c_init(AspeedMachineState *bmc) 5926c323abaSKarthikeyan Pasupathi { 5933c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 5946c323abaSKarthikeyan Pasupathi 5956c323abaSKarthikeyan Pasupathi at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 128 * KiB); 5966c323abaSKarthikeyan Pasupathi at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 6), 0x54, 128 * KiB, 5976c323abaSKarthikeyan Pasupathi tiogapass_bmc_fruid, tiogapass_bmc_fruid_len); 598a09d357dSKarthikeyan Pasupathi /* TMP421 */ 599a09d357dSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "tmp421", 0x1f); 600a09d357dSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4f); 601a09d357dSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4e); 6026c323abaSKarthikeyan Pasupathi } 6036c323abaSKarthikeyan Pasupathi 604f4aec252SCédric Le Goater static void create_pca9552(AspeedSoCState *soc, int bus_id, int addr) 605f4aec252SCédric Le Goater { 606f4aec252SCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, bus_id), 607f4aec252SCédric Le Goater TYPE_PCA9552, addr); 608f4aec252SCédric Le Goater } 609f4aec252SCédric Le Goater 610612b219aSPhilippe Mathieu-Daudé static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc) 611143b040fSPatrick Williams { 6123c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 613143b040fSPatrick Williams 614143b040fSPatrick Williams /* bus 2 : */ 6151373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48); 6161373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49); 617143b040fSPatrick Williams /* bus 2 : pca9546 @ 0x73 */ 618143b040fSPatrick Williams 619143b040fSPatrick Williams /* bus 3 : pca9548 @ 0x70 */ 620143b040fSPatrick Williams 621143b040fSPatrick Williams /* bus 4 : */ 622143b040fSPatrick Williams uint8_t *eeprom4_54 = g_malloc0(8 * 1024); 6237a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 624143b040fSPatrick Williams eeprom4_54); 625143b040fSPatrick Williams /* PCA9539 @ 0x76, but PCA9552 is compatible */ 626f4aec252SCédric Le Goater create_pca9552(soc, 4, 0x76); 627143b040fSPatrick Williams /* PCA9539 @ 0x77, but PCA9552 is compatible */ 628f4aec252SCédric Le Goater create_pca9552(soc, 4, 0x77); 629143b040fSPatrick Williams 630143b040fSPatrick Williams /* bus 6 : */ 6311373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48); 6321373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49); 633143b040fSPatrick Williams /* bus 6 : pca9546 @ 0x73 */ 634143b040fSPatrick Williams 635143b040fSPatrick Williams /* bus 8 : */ 636143b040fSPatrick Williams uint8_t *eeprom8_56 = g_malloc0(8 * 1024); 6377a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56, 638143b040fSPatrick Williams eeprom8_56); 639f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x60); 640f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x61); 641143b040fSPatrick Williams /* bus 8 : adc128d818 @ 0x1d */ 642143b040fSPatrick Williams /* bus 8 : adc128d818 @ 0x1f */ 643143b040fSPatrick Williams 644143b040fSPatrick Williams /* 645143b040fSPatrick Williams * bus 13 : pca9548 @ 0x71 646143b040fSPatrick Williams * - channel 3: 647143b040fSPatrick Williams * - tmm421 @ 0x4c 648143b040fSPatrick Williams * - tmp421 @ 0x4e 649143b040fSPatrick Williams * - tmp421 @ 0x4f 650143b040fSPatrick Williams */ 651143b040fSPatrick Williams 652143b040fSPatrick Williams } 653143b040fSPatrick Williams 654612b219aSPhilippe Mathieu-Daudé static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc) 65562c2c2ebSCédric Le Goater { 6567cfbde5eSPhilippe Mathieu-Daudé static const struct { 6577cfbde5eSPhilippe Mathieu-Daudé unsigned gpio_id; 6587cfbde5eSPhilippe Mathieu-Daudé LEDColor color; 6597cfbde5eSPhilippe Mathieu-Daudé const char *description; 6607cfbde5eSPhilippe Mathieu-Daudé bool gpio_polarity; 6617cfbde5eSPhilippe Mathieu-Daudé } pca1_leds[] = { 6627cfbde5eSPhilippe Mathieu-Daudé {13, LED_COLOR_GREEN, "front-fault-4", GPIO_POLARITY_ACTIVE_LOW}, 6637cfbde5eSPhilippe Mathieu-Daudé {14, LED_COLOR_GREEN, "front-power-3", GPIO_POLARITY_ACTIVE_LOW}, 6647cfbde5eSPhilippe Mathieu-Daudé {15, LED_COLOR_GREEN, "front-id-5", GPIO_POLARITY_ACTIVE_LOW}, 6657cfbde5eSPhilippe Mathieu-Daudé }; 6663c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 6673d165f12SCédric Le Goater uint8_t *eeprom_buf = g_malloc0(8 * 1024); 66815ce12cfSPhilippe Mathieu-Daudé DeviceState *dev; 6697cfbde5eSPhilippe Mathieu-Daudé LEDState *led; 67062c2c2ebSCédric Le Goater 67163ceb818SCédric Le Goater /* Bus 3: TODO bmp280@77 */ 672db437ca6SPhilippe Mathieu-Daudé dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60)); 67315ce12cfSPhilippe Mathieu-Daudé qdev_prop_set_string(dev, "description", "pca1"); 6742616f572SPhilippe Mathieu-Daudé i2c_slave_realize_and_unref(I2C_SLAVE(dev), 6752616f572SPhilippe Mathieu-Daudé aspeed_i2c_get_bus(&soc->i2c, 3), 67615ce12cfSPhilippe Mathieu-Daudé &error_fatal); 6778c9a61d7SCédric Le Goater 6787cfbde5eSPhilippe Mathieu-Daudé for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) { 6797cfbde5eSPhilippe Mathieu-Daudé led = led_create_simple(OBJECT(bmc), 6807cfbde5eSPhilippe Mathieu-Daudé pca1_leds[i].gpio_polarity, 6817cfbde5eSPhilippe Mathieu-Daudé pca1_leds[i].color, 6827cfbde5eSPhilippe Mathieu-Daudé pca1_leds[i].description); 6837cfbde5eSPhilippe Mathieu-Daudé qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id, 6847cfbde5eSPhilippe Mathieu-Daudé qdev_get_gpio_in(DEVICE(led), 0)); 6857cfbde5eSPhilippe Mathieu-Daudé } 686b61ea6e7SJoel Stanley i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76); 6872a75e8c3SMaheswara Kurapati i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "max31785", 0x52); 6881373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c); 6891373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c); 69062c2c2ebSCédric Le Goater 69162c2c2ebSCédric Le Goater /* The Witherspoon expects a TMP275 but a TMP105 is compatible */ 6921373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105, 693044475f3SPhilippe Mathieu-Daudé 0x4a); 6946c4567c7SCédric Le Goater 6954db1c164SJamin Lin /* 6964db1c164SJamin Lin * The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is 6974db1c164SJamin Lin * good enough 6984db1c164SJamin Lin */ 6991373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32); 7003d165f12SCédric Le Goater 7017a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51, 7023d165f12SCédric Le Goater eeprom_buf); 703db437ca6SPhilippe Mathieu-Daudé dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60)); 70415ce12cfSPhilippe Mathieu-Daudé qdev_prop_set_string(dev, "description", "pca0"); 7052616f572SPhilippe Mathieu-Daudé i2c_slave_realize_and_unref(I2C_SLAVE(dev), 7062616f572SPhilippe Mathieu-Daudé aspeed_i2c_get_bus(&soc->i2c, 11), 70715ce12cfSPhilippe Mathieu-Daudé &error_fatal); 70863ceb818SCédric Le Goater /* Bus 11: TODO ucd90160@64 */ 70962c2c2ebSCédric Le Goater } 71062c2c2ebSCédric Le Goater 71195f068c8SJohn Wang static void g220a_bmc_i2c_init(AspeedMachineState *bmc) 71295f068c8SJohn Wang { 7133c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 71495f068c8SJohn Wang DeviceState *dev; 71595f068c8SJohn Wang 71695f068c8SJohn Wang dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), 71795f068c8SJohn Wang "emc1413", 0x4c)); 71895f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 71995f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 72095f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 72195f068c8SJohn Wang 72295f068c8SJohn Wang dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12), 72395f068c8SJohn Wang "emc1413", 0x4c)); 72495f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 72595f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 72695f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 72795f068c8SJohn Wang 72895f068c8SJohn Wang dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13), 72995f068c8SJohn Wang "emc1413", 0x4c)); 73095f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 73195f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 73295f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 7336f5f6507SJohn Wang 7346f5f6507SJohn Wang static uint8_t eeprom_buf[2 * 1024] = { 7356f5f6507SJohn Wang 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe, 7366f5f6507SJohn Wang 0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65, 7376f5f6507SJohn Wang 0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32, 7386f5f6507SJohn Wang 0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42, 7396f5f6507SJohn Wang 0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45, 7406f5f6507SJohn Wang 0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1, 7416f5f6507SJohn Wang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, 7426f5f6507SJohn Wang }; 7436f5f6507SJohn Wang smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57, 7446f5f6507SJohn Wang eeprom_buf); 74595f068c8SJohn Wang } 74695f068c8SJohn Wang 74782b6a3f6SJohn Wang static void fp5280g2_bmc_i2c_init(AspeedMachineState *bmc) 74882b6a3f6SJohn Wang { 7493c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 75082b6a3f6SJohn Wang I2CSlave *i2c_mux; 75182b6a3f6SJohn Wang 75282b6a3f6SJohn Wang /* The at24c256 */ 75382b6a3f6SJohn Wang at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 1), 0x50, 32768); 75482b6a3f6SJohn Wang 75582b6a3f6SJohn Wang /* The fp5280g2 expects a TMP112 but a TMP105 is compatible */ 75682b6a3f6SJohn Wang i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105, 75782b6a3f6SJohn Wang 0x48); 75882b6a3f6SJohn Wang i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105, 75982b6a3f6SJohn Wang 0x49); 76082b6a3f6SJohn Wang 76182b6a3f6SJohn Wang i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), 76282b6a3f6SJohn Wang "pca9546", 0x70); 76382b6a3f6SJohn Wang /* It expects a TMP112 but a TMP105 is compatible */ 76482b6a3f6SJohn Wang i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0), TYPE_TMP105, 76582b6a3f6SJohn Wang 0x4a); 76682b6a3f6SJohn Wang 76782b6a3f6SJohn Wang /* It expects a ds3232 but a ds1338 is good enough */ 76882b6a3f6SJohn Wang i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "ds1338", 0x68); 76982b6a3f6SJohn Wang 77082b6a3f6SJohn Wang /* It expects a pca9555 but a pca9552 is compatible */ 771f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x30); 77282b6a3f6SJohn Wang } 77382b6a3f6SJohn Wang 77458e52bdbSCédric Le Goater static void rainier_bmc_i2c_init(AspeedMachineState *bmc) 77558e52bdbSCédric Le Goater { 7763c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 777fa6d98c0SJoel Stanley I2CSlave *i2c_mux; 778fa6d98c0SJoel Stanley 7799077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB); 78058e52bdbSCédric Le Goater 781f4aec252SCédric Le Goater create_pca9552(soc, 3, 0x61); 782bcb122f8SJoel Stanley 78358e52bdbSCédric Le Goater /* The rainier expects a TMP275 but a TMP105 is compatible */ 78458e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105, 78558e52bdbSCédric Le Goater 0x48); 78658e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105, 78758e52bdbSCédric Le Goater 0x49); 78858e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105, 78958e52bdbSCédric Le Goater 0x4a); 790fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), 791fa6d98c0SJoel Stanley "pca9546", 0x70); 7929077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 7939077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 7949077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB); 795f4aec252SCédric Le Goater create_pca9552(soc, 4, 0x60); 79658e52bdbSCédric Le Goater 79758e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105, 79858e52bdbSCédric Le Goater 0x48); 79958e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105, 80058e52bdbSCédric Le Goater 0x49); 801f4aec252SCédric Le Goater create_pca9552(soc, 5, 0x60); 802f4aec252SCédric Le Goater create_pca9552(soc, 5, 0x61); 803fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), 804fa6d98c0SJoel Stanley "pca9546", 0x70); 8059077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 8069077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 80758e52bdbSCédric Le Goater 80858e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105, 80958e52bdbSCédric Le Goater 0x48); 81058e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105, 81158e52bdbSCédric Le Goater 0x4a); 81258e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105, 81358e52bdbSCédric Le Goater 0x4b); 814fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), 815fa6d98c0SJoel Stanley "pca9546", 0x70); 8169077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 8179077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 8189077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB); 8199077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB); 82058e52bdbSCédric Le Goater 821f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x30); 822f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x31); 823f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x32); 824f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x33); 825f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x60); 826f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x61); 827b61ea6e7SJoel Stanley i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76); 82858e52bdbSCédric Le Goater /* Bus 7: TODO si7021-a20@20 */ 82958e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105, 83058e52bdbSCédric Le Goater 0x48); 8312a75e8c3SMaheswara Kurapati i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "max31785", 0x52); 8329077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB); 8339077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB); 83458e52bdbSCédric Le Goater 83558e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105, 83658e52bdbSCédric Le Goater 0x48); 83758e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105, 83858e52bdbSCédric Le Goater 0x4a); 839be85508fSNinad Palsule at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50, 840be85508fSNinad Palsule 64 * KiB, rainier_bb_fruid, rainier_bb_fruid_len); 841be85508fSNinad Palsule at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 842be85508fSNinad Palsule 64 * KiB, rainier_bmc_fruid, rainier_bmc_fruid_len); 843f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x60); 844f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x61); 84558e52bdbSCédric Le Goater /* Bus 8: ucd90320@11 */ 84658e52bdbSCédric Le Goater /* Bus 8: ucd90320@b */ 84758e52bdbSCédric Le Goater /* Bus 8: ucd90320@c */ 84858e52bdbSCédric Le Goater 84958e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c); 85058e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d); 8519077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB); 85258e52bdbSCédric Le Goater 85358e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c); 85458e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d); 8559077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB); 85658e52bdbSCédric Le Goater 85758e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105, 85858e52bdbSCédric Le Goater 0x48); 85958e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105, 86058e52bdbSCédric Le Goater 0x49); 861fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), 862fa6d98c0SJoel Stanley "pca9546", 0x70); 8639077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 8649077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 865f4aec252SCédric Le Goater create_pca9552(soc, 11, 0x60); 866fa6d98c0SJoel Stanley 867fa6d98c0SJoel Stanley 8689077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB); 869f4aec252SCédric Le Goater create_pca9552(soc, 13, 0x60); 870fa6d98c0SJoel Stanley 8719077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB); 872f4aec252SCédric Le Goater create_pca9552(soc, 14, 0x60); 873fa6d98c0SJoel Stanley 8749077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB); 875f4aec252SCédric Le Goater create_pca9552(soc, 15, 0x60); 87658e52bdbSCédric Le Goater } 87758e52bdbSCédric Le Goater 878febbe308SPeter Delevoryas static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr, 879febbe308SPeter Delevoryas I2CBus **channels) 880febbe308SPeter Delevoryas { 881febbe308SPeter Delevoryas I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr); 882febbe308SPeter Delevoryas for (int i = 0; i < 8; i++) { 883febbe308SPeter Delevoryas channels[i] = pca954x_i2c_get_bus(mux, i); 884febbe308SPeter Delevoryas } 885febbe308SPeter Delevoryas } 886febbe308SPeter Delevoryas 887febbe308SPeter Delevoryas #define TYPE_LM75 TYPE_TMP105 888febbe308SPeter Delevoryas #define TYPE_TMP75 TYPE_TMP105 889febbe308SPeter Delevoryas #define TYPE_TMP422 "tmp422" 890febbe308SPeter Delevoryas 891febbe308SPeter Delevoryas static void fuji_bmc_i2c_init(AspeedMachineState *bmc) 892febbe308SPeter Delevoryas { 8933c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 894febbe308SPeter Delevoryas I2CBus *i2c[144] = {}; 895febbe308SPeter Delevoryas 896febbe308SPeter Delevoryas for (int i = 0; i < 16; i++) { 897febbe308SPeter Delevoryas i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i); 898febbe308SPeter Delevoryas } 899febbe308SPeter Delevoryas I2CBus *i2c180 = i2c[2]; 900febbe308SPeter Delevoryas I2CBus *i2c480 = i2c[8]; 901febbe308SPeter Delevoryas I2CBus *i2c600 = i2c[11]; 902febbe308SPeter Delevoryas 903febbe308SPeter Delevoryas get_pca9548_channels(i2c180, 0x70, &i2c[16]); 904febbe308SPeter Delevoryas get_pca9548_channels(i2c480, 0x70, &i2c[24]); 905febbe308SPeter Delevoryas /* NOTE: The device tree skips [32, 40) in the alias numbering */ 906febbe308SPeter Delevoryas get_pca9548_channels(i2c600, 0x77, &i2c[40]); 907febbe308SPeter Delevoryas get_pca9548_channels(i2c[24], 0x71, &i2c[48]); 908febbe308SPeter Delevoryas get_pca9548_channels(i2c[25], 0x72, &i2c[56]); 909febbe308SPeter Delevoryas get_pca9548_channels(i2c[26], 0x76, &i2c[64]); 910febbe308SPeter Delevoryas get_pca9548_channels(i2c[27], 0x76, &i2c[72]); 911febbe308SPeter Delevoryas for (int i = 0; i < 8; i++) { 912febbe308SPeter Delevoryas get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]); 913febbe308SPeter Delevoryas } 914febbe308SPeter Delevoryas 915febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c); 916febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d); 917febbe308SPeter Delevoryas 918ef0eb67eSSittisak Sinprem /* 919ef0eb67eSSittisak Sinprem * EEPROM 24c64 size is 64Kbits or 8 Kbytes 920ef0eb67eSSittisak Sinprem * 24c02 size is 2Kbits or 256 bytes 921ef0eb67eSSittisak Sinprem */ 922ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[19], 0x52, 8 * KiB); 923ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[20], 0x50, 256); 924ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[22], 0x52, 256); 925febbe308SPeter Delevoryas 926febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x48); 927febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x49); 928febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x4a); 929febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_TMP422, 0x4c); 930febbe308SPeter Delevoryas 931ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[8], 0x51, 8 * KiB); 932febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a); 933febbe308SPeter Delevoryas 934febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[50], TYPE_LM75, 0x4c); 935ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[50], 0x52, 8 * KiB); 936febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[51], TYPE_TMP75, 0x48); 937febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[52], TYPE_TMP75, 0x49); 938febbe308SPeter Delevoryas 939febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[59], TYPE_TMP75, 0x48); 940febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[60], TYPE_TMP75, 0x49); 941febbe308SPeter Delevoryas 942ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[65], 0x53, 8 * KiB); 943febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x49); 944febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x48); 945ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[68], 0x52, 8 * KiB); 946ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[69], 0x52, 8 * KiB); 947ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[70], 0x52, 8 * KiB); 948ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[71], 0x52, 8 * KiB); 949febbe308SPeter Delevoryas 950ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[73], 0x53, 8 * KiB); 951febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x49); 952febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x48); 953ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[76], 0x52, 8 * KiB); 954ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[77], 0x52, 8 * KiB); 955ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[78], 0x52, 8 * KiB); 956ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[79], 0x52, 8 * KiB); 957ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[28], 0x50, 256); 958febbe308SPeter Delevoryas 959febbe308SPeter Delevoryas for (int i = 0; i < 8; i++) { 9609077e09aSPeter Delevoryas at24c_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB); 961febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[82 + i * 8], TYPE_TMP75, 0x48); 962febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[83 + i * 8], TYPE_TMP75, 0x4b); 963febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[84 + i * 8], TYPE_TMP75, 0x4a); 964febbe308SPeter Delevoryas } 965febbe308SPeter Delevoryas } 966febbe308SPeter Delevoryas 967a20c54b1SPatrick Williams #define TYPE_TMP421 "tmp421" 968a20c54b1SPatrick Williams 969a20c54b1SPatrick Williams static void bletchley_bmc_i2c_init(AspeedMachineState *bmc) 970a20c54b1SPatrick Williams { 9713c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 972a20c54b1SPatrick Williams I2CBus *i2c[13] = {}; 973a20c54b1SPatrick Williams for (int i = 0; i < 13; i++) { 974a20c54b1SPatrick Williams if ((i == 8) || (i == 11)) { 975a20c54b1SPatrick Williams continue; 976a20c54b1SPatrick Williams } 977a20c54b1SPatrick Williams i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i); 978a20c54b1SPatrick Williams } 979a20c54b1SPatrick Williams 980a20c54b1SPatrick Williams /* Bus 0 - 5 all have the same config. */ 981a20c54b1SPatrick Williams for (int i = 0; i < 6; i++) { 982a20c54b1SPatrick Williams /* Missing model: ti,ina230 @ 0x45 */ 983a20c54b1SPatrick Williams /* Missing model: mps,mp5023 @ 0x40 */ 984a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[i], TYPE_TMP421, 0x4f); 985a20c54b1SPatrick Williams /* Missing model: nxp,pca9539 @ 0x76, but PCA9552 works enough */ 986a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x76); 987a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x67); 988a20c54b1SPatrick Williams /* Missing model: fsc,fusb302 @ 0x22 */ 989a20c54b1SPatrick Williams } 990a20c54b1SPatrick Williams 991a20c54b1SPatrick Williams /* Bus 6 */ 992a20c54b1SPatrick Williams at24c_eeprom_init(i2c[6], 0x56, 65536); 993a20c54b1SPatrick Williams /* Missing model: nxp,pcf85263 @ 0x51 , but ds1338 works enough */ 994a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[6], "ds1338", 0x51); 995a20c54b1SPatrick Williams 996a20c54b1SPatrick Williams 997a20c54b1SPatrick Williams /* Bus 7 */ 998a20c54b1SPatrick Williams at24c_eeprom_init(i2c[7], 0x54, 65536); 999a20c54b1SPatrick Williams 1000a20c54b1SPatrick Williams /* Bus 9 */ 1001a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[9], TYPE_TMP421, 0x4f); 1002a20c54b1SPatrick Williams 1003a20c54b1SPatrick Williams /* Bus 10 */ 1004a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[10], TYPE_TMP421, 0x4f); 1005a20c54b1SPatrick Williams /* Missing model: ti,hdc1080 @ 0x40 */ 1006a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[10], TYPE_PCA9552, 0x67); 1007a20c54b1SPatrick Williams 1008a20c54b1SPatrick Williams /* Bus 12 */ 1009a20c54b1SPatrick Williams /* Missing model: adi,adm1278 @ 0x11 */ 1010a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4c); 1011a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4d); 1012a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[12], TYPE_PCA9552, 0x67); 1013a20c54b1SPatrick Williams } 1014a20c54b1SPatrick Williams 1015fa699e80SPeter Delevoryas static void fby35_i2c_init(AspeedMachineState *bmc) 1016fa699e80SPeter Delevoryas { 10173c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 1018fa699e80SPeter Delevoryas I2CBus *i2c[16]; 1019fa699e80SPeter Delevoryas 1020fa699e80SPeter Delevoryas for (int i = 0; i < 16; i++) { 1021fa699e80SPeter Delevoryas i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i); 1022fa699e80SPeter Delevoryas } 1023fa699e80SPeter Delevoryas 1024fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[2], TYPE_LM75, 0x4f); 1025fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[8], TYPE_TMP421, 0x1f); 1026fa699e80SPeter Delevoryas /* Hotswap controller is actually supposed to be mp5920 or ltc4282. */ 1027fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[11], "adm1272", 0x44); 1028fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4e); 1029fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4f); 1030fa699e80SPeter Delevoryas 10319077e09aSPeter Delevoryas at24c_eeprom_init(i2c[4], 0x51, 128 * KiB); 10329077e09aSPeter Delevoryas at24c_eeprom_init(i2c[6], 0x51, 128 * KiB); 1033c0216b94SPeter Delevoryas at24c_eeprom_init_rom(i2c[8], 0x50, 32 * KiB, fby35_nic_fruid, 1034c0216b94SPeter Delevoryas fby35_nic_fruid_len); 1035c0216b94SPeter Delevoryas at24c_eeprom_init_rom(i2c[11], 0x51, 128 * KiB, fby35_bb_fruid, 1036c0216b94SPeter Delevoryas fby35_bb_fruid_len); 1037c0216b94SPeter Delevoryas at24c_eeprom_init_rom(i2c[11], 0x54, 128 * KiB, fby35_bmc_fruid, 1038c0216b94SPeter Delevoryas fby35_bmc_fruid_len); 1039fa699e80SPeter Delevoryas 1040fa699e80SPeter Delevoryas /* 1041fa699e80SPeter Delevoryas * TODO: There is a multi-master i2c connection to an AST1030 MiniBMC on 1042fa699e80SPeter Delevoryas * buses 0, 1, 2, 3, and 9. Source address 0x10, target address 0x20 on 1043fa699e80SPeter Delevoryas * each. 1044fa699e80SPeter Delevoryas */ 1045fa699e80SPeter Delevoryas } 1046fa699e80SPeter Delevoryas 1047fb6b3c8dSJae Hyun Yoo static void qcom_dc_scm_bmc_i2c_init(AspeedMachineState *bmc) 1048fb6b3c8dSJae Hyun Yoo { 10493c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 1050fb6b3c8dSJae Hyun Yoo 1051fb6b3c8dSJae Hyun Yoo i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 15), "tmp105", 0x4d); 1052fb6b3c8dSJae Hyun Yoo } 1053fb6b3c8dSJae Hyun Yoo 1054ece4cccdSGraeme Gregory static void qcom_dc_scm_firework_i2c_init(AspeedMachineState *bmc) 1055ece4cccdSGraeme Gregory { 10563c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 10572a7a5d5cSJae Hyun Yoo I2CSlave *therm_mux, *cpuvr_mux; 1058ece4cccdSGraeme Gregory 1059ece4cccdSGraeme Gregory /* Create the generic DC-SCM hardware */ 1060ece4cccdSGraeme Gregory qcom_dc_scm_bmc_i2c_init(bmc); 1061ece4cccdSGraeme Gregory 1062ece4cccdSGraeme Gregory /* Now create the Firework specific hardware */ 10632a75e8c3SMaheswara Kurapati 10642a7a5d5cSJae Hyun Yoo /* I2C7 CPUVR MUX */ 10652a7a5d5cSJae Hyun Yoo cpuvr_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), 10662a7a5d5cSJae Hyun Yoo "pca9546", 0x70); 10672a7a5d5cSJae Hyun Yoo i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 0), "pca9548", 0x72); 10682a7a5d5cSJae Hyun Yoo i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 1), "pca9548", 0x72); 10692a7a5d5cSJae Hyun Yoo i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 2), "pca9548", 0x72); 10702a7a5d5cSJae Hyun Yoo i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 3), "pca9548", 0x72); 10712a7a5d5cSJae Hyun Yoo 1072cfc68f16SMaheswara Kurapati /* I2C8 Thermal Diodes*/ 1073cfc68f16SMaheswara Kurapati therm_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), 1074cfc68f16SMaheswara Kurapati "pca9548", 0x70); 1075cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 0), TYPE_LM75, 0x4C); 1076cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 1), TYPE_LM75, 0x4C); 1077cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 2), TYPE_LM75, 0x48); 1078cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 3), TYPE_LM75, 0x48); 1079cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 4), TYPE_LM75, 0x48); 1080cfc68f16SMaheswara Kurapati 10812a75e8c3SMaheswara Kurapati /* I2C9 Fan Controller (MAX31785) */ 10822a75e8c3SMaheswara Kurapati i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x52); 10832a75e8c3SMaheswara Kurapati i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x54); 1084ece4cccdSGraeme Gregory } 1085ece4cccdSGraeme Gregory 10861a15311aSCédric Le Goater static bool aspeed_get_mmio_exec(Object *obj, Error **errp) 10871a15311aSCédric Le Goater { 10881a15311aSCédric Le Goater return ASPEED_MACHINE(obj)->mmio_exec; 10891a15311aSCédric Le Goater } 10901a15311aSCédric Le Goater 10911a15311aSCédric Le Goater static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp) 10921a15311aSCédric Le Goater { 10931a15311aSCédric Le Goater ASPEED_MACHINE(obj)->mmio_exec = value; 10941a15311aSCédric Le Goater } 10951a15311aSCédric Le Goater 10961a15311aSCédric Le Goater static void aspeed_machine_instance_init(Object *obj) 10971a15311aSCédric Le Goater { 1098621845a9SCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(obj); 1099621845a9SCédric Le Goater 11001a15311aSCédric Le Goater ASPEED_MACHINE(obj)->mmio_exec = false; 1101621845a9SCédric Le Goater ASPEED_MACHINE(obj)->hw_strap1 = amc->hw_strap1; 11021a15311aSCédric Le Goater } 11031a15311aSCédric Le Goater 11049820e52fSCédric Le Goater static char *aspeed_get_fmc_model(Object *obj, Error **errp) 11059820e52fSCédric Le Goater { 11069820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 11079820e52fSCédric Le Goater return g_strdup(bmc->fmc_model); 11089820e52fSCédric Le Goater } 11099820e52fSCédric Le Goater 11109820e52fSCédric Le Goater static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp) 11119820e52fSCédric Le Goater { 11129820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 11139820e52fSCédric Le Goater 11149820e52fSCédric Le Goater g_free(bmc->fmc_model); 11159820e52fSCédric Le Goater bmc->fmc_model = g_strdup(value); 11169820e52fSCédric Le Goater } 11179820e52fSCédric Le Goater 11189820e52fSCédric Le Goater static char *aspeed_get_spi_model(Object *obj, Error **errp) 11199820e52fSCédric Le Goater { 11209820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 11219820e52fSCédric Le Goater return g_strdup(bmc->spi_model); 11229820e52fSCédric Le Goater } 11239820e52fSCédric Le Goater 11249820e52fSCédric Le Goater static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp) 11259820e52fSCédric Le Goater { 11269820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 11279820e52fSCédric Le Goater 11289820e52fSCédric Le Goater g_free(bmc->spi_model); 11299820e52fSCédric Le Goater bmc->spi_model = g_strdup(value); 11309820e52fSCédric Le Goater } 11319820e52fSCédric Le Goater 1132f65f6ad5SCédric Le Goater static char *aspeed_get_bmc_console(Object *obj, Error **errp) 1133f65f6ad5SCédric Le Goater { 1134f65f6ad5SCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 1135f65f6ad5SCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc); 1136f65f6ad5SCédric Le Goater int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default; 1137f65f6ad5SCédric Le Goater 1138944128eeSJamin Lin return g_strdup_printf("uart%d", aspeed_uart_index(uart_chosen)); 1139f65f6ad5SCédric Le Goater } 1140f65f6ad5SCédric Le Goater 1141f65f6ad5SCédric Le Goater static void aspeed_set_bmc_console(Object *obj, const char *value, Error **errp) 1142f65f6ad5SCédric Le Goater { 1143f65f6ad5SCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 1144f65f6ad5SCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc); 1145f65f6ad5SCédric Le Goater AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(amc->soc_name)); 1146f65f6ad5SCédric Le Goater int val; 1147944128eeSJamin Lin int uart_first = aspeed_uart_first(sc); 1148944128eeSJamin Lin int uart_last = aspeed_uart_last(sc); 1149f65f6ad5SCédric Le Goater 1150f65f6ad5SCédric Le Goater if (sscanf(value, "uart%u", &val) != 1) { 1151f65f6ad5SCédric Le Goater error_setg(errp, "Bad value for \"uart\" property"); 1152f65f6ad5SCédric Le Goater return; 1153f65f6ad5SCédric Le Goater } 1154f65f6ad5SCédric Le Goater 1155f65f6ad5SCédric Le Goater /* The number of UART depends on the SoC */ 1156944128eeSJamin Lin if (val < uart_first || val > uart_last) { 1157944128eeSJamin Lin error_setg(errp, "\"uart\" should be in range [%d - %d]", 1158944128eeSJamin Lin uart_first, uart_last); 1159f65f6ad5SCédric Le Goater return; 1160f65f6ad5SCédric Le Goater } 1161944128eeSJamin Lin bmc->uart_chosen = val + ASPEED_DEV_UART0; 1162f65f6ad5SCédric Le Goater } 1163f65f6ad5SCédric Le Goater 11641a15311aSCédric Le Goater static void aspeed_machine_class_props_init(ObjectClass *oc) 11651a15311aSCédric Le Goater { 11661a15311aSCédric Le Goater object_class_property_add_bool(oc, "execute-in-place", 11671a15311aSCédric Le Goater aspeed_get_mmio_exec, 1168d2623129SMarkus Armbruster aspeed_set_mmio_exec); 11691a15311aSCédric Le Goater object_class_property_set_description(oc, "execute-in-place", 11707eecec7dSMarkus Armbruster "boot directly from CE0 flash device"); 11719820e52fSCédric Le Goater 1172f65f6ad5SCédric Le Goater object_class_property_add_str(oc, "bmc-console", aspeed_get_bmc_console, 1173f65f6ad5SCédric Le Goater aspeed_set_bmc_console); 1174f65f6ad5SCédric Le Goater object_class_property_set_description(oc, "bmc-console", 1175f65f6ad5SCédric Le Goater "Change the default UART to \"uartX\""); 1176f65f6ad5SCédric Le Goater 11779820e52fSCédric Le Goater object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model, 11789820e52fSCédric Le Goater aspeed_set_fmc_model); 11799820e52fSCédric Le Goater object_class_property_set_description(oc, "fmc-model", 11809820e52fSCédric Le Goater "Change the FMC Flash model"); 11819820e52fSCédric Le Goater object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model, 11829820e52fSCédric Le Goater aspeed_set_spi_model); 11839820e52fSCédric Le Goater object_class_property_set_description(oc, "spi-model", 11849820e52fSCédric Le Goater "Change the SPI Flash model"); 11851a15311aSCédric Le Goater } 11861a15311aSCédric Le Goater 118743a0a5c9SPhilippe Mathieu-Daudé static void aspeed_machine_class_init_cpus_defaults(MachineClass *mc) 1188b7f1a0cbSCédric Le Goater { 118943a0a5c9SPhilippe Mathieu-Daudé AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(mc); 119043a0a5c9SPhilippe Mathieu-Daudé AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(amc->soc_name)); 119143a0a5c9SPhilippe Mathieu-Daudé 119243a0a5c9SPhilippe Mathieu-Daudé mc->default_cpus = sc->num_cpus; 119343a0a5c9SPhilippe Mathieu-Daudé mc->min_cpus = sc->num_cpus; 119443a0a5c9SPhilippe Mathieu-Daudé mc->max_cpus = sc->num_cpus; 1195dc13909eSPhilippe Mathieu-Daudé mc->valid_cpu_types = sc->valid_cpu_types; 1196b7f1a0cbSCédric Le Goater } 1197b7f1a0cbSCédric Le Goater 1198056b779eSCédric Le Goater static bool aspeed_machine_ast2600_get_boot_from_emmc(Object *obj, Error **errp) 1199056b779eSCédric Le Goater { 1200056b779eSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 1201056b779eSCédric Le Goater 1202056b779eSCédric Le Goater return !!(bmc->hw_strap1 & SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC); 1203056b779eSCédric Le Goater } 1204056b779eSCédric Le Goater 1205056b779eSCédric Le Goater static void aspeed_machine_ast2600_set_boot_from_emmc(Object *obj, bool value, 1206056b779eSCédric Le Goater Error **errp) 1207056b779eSCédric Le Goater { 1208056b779eSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 1209056b779eSCédric Le Goater 1210056b779eSCédric Le Goater if (value) { 1211056b779eSCédric Le Goater bmc->hw_strap1 |= SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC; 1212056b779eSCédric Le Goater } else { 1213056b779eSCédric Le Goater bmc->hw_strap1 &= ~SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC; 1214056b779eSCédric Le Goater } 1215056b779eSCédric Le Goater } 1216056b779eSCédric Le Goater 1217056b779eSCédric Le Goater static void aspeed_machine_ast2600_class_emmc_init(ObjectClass *oc) 1218056b779eSCédric Le Goater { 1219056b779eSCédric Le Goater object_class_property_add_bool(oc, "boot-emmc", 1220056b779eSCédric Le Goater aspeed_machine_ast2600_get_boot_from_emmc, 1221056b779eSCédric Le Goater aspeed_machine_ast2600_set_boot_from_emmc); 1222056b779eSCédric Le Goater object_class_property_set_description(oc, "boot-emmc", 1223056b779eSCédric Le Goater "Set or unset boot from EMMC"); 1224056b779eSCédric Le Goater } 1225056b779eSCédric Le Goater 1226fca9ca1bSCédric Le Goater static void aspeed_machine_class_init(ObjectClass *oc, void *data) 122762c2c2ebSCédric Le Goater { 122862c2c2ebSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1229d3bad7e7SCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 123062c2c2ebSCédric Le Goater 1231fca9ca1bSCédric Le Goater mc->init = aspeed_machine_init; 123262c2c2ebSCédric Le Goater mc->no_floppy = 1; 123362c2c2ebSCédric Le Goater mc->no_cdrom = 1; 123462c2c2ebSCédric Le Goater mc->no_parallel = 1; 1235afcbaed6SIgor Mammedov mc->default_ram_id = "ram"; 1236d3bad7e7SCédric Le Goater amc->macs_mask = ASPEED_MAC0_ON; 12375d63d0c7SPeter Delevoryas amc->uart_default = ASPEED_DEV_UART5; 12381a15311aSCédric Le Goater 12391a15311aSCédric Le Goater aspeed_machine_class_props_init(oc); 124062c2c2ebSCédric Le Goater } 124162c2c2ebSCédric Le Goater 1242baa4732bSCédric Le Goater static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data) 1243baa4732bSCédric Le Goater { 1244baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1245baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1246baa4732bSCédric Le Goater 1247baa4732bSCédric Le Goater mc->desc = "OpenPOWER Palmetto BMC (ARM926EJ-S)"; 1248baa4732bSCédric Le Goater amc->soc_name = "ast2400-a1"; 1249baa4732bSCédric Le Goater amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1; 1250baa4732bSCédric Le Goater amc->fmc_model = "n25q256a"; 125170322913SCédric Le Goater amc->spi_model = "mx25l25635f"; 1252baa4732bSCédric Le Goater amc->num_cs = 1; 1253baa4732bSCédric Le Goater amc->i2c_init = palmetto_bmc_i2c_init; 1254baa4732bSCédric Le Goater mc->default_ram_size = 256 * MiB; 125543a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 1256baa4732bSCédric Le Goater }; 1257baa4732bSCédric Le Goater 12589cccb912SPatrick Venture static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data) 12599cccb912SPatrick Venture { 12609cccb912SPatrick Venture MachineClass *mc = MACHINE_CLASS(oc); 12619cccb912SPatrick Venture AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 12629cccb912SPatrick Venture 12639cccb912SPatrick Venture mc->desc = "Quanta-Q71l BMC (ARM926EJ-S)"; 12649cccb912SPatrick Venture amc->soc_name = "ast2400-a1"; 12659cccb912SPatrick Venture amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1; 12669cccb912SPatrick Venture amc->fmc_model = "n25q256a"; 12679cccb912SPatrick Venture amc->spi_model = "mx25l25635e"; 12689cccb912SPatrick Venture amc->num_cs = 1; 12699cccb912SPatrick Venture amc->i2c_init = quanta_q71l_bmc_i2c_init; 12709cccb912SPatrick Venture mc->default_ram_size = 128 * MiB; 127143a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 12729cccb912SPatrick Venture } 12739cccb912SPatrick Venture 127440a38df5SErik Smit static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc, 127540a38df5SErik Smit void *data) 127640a38df5SErik Smit { 127740a38df5SErik Smit MachineClass *mc = MACHINE_CLASS(oc); 127840a38df5SErik Smit AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 127940a38df5SErik Smit 128040a38df5SErik Smit mc->desc = "Supermicro X11 BMC (ARM926EJ-S)"; 128140a38df5SErik Smit amc->soc_name = "ast2400-a1"; 128240a38df5SErik Smit amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1; 128340a38df5SErik Smit amc->fmc_model = "mx25l25635e"; 128440a38df5SErik Smit amc->spi_model = "mx25l25635e"; 128540a38df5SErik Smit amc->num_cs = 1; 128640a38df5SErik Smit amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 128740a38df5SErik Smit amc->i2c_init = palmetto_bmc_i2c_init; 128840a38df5SErik Smit mc->default_ram_size = 256 * MiB; 128943a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 129040a38df5SErik Smit } 129140a38df5SErik Smit 129247936597SGuenter Roeck static void aspeed_machine_supermicro_x11spi_bmc_class_init(ObjectClass *oc, 129347936597SGuenter Roeck void *data) 129447936597SGuenter Roeck { 129547936597SGuenter Roeck MachineClass *mc = MACHINE_CLASS(oc); 129647936597SGuenter Roeck AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 129747936597SGuenter Roeck 129847936597SGuenter Roeck mc->desc = "Supermicro X11 SPI BMC (ARM1176)"; 129947936597SGuenter Roeck amc->soc_name = "ast2500-a1"; 130047936597SGuenter Roeck amc->hw_strap1 = SUPERMICRO_X11SPI_BMC_HW_STRAP1; 130147936597SGuenter Roeck amc->fmc_model = "mx25l25635e"; 130247936597SGuenter Roeck amc->spi_model = "mx25l25635e"; 130347936597SGuenter Roeck amc->num_cs = 1; 130447936597SGuenter Roeck amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 130547936597SGuenter Roeck amc->i2c_init = palmetto_bmc_i2c_init; 130647936597SGuenter Roeck mc->default_ram_size = 512 * MiB; 130743a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 130847936597SGuenter Roeck } 130947936597SGuenter Roeck 1310baa4732bSCédric Le Goater static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data) 1311baa4732bSCédric Le Goater { 1312baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1313baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1314baa4732bSCédric Le Goater 1315baa4732bSCédric Le Goater mc->desc = "Aspeed AST2500 EVB (ARM1176)"; 1316baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1"; 1317baa4732bSCédric Le Goater amc->hw_strap1 = AST2500_EVB_HW_STRAP1; 1318753abfc4SJae Hyun Yoo amc->fmc_model = "mx25l25635e"; 131970322913SCédric Le Goater amc->spi_model = "mx25l25635f"; 1320baa4732bSCédric Le Goater amc->num_cs = 1; 1321baa4732bSCédric Le Goater amc->i2c_init = ast2500_evb_i2c_init; 1322baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB; 132343a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 1324baa4732bSCédric Le Goater }; 1325baa4732bSCédric Le Goater 132634f73a81SKarthikeyan Pasupathi static void aspeed_machine_yosemitev2_class_init(ObjectClass *oc, void *data) 132734f73a81SKarthikeyan Pasupathi { 132834f73a81SKarthikeyan Pasupathi MachineClass *mc = MACHINE_CLASS(oc); 132934f73a81SKarthikeyan Pasupathi AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 133034f73a81SKarthikeyan Pasupathi 133134f73a81SKarthikeyan Pasupathi mc->desc = "Facebook YosemiteV2 BMC (ARM1176)"; 133234f73a81SKarthikeyan Pasupathi amc->soc_name = "ast2500-a1"; 133334f73a81SKarthikeyan Pasupathi amc->hw_strap1 = AST2500_EVB_HW_STRAP1; 133434f73a81SKarthikeyan Pasupathi amc->hw_strap2 = 0; 133534f73a81SKarthikeyan Pasupathi amc->fmc_model = "n25q256a"; 133634f73a81SKarthikeyan Pasupathi amc->spi_model = "mx25l25635e"; 133734f73a81SKarthikeyan Pasupathi amc->num_cs = 2; 133834f73a81SKarthikeyan Pasupathi amc->i2c_init = yosemitev2_bmc_i2c_init; 133934f73a81SKarthikeyan Pasupathi mc->default_ram_size = 512 * MiB; 134043a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 134134f73a81SKarthikeyan Pasupathi }; 134234f73a81SKarthikeyan Pasupathi 1343baa4732bSCédric Le Goater static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data) 1344baa4732bSCédric Le Goater { 1345baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1346baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1347baa4732bSCédric Le Goater 1348baa4732bSCédric Le Goater mc->desc = "OpenPOWER Romulus BMC (ARM1176)"; 1349baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1"; 1350baa4732bSCédric Le Goater amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1; 1351baa4732bSCédric Le Goater amc->fmc_model = "n25q256a"; 1352baa4732bSCédric Le Goater amc->spi_model = "mx66l1g45g"; 1353baa4732bSCédric Le Goater amc->num_cs = 2; 1354baa4732bSCédric Le Goater amc->i2c_init = romulus_bmc_i2c_init; 1355baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB; 135643a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 1357baa4732bSCédric Le Goater }; 1358baa4732bSCédric Le Goater 13596c323abaSKarthikeyan Pasupathi static void aspeed_machine_tiogapass_class_init(ObjectClass *oc, void *data) 13606c323abaSKarthikeyan Pasupathi { 13616c323abaSKarthikeyan Pasupathi MachineClass *mc = MACHINE_CLASS(oc); 13626c323abaSKarthikeyan Pasupathi AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 13636c323abaSKarthikeyan Pasupathi 13646c323abaSKarthikeyan Pasupathi mc->desc = "Facebook Tiogapass BMC (ARM1176)"; 13656c323abaSKarthikeyan Pasupathi amc->soc_name = "ast2500-a1"; 13666c323abaSKarthikeyan Pasupathi amc->hw_strap1 = AST2500_EVB_HW_STRAP1; 13676c323abaSKarthikeyan Pasupathi amc->hw_strap2 = 0; 13686c323abaSKarthikeyan Pasupathi amc->fmc_model = "n25q256a"; 13696c323abaSKarthikeyan Pasupathi amc->spi_model = "mx25l25635e"; 13706c323abaSKarthikeyan Pasupathi amc->num_cs = 2; 13716c323abaSKarthikeyan Pasupathi amc->i2c_init = tiogapass_bmc_i2c_init; 13726c323abaSKarthikeyan Pasupathi mc->default_ram_size = 1 * GiB; 137343a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 13746c323abaSKarthikeyan Pasupathi }; 13756c323abaSKarthikeyan Pasupathi 1376143b040fSPatrick Williams static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data) 1377143b040fSPatrick Williams { 1378143b040fSPatrick Williams MachineClass *mc = MACHINE_CLASS(oc); 1379143b040fSPatrick Williams AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1380143b040fSPatrick Williams 1381143b040fSPatrick Williams mc->desc = "OCP SonoraPass BMC (ARM1176)"; 1382143b040fSPatrick Williams amc->soc_name = "ast2500-a1"; 1383143b040fSPatrick Williams amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1; 1384143b040fSPatrick Williams amc->fmc_model = "mx66l1g45g"; 1385143b040fSPatrick Williams amc->spi_model = "mx66l1g45g"; 1386143b040fSPatrick Williams amc->num_cs = 2; 1387143b040fSPatrick Williams amc->i2c_init = sonorapass_bmc_i2c_init; 1388143b040fSPatrick Williams mc->default_ram_size = 512 * MiB; 138943a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 1390143b040fSPatrick Williams }; 1391143b040fSPatrick Williams 1392baa4732bSCédric Le Goater static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data) 1393baa4732bSCédric Le Goater { 1394baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1395baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1396baa4732bSCédric Le Goater 1397baa4732bSCédric Le Goater mc->desc = "OpenPOWER Witherspoon BMC (ARM1176)"; 1398baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1"; 1399baa4732bSCédric Le Goater amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1; 140070322913SCédric Le Goater amc->fmc_model = "mx25l25635f"; 1401baa4732bSCédric Le Goater amc->spi_model = "mx66l1g45g"; 1402baa4732bSCédric Le Goater amc->num_cs = 2; 1403baa4732bSCédric Le Goater amc->i2c_init = witherspoon_bmc_i2c_init; 1404baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB; 140543a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 1406baa4732bSCédric Le Goater }; 1407baa4732bSCédric Le Goater 1408baa4732bSCédric Le Goater static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data) 1409baa4732bSCédric Le Goater { 1410baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1411baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1412baa4732bSCédric Le Goater 1413f548f201SPeter Maydell mc->desc = "Aspeed AST2600 EVB (Cortex-A7)"; 1414c5811bb3SJoel Stanley amc->soc_name = "ast2600-a3"; 1415baa4732bSCédric Le Goater amc->hw_strap1 = AST2600_EVB_HW_STRAP1; 1416baa4732bSCédric Le Goater amc->hw_strap2 = AST2600_EVB_HW_STRAP2; 1417753abfc4SJae Hyun Yoo amc->fmc_model = "mx66u51235f"; 1418baa4732bSCédric Le Goater amc->spi_model = "mx66u51235f"; 1419baa4732bSCédric Le Goater amc->num_cs = 1; 142029193286SGuenter Roeck amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON | 142129193286SGuenter Roeck ASPEED_MAC3_ON; 1422baa4732bSCédric Le Goater amc->i2c_init = ast2600_evb_i2c_init; 1423baa4732bSCédric Le Goater mc->default_ram_size = 1 * GiB; 142443a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 1425056b779eSCédric Le Goater aspeed_machine_ast2600_class_emmc_init(oc); 1426baa4732bSCédric Le Goater }; 1427baa4732bSCédric Le Goater 142863ceb818SCédric Le Goater static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data) 142963ceb818SCédric Le Goater { 143063ceb818SCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 143163ceb818SCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 143263ceb818SCédric Le Goater 1433f548f201SPeter Maydell mc->desc = "OpenPOWER Tacoma BMC (Cortex-A7)"; 1434c5811bb3SJoel Stanley amc->soc_name = "ast2600-a3"; 143563ceb818SCédric Le Goater amc->hw_strap1 = TACOMA_BMC_HW_STRAP1; 143663ceb818SCédric Le Goater amc->hw_strap2 = TACOMA_BMC_HW_STRAP2; 143763ceb818SCédric Le Goater amc->fmc_model = "mx66l1g45g"; 143863ceb818SCédric Le Goater amc->spi_model = "mx66l1g45g"; 143963ceb818SCédric Le Goater amc->num_cs = 2; 1440d3bad7e7SCédric Le Goater amc->macs_mask = ASPEED_MAC2_ON; 144163ceb818SCédric Le Goater amc->i2c_init = witherspoon_bmc_i2c_init; /* Same board layout */ 144263ceb818SCédric Le Goater mc->default_ram_size = 1 * GiB; 144343a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 144456a37edaSCédric Le Goater 144556a37edaSCédric Le Goater mc->deprecation_reason = "Please use the similar 'rainier-bmc' machine"; 144663ceb818SCédric Le Goater }; 144763ceb818SCédric Le Goater 144895f068c8SJohn Wang static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data) 144995f068c8SJohn Wang { 145095f068c8SJohn Wang MachineClass *mc = MACHINE_CLASS(oc); 145195f068c8SJohn Wang AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 145295f068c8SJohn Wang 145395f068c8SJohn Wang mc->desc = "Bytedance G220A BMC (ARM1176)"; 145495f068c8SJohn Wang amc->soc_name = "ast2500-a1"; 145595f068c8SJohn Wang amc->hw_strap1 = G220A_BMC_HW_STRAP1; 145695f068c8SJohn Wang amc->fmc_model = "n25q512a"; 145795f068c8SJohn Wang amc->spi_model = "mx25l25635e"; 145895f068c8SJohn Wang amc->num_cs = 2; 14595bb825c8SGuenter Roeck amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 146095f068c8SJohn Wang amc->i2c_init = g220a_bmc_i2c_init; 146195f068c8SJohn Wang mc->default_ram_size = 1024 * MiB; 146243a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 146395f068c8SJohn Wang }; 146495f068c8SJohn Wang 146582b6a3f6SJohn Wang static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc, void *data) 146682b6a3f6SJohn Wang { 146782b6a3f6SJohn Wang MachineClass *mc = MACHINE_CLASS(oc); 146882b6a3f6SJohn Wang AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 146982b6a3f6SJohn Wang 147082b6a3f6SJohn Wang mc->desc = "Inspur FP5280G2 BMC (ARM1176)"; 147182b6a3f6SJohn Wang amc->soc_name = "ast2500-a1"; 147282b6a3f6SJohn Wang amc->hw_strap1 = FP5280G2_BMC_HW_STRAP1; 147382b6a3f6SJohn Wang amc->fmc_model = "n25q512a"; 147482b6a3f6SJohn Wang amc->spi_model = "mx25l25635e"; 147582b6a3f6SJohn Wang amc->num_cs = 2; 147682b6a3f6SJohn Wang amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 147782b6a3f6SJohn Wang amc->i2c_init = fp5280g2_bmc_i2c_init; 147882b6a3f6SJohn Wang mc->default_ram_size = 512 * MiB; 147943a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 148082b6a3f6SJohn Wang }; 148182b6a3f6SJohn Wang 148258e52bdbSCédric Le Goater static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data) 148358e52bdbSCédric Le Goater { 148458e52bdbSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 148558e52bdbSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 148658e52bdbSCédric Le Goater 1487f548f201SPeter Maydell mc->desc = "IBM Rainier BMC (Cortex-A7)"; 1488c5811bb3SJoel Stanley amc->soc_name = "ast2600-a3"; 148958e52bdbSCédric Le Goater amc->hw_strap1 = RAINIER_BMC_HW_STRAP1; 149058e52bdbSCédric Le Goater amc->hw_strap2 = RAINIER_BMC_HW_STRAP2; 149158e52bdbSCédric Le Goater amc->fmc_model = "mx66l1g45g"; 149258e52bdbSCédric Le Goater amc->spi_model = "mx66l1g45g"; 149358e52bdbSCédric Le Goater amc->num_cs = 2; 149458e52bdbSCédric Le Goater amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON; 149558e52bdbSCédric Le Goater amc->i2c_init = rainier_bmc_i2c_init; 149658e52bdbSCédric Le Goater mc->default_ram_size = 1 * GiB; 149743a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 1498056b779eSCédric Le Goater aspeed_machine_ast2600_class_emmc_init(oc); 149958e52bdbSCédric Le Goater }; 150058e52bdbSCédric Le Goater 15011e2c22c9SCédric Le Goater #define FUJI_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB) 1502febbe308SPeter Delevoryas 1503febbe308SPeter Delevoryas static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data) 1504febbe308SPeter Delevoryas { 1505febbe308SPeter Delevoryas MachineClass *mc = MACHINE_CLASS(oc); 1506febbe308SPeter Delevoryas AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1507febbe308SPeter Delevoryas 1508febbe308SPeter Delevoryas mc->desc = "Facebook Fuji BMC (Cortex-A7)"; 1509febbe308SPeter Delevoryas amc->soc_name = "ast2600-a3"; 1510febbe308SPeter Delevoryas amc->hw_strap1 = FUJI_BMC_HW_STRAP1; 1511febbe308SPeter Delevoryas amc->hw_strap2 = FUJI_BMC_HW_STRAP2; 1512febbe308SPeter Delevoryas amc->fmc_model = "mx66l1g45g"; 1513febbe308SPeter Delevoryas amc->spi_model = "mx66l1g45g"; 1514febbe308SPeter Delevoryas amc->num_cs = 2; 1515febbe308SPeter Delevoryas amc->macs_mask = ASPEED_MAC3_ON; 1516febbe308SPeter Delevoryas amc->i2c_init = fuji_bmc_i2c_init; 1517febbe308SPeter Delevoryas amc->uart_default = ASPEED_DEV_UART1; 1518febbe308SPeter Delevoryas mc->default_ram_size = FUJI_BMC_RAM_SIZE; 151943a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 1520febbe308SPeter Delevoryas }; 1521febbe308SPeter Delevoryas 15221e2c22c9SCédric Le Goater #define BLETCHLEY_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB) 1523104bdaffSPatrick Williams 1524a20c54b1SPatrick Williams static void aspeed_machine_bletchley_class_init(ObjectClass *oc, void *data) 1525a20c54b1SPatrick Williams { 1526a20c54b1SPatrick Williams MachineClass *mc = MACHINE_CLASS(oc); 1527a20c54b1SPatrick Williams AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1528a20c54b1SPatrick Williams 1529a20c54b1SPatrick Williams mc->desc = "Facebook Bletchley BMC (Cortex-A7)"; 1530a20c54b1SPatrick Williams amc->soc_name = "ast2600-a3"; 1531a20c54b1SPatrick Williams amc->hw_strap1 = BLETCHLEY_BMC_HW_STRAP1; 1532a20c54b1SPatrick Williams amc->hw_strap2 = BLETCHLEY_BMC_HW_STRAP2; 1533a20c54b1SPatrick Williams amc->fmc_model = "w25q01jvq"; 1534a20c54b1SPatrick Williams amc->spi_model = NULL; 1535a20c54b1SPatrick Williams amc->num_cs = 2; 1536a20c54b1SPatrick Williams amc->macs_mask = ASPEED_MAC2_ON; 1537a20c54b1SPatrick Williams amc->i2c_init = bletchley_bmc_i2c_init; 1538104bdaffSPatrick Williams mc->default_ram_size = BLETCHLEY_BMC_RAM_SIZE; 153943a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 1540a20c54b1SPatrick Williams } 1541a20c54b1SPatrick Williams 15421b063fe2SJuraj Marcin static void fby35_reset(MachineState *state, ResetType type) 1543fa699e80SPeter Delevoryas { 1544fa699e80SPeter Delevoryas AspeedMachineState *bmc = ASPEED_MACHINE(state); 15453c392e87SPhilippe Mathieu-Daudé AspeedGPIOState *gpio = &bmc->soc->gpio; 1546fa699e80SPeter Delevoryas 15471b063fe2SJuraj Marcin qemu_devices_reset(type); 1548fa699e80SPeter Delevoryas 1549f0418558SPeter Delevoryas /* Board ID: 7 (Class-1, 4 slots) */ 1550fa699e80SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioV4", true, &error_fatal); 1551fa699e80SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioV5", true, &error_fatal); 1552fa699e80SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioV6", true, &error_fatal); 1553fa699e80SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioV7", false, &error_fatal); 1554f0418558SPeter Delevoryas 1555f0418558SPeter Delevoryas /* Slot presence pins, inverse polarity. (False means present) */ 1556f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioH4", false, &error_fatal); 1557f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioH5", true, &error_fatal); 1558f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioH6", true, &error_fatal); 1559f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioH7", true, &error_fatal); 1560f0418558SPeter Delevoryas 1561f0418558SPeter Delevoryas /* Slot 12v power pins, normal polarity. (True means powered-on) */ 1562f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioB2", true, &error_fatal); 1563f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioB3", false, &error_fatal); 1564f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioB4", false, &error_fatal); 1565f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioB5", false, &error_fatal); 1566fa699e80SPeter Delevoryas } 1567fa699e80SPeter Delevoryas 1568fa699e80SPeter Delevoryas static void aspeed_machine_fby35_class_init(ObjectClass *oc, void *data) 1569fa699e80SPeter Delevoryas { 1570fa699e80SPeter Delevoryas MachineClass *mc = MACHINE_CLASS(oc); 1571fa699e80SPeter Delevoryas AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1572fa699e80SPeter Delevoryas 1573fa699e80SPeter Delevoryas mc->desc = "Facebook fby35 BMC (Cortex-A7)"; 1574fa699e80SPeter Delevoryas mc->reset = fby35_reset; 1575fa699e80SPeter Delevoryas amc->fmc_model = "mx66l1g45g"; 1576fa699e80SPeter Delevoryas amc->num_cs = 2; 1577fa699e80SPeter Delevoryas amc->macs_mask = ASPEED_MAC3_ON; 1578fa699e80SPeter Delevoryas amc->i2c_init = fby35_i2c_init; 1579fa699e80SPeter Delevoryas /* FIXME: Replace this macro with something more general */ 1580fa699e80SPeter Delevoryas mc->default_ram_size = FUJI_BMC_RAM_SIZE; 158143a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 1582fa699e80SPeter Delevoryas } 1583fa699e80SPeter Delevoryas 158466c895b8SJamin Lin #define AST1030_INTERNAL_FLASH_SIZE (1024 * 1024) 158566c895b8SJamin Lin /* Main SYSCLK frequency in Hz (200MHz) */ 158666c895b8SJamin Lin #define SYSCLK_FRQ 200000000ULL 158766c895b8SJamin Lin 158866c895b8SJamin Lin static void aspeed_minibmc_machine_init(MachineState *machine) 158966c895b8SJamin Lin { 159066c895b8SJamin Lin AspeedMachineState *bmc = ASPEED_MACHINE(machine); 159166c895b8SJamin Lin AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine); 159266c895b8SJamin Lin Clock *sysclk; 159366c895b8SJamin Lin 159466c895b8SJamin Lin sysclk = clock_new(OBJECT(machine), "SYSCLK"); 159566c895b8SJamin Lin clock_set_hz(sysclk, SYSCLK_FRQ); 159666c895b8SJamin Lin 15973c392e87SPhilippe Mathieu-Daudé bmc->soc = ASPEED_SOC(object_new(amc->soc_name)); 15983c392e87SPhilippe Mathieu-Daudé object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc)); 15993c392e87SPhilippe Mathieu-Daudé object_unref(OBJECT(bmc->soc)); 16003c392e87SPhilippe Mathieu-Daudé qdev_connect_clock_in(DEVICE(bmc->soc), "sysclk", sysclk); 160166c895b8SJamin Lin 16023c392e87SPhilippe Mathieu-Daudé object_property_set_link(OBJECT(bmc->soc), "memory", 16034dd9d554SPeter Delevoryas OBJECT(get_system_memory()), &error_abort); 1604d2b3eaefSPeter Delevoryas connect_serial_hds_to_uarts(bmc); 16053c392e87SPhilippe Mathieu-Daudé qdev_realize(DEVICE(bmc->soc), NULL, &error_abort); 160666c895b8SJamin Lin 160722b3c557SJamin Lin if (defaults_enabled()) { 16083c392e87SPhilippe Mathieu-Daudé aspeed_board_init_flashes(&bmc->soc->fmc, 160966c895b8SJamin Lin bmc->fmc_model ? bmc->fmc_model : amc->fmc_model, 161066c895b8SJamin Lin amc->num_cs, 161166c895b8SJamin Lin 0); 161266c895b8SJamin Lin 16133c392e87SPhilippe Mathieu-Daudé aspeed_board_init_flashes(&bmc->soc->spi[0], 161466c895b8SJamin Lin bmc->spi_model ? bmc->spi_model : amc->spi_model, 161566c895b8SJamin Lin amc->num_cs, amc->num_cs); 161666c895b8SJamin Lin 16173c392e87SPhilippe Mathieu-Daudé aspeed_board_init_flashes(&bmc->soc->spi[1], 161866c895b8SJamin Lin bmc->spi_model ? bmc->spi_model : amc->spi_model, 161966c895b8SJamin Lin amc->num_cs, (amc->num_cs * 2)); 162022b3c557SJamin Lin } 162166c895b8SJamin Lin 162266c895b8SJamin Lin if (amc->i2c_init) { 162366c895b8SJamin Lin amc->i2c_init(bmc); 162466c895b8SJamin Lin } 162566c895b8SJamin Lin 162666c895b8SJamin Lin armv7m_load_kernel(ARM_CPU(first_cpu), 162766c895b8SJamin Lin machine->kernel_filename, 1628761c532aSPeter Maydell 0, 162966c895b8SJamin Lin AST1030_INTERNAL_FLASH_SIZE); 163066c895b8SJamin Lin } 163166c895b8SJamin Lin 16324c70ab16STroy Lee static void ast1030_evb_i2c_init(AspeedMachineState *bmc) 16334c70ab16STroy Lee { 16343c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 16354c70ab16STroy Lee 1636673d8215SMichael Tokarev /* U10 24C08 connects to SDA/SCL Group 1 by default */ 16374c70ab16STroy Lee uint8_t *eeprom_buf = g_malloc0(32 * 1024); 16384c70ab16STroy Lee smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, eeprom_buf); 16394c70ab16STroy Lee 16404c70ab16STroy Lee /* U11 LM75 connects to SDA/SCL Group 2 by default */ 16414c70ab16STroy Lee i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d); 16424c70ab16STroy Lee } 16434c70ab16STroy Lee 164466c895b8SJamin Lin static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc, 164566c895b8SJamin Lin void *data) 164666c895b8SJamin Lin { 164766c895b8SJamin Lin MachineClass *mc = MACHINE_CLASS(oc); 164866c895b8SJamin Lin AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 164966c895b8SJamin Lin 165066c895b8SJamin Lin mc->desc = "Aspeed AST1030 MiniBMC (Cortex-M4)"; 165166c895b8SJamin Lin amc->soc_name = "ast1030-a1"; 165266c895b8SJamin Lin amc->hw_strap1 = 0; 165366c895b8SJamin Lin amc->hw_strap2 = 0; 165466c895b8SJamin Lin mc->init = aspeed_minibmc_machine_init; 16554c70ab16STroy Lee amc->i2c_init = ast1030_evb_i2c_init; 165666c895b8SJamin Lin mc->default_ram_size = 0; 1657e15001bcSJamin Lin amc->fmc_model = "w25q80bl"; 1658a37bbfbbSJamin Lin amc->spi_model = "w25q256"; 165966c895b8SJamin Lin amc->num_cs = 2; 166066c895b8SJamin Lin amc->macs_mask = 0; 166143a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 166266c895b8SJamin Lin } 166366c895b8SJamin Lin 166492707992SJamin Lin #ifdef TARGET_AARCH64 16652c075ff3SJamin Lin static void ast2700_evb_i2c_init(AspeedMachineState *bmc) 16662c075ff3SJamin Lin { 16672c075ff3SJamin Lin AspeedSoCState *soc = bmc->soc; 16682c075ff3SJamin Lin 16692c075ff3SJamin Lin /* LM75 is compatible with TMP105 driver */ 16702c075ff3SJamin Lin i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), 16712c075ff3SJamin Lin TYPE_TMP105, 0x4d); 16722c075ff3SJamin Lin } 16732c075ff3SJamin Lin 167492707992SJamin Lin static void aspeed_machine_ast2700_evb_class_init(ObjectClass *oc, void *data) 167592707992SJamin Lin { 167692707992SJamin Lin MachineClass *mc = MACHINE_CLASS(oc); 167792707992SJamin Lin AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 167892707992SJamin Lin 167992707992SJamin Lin mc->desc = "Aspeed AST2700 EVB (Cortex-A35)"; 168092707992SJamin Lin amc->soc_name = "ast2700-a0"; 168192707992SJamin Lin amc->hw_strap1 = AST2700_EVB_HW_STRAP1; 168292707992SJamin Lin amc->hw_strap2 = AST2700_EVB_HW_STRAP2; 168392707992SJamin Lin amc->fmc_model = "w25q01jvq"; 168492707992SJamin Lin amc->spi_model = "w25q512jv"; 168592707992SJamin Lin amc->num_cs = 2; 168692707992SJamin Lin amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON; 168792707992SJamin Lin amc->uart_default = ASPEED_DEV_UART12; 16882c075ff3SJamin Lin amc->i2c_init = ast2700_evb_i2c_init; 168992707992SJamin Lin mc->default_ram_size = 1 * GiB; 169092707992SJamin Lin aspeed_machine_class_init_cpus_defaults(mc); 169192707992SJamin Lin } 169292707992SJamin Lin #endif 169392707992SJamin Lin 1694fb6b3c8dSJae Hyun Yoo static void aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass *oc, 1695fb6b3c8dSJae Hyun Yoo void *data) 1696fb6b3c8dSJae Hyun Yoo { 1697fb6b3c8dSJae Hyun Yoo MachineClass *mc = MACHINE_CLASS(oc); 1698fb6b3c8dSJae Hyun Yoo AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1699fb6b3c8dSJae Hyun Yoo 1700fb6b3c8dSJae Hyun Yoo mc->desc = "Qualcomm DC-SCM V1 BMC (Cortex A7)"; 1701fb6b3c8dSJae Hyun Yoo amc->soc_name = "ast2600-a3"; 1702fb6b3c8dSJae Hyun Yoo amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1; 1703fb6b3c8dSJae Hyun Yoo amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2; 1704fb6b3c8dSJae Hyun Yoo amc->fmc_model = "n25q512a"; 1705fb6b3c8dSJae Hyun Yoo amc->spi_model = "n25q512a"; 1706fb6b3c8dSJae Hyun Yoo amc->num_cs = 2; 1707fb6b3c8dSJae Hyun Yoo amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON; 1708fb6b3c8dSJae Hyun Yoo amc->i2c_init = qcom_dc_scm_bmc_i2c_init; 1709fb6b3c8dSJae Hyun Yoo mc->default_ram_size = 1 * GiB; 171043a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 1711fb6b3c8dSJae Hyun Yoo }; 1712fb6b3c8dSJae Hyun Yoo 1713ece4cccdSGraeme Gregory static void aspeed_machine_qcom_firework_class_init(ObjectClass *oc, 1714ece4cccdSGraeme Gregory void *data) 1715ece4cccdSGraeme Gregory { 1716ece4cccdSGraeme Gregory MachineClass *mc = MACHINE_CLASS(oc); 1717ece4cccdSGraeme Gregory AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1718ece4cccdSGraeme Gregory 1719ece4cccdSGraeme Gregory mc->desc = "Qualcomm DC-SCM V1/Firework BMC (Cortex A7)"; 1720ece4cccdSGraeme Gregory amc->soc_name = "ast2600-a3"; 1721ece4cccdSGraeme Gregory amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1; 1722ece4cccdSGraeme Gregory amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2; 1723ece4cccdSGraeme Gregory amc->fmc_model = "n25q512a"; 1724ece4cccdSGraeme Gregory amc->spi_model = "n25q512a"; 1725ece4cccdSGraeme Gregory amc->num_cs = 2; 1726ece4cccdSGraeme Gregory amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON; 1727ece4cccdSGraeme Gregory amc->i2c_init = qcom_dc_scm_firework_i2c_init; 1728ece4cccdSGraeme Gregory mc->default_ram_size = 1 * GiB; 172943a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 1730ece4cccdSGraeme Gregory }; 1731ece4cccdSGraeme Gregory 1732baa4732bSCédric Le Goater static const TypeInfo aspeed_machine_types[] = { 1733baa4732bSCédric Le Goater { 1734baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("palmetto-bmc"), 1735baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1736baa4732bSCédric Le Goater .class_init = aspeed_machine_palmetto_class_init, 1737baa4732bSCédric Le Goater }, { 173840a38df5SErik Smit .name = MACHINE_TYPE_NAME("supermicrox11-bmc"), 173940a38df5SErik Smit .parent = TYPE_ASPEED_MACHINE, 174040a38df5SErik Smit .class_init = aspeed_machine_supermicrox11_bmc_class_init, 174140a38df5SErik Smit }, { 174247936597SGuenter Roeck .name = MACHINE_TYPE_NAME("supermicro-x11spi-bmc"), 174347936597SGuenter Roeck .parent = TYPE_ASPEED_MACHINE, 174447936597SGuenter Roeck .class_init = aspeed_machine_supermicro_x11spi_bmc_class_init, 174547936597SGuenter Roeck }, { 1746baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("ast2500-evb"), 1747baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1748baa4732bSCédric Le Goater .class_init = aspeed_machine_ast2500_evb_class_init, 1749baa4732bSCédric Le Goater }, { 1750baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("romulus-bmc"), 1751baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1752baa4732bSCédric Le Goater .class_init = aspeed_machine_romulus_class_init, 1753baa4732bSCédric Le Goater }, { 1754143b040fSPatrick Williams .name = MACHINE_TYPE_NAME("sonorapass-bmc"), 1755143b040fSPatrick Williams .parent = TYPE_ASPEED_MACHINE, 1756143b040fSPatrick Williams .class_init = aspeed_machine_sonorapass_class_init, 1757143b040fSPatrick Williams }, { 1758baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("witherspoon-bmc"), 1759baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1760baa4732bSCédric Le Goater .class_init = aspeed_machine_witherspoon_class_init, 1761baa4732bSCédric Le Goater }, { 1762baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("ast2600-evb"), 1763baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1764baa4732bSCédric Le Goater .class_init = aspeed_machine_ast2600_evb_class_init, 1765baa4732bSCédric Le Goater }, { 176634f73a81SKarthikeyan Pasupathi .name = MACHINE_TYPE_NAME("yosemitev2-bmc"), 176734f73a81SKarthikeyan Pasupathi .parent = TYPE_ASPEED_MACHINE, 176834f73a81SKarthikeyan Pasupathi .class_init = aspeed_machine_yosemitev2_class_init, 176934f73a81SKarthikeyan Pasupathi }, { 177063ceb818SCédric Le Goater .name = MACHINE_TYPE_NAME("tacoma-bmc"), 177163ceb818SCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 177263ceb818SCédric Le Goater .class_init = aspeed_machine_tacoma_class_init, 177363ceb818SCédric Le Goater }, { 17746c323abaSKarthikeyan Pasupathi .name = MACHINE_TYPE_NAME("tiogapass-bmc"), 17756c323abaSKarthikeyan Pasupathi .parent = TYPE_ASPEED_MACHINE, 17766c323abaSKarthikeyan Pasupathi .class_init = aspeed_machine_tiogapass_class_init, 17776c323abaSKarthikeyan Pasupathi }, { 177895f068c8SJohn Wang .name = MACHINE_TYPE_NAME("g220a-bmc"), 177995f068c8SJohn Wang .parent = TYPE_ASPEED_MACHINE, 178095f068c8SJohn Wang .class_init = aspeed_machine_g220a_class_init, 178195f068c8SJohn Wang }, { 1782fb6b3c8dSJae Hyun Yoo .name = MACHINE_TYPE_NAME("qcom-dc-scm-v1-bmc"), 1783fb6b3c8dSJae Hyun Yoo .parent = TYPE_ASPEED_MACHINE, 1784fb6b3c8dSJae Hyun Yoo .class_init = aspeed_machine_qcom_dc_scm_v1_class_init, 1785fb6b3c8dSJae Hyun Yoo }, { 1786ece4cccdSGraeme Gregory .name = MACHINE_TYPE_NAME("qcom-firework-bmc"), 1787ece4cccdSGraeme Gregory .parent = TYPE_ASPEED_MACHINE, 1788ece4cccdSGraeme Gregory .class_init = aspeed_machine_qcom_firework_class_init, 1789ece4cccdSGraeme Gregory }, { 179082b6a3f6SJohn Wang .name = MACHINE_TYPE_NAME("fp5280g2-bmc"), 179182b6a3f6SJohn Wang .parent = TYPE_ASPEED_MACHINE, 179282b6a3f6SJohn Wang .class_init = aspeed_machine_fp5280g2_class_init, 179382b6a3f6SJohn Wang }, { 17949cccb912SPatrick Venture .name = MACHINE_TYPE_NAME("quanta-q71l-bmc"), 17959cccb912SPatrick Venture .parent = TYPE_ASPEED_MACHINE, 17969cccb912SPatrick Venture .class_init = aspeed_machine_quanta_q71l_class_init, 17979cccb912SPatrick Venture }, { 179858e52bdbSCédric Le Goater .name = MACHINE_TYPE_NAME("rainier-bmc"), 179958e52bdbSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 180058e52bdbSCédric Le Goater .class_init = aspeed_machine_rainier_class_init, 180158e52bdbSCédric Le Goater }, { 1802febbe308SPeter Delevoryas .name = MACHINE_TYPE_NAME("fuji-bmc"), 1803febbe308SPeter Delevoryas .parent = TYPE_ASPEED_MACHINE, 1804febbe308SPeter Delevoryas .class_init = aspeed_machine_fuji_class_init, 1805febbe308SPeter Delevoryas }, { 1806a20c54b1SPatrick Williams .name = MACHINE_TYPE_NAME("bletchley-bmc"), 1807a20c54b1SPatrick Williams .parent = TYPE_ASPEED_MACHINE, 1808a20c54b1SPatrick Williams .class_init = aspeed_machine_bletchley_class_init, 1809a20c54b1SPatrick Williams }, { 1810fa699e80SPeter Delevoryas .name = MACHINE_TYPE_NAME("fby35-bmc"), 1811fa699e80SPeter Delevoryas .parent = MACHINE_TYPE_NAME("ast2600-evb"), 1812fa699e80SPeter Delevoryas .class_init = aspeed_machine_fby35_class_init, 1813fa699e80SPeter Delevoryas }, { 181466c895b8SJamin Lin .name = MACHINE_TYPE_NAME("ast1030-evb"), 181566c895b8SJamin Lin .parent = TYPE_ASPEED_MACHINE, 181666c895b8SJamin Lin .class_init = aspeed_minibmc_machine_ast1030_evb_class_init, 181792707992SJamin Lin #ifdef TARGET_AARCH64 181892707992SJamin Lin }, { 181992707992SJamin Lin .name = MACHINE_TYPE_NAME("ast2700-evb"), 182092707992SJamin Lin .parent = TYPE_ASPEED_MACHINE, 182192707992SJamin Lin .class_init = aspeed_machine_ast2700_evb_class_init, 182292707992SJamin Lin #endif 182366c895b8SJamin Lin }, { 1824fca9ca1bSCédric Le Goater .name = TYPE_ASPEED_MACHINE, 182562c2c2ebSCédric Le Goater .parent = TYPE_MACHINE, 1826888b2b03SPhilippe Mathieu-Daudé .instance_size = sizeof(AspeedMachineState), 18271a15311aSCédric Le Goater .instance_init = aspeed_machine_instance_init, 1828fca9ca1bSCédric Le Goater .class_size = sizeof(AspeedMachineClass), 1829fca9ca1bSCédric Le Goater .class_init = aspeed_machine_class_init, 1830baa4732bSCédric Le Goater .abstract = true, 1831baa4732bSCédric Le Goater } 1832fca9ca1bSCédric Le Goater }; 183374fb1f38SCédric Le Goater 1834baa4732bSCédric Le Goater DEFINE_TYPES(aspeed_machine_types) 1835