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; 49ea066d39SThomas Huth }; 50327d8e4eSAndrew Jeffery 511e2c22c9SCédric Le Goater /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */ 521e2c22c9SCédric Le Goater #if HOST_LONG_BITS == 32 531e2c22c9SCédric Le Goater #define ASPEED_RAM_SIZE(sz) MIN((sz), 1 * GiB) 541e2c22c9SCédric Le Goater #else 551e2c22c9SCédric Le Goater #define ASPEED_RAM_SIZE(sz) (sz) 561e2c22c9SCédric Le Goater #endif 571e2c22c9SCédric Le Goater 58ef17f836SCédric Le Goater /* Palmetto hardware value: 0x120CE416 */ 598da33ef7SCédric Le Goater #define PALMETTO_BMC_HW_STRAP1 ( \ 608da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_256MB) | \ 618da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_DRAM_CONFIG(2 /* DDR3 with CL=6, CWL=5 */) | \ 628da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_ACPI_DIS | \ 638da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) | \ 648da33ef7SCédric Le Goater SCU_HW_STRAP_VGA_CLASS_CODE | \ 658da33ef7SCédric Le Goater SCU_HW_STRAP_LPC_RESET_PIN | \ 668da33ef7SCédric Le Goater SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) | \ 678da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \ 688da33ef7SCédric Le Goater SCU_HW_STRAP_SPI_WIDTH | \ 698da33ef7SCédric Le Goater SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \ 708da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT)) 718da33ef7SCédric Le Goater 7240a38df5SErik Smit /* TODO: Find the actual hardware value */ 7340a38df5SErik Smit #define SUPERMICROX11_BMC_HW_STRAP1 ( \ 7440a38df5SErik Smit SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) | \ 7540a38df5SErik Smit SCU_AST2400_HW_STRAP_DRAM_CONFIG(2) | \ 7640a38df5SErik Smit SCU_AST2400_HW_STRAP_ACPI_DIS | \ 7740a38df5SErik Smit SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) | \ 7840a38df5SErik Smit SCU_HW_STRAP_VGA_CLASS_CODE | \ 7940a38df5SErik Smit SCU_HW_STRAP_LPC_RESET_PIN | \ 8040a38df5SErik Smit SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) | \ 8140a38df5SErik Smit SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \ 8240a38df5SErik Smit SCU_HW_STRAP_SPI_WIDTH | \ 8340a38df5SErik Smit SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \ 8440a38df5SErik Smit SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT)) 8540a38df5SErik Smit 8647936597SGuenter Roeck /* TODO: Find the actual hardware value */ 8747936597SGuenter Roeck #define SUPERMICRO_X11SPI_BMC_HW_STRAP1 ( \ 8847936597SGuenter Roeck AST2500_HW_STRAP1_DEFAULTS | \ 8947936597SGuenter Roeck SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 9047936597SGuenter Roeck SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 9147936597SGuenter Roeck SCU_AST2500_HW_STRAP_UART_DEBUG | \ 9247936597SGuenter Roeck SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 9347936597SGuenter Roeck SCU_HW_STRAP_SPI_WIDTH | \ 9447936597SGuenter Roeck SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN)) 9547936597SGuenter Roeck 96ef17f836SCédric Le Goater /* AST2500 evb hardware value: 0xF100C2E6 */ 979a7c1750SCédric Le Goater #define AST2500_EVB_HW_STRAP1 (( \ 989a7c1750SCédric Le Goater AST2500_HW_STRAP1_DEFAULTS | \ 999a7c1750SCédric Le Goater SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 1009a7c1750SCédric Le Goater SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 1019a7c1750SCédric Le Goater SCU_AST2500_HW_STRAP_UART_DEBUG | \ 1029a7c1750SCédric Le Goater SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 1039a7c1750SCédric Le Goater SCU_HW_STRAP_MAC1_RGMII | \ 1049a7c1750SCédric Le Goater SCU_HW_STRAP_MAC0_RGMII) & \ 1059a7c1750SCédric Le Goater ~SCU_HW_STRAP_2ND_BOOT_WDT) 1069a7c1750SCédric Le Goater 107ef17f836SCédric Le Goater /* Romulus hardware value: 0xF10AD206 */ 108ef17f836SCédric Le Goater #define ROMULUS_BMC_HW_STRAP1 ( \ 109ef17f836SCédric Le Goater AST2500_HW_STRAP1_DEFAULTS | \ 110ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 111ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 112ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_UART_DEBUG | \ 113ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 114ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_ACPI_ENABLE | \ 115ef17f836SCédric Le Goater SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER)) 116ef17f836SCédric Le Goater 117143b040fSPatrick Williams /* Sonorapass hardware value: 0xF100D216 */ 118143b040fSPatrick Williams #define SONORAPASS_BMC_HW_STRAP1 ( \ 119143b040fSPatrick Williams SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 120143b040fSPatrick Williams SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 121143b040fSPatrick Williams SCU_AST2500_HW_STRAP_UART_DEBUG | \ 122143b040fSPatrick Williams SCU_AST2500_HW_STRAP_RESERVED28 | \ 123143b040fSPatrick Williams SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 124143b040fSPatrick Williams SCU_HW_STRAP_VGA_CLASS_CODE | \ 125143b040fSPatrick Williams SCU_HW_STRAP_LPC_RESET_PIN | \ 126143b040fSPatrick Williams SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \ 127143b040fSPatrick Williams SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \ 128143b040fSPatrick Williams SCU_HW_STRAP_VGA_BIOS_ROM | \ 129143b040fSPatrick Williams SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \ 130143b040fSPatrick Williams SCU_AST2500_HW_STRAP_RESERVED1) 131143b040fSPatrick Williams 13295f068c8SJohn Wang #define G220A_BMC_HW_STRAP1 ( \ 13395f068c8SJohn Wang SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 13495f068c8SJohn Wang SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 13595f068c8SJohn Wang SCU_AST2500_HW_STRAP_UART_DEBUG | \ 13695f068c8SJohn Wang SCU_AST2500_HW_STRAP_RESERVED28 | \ 13795f068c8SJohn Wang SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 13895f068c8SJohn Wang SCU_HW_STRAP_2ND_BOOT_WDT | \ 13995f068c8SJohn Wang SCU_HW_STRAP_VGA_CLASS_CODE | \ 14095f068c8SJohn Wang SCU_HW_STRAP_LPC_RESET_PIN | \ 14195f068c8SJohn Wang SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \ 14295f068c8SJohn Wang SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \ 14395f068c8SJohn Wang SCU_HW_STRAP_VGA_SIZE_SET(VGA_64M_DRAM) | \ 14495f068c8SJohn Wang SCU_AST2500_HW_STRAP_RESERVED1) 14595f068c8SJohn Wang 14682b6a3f6SJohn Wang /* FP5280G2 hardware value: 0XF100D286 */ 14782b6a3f6SJohn Wang #define FP5280G2_BMC_HW_STRAP1 ( \ 14882b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 14982b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 15082b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_UART_DEBUG | \ 15182b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_RESERVED28 | \ 15282b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 15382b6a3f6SJohn Wang SCU_HW_STRAP_VGA_CLASS_CODE | \ 15482b6a3f6SJohn Wang SCU_HW_STRAP_LPC_RESET_PIN | \ 15582b6a3f6SJohn Wang SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \ 15682b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \ 15782b6a3f6SJohn Wang SCU_HW_STRAP_MAC1_RGMII | \ 15882b6a3f6SJohn Wang SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \ 15982b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_RESERVED1) 16082b6a3f6SJohn Wang 16162c2c2ebSCédric Le Goater /* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */ 16262c2c2ebSCédric Le Goater #define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1 16362c2c2ebSCédric Le Goater 1649cccb912SPatrick Venture /* Quanta-Q71l hardware value */ 1659cccb912SPatrick Venture #define QUANTA_Q71L_BMC_HW_STRAP1 ( \ 1669cccb912SPatrick Venture SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) | \ 1679cccb912SPatrick Venture SCU_AST2400_HW_STRAP_DRAM_CONFIG(2/* DDR3 with CL=6, CWL=5 */) | \ 1689cccb912SPatrick Venture SCU_AST2400_HW_STRAP_ACPI_DIS | \ 1699cccb912SPatrick Venture SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_24M_IN) | \ 1709cccb912SPatrick Venture SCU_HW_STRAP_VGA_CLASS_CODE | \ 1719cccb912SPatrick Venture SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_PASS_THROUGH) | \ 1729cccb912SPatrick Venture SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \ 1739cccb912SPatrick Venture SCU_HW_STRAP_SPI_WIDTH | \ 1749cccb912SPatrick Venture SCU_HW_STRAP_VGA_SIZE_SET(VGA_8M_DRAM) | \ 1759cccb912SPatrick Venture SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT)) 1769cccb912SPatrick Venture 177ccc2c418SCédric Le Goater /* AST2600 evb hardware value */ 178ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP1 0x000000C0 179ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP2 0x00000003 180ccc2c418SCédric Le Goater 18192707992SJamin Lin #ifdef TARGET_AARCH64 18292707992SJamin Lin /* AST2700 evb hardware value */ 18392707992SJamin Lin #define AST2700_EVB_HW_STRAP1 0x000000C0 18492707992SJamin Lin #define AST2700_EVB_HW_STRAP2 0x00000003 18592707992SJamin Lin #endif 18692707992SJamin Lin 18763ceb818SCédric Le Goater /* Tacoma hardware value */ 18863ceb818SCédric Le Goater #define TACOMA_BMC_HW_STRAP1 0x00000000 1897582591aSJoel Stanley #define TACOMA_BMC_HW_STRAP2 0x00000040 19063ceb818SCédric Le Goater 19158e52bdbSCédric Le Goater /* Rainier hardware value: (QEMU prototype) */ 192b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP1 0x00422016 193b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP2 0x80000848 19458e52bdbSCédric Le Goater 195febbe308SPeter Delevoryas /* Fuji hardware value */ 196febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP1 0x00000000 197febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP2 0x00000000 198febbe308SPeter Delevoryas 199a20c54b1SPatrick Williams /* Bletchley hardware value */ 200a20c54b1SPatrick Williams /* TODO: Leave same as EVB for now. */ 201a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP1 AST2600_EVB_HW_STRAP1 202a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP2 AST2600_EVB_HW_STRAP2 203a20c54b1SPatrick Williams 204fb6b3c8dSJae Hyun Yoo /* Qualcomm DC-SCM hardware value */ 205fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP1 0x00000000 206fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP2 0x00000041 207fb6b3c8dSJae Hyun Yoo 2089bb6d140SJoel Stanley #define AST_SMP_MAILBOX_BASE 0x1e6e2180 2099bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_ENTRY (AST_SMP_MAILBOX_BASE + 0x0) 2109bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_GOSIGN (AST_SMP_MAILBOX_BASE + 0x4) 2119bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_READY (AST_SMP_MAILBOX_BASE + 0x8) 2129bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_POLLINSN (AST_SMP_MAILBOX_BASE + 0xc) 2139bb6d140SJoel Stanley #define AST_SMP_MBOX_CODE (AST_SMP_MAILBOX_BASE + 0x10) 2149bb6d140SJoel Stanley #define AST_SMP_MBOX_GOSIGN 0xabbaab00 2159bb6d140SJoel Stanley 2169bb6d140SJoel Stanley static void aspeed_write_smpboot(ARMCPU *cpu, 2179bb6d140SJoel Stanley const struct arm_boot_info *info) 2189bb6d140SJoel Stanley { 219902bba54SCédric Le Goater AddressSpace *as = arm_boot_address_space(cpu, info); 220902bba54SCédric Le Goater static const ARMInsnFixup poll_mailbox_ready[] = { 2219bb6d140SJoel Stanley /* 2229bb6d140SJoel Stanley * r2 = per-cpu go sign value 2239bb6d140SJoel Stanley * r1 = AST_SMP_MBOX_FIELD_ENTRY 2249bb6d140SJoel Stanley * r0 = AST_SMP_MBOX_FIELD_GOSIGN 2259bb6d140SJoel Stanley */ 226902bba54SCédric Le Goater { 0xee100fb0 }, /* mrc p15, 0, r0, c0, c0, 5 */ 227902bba54SCédric Le Goater { 0xe21000ff }, /* ands r0, r0, #255 */ 228902bba54SCédric Le Goater { 0xe59f201c }, /* ldr r2, [pc, #28] */ 229902bba54SCédric Le Goater { 0xe1822000 }, /* orr r2, r2, r0 */ 2309bb6d140SJoel Stanley 231902bba54SCédric Le Goater { 0xe59f1018 }, /* ldr r1, [pc, #24] */ 232902bba54SCédric Le Goater { 0xe59f0018 }, /* ldr r0, [pc, #24] */ 2339bb6d140SJoel Stanley 234902bba54SCédric Le Goater { 0xe320f002 }, /* wfe */ 235902bba54SCédric Le Goater { 0xe5904000 }, /* ldr r4, [r0] */ 236902bba54SCédric Le Goater { 0xe1520004 }, /* cmp r2, r4 */ 237902bba54SCédric Le Goater { 0x1afffffb }, /* bne <wfe> */ 238902bba54SCédric Le Goater { 0xe591f000 }, /* ldr pc, [r1] */ 239902bba54SCédric Le Goater { AST_SMP_MBOX_GOSIGN }, 240902bba54SCédric Le Goater { AST_SMP_MBOX_FIELD_ENTRY }, 241902bba54SCédric Le Goater { AST_SMP_MBOX_FIELD_GOSIGN }, 242902bba54SCédric Le Goater { 0, FIXUP_TERMINATOR } 2439bb6d140SJoel Stanley }; 244902bba54SCédric Le Goater static const uint32_t fixupcontext[FIXUP_MAX] = { 0 }; 2459bb6d140SJoel Stanley 246902bba54SCédric Le Goater arm_write_bootloader("aspeed.smpboot", as, info->smp_loader_start, 247902bba54SCédric Le Goater poll_mailbox_ready, fixupcontext); 2489bb6d140SJoel Stanley } 2499bb6d140SJoel Stanley 2509bb6d140SJoel Stanley static void aspeed_reset_secondary(ARMCPU *cpu, 2519bb6d140SJoel Stanley const struct arm_boot_info *info) 2529bb6d140SJoel Stanley { 2539bb6d140SJoel Stanley AddressSpace *as = arm_boot_address_space(cpu, info); 2549bb6d140SJoel Stanley CPUState *cs = CPU(cpu); 2559bb6d140SJoel Stanley 2569bb6d140SJoel Stanley /* info->smp_bootreg_addr */ 2579bb6d140SJoel Stanley address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0, 2589bb6d140SJoel Stanley MEMTXATTRS_UNSPECIFIED, NULL); 2599bb6d140SJoel Stanley cpu_set_pc(cs, info->smp_loader_start); 2609bb6d140SJoel Stanley } 2619bb6d140SJoel Stanley 2628b744a6aSCédric Le Goater static void write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size, 263d769a1daSCédric Le Goater Error **errp) 264d769a1daSCédric Le Goater { 26505e6e40aSWentao_Liang g_autofree void *storage = NULL; 2660c7209beSCédric Le Goater int64_t size; 267d769a1daSCédric Le Goater 2680c7209beSCédric Le Goater /* The block backend size should have already been 'validated' by 2690c7209beSCédric Le Goater * the creation of the m25p80 object. 2700c7209beSCédric Le Goater */ 2710c7209beSCédric Le Goater size = blk_getlength(blk); 2720c7209beSCédric Le Goater if (size <= 0) { 2730c7209beSCédric Le Goater error_setg(errp, "failed to get flash size"); 2740c7209beSCédric Le Goater return; 2750c7209beSCédric Le Goater } 2760c7209beSCédric Le Goater 2770c7209beSCédric Le Goater if (rom_size > size) { 2780c7209beSCédric Le Goater rom_size = size; 279d769a1daSCédric Le Goater } 280d769a1daSCédric Le Goater 28105e6e40aSWentao_Liang storage = g_malloc0(rom_size); 282a9262f55SAlberto Faria if (blk_pread(blk, 0, rom_size, storage, 0) < 0) { 283d769a1daSCédric Le Goater error_setg(errp, "failed to read the initial flash content"); 284d769a1daSCédric Le Goater return; 285d769a1daSCédric Le Goater } 286d769a1daSCédric Le Goater 287d769a1daSCédric Le Goater rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr); 288d769a1daSCédric Le Goater } 289d769a1daSCédric Le Goater 2908b744a6aSCédric Le Goater /* 2918b744a6aSCédric Le Goater * Create a ROM and copy the flash contents at the expected address 2928b744a6aSCédric Le Goater * (0x0). Boots faster than execute-in-place. 2938b744a6aSCédric Le Goater */ 294262259eaSCédric Le Goater static void aspeed_install_boot_rom(AspeedMachineState *bmc, BlockBackend *blk, 2958b744a6aSCédric Le Goater uint64_t rom_size) 2968b744a6aSCédric Le Goater { 2973c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 298db052d0eSJamin Lin AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(soc); 2998b744a6aSCédric Le Goater 300262259eaSCédric Le Goater memory_region_init_rom(&bmc->boot_rom, NULL, "aspeed.boot_rom", rom_size, 3018b744a6aSCédric Le Goater &error_abort); 3028b744a6aSCédric Le Goater memory_region_add_subregion_overlap(&soc->spi_boot_container, 0, 303262259eaSCédric Le Goater &bmc->boot_rom, 1); 304db052d0eSJamin Lin write_boot_rom(blk, sc->memmap[ASPEED_DEV_SPI_BOOT], 305db052d0eSJamin Lin rom_size, &error_abort); 3068b744a6aSCédric Le Goater } 3078b744a6aSCédric Le Goater 3081099ad10SPeter Delevoryas void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype, 3099bd4ac61SCédric Le Goater unsigned int count, int unit0) 310e1ad9bc4SCédric Le Goater { 311e1ad9bc4SCédric Le Goater int i; 312179b2058SPatrick Williams 313179b2058SPatrick Williams if (!flashtype) { 314179b2058SPatrick Williams return; 315179b2058SPatrick Williams } 316e1ad9bc4SCédric Le Goater 3179bd4ac61SCédric Le Goater for (i = 0; i < count; ++i) { 3188ec239f2SMarkus Armbruster DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i); 319a7d78befSCédric Le Goater DeviceState *dev; 320e1ad9bc4SCédric Le Goater 321a7d78befSCédric Le Goater dev = qdev_new(flashtype); 322e1ad9bc4SCédric Le Goater if (dinfo) { 323a7d78befSCédric Le Goater qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo)); 324e1ad9bc4SCédric Le Goater } 32527a2c66cSCédric Le Goater qdev_prop_set_uint8(dev, "cs", i); 326a7d78befSCédric Le Goater qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal); 327e1ad9bc4SCédric Le Goater } 328e1ad9bc4SCédric Le Goater } 329e1ad9bc4SCédric Le Goater 330a29e3e12SAndrew Jeffery static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo) 331a29e3e12SAndrew Jeffery { 332a29e3e12SAndrew Jeffery DeviceState *card; 333a29e3e12SAndrew Jeffery 334756f739bSPhilippe Mathieu-Daudé if (!dinfo) { 335756f739bSPhilippe Mathieu-Daudé return; 336756f739bSPhilippe Mathieu-Daudé } 3373e80f690SMarkus Armbruster card = qdev_new(TYPE_SD_CARD); 338934df912SMarkus Armbruster qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo), 339a29e3e12SAndrew Jeffery &error_fatal); 3403e80f690SMarkus Armbruster qdev_realize_and_unref(card, 3413e80f690SMarkus Armbruster qdev_get_child_bus(DEVICE(sdhci), "sd-bus"), 3423e80f690SMarkus Armbruster &error_fatal); 343a29e3e12SAndrew Jeffery } 344a29e3e12SAndrew Jeffery 345d2b3eaefSPeter Delevoryas static void connect_serial_hds_to_uarts(AspeedMachineState *bmc) 346d2b3eaefSPeter Delevoryas { 347d2b3eaefSPeter Delevoryas AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc); 3483c392e87SPhilippe Mathieu-Daudé AspeedSoCState *s = bmc->soc; 349d2b3eaefSPeter Delevoryas AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s); 350f65f6ad5SCédric Le Goater int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default; 351d2b3eaefSPeter Delevoryas 352f65f6ad5SCédric Le Goater aspeed_soc_uart_set_chr(s, uart_chosen, serial_hd(0)); 353944128eeSJamin Lin for (int i = 1, uart = sc->uarts_base; i < sc->uarts_num; i++, uart++) { 354f65f6ad5SCédric Le Goater if (uart == uart_chosen) { 355d2b3eaefSPeter Delevoryas continue; 356d2b3eaefSPeter Delevoryas } 357d2b3eaefSPeter Delevoryas aspeed_soc_uart_set_chr(s, uart, serial_hd(i)); 358d2b3eaefSPeter Delevoryas } 359d2b3eaefSPeter Delevoryas } 360d2b3eaefSPeter Delevoryas 361baa4732bSCédric Le Goater static void aspeed_machine_init(MachineState *machine) 362327d8e4eSAndrew Jeffery { 363888b2b03SPhilippe Mathieu-Daudé AspeedMachineState *bmc = ASPEED_MACHINE(machine); 364baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine); 365b033271fSCédric Le Goater AspeedSoCClass *sc; 3662bea128cSEddie James int i; 367327d8e4eSAndrew Jeffery 3683c392e87SPhilippe Mathieu-Daudé bmc->soc = ASPEED_SOC(object_new(amc->soc_name)); 3693c392e87SPhilippe Mathieu-Daudé object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc)); 3703c392e87SPhilippe Mathieu-Daudé object_unref(OBJECT(bmc->soc)); 3713c392e87SPhilippe Mathieu-Daudé sc = ASPEED_SOC_GET_CLASS(bmc->soc); 372b033271fSCédric Le Goater 373533eb415SIgor Mammedov /* 374346160cbSCédric Le Goater * This will error out if the RAM size is not supported by the 375346160cbSCédric Le Goater * memory controller of the SoC. 376533eb415SIgor Mammedov */ 3773c392e87SPhilippe Mathieu-Daudé object_property_set_uint(OBJECT(bmc->soc), "ram-size", machine->ram_size, 378533eb415SIgor Mammedov &error_fatal); 379533eb415SIgor Mammedov 380d3bad7e7SCédric Le Goater for (i = 0; i < sc->macs_num; i++) { 381b3cfec5bSDavid Woodhouse if ((amc->macs_mask & (1 << i)) && 382b3cfec5bSDavid Woodhouse !qemu_configure_nic_device(DEVICE(&bmc->soc->ftgmac100[i]), 383b3cfec5bSDavid Woodhouse true, NULL)) { 384b3cfec5bSDavid Woodhouse break; /* No configs left; stop asking */ 385d3bad7e7SCédric Le Goater } 386d3bad7e7SCédric Le Goater } 387d3bad7e7SCédric Le Goater 3883c392e87SPhilippe Mathieu-Daudé object_property_set_int(OBJECT(bmc->soc), "hw-strap1", amc->hw_strap1, 38987e79af0SAndrew Jeffery &error_abort); 3903c392e87SPhilippe Mathieu-Daudé object_property_set_int(OBJECT(bmc->soc), "hw-strap2", amc->hw_strap2, 391ccc2c418SCédric Le Goater &error_abort); 3923c392e87SPhilippe Mathieu-Daudé object_property_set_link(OBJECT(bmc->soc), "memory", 3934dd9d554SPeter Delevoryas OBJECT(get_system_memory()), &error_abort); 3943c392e87SPhilippe Mathieu-Daudé object_property_set_link(OBJECT(bmc->soc), "dram", 3950df2d9a6SCédric Le Goater OBJECT(machine->ram), &error_abort); 396b6e70d1dSJoel Stanley if (machine->kernel_filename) { 397b6e70d1dSJoel Stanley /* 398b6e70d1dSJoel Stanley * When booting with a -kernel command line there is no u-boot 399b6e70d1dSJoel Stanley * that runs to unlock the SCU. In this case set the default to 400b6e70d1dSJoel Stanley * be unlocked as the kernel expects 401b6e70d1dSJoel Stanley */ 4023c392e87SPhilippe Mathieu-Daudé object_property_set_int(OBJECT(bmc->soc), "hw-prot-key", 4035325cc34SMarkus Armbruster ASPEED_SCU_PROT_KEY, &error_abort); 404b6e70d1dSJoel Stanley } 405d2b3eaefSPeter Delevoryas connect_serial_hds_to_uarts(bmc); 4063c392e87SPhilippe Mathieu-Daudé qdev_realize(DEVICE(bmc->soc), NULL, &error_abort); 407327d8e4eSAndrew Jeffery 408c7e313aeSCédric Le Goater if (defaults_enabled()) { 4093c392e87SPhilippe Mathieu-Daudé aspeed_board_init_flashes(&bmc->soc->fmc, 4108ec239f2SMarkus Armbruster bmc->fmc_model ? bmc->fmc_model : amc->fmc_model, 4119bd4ac61SCédric Le Goater amc->num_cs, 0); 4123c392e87SPhilippe Mathieu-Daudé aspeed_board_init_flashes(&bmc->soc->spi[0], 4138ec239f2SMarkus Armbruster bmc->spi_model ? bmc->spi_model : amc->spi_model, 4149bd4ac61SCédric Le Goater 1, amc->num_cs); 415c7e313aeSCédric Le Goater } 416e1ad9bc4SCédric Le Goater 417b7f1a0cbSCédric Le Goater if (machine->kernel_filename && sc->num_cpus > 1) { 4189bb6d140SJoel Stanley /* With no u-boot we must set up a boot stub for the secondary CPU */ 4199bb6d140SJoel Stanley MemoryRegion *smpboot = g_new(MemoryRegion, 1); 420f489960dSPhilippe Mathieu-Daudé memory_region_init_ram(smpboot, NULL, "aspeed.smpboot", 4219bb6d140SJoel Stanley 0x80, &error_abort); 4229bb6d140SJoel Stanley memory_region_add_subregion(get_system_memory(), 4239bb6d140SJoel Stanley AST_SMP_MAILBOX_BASE, smpboot); 4249bb6d140SJoel Stanley 4259bb6d140SJoel Stanley aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot; 4269bb6d140SJoel Stanley aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary; 4279bb6d140SJoel Stanley aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE; 4289bb6d140SJoel Stanley } 4299bb6d140SJoel Stanley 4306e504a98SPaolo Bonzini aspeed_board_binfo.ram_size = machine->ram_size; 431347df6f8SEduardo Habkost aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM]; 432b033271fSCédric Le Goater 433baa4732bSCédric Le Goater if (amc->i2c_init) { 434baa4732bSCédric Le Goater amc->i2c_init(bmc); 4352cf6cb50SCédric Le Goater } 4362cf6cb50SCédric Le Goater 4373c392e87SPhilippe Mathieu-Daudé for (i = 0; i < bmc->soc->sdhci.num_slots; i++) { 4383c392e87SPhilippe Mathieu-Daudé sdhci_attach_drive(&bmc->soc->sdhci.slots[i], 4398ec239f2SMarkus Armbruster drive_get(IF_SD, 0, i)); 440a29e3e12SAndrew Jeffery } 4412bea128cSEddie James 4423c392e87SPhilippe Mathieu-Daudé if (bmc->soc->emmc.num_slots) { 4433c392e87SPhilippe Mathieu-Daudé sdhci_attach_drive(&bmc->soc->emmc.slots[0], 4443c392e87SPhilippe Mathieu-Daudé drive_get(IF_SD, 0, bmc->soc->sdhci.num_slots)); 4452bea128cSEddie James } 4462bea128cSEddie James 4478b744a6aSCédric Le Goater if (!bmc->mmio_exec) { 4483c392e87SPhilippe Mathieu-Daudé DeviceState *dev = ssi_get_cs(bmc->soc->fmc.spi, 0); 4498285490bSCédric Le Goater BlockBackend *fmc0 = dev ? m25p80_get_blk(dev) : NULL; 4508b744a6aSCédric Le Goater 4518285490bSCédric Le Goater if (fmc0) { 4523c392e87SPhilippe Mathieu-Daudé uint64_t rom_size = memory_region_size(&bmc->soc->spi_boot); 4538285490bSCédric Le Goater aspeed_install_boot_rom(bmc, fmc0, rom_size); 4548b744a6aSCédric Le Goater } 4558b744a6aSCédric Le Goater } 4568b744a6aSCédric Le Goater 4572744ece8STao Xu arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo); 458327d8e4eSAndrew Jeffery } 459327d8e4eSAndrew Jeffery 460612b219aSPhilippe Mathieu-Daudé static void palmetto_bmc_i2c_init(AspeedMachineState *bmc) 4612cf6cb50SCédric Le Goater { 4623c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 463a87e81b9SCédric Le Goater DeviceState *dev; 4643d165f12SCédric Le Goater uint8_t *eeprom_buf = g_malloc0(32 * 1024); 4652cf6cb50SCédric Le Goater 4662cf6cb50SCédric Le Goater /* The palmetto platform expects a ds3231 RTC but a ds1338 is 4672cf6cb50SCédric Le Goater * enough to provide basic RTC features. Alarms will be missing */ 4681373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68); 469a87e81b9SCédric Le Goater 4707a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, 4713d165f12SCédric Le Goater eeprom_buf); 4723d165f12SCédric Le Goater 473a87e81b9SCédric Le Goater /* add a TMP423 temperature sensor */ 4741373b15bSPhilippe Mathieu-Daudé dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), 4751373b15bSPhilippe Mathieu-Daudé "tmp423", 0x4c)); 4765325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 4775325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 4785325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 4795325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort); 4802cf6cb50SCédric Le Goater } 4812cf6cb50SCédric Le Goater 4829cccb912SPatrick Venture static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc) 4839cccb912SPatrick Venture { 4843c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 4859cccb912SPatrick Venture 4869cccb912SPatrick Venture /* 4879cccb912SPatrick Venture * The quanta-q71l platform expects tmp75s which are compatible with 4889cccb912SPatrick Venture * tmp105s. 4899cccb912SPatrick Venture */ 4909cccb912SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c); 4919cccb912SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e); 4929cccb912SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f); 4939cccb912SPatrick Venture 4949cccb912SPatrick Venture /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */ 4959cccb912SPatrick Venture /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */ 4969cccb912SPatrick Venture /* TODO: Add Memory Riser i2c mux and eeproms. */ 4979cccb912SPatrick Venture 4983ec75e39SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74); 4993ec75e39SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77); 5003ec75e39SPatrick Venture 5019cccb912SPatrick Venture /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */ 5023ec75e39SPatrick Venture 5033ec75e39SPatrick Venture /* i2c-7 */ 5043ec75e39SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70); 5059cccb912SPatrick Venture /* - i2c@0: pmbus@59 */ 5069cccb912SPatrick Venture /* - i2c@1: pmbus@58 */ 5079cccb912SPatrick Venture /* - i2c@2: pmbus@58 */ 5089cccb912SPatrick Venture /* - i2c@3: pmbus@59 */ 5093ec75e39SPatrick Venture 5109cccb912SPatrick Venture /* TODO: i2c-7: Add PDB FRU eeprom@52 */ 5119cccb912SPatrick Venture /* TODO: i2c-8: Add BMC FRU eeprom@50 */ 5129cccb912SPatrick Venture } 5139cccb912SPatrick Venture 514612b219aSPhilippe Mathieu-Daudé static void ast2500_evb_i2c_init(AspeedMachineState *bmc) 5152cf6cb50SCédric Le Goater { 5163c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 5173d165f12SCédric Le Goater uint8_t *eeprom_buf = g_malloc0(8 * 1024); 5183d165f12SCédric Le Goater 5197a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50, 5203d165f12SCédric Le Goater eeprom_buf); 5212cf6cb50SCédric Le Goater 5222cf6cb50SCédric Le Goater /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */ 5231373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), 524044475f3SPhilippe Mathieu-Daudé TYPE_TMP105, 0x4d); 5252cf6cb50SCédric Le Goater } 5262cf6cb50SCédric Le Goater 527612b219aSPhilippe Mathieu-Daudé static void ast2600_evb_i2c_init(AspeedMachineState *bmc) 528ccc2c418SCédric Le Goater { 5293c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 53052bcd997SHoward Chiu uint8_t *eeprom_buf = g_malloc0(8 * 1024); 53152bcd997SHoward Chiu 53252bcd997SHoward Chiu smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 53352bcd997SHoward Chiu eeprom_buf); 53452bcd997SHoward Chiu 53552bcd997SHoward Chiu /* LM75 is compatible with TMP105 driver */ 53652bcd997SHoward Chiu i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), 53752bcd997SHoward Chiu TYPE_TMP105, 0x4d); 538ccc2c418SCédric Le Goater } 539ccc2c418SCédric Le Goater 54034f73a81SKarthikeyan Pasupathi static void yosemitev2_bmc_i2c_init(AspeedMachineState *bmc) 54134f73a81SKarthikeyan Pasupathi { 5423c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 54334f73a81SKarthikeyan Pasupathi 54434f73a81SKarthikeyan Pasupathi at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x51, 128 * KiB); 54534f73a81SKarthikeyan Pasupathi at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 128 * KiB, 54634f73a81SKarthikeyan Pasupathi yosemitev2_bmc_fruid, yosemitev2_bmc_fruid_len); 5470a1f86baSKarthikeyan Pasupathi /* TMP421 */ 5480a1f86baSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "tmp421", 0x1f); 5490a1f86baSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4e); 5500a1f86baSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4f); 5510a1f86baSKarthikeyan Pasupathi 55234f73a81SKarthikeyan Pasupathi } 55334f73a81SKarthikeyan Pasupathi 554612b219aSPhilippe Mathieu-Daudé static void romulus_bmc_i2c_init(AspeedMachineState *bmc) 5556c4567c7SCédric Le Goater { 5563c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 5576c4567c7SCédric Le Goater 5586c4567c7SCédric Le Goater /* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is 5596c4567c7SCédric Le Goater * good enough */ 5601373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32); 5616c4567c7SCédric Le Goater } 5626c4567c7SCédric Le Goater 5636c323abaSKarthikeyan Pasupathi static void tiogapass_bmc_i2c_init(AspeedMachineState *bmc) 5646c323abaSKarthikeyan Pasupathi { 5653c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 5666c323abaSKarthikeyan Pasupathi 5676c323abaSKarthikeyan Pasupathi at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 128 * KiB); 5686c323abaSKarthikeyan Pasupathi at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 6), 0x54, 128 * KiB, 5696c323abaSKarthikeyan Pasupathi tiogapass_bmc_fruid, tiogapass_bmc_fruid_len); 570a09d357dSKarthikeyan Pasupathi /* TMP421 */ 571a09d357dSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "tmp421", 0x1f); 572a09d357dSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4f); 573a09d357dSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4e); 5746c323abaSKarthikeyan Pasupathi } 5756c323abaSKarthikeyan Pasupathi 576f4aec252SCédric Le Goater static void create_pca9552(AspeedSoCState *soc, int bus_id, int addr) 577f4aec252SCédric Le Goater { 578f4aec252SCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, bus_id), 579f4aec252SCédric Le Goater TYPE_PCA9552, addr); 580f4aec252SCédric Le Goater } 581f4aec252SCédric Le Goater 582612b219aSPhilippe Mathieu-Daudé static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc) 583143b040fSPatrick Williams { 5843c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 585143b040fSPatrick Williams 586143b040fSPatrick Williams /* bus 2 : */ 5871373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48); 5881373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49); 589143b040fSPatrick Williams /* bus 2 : pca9546 @ 0x73 */ 590143b040fSPatrick Williams 591143b040fSPatrick Williams /* bus 3 : pca9548 @ 0x70 */ 592143b040fSPatrick Williams 593143b040fSPatrick Williams /* bus 4 : */ 594143b040fSPatrick Williams uint8_t *eeprom4_54 = g_malloc0(8 * 1024); 5957a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 596143b040fSPatrick Williams eeprom4_54); 597143b040fSPatrick Williams /* PCA9539 @ 0x76, but PCA9552 is compatible */ 598f4aec252SCédric Le Goater create_pca9552(soc, 4, 0x76); 599143b040fSPatrick Williams /* PCA9539 @ 0x77, but PCA9552 is compatible */ 600f4aec252SCédric Le Goater create_pca9552(soc, 4, 0x77); 601143b040fSPatrick Williams 602143b040fSPatrick Williams /* bus 6 : */ 6031373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48); 6041373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49); 605143b040fSPatrick Williams /* bus 6 : pca9546 @ 0x73 */ 606143b040fSPatrick Williams 607143b040fSPatrick Williams /* bus 8 : */ 608143b040fSPatrick Williams uint8_t *eeprom8_56 = g_malloc0(8 * 1024); 6097a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56, 610143b040fSPatrick Williams eeprom8_56); 611f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x60); 612f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x61); 613143b040fSPatrick Williams /* bus 8 : adc128d818 @ 0x1d */ 614143b040fSPatrick Williams /* bus 8 : adc128d818 @ 0x1f */ 615143b040fSPatrick Williams 616143b040fSPatrick Williams /* 617143b040fSPatrick Williams * bus 13 : pca9548 @ 0x71 618143b040fSPatrick Williams * - channel 3: 619143b040fSPatrick Williams * - tmm421 @ 0x4c 620143b040fSPatrick Williams * - tmp421 @ 0x4e 621143b040fSPatrick Williams * - tmp421 @ 0x4f 622143b040fSPatrick Williams */ 623143b040fSPatrick Williams 624143b040fSPatrick Williams } 625143b040fSPatrick Williams 626612b219aSPhilippe Mathieu-Daudé static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc) 62762c2c2ebSCédric Le Goater { 6287cfbde5eSPhilippe Mathieu-Daudé static const struct { 6297cfbde5eSPhilippe Mathieu-Daudé unsigned gpio_id; 6307cfbde5eSPhilippe Mathieu-Daudé LEDColor color; 6317cfbde5eSPhilippe Mathieu-Daudé const char *description; 6327cfbde5eSPhilippe Mathieu-Daudé bool gpio_polarity; 6337cfbde5eSPhilippe Mathieu-Daudé } pca1_leds[] = { 6347cfbde5eSPhilippe Mathieu-Daudé {13, LED_COLOR_GREEN, "front-fault-4", GPIO_POLARITY_ACTIVE_LOW}, 6357cfbde5eSPhilippe Mathieu-Daudé {14, LED_COLOR_GREEN, "front-power-3", GPIO_POLARITY_ACTIVE_LOW}, 6367cfbde5eSPhilippe Mathieu-Daudé {15, LED_COLOR_GREEN, "front-id-5", GPIO_POLARITY_ACTIVE_LOW}, 6377cfbde5eSPhilippe Mathieu-Daudé }; 6383c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 6393d165f12SCédric Le Goater uint8_t *eeprom_buf = g_malloc0(8 * 1024); 64015ce12cfSPhilippe Mathieu-Daudé DeviceState *dev; 6417cfbde5eSPhilippe Mathieu-Daudé LEDState *led; 64262c2c2ebSCédric Le Goater 64363ceb818SCédric Le Goater /* Bus 3: TODO bmp280@77 */ 644db437ca6SPhilippe Mathieu-Daudé dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60)); 64515ce12cfSPhilippe Mathieu-Daudé qdev_prop_set_string(dev, "description", "pca1"); 6462616f572SPhilippe Mathieu-Daudé i2c_slave_realize_and_unref(I2C_SLAVE(dev), 6472616f572SPhilippe Mathieu-Daudé aspeed_i2c_get_bus(&soc->i2c, 3), 64815ce12cfSPhilippe Mathieu-Daudé &error_fatal); 6498c9a61d7SCédric Le Goater 6507cfbde5eSPhilippe Mathieu-Daudé for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) { 6517cfbde5eSPhilippe Mathieu-Daudé led = led_create_simple(OBJECT(bmc), 6527cfbde5eSPhilippe Mathieu-Daudé pca1_leds[i].gpio_polarity, 6537cfbde5eSPhilippe Mathieu-Daudé pca1_leds[i].color, 6547cfbde5eSPhilippe Mathieu-Daudé pca1_leds[i].description); 6557cfbde5eSPhilippe Mathieu-Daudé qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id, 6567cfbde5eSPhilippe Mathieu-Daudé qdev_get_gpio_in(DEVICE(led), 0)); 6577cfbde5eSPhilippe Mathieu-Daudé } 658b61ea6e7SJoel Stanley i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76); 6592a75e8c3SMaheswara Kurapati i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "max31785", 0x52); 6601373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c); 6611373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c); 66262c2c2ebSCédric Le Goater 66362c2c2ebSCédric Le Goater /* The Witherspoon expects a TMP275 but a TMP105 is compatible */ 6641373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105, 665044475f3SPhilippe Mathieu-Daudé 0x4a); 6666c4567c7SCédric Le Goater 6676c4567c7SCédric Le Goater /* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is 6686c4567c7SCédric Le Goater * good enough */ 6691373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32); 6703d165f12SCédric Le Goater 6717a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51, 6723d165f12SCédric Le Goater eeprom_buf); 673db437ca6SPhilippe Mathieu-Daudé dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60)); 67415ce12cfSPhilippe Mathieu-Daudé qdev_prop_set_string(dev, "description", "pca0"); 6752616f572SPhilippe Mathieu-Daudé i2c_slave_realize_and_unref(I2C_SLAVE(dev), 6762616f572SPhilippe Mathieu-Daudé aspeed_i2c_get_bus(&soc->i2c, 11), 67715ce12cfSPhilippe Mathieu-Daudé &error_fatal); 67863ceb818SCédric Le Goater /* Bus 11: TODO ucd90160@64 */ 67962c2c2ebSCédric Le Goater } 68062c2c2ebSCédric Le Goater 68195f068c8SJohn Wang static void g220a_bmc_i2c_init(AspeedMachineState *bmc) 68295f068c8SJohn Wang { 6833c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 68495f068c8SJohn Wang DeviceState *dev; 68595f068c8SJohn Wang 68695f068c8SJohn Wang dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), 68795f068c8SJohn Wang "emc1413", 0x4c)); 68895f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 68995f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 69095f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 69195f068c8SJohn Wang 69295f068c8SJohn Wang dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12), 69395f068c8SJohn Wang "emc1413", 0x4c)); 69495f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 69595f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 69695f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 69795f068c8SJohn Wang 69895f068c8SJohn Wang dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13), 69995f068c8SJohn Wang "emc1413", 0x4c)); 70095f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 70195f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 70295f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 7036f5f6507SJohn Wang 7046f5f6507SJohn Wang static uint8_t eeprom_buf[2 * 1024] = { 7056f5f6507SJohn Wang 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe, 7066f5f6507SJohn Wang 0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65, 7076f5f6507SJohn Wang 0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32, 7086f5f6507SJohn Wang 0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42, 7096f5f6507SJohn Wang 0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45, 7106f5f6507SJohn Wang 0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1, 7116f5f6507SJohn Wang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, 7126f5f6507SJohn Wang }; 7136f5f6507SJohn Wang smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57, 7146f5f6507SJohn Wang eeprom_buf); 71595f068c8SJohn Wang } 71695f068c8SJohn Wang 71782b6a3f6SJohn Wang static void fp5280g2_bmc_i2c_init(AspeedMachineState *bmc) 71882b6a3f6SJohn Wang { 7193c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 72082b6a3f6SJohn Wang I2CSlave *i2c_mux; 72182b6a3f6SJohn Wang 72282b6a3f6SJohn Wang /* The at24c256 */ 72382b6a3f6SJohn Wang at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 1), 0x50, 32768); 72482b6a3f6SJohn Wang 72582b6a3f6SJohn Wang /* The fp5280g2 expects a TMP112 but a TMP105 is compatible */ 72682b6a3f6SJohn Wang i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105, 72782b6a3f6SJohn Wang 0x48); 72882b6a3f6SJohn Wang i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105, 72982b6a3f6SJohn Wang 0x49); 73082b6a3f6SJohn Wang 73182b6a3f6SJohn Wang i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), 73282b6a3f6SJohn Wang "pca9546", 0x70); 73382b6a3f6SJohn Wang /* It expects a TMP112 but a TMP105 is compatible */ 73482b6a3f6SJohn Wang i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0), TYPE_TMP105, 73582b6a3f6SJohn Wang 0x4a); 73682b6a3f6SJohn Wang 73782b6a3f6SJohn Wang /* It expects a ds3232 but a ds1338 is good enough */ 73882b6a3f6SJohn Wang i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "ds1338", 0x68); 73982b6a3f6SJohn Wang 74082b6a3f6SJohn Wang /* It expects a pca9555 but a pca9552 is compatible */ 741f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x30); 74282b6a3f6SJohn Wang } 74382b6a3f6SJohn Wang 74458e52bdbSCédric Le Goater static void rainier_bmc_i2c_init(AspeedMachineState *bmc) 74558e52bdbSCédric Le Goater { 7463c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 747fa6d98c0SJoel Stanley I2CSlave *i2c_mux; 748fa6d98c0SJoel Stanley 7499077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB); 75058e52bdbSCédric Le Goater 751f4aec252SCédric Le Goater create_pca9552(soc, 3, 0x61); 752bcb122f8SJoel Stanley 75358e52bdbSCédric Le Goater /* The rainier expects a TMP275 but a TMP105 is compatible */ 75458e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105, 75558e52bdbSCédric Le Goater 0x48); 75658e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105, 75758e52bdbSCédric Le Goater 0x49); 75858e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105, 75958e52bdbSCédric Le Goater 0x4a); 760fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), 761fa6d98c0SJoel Stanley "pca9546", 0x70); 7629077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 7639077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 7649077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB); 765f4aec252SCédric Le Goater create_pca9552(soc, 4, 0x60); 76658e52bdbSCédric Le Goater 76758e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105, 76858e52bdbSCédric Le Goater 0x48); 76958e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105, 77058e52bdbSCédric Le Goater 0x49); 771f4aec252SCédric Le Goater create_pca9552(soc, 5, 0x60); 772f4aec252SCédric Le Goater create_pca9552(soc, 5, 0x61); 773fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), 774fa6d98c0SJoel Stanley "pca9546", 0x70); 7759077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 7769077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 77758e52bdbSCédric Le Goater 77858e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105, 77958e52bdbSCédric Le Goater 0x48); 78058e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105, 78158e52bdbSCédric Le Goater 0x4a); 78258e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105, 78358e52bdbSCédric Le Goater 0x4b); 784fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), 785fa6d98c0SJoel Stanley "pca9546", 0x70); 7869077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 7879077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 7889077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB); 7899077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB); 79058e52bdbSCédric Le Goater 791f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x30); 792f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x31); 793f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x32); 794f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x33); 795f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x60); 796f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x61); 797b61ea6e7SJoel Stanley i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76); 79858e52bdbSCédric Le Goater /* Bus 7: TODO si7021-a20@20 */ 79958e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105, 80058e52bdbSCédric Le Goater 0x48); 8012a75e8c3SMaheswara Kurapati i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "max31785", 0x52); 8029077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB); 8039077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB); 80458e52bdbSCédric Le Goater 80558e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105, 80658e52bdbSCédric Le Goater 0x48); 80758e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105, 80858e52bdbSCédric Le Goater 0x4a); 809be85508fSNinad Palsule at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50, 810be85508fSNinad Palsule 64 * KiB, rainier_bb_fruid, rainier_bb_fruid_len); 811be85508fSNinad Palsule at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 812be85508fSNinad Palsule 64 * KiB, rainier_bmc_fruid, rainier_bmc_fruid_len); 813f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x60); 814f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x61); 81558e52bdbSCédric Le Goater /* Bus 8: ucd90320@11 */ 81658e52bdbSCédric Le Goater /* Bus 8: ucd90320@b */ 81758e52bdbSCédric Le Goater /* Bus 8: ucd90320@c */ 81858e52bdbSCédric Le Goater 81958e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c); 82058e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d); 8219077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB); 82258e52bdbSCédric Le Goater 82358e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c); 82458e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d); 8259077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB); 82658e52bdbSCédric Le Goater 82758e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105, 82858e52bdbSCédric Le Goater 0x48); 82958e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105, 83058e52bdbSCédric Le Goater 0x49); 831fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), 832fa6d98c0SJoel Stanley "pca9546", 0x70); 8339077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 8349077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 835f4aec252SCédric Le Goater create_pca9552(soc, 11, 0x60); 836fa6d98c0SJoel Stanley 837fa6d98c0SJoel Stanley 8389077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB); 839f4aec252SCédric Le Goater create_pca9552(soc, 13, 0x60); 840fa6d98c0SJoel Stanley 8419077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB); 842f4aec252SCédric Le Goater create_pca9552(soc, 14, 0x60); 843fa6d98c0SJoel Stanley 8449077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB); 845f4aec252SCédric Le Goater create_pca9552(soc, 15, 0x60); 84658e52bdbSCédric Le Goater } 84758e52bdbSCédric Le Goater 848febbe308SPeter Delevoryas static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr, 849febbe308SPeter Delevoryas I2CBus **channels) 850febbe308SPeter Delevoryas { 851febbe308SPeter Delevoryas I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr); 852febbe308SPeter Delevoryas for (int i = 0; i < 8; i++) { 853febbe308SPeter Delevoryas channels[i] = pca954x_i2c_get_bus(mux, i); 854febbe308SPeter Delevoryas } 855febbe308SPeter Delevoryas } 856febbe308SPeter Delevoryas 857febbe308SPeter Delevoryas #define TYPE_LM75 TYPE_TMP105 858febbe308SPeter Delevoryas #define TYPE_TMP75 TYPE_TMP105 859febbe308SPeter Delevoryas #define TYPE_TMP422 "tmp422" 860febbe308SPeter Delevoryas 861febbe308SPeter Delevoryas static void fuji_bmc_i2c_init(AspeedMachineState *bmc) 862febbe308SPeter Delevoryas { 8633c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 864febbe308SPeter Delevoryas I2CBus *i2c[144] = {}; 865febbe308SPeter Delevoryas 866febbe308SPeter Delevoryas for (int i = 0; i < 16; i++) { 867febbe308SPeter Delevoryas i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i); 868febbe308SPeter Delevoryas } 869febbe308SPeter Delevoryas I2CBus *i2c180 = i2c[2]; 870febbe308SPeter Delevoryas I2CBus *i2c480 = i2c[8]; 871febbe308SPeter Delevoryas I2CBus *i2c600 = i2c[11]; 872febbe308SPeter Delevoryas 873febbe308SPeter Delevoryas get_pca9548_channels(i2c180, 0x70, &i2c[16]); 874febbe308SPeter Delevoryas get_pca9548_channels(i2c480, 0x70, &i2c[24]); 875febbe308SPeter Delevoryas /* NOTE: The device tree skips [32, 40) in the alias numbering */ 876febbe308SPeter Delevoryas get_pca9548_channels(i2c600, 0x77, &i2c[40]); 877febbe308SPeter Delevoryas get_pca9548_channels(i2c[24], 0x71, &i2c[48]); 878febbe308SPeter Delevoryas get_pca9548_channels(i2c[25], 0x72, &i2c[56]); 879febbe308SPeter Delevoryas get_pca9548_channels(i2c[26], 0x76, &i2c[64]); 880febbe308SPeter Delevoryas get_pca9548_channels(i2c[27], 0x76, &i2c[72]); 881febbe308SPeter Delevoryas for (int i = 0; i < 8; i++) { 882febbe308SPeter Delevoryas get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]); 883febbe308SPeter Delevoryas } 884febbe308SPeter Delevoryas 885febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c); 886febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d); 887febbe308SPeter Delevoryas 888ef0eb67eSSittisak Sinprem /* 889ef0eb67eSSittisak Sinprem * EEPROM 24c64 size is 64Kbits or 8 Kbytes 890ef0eb67eSSittisak Sinprem * 24c02 size is 2Kbits or 256 bytes 891ef0eb67eSSittisak Sinprem */ 892ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[19], 0x52, 8 * KiB); 893ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[20], 0x50, 256); 894ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[22], 0x52, 256); 895febbe308SPeter Delevoryas 896febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x48); 897febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x49); 898febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x4a); 899febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_TMP422, 0x4c); 900febbe308SPeter Delevoryas 901ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[8], 0x51, 8 * KiB); 902febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a); 903febbe308SPeter Delevoryas 904febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[50], TYPE_LM75, 0x4c); 905ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[50], 0x52, 8 * KiB); 906febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[51], TYPE_TMP75, 0x48); 907febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[52], TYPE_TMP75, 0x49); 908febbe308SPeter Delevoryas 909febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[59], TYPE_TMP75, 0x48); 910febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[60], TYPE_TMP75, 0x49); 911febbe308SPeter Delevoryas 912ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[65], 0x53, 8 * KiB); 913febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x49); 914febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x48); 915ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[68], 0x52, 8 * KiB); 916ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[69], 0x52, 8 * KiB); 917ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[70], 0x52, 8 * KiB); 918ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[71], 0x52, 8 * KiB); 919febbe308SPeter Delevoryas 920ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[73], 0x53, 8 * KiB); 921febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x49); 922febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x48); 923ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[76], 0x52, 8 * KiB); 924ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[77], 0x52, 8 * KiB); 925ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[78], 0x52, 8 * KiB); 926ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[79], 0x52, 8 * KiB); 927ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[28], 0x50, 256); 928febbe308SPeter Delevoryas 929febbe308SPeter Delevoryas for (int i = 0; i < 8; i++) { 9309077e09aSPeter Delevoryas at24c_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB); 931febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[82 + i * 8], TYPE_TMP75, 0x48); 932febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[83 + i * 8], TYPE_TMP75, 0x4b); 933febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[84 + i * 8], TYPE_TMP75, 0x4a); 934febbe308SPeter Delevoryas } 935febbe308SPeter Delevoryas } 936febbe308SPeter Delevoryas 937a20c54b1SPatrick Williams #define TYPE_TMP421 "tmp421" 938a20c54b1SPatrick Williams 939a20c54b1SPatrick Williams static void bletchley_bmc_i2c_init(AspeedMachineState *bmc) 940a20c54b1SPatrick Williams { 9413c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 942a20c54b1SPatrick Williams I2CBus *i2c[13] = {}; 943a20c54b1SPatrick Williams for (int i = 0; i < 13; i++) { 944a20c54b1SPatrick Williams if ((i == 8) || (i == 11)) { 945a20c54b1SPatrick Williams continue; 946a20c54b1SPatrick Williams } 947a20c54b1SPatrick Williams i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i); 948a20c54b1SPatrick Williams } 949a20c54b1SPatrick Williams 950a20c54b1SPatrick Williams /* Bus 0 - 5 all have the same config. */ 951a20c54b1SPatrick Williams for (int i = 0; i < 6; i++) { 952a20c54b1SPatrick Williams /* Missing model: ti,ina230 @ 0x45 */ 953a20c54b1SPatrick Williams /* Missing model: mps,mp5023 @ 0x40 */ 954a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[i], TYPE_TMP421, 0x4f); 955a20c54b1SPatrick Williams /* Missing model: nxp,pca9539 @ 0x76, but PCA9552 works enough */ 956a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x76); 957a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x67); 958a20c54b1SPatrick Williams /* Missing model: fsc,fusb302 @ 0x22 */ 959a20c54b1SPatrick Williams } 960a20c54b1SPatrick Williams 961a20c54b1SPatrick Williams /* Bus 6 */ 962a20c54b1SPatrick Williams at24c_eeprom_init(i2c[6], 0x56, 65536); 963a20c54b1SPatrick Williams /* Missing model: nxp,pcf85263 @ 0x51 , but ds1338 works enough */ 964a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[6], "ds1338", 0x51); 965a20c54b1SPatrick Williams 966a20c54b1SPatrick Williams 967a20c54b1SPatrick Williams /* Bus 7 */ 968a20c54b1SPatrick Williams at24c_eeprom_init(i2c[7], 0x54, 65536); 969a20c54b1SPatrick Williams 970a20c54b1SPatrick Williams /* Bus 9 */ 971a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[9], TYPE_TMP421, 0x4f); 972a20c54b1SPatrick Williams 973a20c54b1SPatrick Williams /* Bus 10 */ 974a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[10], TYPE_TMP421, 0x4f); 975a20c54b1SPatrick Williams /* Missing model: ti,hdc1080 @ 0x40 */ 976a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[10], TYPE_PCA9552, 0x67); 977a20c54b1SPatrick Williams 978a20c54b1SPatrick Williams /* Bus 12 */ 979a20c54b1SPatrick Williams /* Missing model: adi,adm1278 @ 0x11 */ 980a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4c); 981a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4d); 982a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[12], TYPE_PCA9552, 0x67); 983a20c54b1SPatrick Williams } 984a20c54b1SPatrick Williams 985fa699e80SPeter Delevoryas static void fby35_i2c_init(AspeedMachineState *bmc) 986fa699e80SPeter Delevoryas { 9873c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 988fa699e80SPeter Delevoryas I2CBus *i2c[16]; 989fa699e80SPeter Delevoryas 990fa699e80SPeter Delevoryas for (int i = 0; i < 16; i++) { 991fa699e80SPeter Delevoryas i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i); 992fa699e80SPeter Delevoryas } 993fa699e80SPeter Delevoryas 994fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[2], TYPE_LM75, 0x4f); 995fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[8], TYPE_TMP421, 0x1f); 996fa699e80SPeter Delevoryas /* Hotswap controller is actually supposed to be mp5920 or ltc4282. */ 997fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[11], "adm1272", 0x44); 998fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4e); 999fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4f); 1000fa699e80SPeter Delevoryas 10019077e09aSPeter Delevoryas at24c_eeprom_init(i2c[4], 0x51, 128 * KiB); 10029077e09aSPeter Delevoryas at24c_eeprom_init(i2c[6], 0x51, 128 * KiB); 1003c0216b94SPeter Delevoryas at24c_eeprom_init_rom(i2c[8], 0x50, 32 * KiB, fby35_nic_fruid, 1004c0216b94SPeter Delevoryas fby35_nic_fruid_len); 1005c0216b94SPeter Delevoryas at24c_eeprom_init_rom(i2c[11], 0x51, 128 * KiB, fby35_bb_fruid, 1006c0216b94SPeter Delevoryas fby35_bb_fruid_len); 1007c0216b94SPeter Delevoryas at24c_eeprom_init_rom(i2c[11], 0x54, 128 * KiB, fby35_bmc_fruid, 1008c0216b94SPeter Delevoryas fby35_bmc_fruid_len); 1009fa699e80SPeter Delevoryas 1010fa699e80SPeter Delevoryas /* 1011fa699e80SPeter Delevoryas * TODO: There is a multi-master i2c connection to an AST1030 MiniBMC on 1012fa699e80SPeter Delevoryas * buses 0, 1, 2, 3, and 9. Source address 0x10, target address 0x20 on 1013fa699e80SPeter Delevoryas * each. 1014fa699e80SPeter Delevoryas */ 1015fa699e80SPeter Delevoryas } 1016fa699e80SPeter Delevoryas 1017fb6b3c8dSJae Hyun Yoo static void qcom_dc_scm_bmc_i2c_init(AspeedMachineState *bmc) 1018fb6b3c8dSJae Hyun Yoo { 10193c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 1020fb6b3c8dSJae Hyun Yoo 1021fb6b3c8dSJae Hyun Yoo i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 15), "tmp105", 0x4d); 1022fb6b3c8dSJae Hyun Yoo } 1023fb6b3c8dSJae Hyun Yoo 1024ece4cccdSGraeme Gregory static void qcom_dc_scm_firework_i2c_init(AspeedMachineState *bmc) 1025ece4cccdSGraeme Gregory { 10263c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 10272a7a5d5cSJae Hyun Yoo I2CSlave *therm_mux, *cpuvr_mux; 1028ece4cccdSGraeme Gregory 1029ece4cccdSGraeme Gregory /* Create the generic DC-SCM hardware */ 1030ece4cccdSGraeme Gregory qcom_dc_scm_bmc_i2c_init(bmc); 1031ece4cccdSGraeme Gregory 1032ece4cccdSGraeme Gregory /* Now create the Firework specific hardware */ 10332a75e8c3SMaheswara Kurapati 10342a7a5d5cSJae Hyun Yoo /* I2C7 CPUVR MUX */ 10352a7a5d5cSJae Hyun Yoo cpuvr_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), 10362a7a5d5cSJae Hyun Yoo "pca9546", 0x70); 10372a7a5d5cSJae Hyun Yoo i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 0), "pca9548", 0x72); 10382a7a5d5cSJae Hyun Yoo i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 1), "pca9548", 0x72); 10392a7a5d5cSJae Hyun Yoo i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 2), "pca9548", 0x72); 10402a7a5d5cSJae Hyun Yoo i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 3), "pca9548", 0x72); 10412a7a5d5cSJae Hyun Yoo 1042cfc68f16SMaheswara Kurapati /* I2C8 Thermal Diodes*/ 1043cfc68f16SMaheswara Kurapati therm_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), 1044cfc68f16SMaheswara Kurapati "pca9548", 0x70); 1045cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 0), TYPE_LM75, 0x4C); 1046cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 1), TYPE_LM75, 0x4C); 1047cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 2), TYPE_LM75, 0x48); 1048cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 3), TYPE_LM75, 0x48); 1049cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 4), TYPE_LM75, 0x48); 1050cfc68f16SMaheswara Kurapati 10512a75e8c3SMaheswara Kurapati /* I2C9 Fan Controller (MAX31785) */ 10522a75e8c3SMaheswara Kurapati i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x52); 10532a75e8c3SMaheswara Kurapati i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x54); 1054ece4cccdSGraeme Gregory } 1055ece4cccdSGraeme Gregory 10561a15311aSCédric Le Goater static bool aspeed_get_mmio_exec(Object *obj, Error **errp) 10571a15311aSCédric Le Goater { 10581a15311aSCédric Le Goater return ASPEED_MACHINE(obj)->mmio_exec; 10591a15311aSCédric Le Goater } 10601a15311aSCédric Le Goater 10611a15311aSCédric Le Goater static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp) 10621a15311aSCédric Le Goater { 10631a15311aSCédric Le Goater ASPEED_MACHINE(obj)->mmio_exec = value; 10641a15311aSCédric Le Goater } 10651a15311aSCédric Le Goater 10661a15311aSCédric Le Goater static void aspeed_machine_instance_init(Object *obj) 10671a15311aSCédric Le Goater { 10681a15311aSCédric Le Goater ASPEED_MACHINE(obj)->mmio_exec = false; 10691a15311aSCédric Le Goater } 10701a15311aSCédric Le Goater 10719820e52fSCédric Le Goater static char *aspeed_get_fmc_model(Object *obj, Error **errp) 10729820e52fSCédric Le Goater { 10739820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 10749820e52fSCédric Le Goater return g_strdup(bmc->fmc_model); 10759820e52fSCédric Le Goater } 10769820e52fSCédric Le Goater 10779820e52fSCédric Le Goater static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp) 10789820e52fSCédric Le Goater { 10799820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 10809820e52fSCédric Le Goater 10819820e52fSCédric Le Goater g_free(bmc->fmc_model); 10829820e52fSCédric Le Goater bmc->fmc_model = g_strdup(value); 10839820e52fSCédric Le Goater } 10849820e52fSCédric Le Goater 10859820e52fSCédric Le Goater static char *aspeed_get_spi_model(Object *obj, Error **errp) 10869820e52fSCédric Le Goater { 10879820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 10889820e52fSCédric Le Goater return g_strdup(bmc->spi_model); 10899820e52fSCédric Le Goater } 10909820e52fSCédric Le Goater 10919820e52fSCédric Le Goater static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp) 10929820e52fSCédric Le Goater { 10939820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 10949820e52fSCédric Le Goater 10959820e52fSCédric Le Goater g_free(bmc->spi_model); 10969820e52fSCédric Le Goater bmc->spi_model = g_strdup(value); 10979820e52fSCédric Le Goater } 10989820e52fSCédric Le Goater 1099f65f6ad5SCédric Le Goater static char *aspeed_get_bmc_console(Object *obj, Error **errp) 1100f65f6ad5SCédric Le Goater { 1101f65f6ad5SCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 1102f65f6ad5SCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc); 1103f65f6ad5SCédric Le Goater int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default; 1104f65f6ad5SCédric Le Goater 1105944128eeSJamin Lin return g_strdup_printf("uart%d", aspeed_uart_index(uart_chosen)); 1106f65f6ad5SCédric Le Goater } 1107f65f6ad5SCédric Le Goater 1108f65f6ad5SCédric Le Goater static void aspeed_set_bmc_console(Object *obj, const char *value, Error **errp) 1109f65f6ad5SCédric Le Goater { 1110f65f6ad5SCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 1111f65f6ad5SCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc); 1112f65f6ad5SCédric Le Goater AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(amc->soc_name)); 1113f65f6ad5SCédric Le Goater int val; 1114944128eeSJamin Lin int uart_first = aspeed_uart_first(sc); 1115944128eeSJamin Lin int uart_last = aspeed_uart_last(sc); 1116f65f6ad5SCédric Le Goater 1117f65f6ad5SCédric Le Goater if (sscanf(value, "uart%u", &val) != 1) { 1118f65f6ad5SCédric Le Goater error_setg(errp, "Bad value for \"uart\" property"); 1119f65f6ad5SCédric Le Goater return; 1120f65f6ad5SCédric Le Goater } 1121f65f6ad5SCédric Le Goater 1122f65f6ad5SCédric Le Goater /* The number of UART depends on the SoC */ 1123944128eeSJamin Lin if (val < uart_first || val > uart_last) { 1124944128eeSJamin Lin error_setg(errp, "\"uart\" should be in range [%d - %d]", 1125944128eeSJamin Lin uart_first, uart_last); 1126f65f6ad5SCédric Le Goater return; 1127f65f6ad5SCédric Le Goater } 1128944128eeSJamin Lin bmc->uart_chosen = val + ASPEED_DEV_UART0; 1129f65f6ad5SCédric Le Goater } 1130f65f6ad5SCédric Le Goater 11311a15311aSCédric Le Goater static void aspeed_machine_class_props_init(ObjectClass *oc) 11321a15311aSCédric Le Goater { 11331a15311aSCédric Le Goater object_class_property_add_bool(oc, "execute-in-place", 11341a15311aSCédric Le Goater aspeed_get_mmio_exec, 1135d2623129SMarkus Armbruster aspeed_set_mmio_exec); 11361a15311aSCédric Le Goater object_class_property_set_description(oc, "execute-in-place", 11377eecec7dSMarkus Armbruster "boot directly from CE0 flash device"); 11389820e52fSCédric Le Goater 1139f65f6ad5SCédric Le Goater object_class_property_add_str(oc, "bmc-console", aspeed_get_bmc_console, 1140f65f6ad5SCédric Le Goater aspeed_set_bmc_console); 1141f65f6ad5SCédric Le Goater object_class_property_set_description(oc, "bmc-console", 1142f65f6ad5SCédric Le Goater "Change the default UART to \"uartX\""); 1143f65f6ad5SCédric Le Goater 11449820e52fSCédric Le Goater object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model, 11459820e52fSCédric Le Goater aspeed_set_fmc_model); 11469820e52fSCédric Le Goater object_class_property_set_description(oc, "fmc-model", 11479820e52fSCédric Le Goater "Change the FMC Flash model"); 11489820e52fSCédric Le Goater object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model, 11499820e52fSCédric Le Goater aspeed_set_spi_model); 11509820e52fSCédric Le Goater object_class_property_set_description(oc, "spi-model", 11519820e52fSCédric Le Goater "Change the SPI Flash model"); 11521a15311aSCédric Le Goater } 11531a15311aSCédric Le Goater 115443a0a5c9SPhilippe Mathieu-Daudé static void aspeed_machine_class_init_cpus_defaults(MachineClass *mc) 1155b7f1a0cbSCédric Le Goater { 115643a0a5c9SPhilippe Mathieu-Daudé AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(mc); 115743a0a5c9SPhilippe Mathieu-Daudé AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(amc->soc_name)); 115843a0a5c9SPhilippe Mathieu-Daudé 115943a0a5c9SPhilippe Mathieu-Daudé mc->default_cpus = sc->num_cpus; 116043a0a5c9SPhilippe Mathieu-Daudé mc->min_cpus = sc->num_cpus; 116143a0a5c9SPhilippe Mathieu-Daudé mc->max_cpus = sc->num_cpus; 1162dc13909eSPhilippe Mathieu-Daudé mc->valid_cpu_types = sc->valid_cpu_types; 1163b7f1a0cbSCédric Le Goater } 1164b7f1a0cbSCédric Le Goater 1165fca9ca1bSCédric Le Goater static void aspeed_machine_class_init(ObjectClass *oc, void *data) 116662c2c2ebSCédric Le Goater { 116762c2c2ebSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1168d3bad7e7SCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 116962c2c2ebSCédric Le Goater 1170fca9ca1bSCédric Le Goater mc->init = aspeed_machine_init; 117162c2c2ebSCédric Le Goater mc->no_floppy = 1; 117262c2c2ebSCédric Le Goater mc->no_cdrom = 1; 117362c2c2ebSCédric Le Goater mc->no_parallel = 1; 1174afcbaed6SIgor Mammedov mc->default_ram_id = "ram"; 1175d3bad7e7SCédric Le Goater amc->macs_mask = ASPEED_MAC0_ON; 11765d63d0c7SPeter Delevoryas amc->uart_default = ASPEED_DEV_UART5; 11771a15311aSCédric Le Goater 11781a15311aSCédric Le Goater aspeed_machine_class_props_init(oc); 117962c2c2ebSCédric Le Goater } 118062c2c2ebSCédric Le Goater 1181baa4732bSCédric Le Goater static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data) 1182baa4732bSCédric Le Goater { 1183baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1184baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1185baa4732bSCédric Le Goater 1186baa4732bSCédric Le Goater mc->desc = "OpenPOWER Palmetto BMC (ARM926EJ-S)"; 1187baa4732bSCédric Le Goater amc->soc_name = "ast2400-a1"; 1188baa4732bSCédric Le Goater amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1; 1189baa4732bSCédric Le Goater amc->fmc_model = "n25q256a"; 119070322913SCédric Le Goater amc->spi_model = "mx25l25635f"; 1191baa4732bSCédric Le Goater amc->num_cs = 1; 1192baa4732bSCédric Le Goater amc->i2c_init = palmetto_bmc_i2c_init; 1193baa4732bSCédric Le Goater mc->default_ram_size = 256 * MiB; 119443a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 1195baa4732bSCédric Le Goater }; 1196baa4732bSCédric Le Goater 11979cccb912SPatrick Venture static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data) 11989cccb912SPatrick Venture { 11999cccb912SPatrick Venture MachineClass *mc = MACHINE_CLASS(oc); 12009cccb912SPatrick Venture AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 12019cccb912SPatrick Venture 12029cccb912SPatrick Venture mc->desc = "Quanta-Q71l BMC (ARM926EJ-S)"; 12039cccb912SPatrick Venture amc->soc_name = "ast2400-a1"; 12049cccb912SPatrick Venture amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1; 12059cccb912SPatrick Venture amc->fmc_model = "n25q256a"; 12069cccb912SPatrick Venture amc->spi_model = "mx25l25635e"; 12079cccb912SPatrick Venture amc->num_cs = 1; 12089cccb912SPatrick Venture amc->i2c_init = quanta_q71l_bmc_i2c_init; 12099cccb912SPatrick Venture mc->default_ram_size = 128 * MiB; 121043a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 12119cccb912SPatrick Venture } 12129cccb912SPatrick Venture 121340a38df5SErik Smit static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc, 121440a38df5SErik Smit void *data) 121540a38df5SErik Smit { 121640a38df5SErik Smit MachineClass *mc = MACHINE_CLASS(oc); 121740a38df5SErik Smit AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 121840a38df5SErik Smit 121940a38df5SErik Smit mc->desc = "Supermicro X11 BMC (ARM926EJ-S)"; 122040a38df5SErik Smit amc->soc_name = "ast2400-a1"; 122140a38df5SErik Smit amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1; 122240a38df5SErik Smit amc->fmc_model = "mx25l25635e"; 122340a38df5SErik Smit amc->spi_model = "mx25l25635e"; 122440a38df5SErik Smit amc->num_cs = 1; 122540a38df5SErik Smit amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 122640a38df5SErik Smit amc->i2c_init = palmetto_bmc_i2c_init; 122740a38df5SErik Smit mc->default_ram_size = 256 * MiB; 122843a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 122940a38df5SErik Smit } 123040a38df5SErik Smit 123147936597SGuenter Roeck static void aspeed_machine_supermicro_x11spi_bmc_class_init(ObjectClass *oc, 123247936597SGuenter Roeck void *data) 123347936597SGuenter Roeck { 123447936597SGuenter Roeck MachineClass *mc = MACHINE_CLASS(oc); 123547936597SGuenter Roeck AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 123647936597SGuenter Roeck 123747936597SGuenter Roeck mc->desc = "Supermicro X11 SPI BMC (ARM1176)"; 123847936597SGuenter Roeck amc->soc_name = "ast2500-a1"; 123947936597SGuenter Roeck amc->hw_strap1 = SUPERMICRO_X11SPI_BMC_HW_STRAP1; 124047936597SGuenter Roeck amc->fmc_model = "mx25l25635e"; 124147936597SGuenter Roeck amc->spi_model = "mx25l25635e"; 124247936597SGuenter Roeck amc->num_cs = 1; 124347936597SGuenter Roeck amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 124447936597SGuenter Roeck amc->i2c_init = palmetto_bmc_i2c_init; 124547936597SGuenter Roeck mc->default_ram_size = 512 * MiB; 124643a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 124747936597SGuenter Roeck } 124847936597SGuenter Roeck 1249baa4732bSCédric Le Goater static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data) 1250baa4732bSCédric Le Goater { 1251baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1252baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1253baa4732bSCédric Le Goater 1254baa4732bSCédric Le Goater mc->desc = "Aspeed AST2500 EVB (ARM1176)"; 1255baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1"; 1256baa4732bSCédric Le Goater amc->hw_strap1 = AST2500_EVB_HW_STRAP1; 1257753abfc4SJae Hyun Yoo amc->fmc_model = "mx25l25635e"; 125870322913SCédric Le Goater amc->spi_model = "mx25l25635f"; 1259baa4732bSCédric Le Goater amc->num_cs = 1; 1260baa4732bSCédric Le Goater amc->i2c_init = ast2500_evb_i2c_init; 1261baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB; 126243a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 1263baa4732bSCédric Le Goater }; 1264baa4732bSCédric Le Goater 126534f73a81SKarthikeyan Pasupathi static void aspeed_machine_yosemitev2_class_init(ObjectClass *oc, void *data) 126634f73a81SKarthikeyan Pasupathi { 126734f73a81SKarthikeyan Pasupathi MachineClass *mc = MACHINE_CLASS(oc); 126834f73a81SKarthikeyan Pasupathi AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 126934f73a81SKarthikeyan Pasupathi 127034f73a81SKarthikeyan Pasupathi mc->desc = "Facebook YosemiteV2 BMC (ARM1176)"; 127134f73a81SKarthikeyan Pasupathi amc->soc_name = "ast2500-a1"; 127234f73a81SKarthikeyan Pasupathi amc->hw_strap1 = AST2500_EVB_HW_STRAP1; 127334f73a81SKarthikeyan Pasupathi amc->hw_strap2 = 0; 127434f73a81SKarthikeyan Pasupathi amc->fmc_model = "n25q256a"; 127534f73a81SKarthikeyan Pasupathi amc->spi_model = "mx25l25635e"; 127634f73a81SKarthikeyan Pasupathi amc->num_cs = 2; 127734f73a81SKarthikeyan Pasupathi amc->i2c_init = yosemitev2_bmc_i2c_init; 127834f73a81SKarthikeyan Pasupathi mc->default_ram_size = 512 * MiB; 127943a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 128034f73a81SKarthikeyan Pasupathi }; 128134f73a81SKarthikeyan Pasupathi 1282baa4732bSCédric Le Goater static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data) 1283baa4732bSCédric Le Goater { 1284baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1285baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1286baa4732bSCédric Le Goater 1287baa4732bSCédric Le Goater mc->desc = "OpenPOWER Romulus BMC (ARM1176)"; 1288baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1"; 1289baa4732bSCédric Le Goater amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1; 1290baa4732bSCédric Le Goater amc->fmc_model = "n25q256a"; 1291baa4732bSCédric Le Goater amc->spi_model = "mx66l1g45g"; 1292baa4732bSCédric Le Goater amc->num_cs = 2; 1293baa4732bSCédric Le Goater amc->i2c_init = romulus_bmc_i2c_init; 1294baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB; 129543a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 1296baa4732bSCédric Le Goater }; 1297baa4732bSCédric Le Goater 12986c323abaSKarthikeyan Pasupathi static void aspeed_machine_tiogapass_class_init(ObjectClass *oc, void *data) 12996c323abaSKarthikeyan Pasupathi { 13006c323abaSKarthikeyan Pasupathi MachineClass *mc = MACHINE_CLASS(oc); 13016c323abaSKarthikeyan Pasupathi AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 13026c323abaSKarthikeyan Pasupathi 13036c323abaSKarthikeyan Pasupathi mc->desc = "Facebook Tiogapass BMC (ARM1176)"; 13046c323abaSKarthikeyan Pasupathi amc->soc_name = "ast2500-a1"; 13056c323abaSKarthikeyan Pasupathi amc->hw_strap1 = AST2500_EVB_HW_STRAP1; 13066c323abaSKarthikeyan Pasupathi amc->hw_strap2 = 0; 13076c323abaSKarthikeyan Pasupathi amc->fmc_model = "n25q256a"; 13086c323abaSKarthikeyan Pasupathi amc->spi_model = "mx25l25635e"; 13096c323abaSKarthikeyan Pasupathi amc->num_cs = 2; 13106c323abaSKarthikeyan Pasupathi amc->i2c_init = tiogapass_bmc_i2c_init; 13116c323abaSKarthikeyan Pasupathi mc->default_ram_size = 1 * GiB; 131243a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 13136c323abaSKarthikeyan Pasupathi }; 13146c323abaSKarthikeyan Pasupathi 1315143b040fSPatrick Williams static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data) 1316143b040fSPatrick Williams { 1317143b040fSPatrick Williams MachineClass *mc = MACHINE_CLASS(oc); 1318143b040fSPatrick Williams AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1319143b040fSPatrick Williams 1320143b040fSPatrick Williams mc->desc = "OCP SonoraPass BMC (ARM1176)"; 1321143b040fSPatrick Williams amc->soc_name = "ast2500-a1"; 1322143b040fSPatrick Williams amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1; 1323143b040fSPatrick Williams amc->fmc_model = "mx66l1g45g"; 1324143b040fSPatrick Williams amc->spi_model = "mx66l1g45g"; 1325143b040fSPatrick Williams amc->num_cs = 2; 1326143b040fSPatrick Williams amc->i2c_init = sonorapass_bmc_i2c_init; 1327143b040fSPatrick Williams mc->default_ram_size = 512 * MiB; 132843a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 1329143b040fSPatrick Williams }; 1330143b040fSPatrick Williams 1331baa4732bSCédric Le Goater static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data) 1332baa4732bSCédric Le Goater { 1333baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1334baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1335baa4732bSCédric Le Goater 1336baa4732bSCédric Le Goater mc->desc = "OpenPOWER Witherspoon BMC (ARM1176)"; 1337baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1"; 1338baa4732bSCédric Le Goater amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1; 133970322913SCédric Le Goater amc->fmc_model = "mx25l25635f"; 1340baa4732bSCédric Le Goater amc->spi_model = "mx66l1g45g"; 1341baa4732bSCédric Le Goater amc->num_cs = 2; 1342baa4732bSCédric Le Goater amc->i2c_init = witherspoon_bmc_i2c_init; 1343baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB; 134443a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 1345baa4732bSCédric Le Goater }; 1346baa4732bSCédric Le Goater 1347baa4732bSCédric Le Goater static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data) 1348baa4732bSCédric Le Goater { 1349baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1350baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1351baa4732bSCédric Le Goater 1352f548f201SPeter Maydell mc->desc = "Aspeed AST2600 EVB (Cortex-A7)"; 1353c5811bb3SJoel Stanley amc->soc_name = "ast2600-a3"; 1354baa4732bSCédric Le Goater amc->hw_strap1 = AST2600_EVB_HW_STRAP1; 1355baa4732bSCédric Le Goater amc->hw_strap2 = AST2600_EVB_HW_STRAP2; 1356753abfc4SJae Hyun Yoo amc->fmc_model = "mx66u51235f"; 1357baa4732bSCédric Le Goater amc->spi_model = "mx66u51235f"; 1358baa4732bSCédric Le Goater amc->num_cs = 1; 135929193286SGuenter Roeck amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON | 136029193286SGuenter Roeck ASPEED_MAC3_ON; 1361baa4732bSCédric Le Goater amc->i2c_init = ast2600_evb_i2c_init; 1362baa4732bSCédric Le Goater mc->default_ram_size = 1 * GiB; 136343a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 1364baa4732bSCédric Le Goater }; 1365baa4732bSCédric Le Goater 136663ceb818SCédric Le Goater static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data) 136763ceb818SCédric Le Goater { 136863ceb818SCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 136963ceb818SCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 137063ceb818SCédric Le Goater 1371f548f201SPeter Maydell mc->desc = "OpenPOWER Tacoma BMC (Cortex-A7)"; 1372c5811bb3SJoel Stanley amc->soc_name = "ast2600-a3"; 137363ceb818SCédric Le Goater amc->hw_strap1 = TACOMA_BMC_HW_STRAP1; 137463ceb818SCédric Le Goater amc->hw_strap2 = TACOMA_BMC_HW_STRAP2; 137563ceb818SCédric Le Goater amc->fmc_model = "mx66l1g45g"; 137663ceb818SCédric Le Goater amc->spi_model = "mx66l1g45g"; 137763ceb818SCédric Le Goater amc->num_cs = 2; 1378d3bad7e7SCédric Le Goater amc->macs_mask = ASPEED_MAC2_ON; 137963ceb818SCédric Le Goater amc->i2c_init = witherspoon_bmc_i2c_init; /* Same board layout */ 138063ceb818SCédric Le Goater mc->default_ram_size = 1 * GiB; 138143a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 1382*56a37edaSCédric Le Goater 1383*56a37edaSCédric Le Goater mc->deprecation_reason = "Please use the similar 'rainier-bmc' machine"; 138463ceb818SCédric Le Goater }; 138563ceb818SCédric Le Goater 138695f068c8SJohn Wang static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data) 138795f068c8SJohn Wang { 138895f068c8SJohn Wang MachineClass *mc = MACHINE_CLASS(oc); 138995f068c8SJohn Wang AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 139095f068c8SJohn Wang 139195f068c8SJohn Wang mc->desc = "Bytedance G220A BMC (ARM1176)"; 139295f068c8SJohn Wang amc->soc_name = "ast2500-a1"; 139395f068c8SJohn Wang amc->hw_strap1 = G220A_BMC_HW_STRAP1; 139495f068c8SJohn Wang amc->fmc_model = "n25q512a"; 139595f068c8SJohn Wang amc->spi_model = "mx25l25635e"; 139695f068c8SJohn Wang amc->num_cs = 2; 13975bb825c8SGuenter Roeck amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 139895f068c8SJohn Wang amc->i2c_init = g220a_bmc_i2c_init; 139995f068c8SJohn Wang mc->default_ram_size = 1024 * MiB; 140043a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 140195f068c8SJohn Wang }; 140295f068c8SJohn Wang 140382b6a3f6SJohn Wang static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc, void *data) 140482b6a3f6SJohn Wang { 140582b6a3f6SJohn Wang MachineClass *mc = MACHINE_CLASS(oc); 140682b6a3f6SJohn Wang AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 140782b6a3f6SJohn Wang 140882b6a3f6SJohn Wang mc->desc = "Inspur FP5280G2 BMC (ARM1176)"; 140982b6a3f6SJohn Wang amc->soc_name = "ast2500-a1"; 141082b6a3f6SJohn Wang amc->hw_strap1 = FP5280G2_BMC_HW_STRAP1; 141182b6a3f6SJohn Wang amc->fmc_model = "n25q512a"; 141282b6a3f6SJohn Wang amc->spi_model = "mx25l25635e"; 141382b6a3f6SJohn Wang amc->num_cs = 2; 141482b6a3f6SJohn Wang amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 141582b6a3f6SJohn Wang amc->i2c_init = fp5280g2_bmc_i2c_init; 141682b6a3f6SJohn Wang mc->default_ram_size = 512 * MiB; 141743a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 141882b6a3f6SJohn Wang }; 141982b6a3f6SJohn Wang 142058e52bdbSCédric Le Goater static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data) 142158e52bdbSCédric Le Goater { 142258e52bdbSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 142358e52bdbSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 142458e52bdbSCédric Le Goater 1425f548f201SPeter Maydell mc->desc = "IBM Rainier BMC (Cortex-A7)"; 1426c5811bb3SJoel Stanley amc->soc_name = "ast2600-a3"; 142758e52bdbSCédric Le Goater amc->hw_strap1 = RAINIER_BMC_HW_STRAP1; 142858e52bdbSCédric Le Goater amc->hw_strap2 = RAINIER_BMC_HW_STRAP2; 142958e52bdbSCédric Le Goater amc->fmc_model = "mx66l1g45g"; 143058e52bdbSCédric Le Goater amc->spi_model = "mx66l1g45g"; 143158e52bdbSCédric Le Goater amc->num_cs = 2; 143258e52bdbSCédric Le Goater amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON; 143358e52bdbSCédric Le Goater amc->i2c_init = rainier_bmc_i2c_init; 143458e52bdbSCédric Le Goater mc->default_ram_size = 1 * GiB; 143543a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 143658e52bdbSCédric Le Goater }; 143758e52bdbSCédric Le Goater 14381e2c22c9SCédric Le Goater #define FUJI_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB) 1439febbe308SPeter Delevoryas 1440febbe308SPeter Delevoryas static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data) 1441febbe308SPeter Delevoryas { 1442febbe308SPeter Delevoryas MachineClass *mc = MACHINE_CLASS(oc); 1443febbe308SPeter Delevoryas AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1444febbe308SPeter Delevoryas 1445febbe308SPeter Delevoryas mc->desc = "Facebook Fuji BMC (Cortex-A7)"; 1446febbe308SPeter Delevoryas amc->soc_name = "ast2600-a3"; 1447febbe308SPeter Delevoryas amc->hw_strap1 = FUJI_BMC_HW_STRAP1; 1448febbe308SPeter Delevoryas amc->hw_strap2 = FUJI_BMC_HW_STRAP2; 1449febbe308SPeter Delevoryas amc->fmc_model = "mx66l1g45g"; 1450febbe308SPeter Delevoryas amc->spi_model = "mx66l1g45g"; 1451febbe308SPeter Delevoryas amc->num_cs = 2; 1452febbe308SPeter Delevoryas amc->macs_mask = ASPEED_MAC3_ON; 1453febbe308SPeter Delevoryas amc->i2c_init = fuji_bmc_i2c_init; 1454febbe308SPeter Delevoryas amc->uart_default = ASPEED_DEV_UART1; 1455febbe308SPeter Delevoryas mc->default_ram_size = FUJI_BMC_RAM_SIZE; 145643a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 1457febbe308SPeter Delevoryas }; 1458febbe308SPeter Delevoryas 14591e2c22c9SCédric Le Goater #define BLETCHLEY_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB) 1460104bdaffSPatrick Williams 1461a20c54b1SPatrick Williams static void aspeed_machine_bletchley_class_init(ObjectClass *oc, void *data) 1462a20c54b1SPatrick Williams { 1463a20c54b1SPatrick Williams MachineClass *mc = MACHINE_CLASS(oc); 1464a20c54b1SPatrick Williams AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1465a20c54b1SPatrick Williams 1466a20c54b1SPatrick Williams mc->desc = "Facebook Bletchley BMC (Cortex-A7)"; 1467a20c54b1SPatrick Williams amc->soc_name = "ast2600-a3"; 1468a20c54b1SPatrick Williams amc->hw_strap1 = BLETCHLEY_BMC_HW_STRAP1; 1469a20c54b1SPatrick Williams amc->hw_strap2 = BLETCHLEY_BMC_HW_STRAP2; 1470a20c54b1SPatrick Williams amc->fmc_model = "w25q01jvq"; 1471a20c54b1SPatrick Williams amc->spi_model = NULL; 1472a20c54b1SPatrick Williams amc->num_cs = 2; 1473a20c54b1SPatrick Williams amc->macs_mask = ASPEED_MAC2_ON; 1474a20c54b1SPatrick Williams amc->i2c_init = bletchley_bmc_i2c_init; 1475104bdaffSPatrick Williams mc->default_ram_size = BLETCHLEY_BMC_RAM_SIZE; 147643a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 1477a20c54b1SPatrick Williams } 1478a20c54b1SPatrick Williams 14797966d70fSJason A. Donenfeld static void fby35_reset(MachineState *state, ShutdownCause reason) 1480fa699e80SPeter Delevoryas { 1481fa699e80SPeter Delevoryas AspeedMachineState *bmc = ASPEED_MACHINE(state); 14823c392e87SPhilippe Mathieu-Daudé AspeedGPIOState *gpio = &bmc->soc->gpio; 1483fa699e80SPeter Delevoryas 14847966d70fSJason A. Donenfeld qemu_devices_reset(reason); 1485fa699e80SPeter Delevoryas 1486f0418558SPeter Delevoryas /* Board ID: 7 (Class-1, 4 slots) */ 1487fa699e80SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioV4", true, &error_fatal); 1488fa699e80SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioV5", true, &error_fatal); 1489fa699e80SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioV6", true, &error_fatal); 1490fa699e80SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioV7", false, &error_fatal); 1491f0418558SPeter Delevoryas 1492f0418558SPeter Delevoryas /* Slot presence pins, inverse polarity. (False means present) */ 1493f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioH4", false, &error_fatal); 1494f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioH5", true, &error_fatal); 1495f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioH6", true, &error_fatal); 1496f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioH7", true, &error_fatal); 1497f0418558SPeter Delevoryas 1498f0418558SPeter Delevoryas /* Slot 12v power pins, normal polarity. (True means powered-on) */ 1499f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioB2", true, &error_fatal); 1500f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioB3", false, &error_fatal); 1501f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioB4", false, &error_fatal); 1502f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioB5", false, &error_fatal); 1503fa699e80SPeter Delevoryas } 1504fa699e80SPeter Delevoryas 1505fa699e80SPeter Delevoryas static void aspeed_machine_fby35_class_init(ObjectClass *oc, void *data) 1506fa699e80SPeter Delevoryas { 1507fa699e80SPeter Delevoryas MachineClass *mc = MACHINE_CLASS(oc); 1508fa699e80SPeter Delevoryas AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1509fa699e80SPeter Delevoryas 1510fa699e80SPeter Delevoryas mc->desc = "Facebook fby35 BMC (Cortex-A7)"; 1511fa699e80SPeter Delevoryas mc->reset = fby35_reset; 1512fa699e80SPeter Delevoryas amc->fmc_model = "mx66l1g45g"; 1513fa699e80SPeter Delevoryas amc->num_cs = 2; 1514fa699e80SPeter Delevoryas amc->macs_mask = ASPEED_MAC3_ON; 1515fa699e80SPeter Delevoryas amc->i2c_init = fby35_i2c_init; 1516fa699e80SPeter Delevoryas /* FIXME: Replace this macro with something more general */ 1517fa699e80SPeter Delevoryas mc->default_ram_size = FUJI_BMC_RAM_SIZE; 151843a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 1519fa699e80SPeter Delevoryas } 1520fa699e80SPeter Delevoryas 152166c895b8SJamin Lin #define AST1030_INTERNAL_FLASH_SIZE (1024 * 1024) 152266c895b8SJamin Lin /* Main SYSCLK frequency in Hz (200MHz) */ 152366c895b8SJamin Lin #define SYSCLK_FRQ 200000000ULL 152466c895b8SJamin Lin 152566c895b8SJamin Lin static void aspeed_minibmc_machine_init(MachineState *machine) 152666c895b8SJamin Lin { 152766c895b8SJamin Lin AspeedMachineState *bmc = ASPEED_MACHINE(machine); 152866c895b8SJamin Lin AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine); 152966c895b8SJamin Lin Clock *sysclk; 153066c895b8SJamin Lin 153166c895b8SJamin Lin sysclk = clock_new(OBJECT(machine), "SYSCLK"); 153266c895b8SJamin Lin clock_set_hz(sysclk, SYSCLK_FRQ); 153366c895b8SJamin Lin 15343c392e87SPhilippe Mathieu-Daudé bmc->soc = ASPEED_SOC(object_new(amc->soc_name)); 15353c392e87SPhilippe Mathieu-Daudé object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc)); 15363c392e87SPhilippe Mathieu-Daudé object_unref(OBJECT(bmc->soc)); 15373c392e87SPhilippe Mathieu-Daudé qdev_connect_clock_in(DEVICE(bmc->soc), "sysclk", sysclk); 153866c895b8SJamin Lin 15393c392e87SPhilippe Mathieu-Daudé object_property_set_link(OBJECT(bmc->soc), "memory", 15404dd9d554SPeter Delevoryas OBJECT(get_system_memory()), &error_abort); 1541d2b3eaefSPeter Delevoryas connect_serial_hds_to_uarts(bmc); 15423c392e87SPhilippe Mathieu-Daudé qdev_realize(DEVICE(bmc->soc), NULL, &error_abort); 154366c895b8SJamin Lin 15443c392e87SPhilippe Mathieu-Daudé aspeed_board_init_flashes(&bmc->soc->fmc, 154566c895b8SJamin Lin bmc->fmc_model ? bmc->fmc_model : amc->fmc_model, 154666c895b8SJamin Lin amc->num_cs, 154766c895b8SJamin Lin 0); 154866c895b8SJamin Lin 15493c392e87SPhilippe Mathieu-Daudé aspeed_board_init_flashes(&bmc->soc->spi[0], 155066c895b8SJamin Lin bmc->spi_model ? bmc->spi_model : amc->spi_model, 155166c895b8SJamin Lin amc->num_cs, amc->num_cs); 155266c895b8SJamin Lin 15533c392e87SPhilippe Mathieu-Daudé aspeed_board_init_flashes(&bmc->soc->spi[1], 155466c895b8SJamin Lin bmc->spi_model ? bmc->spi_model : amc->spi_model, 155566c895b8SJamin Lin amc->num_cs, (amc->num_cs * 2)); 155666c895b8SJamin Lin 155766c895b8SJamin Lin if (amc->i2c_init) { 155866c895b8SJamin Lin amc->i2c_init(bmc); 155966c895b8SJamin Lin } 156066c895b8SJamin Lin 156166c895b8SJamin Lin armv7m_load_kernel(ARM_CPU(first_cpu), 156266c895b8SJamin Lin machine->kernel_filename, 1563761c532aSPeter Maydell 0, 156466c895b8SJamin Lin AST1030_INTERNAL_FLASH_SIZE); 156566c895b8SJamin Lin } 156666c895b8SJamin Lin 15674c70ab16STroy Lee static void ast1030_evb_i2c_init(AspeedMachineState *bmc) 15684c70ab16STroy Lee { 15693c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 15704c70ab16STroy Lee 1571673d8215SMichael Tokarev /* U10 24C08 connects to SDA/SCL Group 1 by default */ 15724c70ab16STroy Lee uint8_t *eeprom_buf = g_malloc0(32 * 1024); 15734c70ab16STroy Lee smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, eeprom_buf); 15744c70ab16STroy Lee 15754c70ab16STroy Lee /* U11 LM75 connects to SDA/SCL Group 2 by default */ 15764c70ab16STroy Lee i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d); 15774c70ab16STroy Lee } 15784c70ab16STroy Lee 157966c895b8SJamin Lin static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc, 158066c895b8SJamin Lin void *data) 158166c895b8SJamin Lin { 158266c895b8SJamin Lin MachineClass *mc = MACHINE_CLASS(oc); 158366c895b8SJamin Lin AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 158466c895b8SJamin Lin 158566c895b8SJamin Lin mc->desc = "Aspeed AST1030 MiniBMC (Cortex-M4)"; 158666c895b8SJamin Lin amc->soc_name = "ast1030-a1"; 158766c895b8SJamin Lin amc->hw_strap1 = 0; 158866c895b8SJamin Lin amc->hw_strap2 = 0; 158966c895b8SJamin Lin mc->init = aspeed_minibmc_machine_init; 15904c70ab16STroy Lee amc->i2c_init = ast1030_evb_i2c_init; 159166c895b8SJamin Lin mc->default_ram_size = 0; 159266c895b8SJamin Lin amc->fmc_model = "sst25vf032b"; 159366c895b8SJamin Lin amc->spi_model = "sst25vf032b"; 159466c895b8SJamin Lin amc->num_cs = 2; 159566c895b8SJamin Lin amc->macs_mask = 0; 159643a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 159766c895b8SJamin Lin } 159866c895b8SJamin Lin 159992707992SJamin Lin #ifdef TARGET_AARCH64 160092707992SJamin Lin static void aspeed_machine_ast2700_evb_class_init(ObjectClass *oc, void *data) 160192707992SJamin Lin { 160292707992SJamin Lin MachineClass *mc = MACHINE_CLASS(oc); 160392707992SJamin Lin AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 160492707992SJamin Lin 160592707992SJamin Lin mc->desc = "Aspeed AST2700 EVB (Cortex-A35)"; 160692707992SJamin Lin amc->soc_name = "ast2700-a0"; 160792707992SJamin Lin amc->hw_strap1 = AST2700_EVB_HW_STRAP1; 160892707992SJamin Lin amc->hw_strap2 = AST2700_EVB_HW_STRAP2; 160992707992SJamin Lin amc->fmc_model = "w25q01jvq"; 161092707992SJamin Lin amc->spi_model = "w25q512jv"; 161192707992SJamin Lin amc->num_cs = 2; 161292707992SJamin Lin amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON; 161392707992SJamin Lin amc->uart_default = ASPEED_DEV_UART12; 161492707992SJamin Lin mc->default_ram_size = 1 * GiB; 161592707992SJamin Lin aspeed_machine_class_init_cpus_defaults(mc); 161692707992SJamin Lin } 161792707992SJamin Lin #endif 161892707992SJamin Lin 1619fb6b3c8dSJae Hyun Yoo static void aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass *oc, 1620fb6b3c8dSJae Hyun Yoo void *data) 1621fb6b3c8dSJae Hyun Yoo { 1622fb6b3c8dSJae Hyun Yoo MachineClass *mc = MACHINE_CLASS(oc); 1623fb6b3c8dSJae Hyun Yoo AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1624fb6b3c8dSJae Hyun Yoo 1625fb6b3c8dSJae Hyun Yoo mc->desc = "Qualcomm DC-SCM V1 BMC (Cortex A7)"; 1626fb6b3c8dSJae Hyun Yoo amc->soc_name = "ast2600-a3"; 1627fb6b3c8dSJae Hyun Yoo amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1; 1628fb6b3c8dSJae Hyun Yoo amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2; 1629fb6b3c8dSJae Hyun Yoo amc->fmc_model = "n25q512a"; 1630fb6b3c8dSJae Hyun Yoo amc->spi_model = "n25q512a"; 1631fb6b3c8dSJae Hyun Yoo amc->num_cs = 2; 1632fb6b3c8dSJae Hyun Yoo amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON; 1633fb6b3c8dSJae Hyun Yoo amc->i2c_init = qcom_dc_scm_bmc_i2c_init; 1634fb6b3c8dSJae Hyun Yoo mc->default_ram_size = 1 * GiB; 163543a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 1636fb6b3c8dSJae Hyun Yoo }; 1637fb6b3c8dSJae Hyun Yoo 1638ece4cccdSGraeme Gregory static void aspeed_machine_qcom_firework_class_init(ObjectClass *oc, 1639ece4cccdSGraeme Gregory void *data) 1640ece4cccdSGraeme Gregory { 1641ece4cccdSGraeme Gregory MachineClass *mc = MACHINE_CLASS(oc); 1642ece4cccdSGraeme Gregory AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1643ece4cccdSGraeme Gregory 1644ece4cccdSGraeme Gregory mc->desc = "Qualcomm DC-SCM V1/Firework BMC (Cortex A7)"; 1645ece4cccdSGraeme Gregory amc->soc_name = "ast2600-a3"; 1646ece4cccdSGraeme Gregory amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1; 1647ece4cccdSGraeme Gregory amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2; 1648ece4cccdSGraeme Gregory amc->fmc_model = "n25q512a"; 1649ece4cccdSGraeme Gregory amc->spi_model = "n25q512a"; 1650ece4cccdSGraeme Gregory amc->num_cs = 2; 1651ece4cccdSGraeme Gregory amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON; 1652ece4cccdSGraeme Gregory amc->i2c_init = qcom_dc_scm_firework_i2c_init; 1653ece4cccdSGraeme Gregory mc->default_ram_size = 1 * GiB; 165443a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 1655ece4cccdSGraeme Gregory }; 1656ece4cccdSGraeme Gregory 1657baa4732bSCédric Le Goater static const TypeInfo aspeed_machine_types[] = { 1658baa4732bSCédric Le Goater { 1659baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("palmetto-bmc"), 1660baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1661baa4732bSCédric Le Goater .class_init = aspeed_machine_palmetto_class_init, 1662baa4732bSCédric Le Goater }, { 166340a38df5SErik Smit .name = MACHINE_TYPE_NAME("supermicrox11-bmc"), 166440a38df5SErik Smit .parent = TYPE_ASPEED_MACHINE, 166540a38df5SErik Smit .class_init = aspeed_machine_supermicrox11_bmc_class_init, 166640a38df5SErik Smit }, { 166747936597SGuenter Roeck .name = MACHINE_TYPE_NAME("supermicro-x11spi-bmc"), 166847936597SGuenter Roeck .parent = TYPE_ASPEED_MACHINE, 166947936597SGuenter Roeck .class_init = aspeed_machine_supermicro_x11spi_bmc_class_init, 167047936597SGuenter Roeck }, { 1671baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("ast2500-evb"), 1672baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1673baa4732bSCédric Le Goater .class_init = aspeed_machine_ast2500_evb_class_init, 1674baa4732bSCédric Le Goater }, { 1675baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("romulus-bmc"), 1676baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1677baa4732bSCédric Le Goater .class_init = aspeed_machine_romulus_class_init, 1678baa4732bSCédric Le Goater }, { 1679143b040fSPatrick Williams .name = MACHINE_TYPE_NAME("sonorapass-bmc"), 1680143b040fSPatrick Williams .parent = TYPE_ASPEED_MACHINE, 1681143b040fSPatrick Williams .class_init = aspeed_machine_sonorapass_class_init, 1682143b040fSPatrick Williams }, { 1683baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("witherspoon-bmc"), 1684baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1685baa4732bSCédric Le Goater .class_init = aspeed_machine_witherspoon_class_init, 1686baa4732bSCédric Le Goater }, { 1687baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("ast2600-evb"), 1688baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1689baa4732bSCédric Le Goater .class_init = aspeed_machine_ast2600_evb_class_init, 1690baa4732bSCédric Le Goater }, { 169134f73a81SKarthikeyan Pasupathi .name = MACHINE_TYPE_NAME("yosemitev2-bmc"), 169234f73a81SKarthikeyan Pasupathi .parent = TYPE_ASPEED_MACHINE, 169334f73a81SKarthikeyan Pasupathi .class_init = aspeed_machine_yosemitev2_class_init, 169434f73a81SKarthikeyan Pasupathi }, { 169563ceb818SCédric Le Goater .name = MACHINE_TYPE_NAME("tacoma-bmc"), 169663ceb818SCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 169763ceb818SCédric Le Goater .class_init = aspeed_machine_tacoma_class_init, 169863ceb818SCédric Le Goater }, { 16996c323abaSKarthikeyan Pasupathi .name = MACHINE_TYPE_NAME("tiogapass-bmc"), 17006c323abaSKarthikeyan Pasupathi .parent = TYPE_ASPEED_MACHINE, 17016c323abaSKarthikeyan Pasupathi .class_init = aspeed_machine_tiogapass_class_init, 17026c323abaSKarthikeyan Pasupathi }, { 170395f068c8SJohn Wang .name = MACHINE_TYPE_NAME("g220a-bmc"), 170495f068c8SJohn Wang .parent = TYPE_ASPEED_MACHINE, 170595f068c8SJohn Wang .class_init = aspeed_machine_g220a_class_init, 170695f068c8SJohn Wang }, { 1707fb6b3c8dSJae Hyun Yoo .name = MACHINE_TYPE_NAME("qcom-dc-scm-v1-bmc"), 1708fb6b3c8dSJae Hyun Yoo .parent = TYPE_ASPEED_MACHINE, 1709fb6b3c8dSJae Hyun Yoo .class_init = aspeed_machine_qcom_dc_scm_v1_class_init, 1710fb6b3c8dSJae Hyun Yoo }, { 1711ece4cccdSGraeme Gregory .name = MACHINE_TYPE_NAME("qcom-firework-bmc"), 1712ece4cccdSGraeme Gregory .parent = TYPE_ASPEED_MACHINE, 1713ece4cccdSGraeme Gregory .class_init = aspeed_machine_qcom_firework_class_init, 1714ece4cccdSGraeme Gregory }, { 171582b6a3f6SJohn Wang .name = MACHINE_TYPE_NAME("fp5280g2-bmc"), 171682b6a3f6SJohn Wang .parent = TYPE_ASPEED_MACHINE, 171782b6a3f6SJohn Wang .class_init = aspeed_machine_fp5280g2_class_init, 171882b6a3f6SJohn Wang }, { 17199cccb912SPatrick Venture .name = MACHINE_TYPE_NAME("quanta-q71l-bmc"), 17209cccb912SPatrick Venture .parent = TYPE_ASPEED_MACHINE, 17219cccb912SPatrick Venture .class_init = aspeed_machine_quanta_q71l_class_init, 17229cccb912SPatrick Venture }, { 172358e52bdbSCédric Le Goater .name = MACHINE_TYPE_NAME("rainier-bmc"), 172458e52bdbSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 172558e52bdbSCédric Le Goater .class_init = aspeed_machine_rainier_class_init, 172658e52bdbSCédric Le Goater }, { 1727febbe308SPeter Delevoryas .name = MACHINE_TYPE_NAME("fuji-bmc"), 1728febbe308SPeter Delevoryas .parent = TYPE_ASPEED_MACHINE, 1729febbe308SPeter Delevoryas .class_init = aspeed_machine_fuji_class_init, 1730febbe308SPeter Delevoryas }, { 1731a20c54b1SPatrick Williams .name = MACHINE_TYPE_NAME("bletchley-bmc"), 1732a20c54b1SPatrick Williams .parent = TYPE_ASPEED_MACHINE, 1733a20c54b1SPatrick Williams .class_init = aspeed_machine_bletchley_class_init, 1734a20c54b1SPatrick Williams }, { 1735fa699e80SPeter Delevoryas .name = MACHINE_TYPE_NAME("fby35-bmc"), 1736fa699e80SPeter Delevoryas .parent = MACHINE_TYPE_NAME("ast2600-evb"), 1737fa699e80SPeter Delevoryas .class_init = aspeed_machine_fby35_class_init, 1738fa699e80SPeter Delevoryas }, { 173966c895b8SJamin Lin .name = MACHINE_TYPE_NAME("ast1030-evb"), 174066c895b8SJamin Lin .parent = TYPE_ASPEED_MACHINE, 174166c895b8SJamin Lin .class_init = aspeed_minibmc_machine_ast1030_evb_class_init, 174292707992SJamin Lin #ifdef TARGET_AARCH64 174392707992SJamin Lin }, { 174492707992SJamin Lin .name = MACHINE_TYPE_NAME("ast2700-evb"), 174592707992SJamin Lin .parent = TYPE_ASPEED_MACHINE, 174692707992SJamin Lin .class_init = aspeed_machine_ast2700_evb_class_init, 174792707992SJamin Lin #endif 174866c895b8SJamin Lin }, { 1749fca9ca1bSCédric Le Goater .name = TYPE_ASPEED_MACHINE, 175062c2c2ebSCédric Le Goater .parent = TYPE_MACHINE, 1751888b2b03SPhilippe Mathieu-Daudé .instance_size = sizeof(AspeedMachineState), 17521a15311aSCédric Le Goater .instance_init = aspeed_machine_instance_init, 1753fca9ca1bSCédric Le Goater .class_size = sizeof(AspeedMachineClass), 1754fca9ca1bSCédric Le Goater .class_init = aspeed_machine_class_init, 1755baa4732bSCédric Le Goater .abstract = true, 1756baa4732bSCédric Le Goater } 1757fca9ca1bSCédric Le Goater }; 175874fb1f38SCédric Le Goater 1759baa4732bSCédric Le Goater DEFINE_TYPES(aspeed_machine_types) 1760