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" 18*8285490bSCé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" 21044475f3SPhilippe Mathieu-Daudé #include "hw/misc/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é 43ff90606fSCédric Le Goater 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 18163ceb818SCédric Le Goater /* Tacoma hardware value */ 18263ceb818SCédric Le Goater #define TACOMA_BMC_HW_STRAP1 0x00000000 1837582591aSJoel Stanley #define TACOMA_BMC_HW_STRAP2 0x00000040 18463ceb818SCédric Le Goater 18558e52bdbSCédric Le Goater /* Rainier hardware value: (QEMU prototype) */ 186b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP1 0x00422016 187b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP2 0x80000848 18858e52bdbSCédric Le Goater 189febbe308SPeter Delevoryas /* Fuji hardware value */ 190febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP1 0x00000000 191febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP2 0x00000000 192febbe308SPeter Delevoryas 193a20c54b1SPatrick Williams /* Bletchley hardware value */ 194a20c54b1SPatrick Williams /* TODO: Leave same as EVB for now. */ 195a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP1 AST2600_EVB_HW_STRAP1 196a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP2 AST2600_EVB_HW_STRAP2 197a20c54b1SPatrick Williams 198fb6b3c8dSJae Hyun Yoo /* Qualcomm DC-SCM hardware value */ 199fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP1 0x00000000 200fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP2 0x00000041 201fb6b3c8dSJae Hyun Yoo 2029bb6d140SJoel Stanley #define AST_SMP_MAILBOX_BASE 0x1e6e2180 2039bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_ENTRY (AST_SMP_MAILBOX_BASE + 0x0) 2049bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_GOSIGN (AST_SMP_MAILBOX_BASE + 0x4) 2059bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_READY (AST_SMP_MAILBOX_BASE + 0x8) 2069bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_POLLINSN (AST_SMP_MAILBOX_BASE + 0xc) 2079bb6d140SJoel Stanley #define AST_SMP_MBOX_CODE (AST_SMP_MAILBOX_BASE + 0x10) 2089bb6d140SJoel Stanley #define AST_SMP_MBOX_GOSIGN 0xabbaab00 2099bb6d140SJoel Stanley 2109bb6d140SJoel Stanley static void aspeed_write_smpboot(ARMCPU *cpu, 2119bb6d140SJoel Stanley const struct arm_boot_info *info) 2129bb6d140SJoel Stanley { 213902bba54SCédric Le Goater AddressSpace *as = arm_boot_address_space(cpu, info); 214902bba54SCédric Le Goater static const ARMInsnFixup poll_mailbox_ready[] = { 2159bb6d140SJoel Stanley /* 2169bb6d140SJoel Stanley * r2 = per-cpu go sign value 2179bb6d140SJoel Stanley * r1 = AST_SMP_MBOX_FIELD_ENTRY 2189bb6d140SJoel Stanley * r0 = AST_SMP_MBOX_FIELD_GOSIGN 2199bb6d140SJoel Stanley */ 220902bba54SCédric Le Goater { 0xee100fb0 }, /* mrc p15, 0, r0, c0, c0, 5 */ 221902bba54SCédric Le Goater { 0xe21000ff }, /* ands r0, r0, #255 */ 222902bba54SCédric Le Goater { 0xe59f201c }, /* ldr r2, [pc, #28] */ 223902bba54SCédric Le Goater { 0xe1822000 }, /* orr r2, r2, r0 */ 2249bb6d140SJoel Stanley 225902bba54SCédric Le Goater { 0xe59f1018 }, /* ldr r1, [pc, #24] */ 226902bba54SCédric Le Goater { 0xe59f0018 }, /* ldr r0, [pc, #24] */ 2279bb6d140SJoel Stanley 228902bba54SCédric Le Goater { 0xe320f002 }, /* wfe */ 229902bba54SCédric Le Goater { 0xe5904000 }, /* ldr r4, [r0] */ 230902bba54SCédric Le Goater { 0xe1520004 }, /* cmp r2, r4 */ 231902bba54SCédric Le Goater { 0x1afffffb }, /* bne <wfe> */ 232902bba54SCédric Le Goater { 0xe591f000 }, /* ldr pc, [r1] */ 233902bba54SCédric Le Goater { AST_SMP_MBOX_GOSIGN }, 234902bba54SCédric Le Goater { AST_SMP_MBOX_FIELD_ENTRY }, 235902bba54SCédric Le Goater { AST_SMP_MBOX_FIELD_GOSIGN }, 236902bba54SCédric Le Goater { 0, FIXUP_TERMINATOR } 2379bb6d140SJoel Stanley }; 238902bba54SCédric Le Goater static const uint32_t fixupcontext[FIXUP_MAX] = { 0 }; 2399bb6d140SJoel Stanley 240902bba54SCédric Le Goater arm_write_bootloader("aspeed.smpboot", as, info->smp_loader_start, 241902bba54SCédric Le Goater poll_mailbox_ready, fixupcontext); 2429bb6d140SJoel Stanley } 2439bb6d140SJoel Stanley 2449bb6d140SJoel Stanley static void aspeed_reset_secondary(ARMCPU *cpu, 2459bb6d140SJoel Stanley const struct arm_boot_info *info) 2469bb6d140SJoel Stanley { 2479bb6d140SJoel Stanley AddressSpace *as = arm_boot_address_space(cpu, info); 2489bb6d140SJoel Stanley CPUState *cs = CPU(cpu); 2499bb6d140SJoel Stanley 2509bb6d140SJoel Stanley /* info->smp_bootreg_addr */ 2519bb6d140SJoel Stanley address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0, 2529bb6d140SJoel Stanley MEMTXATTRS_UNSPECIFIED, NULL); 2539bb6d140SJoel Stanley cpu_set_pc(cs, info->smp_loader_start); 2549bb6d140SJoel Stanley } 2559bb6d140SJoel Stanley 2568b744a6aSCédric Le Goater static void write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size, 257d769a1daSCédric Le Goater Error **errp) 258d769a1daSCédric Le Goater { 25905e6e40aSWentao_Liang g_autofree void *storage = NULL; 2600c7209beSCédric Le Goater int64_t size; 261d769a1daSCédric Le Goater 2620c7209beSCédric Le Goater /* The block backend size should have already been 'validated' by 2630c7209beSCédric Le Goater * the creation of the m25p80 object. 2640c7209beSCédric Le Goater */ 2650c7209beSCédric Le Goater size = blk_getlength(blk); 2660c7209beSCédric Le Goater if (size <= 0) { 2670c7209beSCédric Le Goater error_setg(errp, "failed to get flash size"); 2680c7209beSCédric Le Goater return; 2690c7209beSCédric Le Goater } 2700c7209beSCédric Le Goater 2710c7209beSCédric Le Goater if (rom_size > size) { 2720c7209beSCédric Le Goater rom_size = size; 273d769a1daSCédric Le Goater } 274d769a1daSCédric Le Goater 27505e6e40aSWentao_Liang storage = g_malloc0(rom_size); 276a9262f55SAlberto Faria if (blk_pread(blk, 0, rom_size, storage, 0) < 0) { 277d769a1daSCédric Le Goater error_setg(errp, "failed to read the initial flash content"); 278d769a1daSCédric Le Goater return; 279d769a1daSCédric Le Goater } 280d769a1daSCédric Le Goater 281d769a1daSCédric Le Goater rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr); 282d769a1daSCédric Le Goater } 283d769a1daSCédric Le Goater 2848b744a6aSCédric Le Goater /* 2858b744a6aSCédric Le Goater * Create a ROM and copy the flash contents at the expected address 2868b744a6aSCédric Le Goater * (0x0). Boots faster than execute-in-place. 2878b744a6aSCédric Le Goater */ 288262259eaSCédric Le Goater static void aspeed_install_boot_rom(AspeedMachineState *bmc, BlockBackend *blk, 2898b744a6aSCédric Le Goater uint64_t rom_size) 2908b744a6aSCédric Le Goater { 291262259eaSCédric Le Goater AspeedSoCState *soc = &bmc->soc; 2928b744a6aSCédric Le Goater 293262259eaSCédric Le Goater memory_region_init_rom(&bmc->boot_rom, NULL, "aspeed.boot_rom", rom_size, 2948b744a6aSCédric Le Goater &error_abort); 2958b744a6aSCédric Le Goater memory_region_add_subregion_overlap(&soc->spi_boot_container, 0, 296262259eaSCédric Le Goater &bmc->boot_rom, 1); 2978b744a6aSCédric Le Goater write_boot_rom(blk, ASPEED_SOC_SPI_BOOT_ADDR, rom_size, &error_abort); 2988b744a6aSCédric Le Goater } 2998b744a6aSCédric Le Goater 3001099ad10SPeter Delevoryas void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype, 3019bd4ac61SCédric Le Goater unsigned int count, int unit0) 302e1ad9bc4SCédric Le Goater { 303e1ad9bc4SCédric Le Goater int i; 304179b2058SPatrick Williams 305179b2058SPatrick Williams if (!flashtype) { 306179b2058SPatrick Williams return; 307179b2058SPatrick Williams } 308e1ad9bc4SCédric Le Goater 3099bd4ac61SCédric Le Goater for (i = 0; i < count; ++i) { 3108ec239f2SMarkus Armbruster DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i); 311a7d78befSCédric Le Goater DeviceState *dev; 312e1ad9bc4SCédric Le Goater 313a7d78befSCédric Le Goater dev = qdev_new(flashtype); 314e1ad9bc4SCédric Le Goater if (dinfo) { 315a7d78befSCédric Le Goater qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo)); 316e1ad9bc4SCédric Le Goater } 31727a2c66cSCédric Le Goater qdev_prop_set_uint8(dev, "cs", i); 318a7d78befSCédric Le Goater qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal); 319e1ad9bc4SCédric Le Goater } 320e1ad9bc4SCédric Le Goater } 321e1ad9bc4SCédric Le Goater 322a29e3e12SAndrew Jeffery static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo) 323a29e3e12SAndrew Jeffery { 324a29e3e12SAndrew Jeffery DeviceState *card; 325a29e3e12SAndrew Jeffery 326756f739bSPhilippe Mathieu-Daudé if (!dinfo) { 327756f739bSPhilippe Mathieu-Daudé return; 328756f739bSPhilippe Mathieu-Daudé } 3293e80f690SMarkus Armbruster card = qdev_new(TYPE_SD_CARD); 330934df912SMarkus Armbruster qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo), 331a29e3e12SAndrew Jeffery &error_fatal); 3323e80f690SMarkus Armbruster qdev_realize_and_unref(card, 3333e80f690SMarkus Armbruster qdev_get_child_bus(DEVICE(sdhci), "sd-bus"), 3343e80f690SMarkus Armbruster &error_fatal); 335a29e3e12SAndrew Jeffery } 336a29e3e12SAndrew Jeffery 337d2b3eaefSPeter Delevoryas static void connect_serial_hds_to_uarts(AspeedMachineState *bmc) 338d2b3eaefSPeter Delevoryas { 339d2b3eaefSPeter Delevoryas AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc); 340d2b3eaefSPeter Delevoryas AspeedSoCState *s = &bmc->soc; 341d2b3eaefSPeter Delevoryas AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s); 342f65f6ad5SCédric Le Goater int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default; 343d2b3eaefSPeter Delevoryas 344f65f6ad5SCédric Le Goater aspeed_soc_uart_set_chr(s, uart_chosen, serial_hd(0)); 345d2b3eaefSPeter Delevoryas for (int i = 1, uart = ASPEED_DEV_UART1; i < sc->uarts_num; i++, uart++) { 346f65f6ad5SCédric Le Goater if (uart == uart_chosen) { 347d2b3eaefSPeter Delevoryas continue; 348d2b3eaefSPeter Delevoryas } 349d2b3eaefSPeter Delevoryas aspeed_soc_uart_set_chr(s, uart, serial_hd(i)); 350d2b3eaefSPeter Delevoryas } 351d2b3eaefSPeter Delevoryas } 352d2b3eaefSPeter Delevoryas 353baa4732bSCédric Le Goater static void aspeed_machine_init(MachineState *machine) 354327d8e4eSAndrew Jeffery { 355888b2b03SPhilippe Mathieu-Daudé AspeedMachineState *bmc = ASPEED_MACHINE(machine); 356baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine); 357b033271fSCédric Le Goater AspeedSoCClass *sc; 3582bea128cSEddie James int i; 359d3bad7e7SCédric Le Goater NICInfo *nd = &nd_table[0]; 360327d8e4eSAndrew Jeffery 3619fc7fc4dSMarkus Armbruster object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name); 362327d8e4eSAndrew Jeffery 363b033271fSCédric Le Goater sc = ASPEED_SOC_GET_CLASS(&bmc->soc); 364b033271fSCédric Le Goater 365533eb415SIgor Mammedov /* 366346160cbSCédric Le Goater * This will error out if the RAM size is not supported by the 367346160cbSCédric Le Goater * memory controller of the SoC. 368533eb415SIgor Mammedov */ 3696e504a98SPaolo Bonzini object_property_set_uint(OBJECT(&bmc->soc), "ram-size", machine->ram_size, 370533eb415SIgor Mammedov &error_fatal); 371533eb415SIgor Mammedov 372d3bad7e7SCédric Le Goater for (i = 0; i < sc->macs_num; i++) { 373d3bad7e7SCédric Le Goater if ((amc->macs_mask & (1 << i)) && nd->used) { 374d3bad7e7SCédric Le Goater qemu_check_nic_model(nd, TYPE_FTGMAC100); 375d3bad7e7SCédric Le Goater qdev_set_nic_properties(DEVICE(&bmc->soc.ftgmac100[i]), nd); 376d3bad7e7SCédric Le Goater nd++; 377d3bad7e7SCédric Le Goater } 378d3bad7e7SCédric Le Goater } 379d3bad7e7SCédric Le Goater 3805325cc34SMarkus Armbruster object_property_set_int(OBJECT(&bmc->soc), "hw-strap1", amc->hw_strap1, 38187e79af0SAndrew Jeffery &error_abort); 3825325cc34SMarkus Armbruster object_property_set_int(OBJECT(&bmc->soc), "hw-strap2", amc->hw_strap2, 383ccc2c418SCédric Le Goater &error_abort); 3844dd9d554SPeter Delevoryas object_property_set_link(OBJECT(&bmc->soc), "memory", 3854dd9d554SPeter Delevoryas OBJECT(get_system_memory()), &error_abort); 3865325cc34SMarkus Armbruster object_property_set_link(OBJECT(&bmc->soc), "dram", 3870df2d9a6SCédric Le Goater OBJECT(machine->ram), &error_abort); 388b6e70d1dSJoel Stanley if (machine->kernel_filename) { 389b6e70d1dSJoel Stanley /* 390b6e70d1dSJoel Stanley * When booting with a -kernel command line there is no u-boot 391b6e70d1dSJoel Stanley * that runs to unlock the SCU. In this case set the default to 392b6e70d1dSJoel Stanley * be unlocked as the kernel expects 393b6e70d1dSJoel Stanley */ 3945325cc34SMarkus Armbruster object_property_set_int(OBJECT(&bmc->soc), "hw-prot-key", 3955325cc34SMarkus Armbruster ASPEED_SCU_PROT_KEY, &error_abort); 396b6e70d1dSJoel Stanley } 397d2b3eaefSPeter Delevoryas connect_serial_hds_to_uarts(bmc); 398ce189ab2SMarkus Armbruster qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort); 399327d8e4eSAndrew Jeffery 400c7e313aeSCédric Le Goater if (defaults_enabled()) { 4018ec239f2SMarkus Armbruster aspeed_board_init_flashes(&bmc->soc.fmc, 4028ec239f2SMarkus Armbruster bmc->fmc_model ? bmc->fmc_model : amc->fmc_model, 4039bd4ac61SCédric Le Goater amc->num_cs, 0); 4048ec239f2SMarkus Armbruster aspeed_board_init_flashes(&bmc->soc.spi[0], 4058ec239f2SMarkus Armbruster bmc->spi_model ? bmc->spi_model : amc->spi_model, 4069bd4ac61SCédric Le Goater 1, amc->num_cs); 407c7e313aeSCédric Le Goater } 408e1ad9bc4SCédric Le Goater 409b7f1a0cbSCédric Le Goater if (machine->kernel_filename && sc->num_cpus > 1) { 4109bb6d140SJoel Stanley /* With no u-boot we must set up a boot stub for the secondary CPU */ 4119bb6d140SJoel Stanley MemoryRegion *smpboot = g_new(MemoryRegion, 1); 412f489960dSPhilippe Mathieu-Daudé memory_region_init_ram(smpboot, NULL, "aspeed.smpboot", 4139bb6d140SJoel Stanley 0x80, &error_abort); 4149bb6d140SJoel Stanley memory_region_add_subregion(get_system_memory(), 4159bb6d140SJoel Stanley AST_SMP_MAILBOX_BASE, smpboot); 4169bb6d140SJoel Stanley 4179bb6d140SJoel Stanley aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot; 4189bb6d140SJoel Stanley aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary; 4199bb6d140SJoel Stanley aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE; 4209bb6d140SJoel Stanley } 4219bb6d140SJoel Stanley 4226e504a98SPaolo Bonzini aspeed_board_binfo.ram_size = machine->ram_size; 423347df6f8SEduardo Habkost aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM]; 424b033271fSCédric Le Goater 425baa4732bSCédric Le Goater if (amc->i2c_init) { 426baa4732bSCédric Le Goater amc->i2c_init(bmc); 4272cf6cb50SCédric Le Goater } 4282cf6cb50SCédric Le Goater 4290e2c24c6SAndrew Jeffery for (i = 0; i < bmc->soc.sdhci.num_slots; i++) { 4308ec239f2SMarkus Armbruster sdhci_attach_drive(&bmc->soc.sdhci.slots[i], 4318ec239f2SMarkus Armbruster drive_get(IF_SD, 0, i)); 432a29e3e12SAndrew Jeffery } 4332bea128cSEddie James 434a29e3e12SAndrew Jeffery if (bmc->soc.emmc.num_slots) { 4358ec239f2SMarkus Armbruster sdhci_attach_drive(&bmc->soc.emmc.slots[0], 4368ec239f2SMarkus Armbruster drive_get(IF_SD, 0, bmc->soc.sdhci.num_slots)); 4372bea128cSEddie James } 4382bea128cSEddie James 4398b744a6aSCédric Le Goater if (!bmc->mmio_exec) { 440*8285490bSCédric Le Goater DeviceState *dev = ssi_get_cs(bmc->soc.fmc.spi, 0); 441*8285490bSCédric Le Goater BlockBackend *fmc0 = dev ? m25p80_get_blk(dev) : NULL; 4428b744a6aSCédric Le Goater 443*8285490bSCédric Le Goater if (fmc0) { 4448b744a6aSCédric Le Goater uint64_t rom_size = memory_region_size(&bmc->soc.spi_boot); 445*8285490bSCédric Le Goater aspeed_install_boot_rom(bmc, fmc0, rom_size); 4468b744a6aSCédric Le Goater } 4478b744a6aSCédric Le Goater } 4488b744a6aSCédric Le Goater 4492744ece8STao Xu arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo); 450327d8e4eSAndrew Jeffery } 451327d8e4eSAndrew Jeffery 452612b219aSPhilippe Mathieu-Daudé static void palmetto_bmc_i2c_init(AspeedMachineState *bmc) 4532cf6cb50SCédric Le Goater { 4542cf6cb50SCédric Le Goater AspeedSoCState *soc = &bmc->soc; 455a87e81b9SCédric Le Goater DeviceState *dev; 4563d165f12SCédric Le Goater uint8_t *eeprom_buf = g_malloc0(32 * 1024); 4572cf6cb50SCédric Le Goater 4582cf6cb50SCédric Le Goater /* The palmetto platform expects a ds3231 RTC but a ds1338 is 4592cf6cb50SCédric Le Goater * enough to provide basic RTC features. Alarms will be missing */ 4601373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68); 461a87e81b9SCédric Le Goater 4627a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, 4633d165f12SCédric Le Goater eeprom_buf); 4643d165f12SCédric Le Goater 465a87e81b9SCédric Le Goater /* add a TMP423 temperature sensor */ 4661373b15bSPhilippe Mathieu-Daudé dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), 4671373b15bSPhilippe Mathieu-Daudé "tmp423", 0x4c)); 4685325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 4695325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 4705325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 4715325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort); 4722cf6cb50SCédric Le Goater } 4732cf6cb50SCédric Le Goater 4749cccb912SPatrick Venture static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc) 4759cccb912SPatrick Venture { 4769cccb912SPatrick Venture AspeedSoCState *soc = &bmc->soc; 4779cccb912SPatrick Venture 4789cccb912SPatrick Venture /* 4799cccb912SPatrick Venture * The quanta-q71l platform expects tmp75s which are compatible with 4809cccb912SPatrick Venture * tmp105s. 4819cccb912SPatrick Venture */ 4829cccb912SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c); 4839cccb912SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e); 4849cccb912SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f); 4859cccb912SPatrick Venture 4869cccb912SPatrick Venture /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */ 4879cccb912SPatrick Venture /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */ 4889cccb912SPatrick Venture /* TODO: Add Memory Riser i2c mux and eeproms. */ 4899cccb912SPatrick Venture 4903ec75e39SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74); 4913ec75e39SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77); 4923ec75e39SPatrick Venture 4939cccb912SPatrick Venture /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */ 4943ec75e39SPatrick Venture 4953ec75e39SPatrick Venture /* i2c-7 */ 4963ec75e39SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70); 4979cccb912SPatrick Venture /* - i2c@0: pmbus@59 */ 4989cccb912SPatrick Venture /* - i2c@1: pmbus@58 */ 4999cccb912SPatrick Venture /* - i2c@2: pmbus@58 */ 5009cccb912SPatrick Venture /* - i2c@3: pmbus@59 */ 5013ec75e39SPatrick Venture 5029cccb912SPatrick Venture /* TODO: i2c-7: Add PDB FRU eeprom@52 */ 5039cccb912SPatrick Venture /* TODO: i2c-8: Add BMC FRU eeprom@50 */ 5049cccb912SPatrick Venture } 5059cccb912SPatrick Venture 506612b219aSPhilippe Mathieu-Daudé static void ast2500_evb_i2c_init(AspeedMachineState *bmc) 5072cf6cb50SCédric Le Goater { 5082cf6cb50SCédric Le Goater AspeedSoCState *soc = &bmc->soc; 5093d165f12SCédric Le Goater uint8_t *eeprom_buf = g_malloc0(8 * 1024); 5103d165f12SCédric Le Goater 5117a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50, 5123d165f12SCédric Le Goater eeprom_buf); 5132cf6cb50SCédric Le Goater 5142cf6cb50SCédric Le Goater /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */ 5151373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), 516044475f3SPhilippe Mathieu-Daudé TYPE_TMP105, 0x4d); 5172cf6cb50SCédric Le Goater } 5182cf6cb50SCédric Le Goater 519612b219aSPhilippe Mathieu-Daudé static void ast2600_evb_i2c_init(AspeedMachineState *bmc) 520ccc2c418SCédric Le Goater { 52152bcd997SHoward Chiu AspeedSoCState *soc = &bmc->soc; 52252bcd997SHoward Chiu uint8_t *eeprom_buf = g_malloc0(8 * 1024); 52352bcd997SHoward Chiu 52452bcd997SHoward Chiu smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 52552bcd997SHoward Chiu eeprom_buf); 52652bcd997SHoward Chiu 52752bcd997SHoward Chiu /* LM75 is compatible with TMP105 driver */ 52852bcd997SHoward Chiu i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), 52952bcd997SHoward Chiu TYPE_TMP105, 0x4d); 530ccc2c418SCédric Le Goater } 531ccc2c418SCédric Le Goater 53234f73a81SKarthikeyan Pasupathi static void yosemitev2_bmc_i2c_init(AspeedMachineState *bmc) 53334f73a81SKarthikeyan Pasupathi { 53434f73a81SKarthikeyan Pasupathi AspeedSoCState *soc = &bmc->soc; 53534f73a81SKarthikeyan Pasupathi 53634f73a81SKarthikeyan Pasupathi at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x51, 128 * KiB); 53734f73a81SKarthikeyan Pasupathi at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 128 * KiB, 53834f73a81SKarthikeyan Pasupathi yosemitev2_bmc_fruid, yosemitev2_bmc_fruid_len); 5390a1f86baSKarthikeyan Pasupathi /* TMP421 */ 5400a1f86baSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "tmp421", 0x1f); 5410a1f86baSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4e); 5420a1f86baSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4f); 5430a1f86baSKarthikeyan Pasupathi 54434f73a81SKarthikeyan Pasupathi } 54534f73a81SKarthikeyan Pasupathi 546612b219aSPhilippe Mathieu-Daudé static void romulus_bmc_i2c_init(AspeedMachineState *bmc) 5476c4567c7SCédric Le Goater { 5486c4567c7SCédric Le Goater AspeedSoCState *soc = &bmc->soc; 5496c4567c7SCédric Le Goater 5506c4567c7SCédric Le Goater /* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is 5516c4567c7SCédric Le Goater * good enough */ 5521373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32); 5536c4567c7SCédric Le Goater } 5546c4567c7SCédric Le Goater 5556c323abaSKarthikeyan Pasupathi static void tiogapass_bmc_i2c_init(AspeedMachineState *bmc) 5566c323abaSKarthikeyan Pasupathi { 5576c323abaSKarthikeyan Pasupathi AspeedSoCState *soc = &bmc->soc; 5586c323abaSKarthikeyan Pasupathi 5596c323abaSKarthikeyan Pasupathi at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 128 * KiB); 5606c323abaSKarthikeyan Pasupathi at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 6), 0x54, 128 * KiB, 5616c323abaSKarthikeyan Pasupathi tiogapass_bmc_fruid, tiogapass_bmc_fruid_len); 562a09d357dSKarthikeyan Pasupathi /* TMP421 */ 563a09d357dSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "tmp421", 0x1f); 564a09d357dSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4f); 565a09d357dSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4e); 5666c323abaSKarthikeyan Pasupathi } 5676c323abaSKarthikeyan Pasupathi 568f4aec252SCédric Le Goater static void create_pca9552(AspeedSoCState *soc, int bus_id, int addr) 569f4aec252SCédric Le Goater { 570f4aec252SCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, bus_id), 571f4aec252SCédric Le Goater TYPE_PCA9552, addr); 572f4aec252SCédric Le Goater } 573f4aec252SCédric Le Goater 574612b219aSPhilippe Mathieu-Daudé static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc) 575143b040fSPatrick Williams { 576143b040fSPatrick Williams AspeedSoCState *soc = &bmc->soc; 577143b040fSPatrick Williams 578143b040fSPatrick Williams /* bus 2 : */ 5791373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48); 5801373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49); 581143b040fSPatrick Williams /* bus 2 : pca9546 @ 0x73 */ 582143b040fSPatrick Williams 583143b040fSPatrick Williams /* bus 3 : pca9548 @ 0x70 */ 584143b040fSPatrick Williams 585143b040fSPatrick Williams /* bus 4 : */ 586143b040fSPatrick Williams uint8_t *eeprom4_54 = g_malloc0(8 * 1024); 5877a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 588143b040fSPatrick Williams eeprom4_54); 589143b040fSPatrick Williams /* PCA9539 @ 0x76, but PCA9552 is compatible */ 590f4aec252SCédric Le Goater create_pca9552(soc, 4, 0x76); 591143b040fSPatrick Williams /* PCA9539 @ 0x77, but PCA9552 is compatible */ 592f4aec252SCédric Le Goater create_pca9552(soc, 4, 0x77); 593143b040fSPatrick Williams 594143b040fSPatrick Williams /* bus 6 : */ 5951373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48); 5961373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49); 597143b040fSPatrick Williams /* bus 6 : pca9546 @ 0x73 */ 598143b040fSPatrick Williams 599143b040fSPatrick Williams /* bus 8 : */ 600143b040fSPatrick Williams uint8_t *eeprom8_56 = g_malloc0(8 * 1024); 6017a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56, 602143b040fSPatrick Williams eeprom8_56); 603f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x60); 604f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x61); 605143b040fSPatrick Williams /* bus 8 : adc128d818 @ 0x1d */ 606143b040fSPatrick Williams /* bus 8 : adc128d818 @ 0x1f */ 607143b040fSPatrick Williams 608143b040fSPatrick Williams /* 609143b040fSPatrick Williams * bus 13 : pca9548 @ 0x71 610143b040fSPatrick Williams * - channel 3: 611143b040fSPatrick Williams * - tmm421 @ 0x4c 612143b040fSPatrick Williams * - tmp421 @ 0x4e 613143b040fSPatrick Williams * - tmp421 @ 0x4f 614143b040fSPatrick Williams */ 615143b040fSPatrick Williams 616143b040fSPatrick Williams } 617143b040fSPatrick Williams 618612b219aSPhilippe Mathieu-Daudé static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc) 61962c2c2ebSCédric Le Goater { 6207cfbde5eSPhilippe Mathieu-Daudé static const struct { 6217cfbde5eSPhilippe Mathieu-Daudé unsigned gpio_id; 6227cfbde5eSPhilippe Mathieu-Daudé LEDColor color; 6237cfbde5eSPhilippe Mathieu-Daudé const char *description; 6247cfbde5eSPhilippe Mathieu-Daudé bool gpio_polarity; 6257cfbde5eSPhilippe Mathieu-Daudé } pca1_leds[] = { 6267cfbde5eSPhilippe Mathieu-Daudé {13, LED_COLOR_GREEN, "front-fault-4", GPIO_POLARITY_ACTIVE_LOW}, 6277cfbde5eSPhilippe Mathieu-Daudé {14, LED_COLOR_GREEN, "front-power-3", GPIO_POLARITY_ACTIVE_LOW}, 6287cfbde5eSPhilippe Mathieu-Daudé {15, LED_COLOR_GREEN, "front-id-5", GPIO_POLARITY_ACTIVE_LOW}, 6297cfbde5eSPhilippe Mathieu-Daudé }; 63062c2c2ebSCédric Le Goater AspeedSoCState *soc = &bmc->soc; 6313d165f12SCédric Le Goater uint8_t *eeprom_buf = g_malloc0(8 * 1024); 63215ce12cfSPhilippe Mathieu-Daudé DeviceState *dev; 6337cfbde5eSPhilippe Mathieu-Daudé LEDState *led; 63462c2c2ebSCédric Le Goater 63563ceb818SCédric Le Goater /* Bus 3: TODO bmp280@77 */ 636db437ca6SPhilippe Mathieu-Daudé dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60)); 63715ce12cfSPhilippe Mathieu-Daudé qdev_prop_set_string(dev, "description", "pca1"); 6382616f572SPhilippe Mathieu-Daudé i2c_slave_realize_and_unref(I2C_SLAVE(dev), 6392616f572SPhilippe Mathieu-Daudé aspeed_i2c_get_bus(&soc->i2c, 3), 64015ce12cfSPhilippe Mathieu-Daudé &error_fatal); 6418c9a61d7SCédric Le Goater 6427cfbde5eSPhilippe Mathieu-Daudé for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) { 6437cfbde5eSPhilippe Mathieu-Daudé led = led_create_simple(OBJECT(bmc), 6447cfbde5eSPhilippe Mathieu-Daudé pca1_leds[i].gpio_polarity, 6457cfbde5eSPhilippe Mathieu-Daudé pca1_leds[i].color, 6467cfbde5eSPhilippe Mathieu-Daudé pca1_leds[i].description); 6477cfbde5eSPhilippe Mathieu-Daudé qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id, 6487cfbde5eSPhilippe Mathieu-Daudé qdev_get_gpio_in(DEVICE(led), 0)); 6497cfbde5eSPhilippe Mathieu-Daudé } 650b61ea6e7SJoel Stanley i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76); 6512a75e8c3SMaheswara Kurapati i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "max31785", 0x52); 6521373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c); 6531373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c); 65462c2c2ebSCédric Le Goater 65562c2c2ebSCédric Le Goater /* The Witherspoon expects a TMP275 but a TMP105 is compatible */ 6561373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105, 657044475f3SPhilippe Mathieu-Daudé 0x4a); 6586c4567c7SCédric Le Goater 6596c4567c7SCédric Le Goater /* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is 6606c4567c7SCédric Le Goater * good enough */ 6611373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32); 6623d165f12SCédric Le Goater 6637a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51, 6643d165f12SCédric Le Goater eeprom_buf); 665db437ca6SPhilippe Mathieu-Daudé dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60)); 66615ce12cfSPhilippe Mathieu-Daudé qdev_prop_set_string(dev, "description", "pca0"); 6672616f572SPhilippe Mathieu-Daudé i2c_slave_realize_and_unref(I2C_SLAVE(dev), 6682616f572SPhilippe Mathieu-Daudé aspeed_i2c_get_bus(&soc->i2c, 11), 66915ce12cfSPhilippe Mathieu-Daudé &error_fatal); 67063ceb818SCédric Le Goater /* Bus 11: TODO ucd90160@64 */ 67162c2c2ebSCédric Le Goater } 67262c2c2ebSCédric Le Goater 67395f068c8SJohn Wang static void g220a_bmc_i2c_init(AspeedMachineState *bmc) 67495f068c8SJohn Wang { 67595f068c8SJohn Wang AspeedSoCState *soc = &bmc->soc; 67695f068c8SJohn Wang DeviceState *dev; 67795f068c8SJohn Wang 67895f068c8SJohn Wang dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), 67995f068c8SJohn Wang "emc1413", 0x4c)); 68095f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 68195f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 68295f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 68395f068c8SJohn Wang 68495f068c8SJohn Wang dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12), 68595f068c8SJohn Wang "emc1413", 0x4c)); 68695f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 68795f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 68895f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 68995f068c8SJohn Wang 69095f068c8SJohn Wang dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13), 69195f068c8SJohn Wang "emc1413", 0x4c)); 69295f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 69395f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 69495f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 6956f5f6507SJohn Wang 6966f5f6507SJohn Wang static uint8_t eeprom_buf[2 * 1024] = { 6976f5f6507SJohn Wang 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe, 6986f5f6507SJohn Wang 0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65, 6996f5f6507SJohn Wang 0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32, 7006f5f6507SJohn Wang 0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42, 7016f5f6507SJohn Wang 0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45, 7026f5f6507SJohn Wang 0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1, 7036f5f6507SJohn Wang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, 7046f5f6507SJohn Wang }; 7056f5f6507SJohn Wang smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57, 7066f5f6507SJohn Wang eeprom_buf); 70795f068c8SJohn Wang } 70895f068c8SJohn Wang 70982b6a3f6SJohn Wang static void fp5280g2_bmc_i2c_init(AspeedMachineState *bmc) 71082b6a3f6SJohn Wang { 71182b6a3f6SJohn Wang AspeedSoCState *soc = &bmc->soc; 71282b6a3f6SJohn Wang I2CSlave *i2c_mux; 71382b6a3f6SJohn Wang 71482b6a3f6SJohn Wang /* The at24c256 */ 71582b6a3f6SJohn Wang at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 1), 0x50, 32768); 71682b6a3f6SJohn Wang 71782b6a3f6SJohn Wang /* The fp5280g2 expects a TMP112 but a TMP105 is compatible */ 71882b6a3f6SJohn Wang i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105, 71982b6a3f6SJohn Wang 0x48); 72082b6a3f6SJohn Wang i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105, 72182b6a3f6SJohn Wang 0x49); 72282b6a3f6SJohn Wang 72382b6a3f6SJohn Wang i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), 72482b6a3f6SJohn Wang "pca9546", 0x70); 72582b6a3f6SJohn Wang /* It expects a TMP112 but a TMP105 is compatible */ 72682b6a3f6SJohn Wang i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0), TYPE_TMP105, 72782b6a3f6SJohn Wang 0x4a); 72882b6a3f6SJohn Wang 72982b6a3f6SJohn Wang /* It expects a ds3232 but a ds1338 is good enough */ 73082b6a3f6SJohn Wang i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "ds1338", 0x68); 73182b6a3f6SJohn Wang 73282b6a3f6SJohn Wang /* It expects a pca9555 but a pca9552 is compatible */ 733f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x30); 73482b6a3f6SJohn Wang } 73582b6a3f6SJohn Wang 73658e52bdbSCédric Le Goater static void rainier_bmc_i2c_init(AspeedMachineState *bmc) 73758e52bdbSCédric Le Goater { 73858e52bdbSCédric Le Goater AspeedSoCState *soc = &bmc->soc; 739fa6d98c0SJoel Stanley I2CSlave *i2c_mux; 740fa6d98c0SJoel Stanley 7419077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB); 74258e52bdbSCédric Le Goater 743f4aec252SCédric Le Goater create_pca9552(soc, 3, 0x61); 744bcb122f8SJoel Stanley 74558e52bdbSCédric Le Goater /* The rainier expects a TMP275 but a TMP105 is compatible */ 74658e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105, 74758e52bdbSCédric Le Goater 0x48); 74858e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105, 74958e52bdbSCédric Le Goater 0x49); 75058e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105, 75158e52bdbSCédric Le Goater 0x4a); 752fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), 753fa6d98c0SJoel Stanley "pca9546", 0x70); 7549077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 7559077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 7569077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB); 757f4aec252SCédric Le Goater create_pca9552(soc, 4, 0x60); 75858e52bdbSCédric Le Goater 75958e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105, 76058e52bdbSCédric Le Goater 0x48); 76158e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105, 76258e52bdbSCédric Le Goater 0x49); 763f4aec252SCédric Le Goater create_pca9552(soc, 5, 0x60); 764f4aec252SCédric Le Goater create_pca9552(soc, 5, 0x61); 765fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), 766fa6d98c0SJoel Stanley "pca9546", 0x70); 7679077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 7689077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 76958e52bdbSCédric Le Goater 77058e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105, 77158e52bdbSCédric Le Goater 0x48); 77258e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105, 77358e52bdbSCédric Le Goater 0x4a); 77458e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105, 77558e52bdbSCédric Le Goater 0x4b); 776fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), 777fa6d98c0SJoel Stanley "pca9546", 0x70); 7789077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 7799077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 7809077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB); 7819077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB); 78258e52bdbSCédric Le Goater 783f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x30); 784f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x31); 785f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x32); 786f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x33); 787f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x60); 788f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x61); 789b61ea6e7SJoel Stanley i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76); 79058e52bdbSCédric Le Goater /* Bus 7: TODO si7021-a20@20 */ 79158e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105, 79258e52bdbSCédric Le Goater 0x48); 7932a75e8c3SMaheswara Kurapati i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "max31785", 0x52); 7949077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB); 7959077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB); 79658e52bdbSCédric Le Goater 79758e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105, 79858e52bdbSCédric Le Goater 0x48); 79958e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105, 80058e52bdbSCédric Le Goater 0x4a); 801be85508fSNinad Palsule at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50, 802be85508fSNinad Palsule 64 * KiB, rainier_bb_fruid, rainier_bb_fruid_len); 803be85508fSNinad Palsule at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 804be85508fSNinad Palsule 64 * KiB, rainier_bmc_fruid, rainier_bmc_fruid_len); 805f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x60); 806f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x61); 80758e52bdbSCédric Le Goater /* Bus 8: ucd90320@11 */ 80858e52bdbSCédric Le Goater /* Bus 8: ucd90320@b */ 80958e52bdbSCédric Le Goater /* Bus 8: ucd90320@c */ 81058e52bdbSCédric Le Goater 81158e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c); 81258e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d); 8139077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB); 81458e52bdbSCédric Le Goater 81558e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c); 81658e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d); 8179077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB); 81858e52bdbSCédric Le Goater 81958e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105, 82058e52bdbSCédric Le Goater 0x48); 82158e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105, 82258e52bdbSCédric Le Goater 0x49); 823fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), 824fa6d98c0SJoel Stanley "pca9546", 0x70); 8259077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 8269077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 827f4aec252SCédric Le Goater create_pca9552(soc, 11, 0x60); 828fa6d98c0SJoel Stanley 829fa6d98c0SJoel Stanley 8309077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB); 831f4aec252SCédric Le Goater create_pca9552(soc, 13, 0x60); 832fa6d98c0SJoel Stanley 8339077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB); 834f4aec252SCédric Le Goater create_pca9552(soc, 14, 0x60); 835fa6d98c0SJoel Stanley 8369077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB); 837f4aec252SCédric Le Goater create_pca9552(soc, 15, 0x60); 83858e52bdbSCédric Le Goater } 83958e52bdbSCédric Le Goater 840febbe308SPeter Delevoryas static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr, 841febbe308SPeter Delevoryas I2CBus **channels) 842febbe308SPeter Delevoryas { 843febbe308SPeter Delevoryas I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr); 844febbe308SPeter Delevoryas for (int i = 0; i < 8; i++) { 845febbe308SPeter Delevoryas channels[i] = pca954x_i2c_get_bus(mux, i); 846febbe308SPeter Delevoryas } 847febbe308SPeter Delevoryas } 848febbe308SPeter Delevoryas 849febbe308SPeter Delevoryas #define TYPE_LM75 TYPE_TMP105 850febbe308SPeter Delevoryas #define TYPE_TMP75 TYPE_TMP105 851febbe308SPeter Delevoryas #define TYPE_TMP422 "tmp422" 852febbe308SPeter Delevoryas 853febbe308SPeter Delevoryas static void fuji_bmc_i2c_init(AspeedMachineState *bmc) 854febbe308SPeter Delevoryas { 855febbe308SPeter Delevoryas AspeedSoCState *soc = &bmc->soc; 856febbe308SPeter Delevoryas I2CBus *i2c[144] = {}; 857febbe308SPeter Delevoryas 858febbe308SPeter Delevoryas for (int i = 0; i < 16; i++) { 859febbe308SPeter Delevoryas i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i); 860febbe308SPeter Delevoryas } 861febbe308SPeter Delevoryas I2CBus *i2c180 = i2c[2]; 862febbe308SPeter Delevoryas I2CBus *i2c480 = i2c[8]; 863febbe308SPeter Delevoryas I2CBus *i2c600 = i2c[11]; 864febbe308SPeter Delevoryas 865febbe308SPeter Delevoryas get_pca9548_channels(i2c180, 0x70, &i2c[16]); 866febbe308SPeter Delevoryas get_pca9548_channels(i2c480, 0x70, &i2c[24]); 867febbe308SPeter Delevoryas /* NOTE: The device tree skips [32, 40) in the alias numbering */ 868febbe308SPeter Delevoryas get_pca9548_channels(i2c600, 0x77, &i2c[40]); 869febbe308SPeter Delevoryas get_pca9548_channels(i2c[24], 0x71, &i2c[48]); 870febbe308SPeter Delevoryas get_pca9548_channels(i2c[25], 0x72, &i2c[56]); 871febbe308SPeter Delevoryas get_pca9548_channels(i2c[26], 0x76, &i2c[64]); 872febbe308SPeter Delevoryas get_pca9548_channels(i2c[27], 0x76, &i2c[72]); 873febbe308SPeter Delevoryas for (int i = 0; i < 8; i++) { 874febbe308SPeter Delevoryas get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]); 875febbe308SPeter Delevoryas } 876febbe308SPeter Delevoryas 877febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c); 878febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d); 879febbe308SPeter Delevoryas 880ef0eb67eSSittisak Sinprem /* 881ef0eb67eSSittisak Sinprem * EEPROM 24c64 size is 64Kbits or 8 Kbytes 882ef0eb67eSSittisak Sinprem * 24c02 size is 2Kbits or 256 bytes 883ef0eb67eSSittisak Sinprem */ 884ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[19], 0x52, 8 * KiB); 885ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[20], 0x50, 256); 886ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[22], 0x52, 256); 887febbe308SPeter Delevoryas 888febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x48); 889febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x49); 890febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x4a); 891febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_TMP422, 0x4c); 892febbe308SPeter Delevoryas 893ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[8], 0x51, 8 * KiB); 894febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a); 895febbe308SPeter Delevoryas 896febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[50], TYPE_LM75, 0x4c); 897ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[50], 0x52, 8 * KiB); 898febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[51], TYPE_TMP75, 0x48); 899febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[52], TYPE_TMP75, 0x49); 900febbe308SPeter Delevoryas 901febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[59], TYPE_TMP75, 0x48); 902febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[60], TYPE_TMP75, 0x49); 903febbe308SPeter Delevoryas 904ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[65], 0x53, 8 * KiB); 905febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x49); 906febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x48); 907ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[68], 0x52, 8 * KiB); 908ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[69], 0x52, 8 * KiB); 909ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[70], 0x52, 8 * KiB); 910ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[71], 0x52, 8 * KiB); 911febbe308SPeter Delevoryas 912ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[73], 0x53, 8 * KiB); 913febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x49); 914febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x48); 915ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[76], 0x52, 8 * KiB); 916ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[77], 0x52, 8 * KiB); 917ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[78], 0x52, 8 * KiB); 918ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[79], 0x52, 8 * KiB); 919ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[28], 0x50, 256); 920febbe308SPeter Delevoryas 921febbe308SPeter Delevoryas for (int i = 0; i < 8; i++) { 9229077e09aSPeter Delevoryas at24c_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB); 923febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[82 + i * 8], TYPE_TMP75, 0x48); 924febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[83 + i * 8], TYPE_TMP75, 0x4b); 925febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[84 + i * 8], TYPE_TMP75, 0x4a); 926febbe308SPeter Delevoryas } 927febbe308SPeter Delevoryas } 928febbe308SPeter Delevoryas 929a20c54b1SPatrick Williams #define TYPE_TMP421 "tmp421" 930a20c54b1SPatrick Williams 931a20c54b1SPatrick Williams static void bletchley_bmc_i2c_init(AspeedMachineState *bmc) 932a20c54b1SPatrick Williams { 933a20c54b1SPatrick Williams AspeedSoCState *soc = &bmc->soc; 934a20c54b1SPatrick Williams I2CBus *i2c[13] = {}; 935a20c54b1SPatrick Williams for (int i = 0; i < 13; i++) { 936a20c54b1SPatrick Williams if ((i == 8) || (i == 11)) { 937a20c54b1SPatrick Williams continue; 938a20c54b1SPatrick Williams } 939a20c54b1SPatrick Williams i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i); 940a20c54b1SPatrick Williams } 941a20c54b1SPatrick Williams 942a20c54b1SPatrick Williams /* Bus 0 - 5 all have the same config. */ 943a20c54b1SPatrick Williams for (int i = 0; i < 6; i++) { 944a20c54b1SPatrick Williams /* Missing model: ti,ina230 @ 0x45 */ 945a20c54b1SPatrick Williams /* Missing model: mps,mp5023 @ 0x40 */ 946a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[i], TYPE_TMP421, 0x4f); 947a20c54b1SPatrick Williams /* Missing model: nxp,pca9539 @ 0x76, but PCA9552 works enough */ 948a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x76); 949a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x67); 950a20c54b1SPatrick Williams /* Missing model: fsc,fusb302 @ 0x22 */ 951a20c54b1SPatrick Williams } 952a20c54b1SPatrick Williams 953a20c54b1SPatrick Williams /* Bus 6 */ 954a20c54b1SPatrick Williams at24c_eeprom_init(i2c[6], 0x56, 65536); 955a20c54b1SPatrick Williams /* Missing model: nxp,pcf85263 @ 0x51 , but ds1338 works enough */ 956a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[6], "ds1338", 0x51); 957a20c54b1SPatrick Williams 958a20c54b1SPatrick Williams 959a20c54b1SPatrick Williams /* Bus 7 */ 960a20c54b1SPatrick Williams at24c_eeprom_init(i2c[7], 0x54, 65536); 961a20c54b1SPatrick Williams 962a20c54b1SPatrick Williams /* Bus 9 */ 963a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[9], TYPE_TMP421, 0x4f); 964a20c54b1SPatrick Williams 965a20c54b1SPatrick Williams /* Bus 10 */ 966a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[10], TYPE_TMP421, 0x4f); 967a20c54b1SPatrick Williams /* Missing model: ti,hdc1080 @ 0x40 */ 968a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[10], TYPE_PCA9552, 0x67); 969a20c54b1SPatrick Williams 970a20c54b1SPatrick Williams /* Bus 12 */ 971a20c54b1SPatrick Williams /* Missing model: adi,adm1278 @ 0x11 */ 972a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4c); 973a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4d); 974a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[12], TYPE_PCA9552, 0x67); 975a20c54b1SPatrick Williams } 976a20c54b1SPatrick Williams 977fa699e80SPeter Delevoryas static void fby35_i2c_init(AspeedMachineState *bmc) 978fa699e80SPeter Delevoryas { 979fa699e80SPeter Delevoryas AspeedSoCState *soc = &bmc->soc; 980fa699e80SPeter Delevoryas I2CBus *i2c[16]; 981fa699e80SPeter Delevoryas 982fa699e80SPeter Delevoryas for (int i = 0; i < 16; i++) { 983fa699e80SPeter Delevoryas i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i); 984fa699e80SPeter Delevoryas } 985fa699e80SPeter Delevoryas 986fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[2], TYPE_LM75, 0x4f); 987fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[8], TYPE_TMP421, 0x1f); 988fa699e80SPeter Delevoryas /* Hotswap controller is actually supposed to be mp5920 or ltc4282. */ 989fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[11], "adm1272", 0x44); 990fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4e); 991fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4f); 992fa699e80SPeter Delevoryas 9939077e09aSPeter Delevoryas at24c_eeprom_init(i2c[4], 0x51, 128 * KiB); 9949077e09aSPeter Delevoryas at24c_eeprom_init(i2c[6], 0x51, 128 * KiB); 995c0216b94SPeter Delevoryas at24c_eeprom_init_rom(i2c[8], 0x50, 32 * KiB, fby35_nic_fruid, 996c0216b94SPeter Delevoryas fby35_nic_fruid_len); 997c0216b94SPeter Delevoryas at24c_eeprom_init_rom(i2c[11], 0x51, 128 * KiB, fby35_bb_fruid, 998c0216b94SPeter Delevoryas fby35_bb_fruid_len); 999c0216b94SPeter Delevoryas at24c_eeprom_init_rom(i2c[11], 0x54, 128 * KiB, fby35_bmc_fruid, 1000c0216b94SPeter Delevoryas fby35_bmc_fruid_len); 1001fa699e80SPeter Delevoryas 1002fa699e80SPeter Delevoryas /* 1003fa699e80SPeter Delevoryas * TODO: There is a multi-master i2c connection to an AST1030 MiniBMC on 1004fa699e80SPeter Delevoryas * buses 0, 1, 2, 3, and 9. Source address 0x10, target address 0x20 on 1005fa699e80SPeter Delevoryas * each. 1006fa699e80SPeter Delevoryas */ 1007fa699e80SPeter Delevoryas } 1008fa699e80SPeter Delevoryas 1009fb6b3c8dSJae Hyun Yoo static void qcom_dc_scm_bmc_i2c_init(AspeedMachineState *bmc) 1010fb6b3c8dSJae Hyun Yoo { 1011fb6b3c8dSJae Hyun Yoo AspeedSoCState *soc = &bmc->soc; 1012fb6b3c8dSJae Hyun Yoo 1013fb6b3c8dSJae Hyun Yoo i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 15), "tmp105", 0x4d); 1014fb6b3c8dSJae Hyun Yoo } 1015fb6b3c8dSJae Hyun Yoo 1016ece4cccdSGraeme Gregory static void qcom_dc_scm_firework_i2c_init(AspeedMachineState *bmc) 1017ece4cccdSGraeme Gregory { 1018ece4cccdSGraeme Gregory AspeedSoCState *soc = &bmc->soc; 10192a7a5d5cSJae Hyun Yoo I2CSlave *therm_mux, *cpuvr_mux; 1020ece4cccdSGraeme Gregory 1021ece4cccdSGraeme Gregory /* Create the generic DC-SCM hardware */ 1022ece4cccdSGraeme Gregory qcom_dc_scm_bmc_i2c_init(bmc); 1023ece4cccdSGraeme Gregory 1024ece4cccdSGraeme Gregory /* Now create the Firework specific hardware */ 10252a75e8c3SMaheswara Kurapati 10262a7a5d5cSJae Hyun Yoo /* I2C7 CPUVR MUX */ 10272a7a5d5cSJae Hyun Yoo cpuvr_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), 10282a7a5d5cSJae Hyun Yoo "pca9546", 0x70); 10292a7a5d5cSJae Hyun Yoo i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 0), "pca9548", 0x72); 10302a7a5d5cSJae Hyun Yoo i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 1), "pca9548", 0x72); 10312a7a5d5cSJae Hyun Yoo i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 2), "pca9548", 0x72); 10322a7a5d5cSJae Hyun Yoo i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 3), "pca9548", 0x72); 10332a7a5d5cSJae Hyun Yoo 1034cfc68f16SMaheswara Kurapati /* I2C8 Thermal Diodes*/ 1035cfc68f16SMaheswara Kurapati therm_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), 1036cfc68f16SMaheswara Kurapati "pca9548", 0x70); 1037cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 0), TYPE_LM75, 0x4C); 1038cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 1), TYPE_LM75, 0x4C); 1039cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 2), TYPE_LM75, 0x48); 1040cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 3), TYPE_LM75, 0x48); 1041cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 4), TYPE_LM75, 0x48); 1042cfc68f16SMaheswara Kurapati 10432a75e8c3SMaheswara Kurapati /* I2C9 Fan Controller (MAX31785) */ 10442a75e8c3SMaheswara Kurapati i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x52); 10452a75e8c3SMaheswara Kurapati i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x54); 1046ece4cccdSGraeme Gregory } 1047ece4cccdSGraeme Gregory 10481a15311aSCédric Le Goater static bool aspeed_get_mmio_exec(Object *obj, Error **errp) 10491a15311aSCédric Le Goater { 10501a15311aSCédric Le Goater return ASPEED_MACHINE(obj)->mmio_exec; 10511a15311aSCédric Le Goater } 10521a15311aSCédric Le Goater 10531a15311aSCédric Le Goater static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp) 10541a15311aSCédric Le Goater { 10551a15311aSCédric Le Goater ASPEED_MACHINE(obj)->mmio_exec = value; 10561a15311aSCédric Le Goater } 10571a15311aSCédric Le Goater 10581a15311aSCédric Le Goater static void aspeed_machine_instance_init(Object *obj) 10591a15311aSCédric Le Goater { 10601a15311aSCédric Le Goater ASPEED_MACHINE(obj)->mmio_exec = false; 10611a15311aSCédric Le Goater } 10621a15311aSCédric Le Goater 10639820e52fSCédric Le Goater static char *aspeed_get_fmc_model(Object *obj, Error **errp) 10649820e52fSCédric Le Goater { 10659820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 10669820e52fSCédric Le Goater return g_strdup(bmc->fmc_model); 10679820e52fSCédric Le Goater } 10689820e52fSCédric Le Goater 10699820e52fSCédric Le Goater static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp) 10709820e52fSCédric Le Goater { 10719820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 10729820e52fSCédric Le Goater 10739820e52fSCédric Le Goater g_free(bmc->fmc_model); 10749820e52fSCédric Le Goater bmc->fmc_model = g_strdup(value); 10759820e52fSCédric Le Goater } 10769820e52fSCédric Le Goater 10779820e52fSCédric Le Goater static char *aspeed_get_spi_model(Object *obj, Error **errp) 10789820e52fSCédric Le Goater { 10799820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 10809820e52fSCédric Le Goater return g_strdup(bmc->spi_model); 10819820e52fSCédric Le Goater } 10829820e52fSCédric Le Goater 10839820e52fSCédric Le Goater static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp) 10849820e52fSCédric Le Goater { 10859820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 10869820e52fSCédric Le Goater 10879820e52fSCédric Le Goater g_free(bmc->spi_model); 10889820e52fSCédric Le Goater bmc->spi_model = g_strdup(value); 10899820e52fSCédric Le Goater } 10909820e52fSCédric Le Goater 1091f65f6ad5SCédric Le Goater static char *aspeed_get_bmc_console(Object *obj, Error **errp) 1092f65f6ad5SCédric Le Goater { 1093f65f6ad5SCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 1094f65f6ad5SCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc); 1095f65f6ad5SCédric Le Goater int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default; 1096f65f6ad5SCédric Le Goater 1097f65f6ad5SCédric Le Goater return g_strdup_printf("uart%d", uart_chosen - ASPEED_DEV_UART1 + 1); 1098f65f6ad5SCédric Le Goater } 1099f65f6ad5SCédric Le Goater 1100f65f6ad5SCédric Le Goater static void aspeed_set_bmc_console(Object *obj, const char *value, Error **errp) 1101f65f6ad5SCédric Le Goater { 1102f65f6ad5SCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 1103f65f6ad5SCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc); 1104f65f6ad5SCédric Le Goater AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(amc->soc_name)); 1105f65f6ad5SCédric Le Goater int val; 1106f65f6ad5SCédric Le Goater 1107f65f6ad5SCédric Le Goater if (sscanf(value, "uart%u", &val) != 1) { 1108f65f6ad5SCédric Le Goater error_setg(errp, "Bad value for \"uart\" property"); 1109f65f6ad5SCédric Le Goater return; 1110f65f6ad5SCédric Le Goater } 1111f65f6ad5SCédric Le Goater 1112f65f6ad5SCédric Le Goater /* The number of UART depends on the SoC */ 1113f65f6ad5SCédric Le Goater if (val < 1 || val > sc->uarts_num) { 1114f65f6ad5SCédric Le Goater error_setg(errp, "\"uart\" should be in range [1 - %d]", sc->uarts_num); 1115f65f6ad5SCédric Le Goater return; 1116f65f6ad5SCédric Le Goater } 1117f65f6ad5SCédric Le Goater bmc->uart_chosen = ASPEED_DEV_UART1 + val - 1; 1118f65f6ad5SCédric Le Goater } 1119f65f6ad5SCédric Le Goater 11201a15311aSCédric Le Goater static void aspeed_machine_class_props_init(ObjectClass *oc) 11211a15311aSCédric Le Goater { 11221a15311aSCédric Le Goater object_class_property_add_bool(oc, "execute-in-place", 11231a15311aSCédric Le Goater aspeed_get_mmio_exec, 1124d2623129SMarkus Armbruster aspeed_set_mmio_exec); 11251a15311aSCédric Le Goater object_class_property_set_description(oc, "execute-in-place", 11267eecec7dSMarkus Armbruster "boot directly from CE0 flash device"); 11279820e52fSCédric Le Goater 1128f65f6ad5SCédric Le Goater object_class_property_add_str(oc, "bmc-console", aspeed_get_bmc_console, 1129f65f6ad5SCédric Le Goater aspeed_set_bmc_console); 1130f65f6ad5SCédric Le Goater object_class_property_set_description(oc, "bmc-console", 1131f65f6ad5SCédric Le Goater "Change the default UART to \"uartX\""); 1132f65f6ad5SCédric Le Goater 11339820e52fSCédric Le Goater object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model, 11349820e52fSCédric Le Goater aspeed_set_fmc_model); 11359820e52fSCédric Le Goater object_class_property_set_description(oc, "fmc-model", 11369820e52fSCédric Le Goater "Change the FMC Flash model"); 11379820e52fSCédric Le Goater object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model, 11389820e52fSCédric Le Goater aspeed_set_spi_model); 11399820e52fSCédric Le Goater object_class_property_set_description(oc, "spi-model", 11409820e52fSCédric Le Goater "Change the SPI Flash model"); 11411a15311aSCédric Le Goater } 11421a15311aSCédric Le Goater 1143b7f1a0cbSCédric Le Goater static int aspeed_soc_num_cpus(const char *soc_name) 1144b7f1a0cbSCédric Le Goater { 1145b7f1a0cbSCédric Le Goater AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(soc_name)); 1146b7f1a0cbSCédric Le Goater return sc->num_cpus; 1147b7f1a0cbSCédric Le Goater } 1148b7f1a0cbSCédric Le Goater 1149fca9ca1bSCédric Le Goater static void aspeed_machine_class_init(ObjectClass *oc, void *data) 115062c2c2ebSCédric Le Goater { 115162c2c2ebSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1152d3bad7e7SCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 115362c2c2ebSCédric Le Goater 1154fca9ca1bSCédric Le Goater mc->init = aspeed_machine_init; 115562c2c2ebSCédric Le Goater mc->no_floppy = 1; 115662c2c2ebSCédric Le Goater mc->no_cdrom = 1; 115762c2c2ebSCédric Le Goater mc->no_parallel = 1; 1158afcbaed6SIgor Mammedov mc->default_ram_id = "ram"; 1159d3bad7e7SCédric Le Goater amc->macs_mask = ASPEED_MAC0_ON; 11605d63d0c7SPeter Delevoryas amc->uart_default = ASPEED_DEV_UART5; 11611a15311aSCédric Le Goater 11621a15311aSCédric Le Goater aspeed_machine_class_props_init(oc); 116362c2c2ebSCédric Le Goater } 116462c2c2ebSCédric Le Goater 1165baa4732bSCédric Le Goater static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data) 1166baa4732bSCédric Le Goater { 1167baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1168baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1169baa4732bSCédric Le Goater 1170baa4732bSCédric Le Goater mc->desc = "OpenPOWER Palmetto BMC (ARM926EJ-S)"; 1171baa4732bSCédric Le Goater amc->soc_name = "ast2400-a1"; 1172baa4732bSCédric Le Goater amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1; 1173baa4732bSCédric Le Goater amc->fmc_model = "n25q256a"; 117470322913SCédric Le Goater amc->spi_model = "mx25l25635f"; 1175baa4732bSCédric Le Goater amc->num_cs = 1; 1176baa4732bSCédric Le Goater amc->i2c_init = palmetto_bmc_i2c_init; 1177baa4732bSCédric Le Goater mc->default_ram_size = 256 * MiB; 1178b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1179b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1180baa4732bSCédric Le Goater }; 1181baa4732bSCédric Le Goater 11829cccb912SPatrick Venture static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data) 11839cccb912SPatrick Venture { 11849cccb912SPatrick Venture MachineClass *mc = MACHINE_CLASS(oc); 11859cccb912SPatrick Venture AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 11869cccb912SPatrick Venture 11879cccb912SPatrick Venture mc->desc = "Quanta-Q71l BMC (ARM926EJ-S)"; 11889cccb912SPatrick Venture amc->soc_name = "ast2400-a1"; 11899cccb912SPatrick Venture amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1; 11909cccb912SPatrick Venture amc->fmc_model = "n25q256a"; 11919cccb912SPatrick Venture amc->spi_model = "mx25l25635e"; 11929cccb912SPatrick Venture amc->num_cs = 1; 11939cccb912SPatrick Venture amc->i2c_init = quanta_q71l_bmc_i2c_init; 11949cccb912SPatrick Venture mc->default_ram_size = 128 * MiB; 11959cccb912SPatrick Venture mc->default_cpus = mc->min_cpus = mc->max_cpus = 11969cccb912SPatrick Venture aspeed_soc_num_cpus(amc->soc_name); 11979cccb912SPatrick Venture } 11989cccb912SPatrick Venture 119940a38df5SErik Smit static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc, 120040a38df5SErik Smit void *data) 120140a38df5SErik Smit { 120240a38df5SErik Smit MachineClass *mc = MACHINE_CLASS(oc); 120340a38df5SErik Smit AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 120440a38df5SErik Smit 120540a38df5SErik Smit mc->desc = "Supermicro X11 BMC (ARM926EJ-S)"; 120640a38df5SErik Smit amc->soc_name = "ast2400-a1"; 120740a38df5SErik Smit amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1; 120840a38df5SErik Smit amc->fmc_model = "mx25l25635e"; 120940a38df5SErik Smit amc->spi_model = "mx25l25635e"; 121040a38df5SErik Smit amc->num_cs = 1; 121140a38df5SErik Smit amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 121240a38df5SErik Smit amc->i2c_init = palmetto_bmc_i2c_init; 121340a38df5SErik Smit mc->default_ram_size = 256 * MiB; 121440a38df5SErik Smit } 121540a38df5SErik Smit 121647936597SGuenter Roeck static void aspeed_machine_supermicro_x11spi_bmc_class_init(ObjectClass *oc, 121747936597SGuenter Roeck void *data) 121847936597SGuenter Roeck { 121947936597SGuenter Roeck MachineClass *mc = MACHINE_CLASS(oc); 122047936597SGuenter Roeck AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 122147936597SGuenter Roeck 122247936597SGuenter Roeck mc->desc = "Supermicro X11 SPI BMC (ARM1176)"; 122347936597SGuenter Roeck amc->soc_name = "ast2500-a1"; 122447936597SGuenter Roeck amc->hw_strap1 = SUPERMICRO_X11SPI_BMC_HW_STRAP1; 122547936597SGuenter Roeck amc->fmc_model = "mx25l25635e"; 122647936597SGuenter Roeck amc->spi_model = "mx25l25635e"; 122747936597SGuenter Roeck amc->num_cs = 1; 122847936597SGuenter Roeck amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 122947936597SGuenter Roeck amc->i2c_init = palmetto_bmc_i2c_init; 123047936597SGuenter Roeck mc->default_ram_size = 512 * MiB; 123147936597SGuenter Roeck mc->default_cpus = mc->min_cpus = mc->max_cpus = 123247936597SGuenter Roeck aspeed_soc_num_cpus(amc->soc_name); 123347936597SGuenter Roeck } 123447936597SGuenter Roeck 1235baa4732bSCédric Le Goater static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data) 1236baa4732bSCédric Le Goater { 1237baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1238baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1239baa4732bSCédric Le Goater 1240baa4732bSCédric Le Goater mc->desc = "Aspeed AST2500 EVB (ARM1176)"; 1241baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1"; 1242baa4732bSCédric Le Goater amc->hw_strap1 = AST2500_EVB_HW_STRAP1; 1243753abfc4SJae Hyun Yoo amc->fmc_model = "mx25l25635e"; 124470322913SCédric Le Goater amc->spi_model = "mx25l25635f"; 1245baa4732bSCédric Le Goater amc->num_cs = 1; 1246baa4732bSCédric Le Goater amc->i2c_init = ast2500_evb_i2c_init; 1247baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB; 1248b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1249b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1250baa4732bSCédric Le Goater }; 1251baa4732bSCédric Le Goater 125234f73a81SKarthikeyan Pasupathi static void aspeed_machine_yosemitev2_class_init(ObjectClass *oc, void *data) 125334f73a81SKarthikeyan Pasupathi { 125434f73a81SKarthikeyan Pasupathi MachineClass *mc = MACHINE_CLASS(oc); 125534f73a81SKarthikeyan Pasupathi AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 125634f73a81SKarthikeyan Pasupathi 125734f73a81SKarthikeyan Pasupathi mc->desc = "Facebook YosemiteV2 BMC (ARM1176)"; 125834f73a81SKarthikeyan Pasupathi amc->soc_name = "ast2500-a1"; 125934f73a81SKarthikeyan Pasupathi amc->hw_strap1 = AST2500_EVB_HW_STRAP1; 126034f73a81SKarthikeyan Pasupathi amc->hw_strap2 = 0; 126134f73a81SKarthikeyan Pasupathi amc->fmc_model = "n25q256a"; 126234f73a81SKarthikeyan Pasupathi amc->spi_model = "mx25l25635e"; 126334f73a81SKarthikeyan Pasupathi amc->num_cs = 2; 126434f73a81SKarthikeyan Pasupathi amc->i2c_init = yosemitev2_bmc_i2c_init; 126534f73a81SKarthikeyan Pasupathi mc->default_ram_size = 512 * MiB; 126634f73a81SKarthikeyan Pasupathi mc->default_cpus = mc->min_cpus = mc->max_cpus = 126734f73a81SKarthikeyan Pasupathi aspeed_soc_num_cpus(amc->soc_name); 126834f73a81SKarthikeyan Pasupathi }; 126934f73a81SKarthikeyan Pasupathi 1270baa4732bSCédric Le Goater static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data) 1271baa4732bSCédric Le Goater { 1272baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1273baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1274baa4732bSCédric Le Goater 1275baa4732bSCédric Le Goater mc->desc = "OpenPOWER Romulus BMC (ARM1176)"; 1276baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1"; 1277baa4732bSCédric Le Goater amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1; 1278baa4732bSCédric Le Goater amc->fmc_model = "n25q256a"; 1279baa4732bSCédric Le Goater amc->spi_model = "mx66l1g45g"; 1280baa4732bSCédric Le Goater amc->num_cs = 2; 1281baa4732bSCédric Le Goater amc->i2c_init = romulus_bmc_i2c_init; 1282baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB; 1283b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1284b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1285baa4732bSCédric Le Goater }; 1286baa4732bSCédric Le Goater 12876c323abaSKarthikeyan Pasupathi static void aspeed_machine_tiogapass_class_init(ObjectClass *oc, void *data) 12886c323abaSKarthikeyan Pasupathi { 12896c323abaSKarthikeyan Pasupathi MachineClass *mc = MACHINE_CLASS(oc); 12906c323abaSKarthikeyan Pasupathi AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 12916c323abaSKarthikeyan Pasupathi 12926c323abaSKarthikeyan Pasupathi mc->desc = "Facebook Tiogapass BMC (ARM1176)"; 12936c323abaSKarthikeyan Pasupathi amc->soc_name = "ast2500-a1"; 12946c323abaSKarthikeyan Pasupathi amc->hw_strap1 = AST2500_EVB_HW_STRAP1; 12956c323abaSKarthikeyan Pasupathi amc->hw_strap2 = 0; 12966c323abaSKarthikeyan Pasupathi amc->fmc_model = "n25q256a"; 12976c323abaSKarthikeyan Pasupathi amc->spi_model = "mx25l25635e"; 12986c323abaSKarthikeyan Pasupathi amc->num_cs = 2; 12996c323abaSKarthikeyan Pasupathi amc->i2c_init = tiogapass_bmc_i2c_init; 13006c323abaSKarthikeyan Pasupathi mc->default_ram_size = 1 * GiB; 13016c323abaSKarthikeyan Pasupathi mc->default_cpus = mc->min_cpus = mc->max_cpus = 13026c323abaSKarthikeyan Pasupathi aspeed_soc_num_cpus(amc->soc_name); 13036c323abaSKarthikeyan Pasupathi aspeed_soc_num_cpus(amc->soc_name); 13046c323abaSKarthikeyan Pasupathi }; 13056c323abaSKarthikeyan Pasupathi 1306143b040fSPatrick Williams static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data) 1307143b040fSPatrick Williams { 1308143b040fSPatrick Williams MachineClass *mc = MACHINE_CLASS(oc); 1309143b040fSPatrick Williams AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1310143b040fSPatrick Williams 1311143b040fSPatrick Williams mc->desc = "OCP SonoraPass BMC (ARM1176)"; 1312143b040fSPatrick Williams amc->soc_name = "ast2500-a1"; 1313143b040fSPatrick Williams amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1; 1314143b040fSPatrick Williams amc->fmc_model = "mx66l1g45g"; 1315143b040fSPatrick Williams amc->spi_model = "mx66l1g45g"; 1316143b040fSPatrick Williams amc->num_cs = 2; 1317143b040fSPatrick Williams amc->i2c_init = sonorapass_bmc_i2c_init; 1318143b040fSPatrick Williams mc->default_ram_size = 512 * MiB; 1319b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1320b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1321143b040fSPatrick Williams }; 1322143b040fSPatrick Williams 1323baa4732bSCédric Le Goater static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data) 1324baa4732bSCédric Le Goater { 1325baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1326baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1327baa4732bSCédric Le Goater 1328baa4732bSCédric Le Goater mc->desc = "OpenPOWER Witherspoon BMC (ARM1176)"; 1329baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1"; 1330baa4732bSCédric Le Goater amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1; 133170322913SCédric Le Goater amc->fmc_model = "mx25l25635f"; 1332baa4732bSCédric Le Goater amc->spi_model = "mx66l1g45g"; 1333baa4732bSCédric Le Goater amc->num_cs = 2; 1334baa4732bSCédric Le Goater amc->i2c_init = witherspoon_bmc_i2c_init; 1335baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB; 1336b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1337b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1338baa4732bSCédric Le Goater }; 1339baa4732bSCédric Le Goater 1340baa4732bSCédric Le Goater static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data) 1341baa4732bSCédric Le Goater { 1342baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1343baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1344baa4732bSCédric Le Goater 1345f548f201SPeter Maydell mc->desc = "Aspeed AST2600 EVB (Cortex-A7)"; 1346c5811bb3SJoel Stanley amc->soc_name = "ast2600-a3"; 1347baa4732bSCédric Le Goater amc->hw_strap1 = AST2600_EVB_HW_STRAP1; 1348baa4732bSCédric Le Goater amc->hw_strap2 = AST2600_EVB_HW_STRAP2; 1349753abfc4SJae Hyun Yoo amc->fmc_model = "mx66u51235f"; 1350baa4732bSCédric Le Goater amc->spi_model = "mx66u51235f"; 1351baa4732bSCédric Le Goater amc->num_cs = 1; 135229193286SGuenter Roeck amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON | 135329193286SGuenter Roeck ASPEED_MAC3_ON; 1354baa4732bSCédric Le Goater amc->i2c_init = ast2600_evb_i2c_init; 1355baa4732bSCédric Le Goater mc->default_ram_size = 1 * GiB; 1356b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1357b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1358baa4732bSCédric Le Goater }; 1359baa4732bSCédric Le Goater 136063ceb818SCédric Le Goater static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data) 136163ceb818SCédric Le Goater { 136263ceb818SCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 136363ceb818SCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 136463ceb818SCédric Le Goater 1365f548f201SPeter Maydell mc->desc = "OpenPOWER Tacoma BMC (Cortex-A7)"; 1366c5811bb3SJoel Stanley amc->soc_name = "ast2600-a3"; 136763ceb818SCédric Le Goater amc->hw_strap1 = TACOMA_BMC_HW_STRAP1; 136863ceb818SCédric Le Goater amc->hw_strap2 = TACOMA_BMC_HW_STRAP2; 136963ceb818SCédric Le Goater amc->fmc_model = "mx66l1g45g"; 137063ceb818SCédric Le Goater amc->spi_model = "mx66l1g45g"; 137163ceb818SCédric Le Goater amc->num_cs = 2; 1372d3bad7e7SCédric Le Goater amc->macs_mask = ASPEED_MAC2_ON; 137363ceb818SCédric Le Goater amc->i2c_init = witherspoon_bmc_i2c_init; /* Same board layout */ 137463ceb818SCédric Le Goater mc->default_ram_size = 1 * GiB; 1375b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1376b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 137763ceb818SCédric Le Goater }; 137863ceb818SCédric Le Goater 137995f068c8SJohn Wang static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data) 138095f068c8SJohn Wang { 138195f068c8SJohn Wang MachineClass *mc = MACHINE_CLASS(oc); 138295f068c8SJohn Wang AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 138395f068c8SJohn Wang 138495f068c8SJohn Wang mc->desc = "Bytedance G220A BMC (ARM1176)"; 138595f068c8SJohn Wang amc->soc_name = "ast2500-a1"; 138695f068c8SJohn Wang amc->hw_strap1 = G220A_BMC_HW_STRAP1; 138795f068c8SJohn Wang amc->fmc_model = "n25q512a"; 138895f068c8SJohn Wang amc->spi_model = "mx25l25635e"; 138995f068c8SJohn Wang amc->num_cs = 2; 13905bb825c8SGuenter Roeck amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 139195f068c8SJohn Wang amc->i2c_init = g220a_bmc_i2c_init; 139295f068c8SJohn Wang mc->default_ram_size = 1024 * MiB; 139395f068c8SJohn Wang mc->default_cpus = mc->min_cpus = mc->max_cpus = 139495f068c8SJohn Wang aspeed_soc_num_cpus(amc->soc_name); 139595f068c8SJohn Wang }; 139695f068c8SJohn Wang 139782b6a3f6SJohn Wang static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc, void *data) 139882b6a3f6SJohn Wang { 139982b6a3f6SJohn Wang MachineClass *mc = MACHINE_CLASS(oc); 140082b6a3f6SJohn Wang AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 140182b6a3f6SJohn Wang 140282b6a3f6SJohn Wang mc->desc = "Inspur FP5280G2 BMC (ARM1176)"; 140382b6a3f6SJohn Wang amc->soc_name = "ast2500-a1"; 140482b6a3f6SJohn Wang amc->hw_strap1 = FP5280G2_BMC_HW_STRAP1; 140582b6a3f6SJohn Wang amc->fmc_model = "n25q512a"; 140682b6a3f6SJohn Wang amc->spi_model = "mx25l25635e"; 140782b6a3f6SJohn Wang amc->num_cs = 2; 140882b6a3f6SJohn Wang amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 140982b6a3f6SJohn Wang amc->i2c_init = fp5280g2_bmc_i2c_init; 141082b6a3f6SJohn Wang mc->default_ram_size = 512 * MiB; 141182b6a3f6SJohn Wang mc->default_cpus = mc->min_cpus = mc->max_cpus = 141282b6a3f6SJohn Wang aspeed_soc_num_cpus(amc->soc_name); 141382b6a3f6SJohn Wang }; 141482b6a3f6SJohn Wang 141558e52bdbSCédric Le Goater static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data) 141658e52bdbSCédric Le Goater { 141758e52bdbSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 141858e52bdbSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 141958e52bdbSCédric Le Goater 1420f548f201SPeter Maydell mc->desc = "IBM Rainier BMC (Cortex-A7)"; 1421c5811bb3SJoel Stanley amc->soc_name = "ast2600-a3"; 142258e52bdbSCédric Le Goater amc->hw_strap1 = RAINIER_BMC_HW_STRAP1; 142358e52bdbSCédric Le Goater amc->hw_strap2 = RAINIER_BMC_HW_STRAP2; 142458e52bdbSCédric Le Goater amc->fmc_model = "mx66l1g45g"; 142558e52bdbSCédric Le Goater amc->spi_model = "mx66l1g45g"; 142658e52bdbSCédric Le Goater amc->num_cs = 2; 142758e52bdbSCédric Le Goater amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON; 142858e52bdbSCédric Le Goater amc->i2c_init = rainier_bmc_i2c_init; 142958e52bdbSCédric Le Goater mc->default_ram_size = 1 * GiB; 143058e52bdbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 143158e52bdbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 143258e52bdbSCédric Le Goater }; 143358e52bdbSCédric Le Goater 14341e2c22c9SCédric Le Goater #define FUJI_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB) 1435febbe308SPeter Delevoryas 1436febbe308SPeter Delevoryas static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data) 1437febbe308SPeter Delevoryas { 1438febbe308SPeter Delevoryas MachineClass *mc = MACHINE_CLASS(oc); 1439febbe308SPeter Delevoryas AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1440febbe308SPeter Delevoryas 1441febbe308SPeter Delevoryas mc->desc = "Facebook Fuji BMC (Cortex-A7)"; 1442febbe308SPeter Delevoryas amc->soc_name = "ast2600-a3"; 1443febbe308SPeter Delevoryas amc->hw_strap1 = FUJI_BMC_HW_STRAP1; 1444febbe308SPeter Delevoryas amc->hw_strap2 = FUJI_BMC_HW_STRAP2; 1445febbe308SPeter Delevoryas amc->fmc_model = "mx66l1g45g"; 1446febbe308SPeter Delevoryas amc->spi_model = "mx66l1g45g"; 1447febbe308SPeter Delevoryas amc->num_cs = 2; 1448febbe308SPeter Delevoryas amc->macs_mask = ASPEED_MAC3_ON; 1449febbe308SPeter Delevoryas amc->i2c_init = fuji_bmc_i2c_init; 1450febbe308SPeter Delevoryas amc->uart_default = ASPEED_DEV_UART1; 1451febbe308SPeter Delevoryas mc->default_ram_size = FUJI_BMC_RAM_SIZE; 1452febbe308SPeter Delevoryas mc->default_cpus = mc->min_cpus = mc->max_cpus = 1453febbe308SPeter Delevoryas aspeed_soc_num_cpus(amc->soc_name); 1454febbe308SPeter Delevoryas }; 1455febbe308SPeter Delevoryas 14561e2c22c9SCédric Le Goater #define BLETCHLEY_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB) 1457104bdaffSPatrick Williams 1458a20c54b1SPatrick Williams static void aspeed_machine_bletchley_class_init(ObjectClass *oc, void *data) 1459a20c54b1SPatrick Williams { 1460a20c54b1SPatrick Williams MachineClass *mc = MACHINE_CLASS(oc); 1461a20c54b1SPatrick Williams AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1462a20c54b1SPatrick Williams 1463a20c54b1SPatrick Williams mc->desc = "Facebook Bletchley BMC (Cortex-A7)"; 1464a20c54b1SPatrick Williams amc->soc_name = "ast2600-a3"; 1465a20c54b1SPatrick Williams amc->hw_strap1 = BLETCHLEY_BMC_HW_STRAP1; 1466a20c54b1SPatrick Williams amc->hw_strap2 = BLETCHLEY_BMC_HW_STRAP2; 1467a20c54b1SPatrick Williams amc->fmc_model = "w25q01jvq"; 1468a20c54b1SPatrick Williams amc->spi_model = NULL; 1469a20c54b1SPatrick Williams amc->num_cs = 2; 1470a20c54b1SPatrick Williams amc->macs_mask = ASPEED_MAC2_ON; 1471a20c54b1SPatrick Williams amc->i2c_init = bletchley_bmc_i2c_init; 1472104bdaffSPatrick Williams mc->default_ram_size = BLETCHLEY_BMC_RAM_SIZE; 1473a20c54b1SPatrick Williams mc->default_cpus = mc->min_cpus = mc->max_cpus = 1474a20c54b1SPatrick Williams aspeed_soc_num_cpus(amc->soc_name); 1475a20c54b1SPatrick Williams } 1476a20c54b1SPatrick Williams 14777966d70fSJason A. Donenfeld static void fby35_reset(MachineState *state, ShutdownCause reason) 1478fa699e80SPeter Delevoryas { 1479fa699e80SPeter Delevoryas AspeedMachineState *bmc = ASPEED_MACHINE(state); 1480fa699e80SPeter Delevoryas AspeedGPIOState *gpio = &bmc->soc.gpio; 1481fa699e80SPeter Delevoryas 14827966d70fSJason A. Donenfeld qemu_devices_reset(reason); 1483fa699e80SPeter Delevoryas 1484f0418558SPeter Delevoryas /* Board ID: 7 (Class-1, 4 slots) */ 1485fa699e80SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioV4", true, &error_fatal); 1486fa699e80SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioV5", true, &error_fatal); 1487fa699e80SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioV6", true, &error_fatal); 1488fa699e80SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioV7", false, &error_fatal); 1489f0418558SPeter Delevoryas 1490f0418558SPeter Delevoryas /* Slot presence pins, inverse polarity. (False means present) */ 1491f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioH4", false, &error_fatal); 1492f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioH5", true, &error_fatal); 1493f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioH6", true, &error_fatal); 1494f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioH7", true, &error_fatal); 1495f0418558SPeter Delevoryas 1496f0418558SPeter Delevoryas /* Slot 12v power pins, normal polarity. (True means powered-on) */ 1497f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioB2", true, &error_fatal); 1498f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioB3", false, &error_fatal); 1499f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioB4", false, &error_fatal); 1500f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioB5", false, &error_fatal); 1501fa699e80SPeter Delevoryas } 1502fa699e80SPeter Delevoryas 1503fa699e80SPeter Delevoryas static void aspeed_machine_fby35_class_init(ObjectClass *oc, void *data) 1504fa699e80SPeter Delevoryas { 1505fa699e80SPeter Delevoryas MachineClass *mc = MACHINE_CLASS(oc); 1506fa699e80SPeter Delevoryas AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1507fa699e80SPeter Delevoryas 1508fa699e80SPeter Delevoryas mc->desc = "Facebook fby35 BMC (Cortex-A7)"; 1509fa699e80SPeter Delevoryas mc->reset = fby35_reset; 1510fa699e80SPeter Delevoryas amc->fmc_model = "mx66l1g45g"; 1511fa699e80SPeter Delevoryas amc->num_cs = 2; 1512fa699e80SPeter Delevoryas amc->macs_mask = ASPEED_MAC3_ON; 1513fa699e80SPeter Delevoryas amc->i2c_init = fby35_i2c_init; 1514fa699e80SPeter Delevoryas /* FIXME: Replace this macro with something more general */ 1515fa699e80SPeter Delevoryas mc->default_ram_size = FUJI_BMC_RAM_SIZE; 1516fa699e80SPeter Delevoryas } 1517fa699e80SPeter Delevoryas 151866c895b8SJamin Lin #define AST1030_INTERNAL_FLASH_SIZE (1024 * 1024) 151966c895b8SJamin Lin /* Main SYSCLK frequency in Hz (200MHz) */ 152066c895b8SJamin Lin #define SYSCLK_FRQ 200000000ULL 152166c895b8SJamin Lin 152266c895b8SJamin Lin static void aspeed_minibmc_machine_init(MachineState *machine) 152366c895b8SJamin Lin { 152466c895b8SJamin Lin AspeedMachineState *bmc = ASPEED_MACHINE(machine); 152566c895b8SJamin Lin AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine); 152666c895b8SJamin Lin Clock *sysclk; 152766c895b8SJamin Lin 152866c895b8SJamin Lin sysclk = clock_new(OBJECT(machine), "SYSCLK"); 152966c895b8SJamin Lin clock_set_hz(sysclk, SYSCLK_FRQ); 153066c895b8SJamin Lin 153166c895b8SJamin Lin object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name); 153266c895b8SJamin Lin qdev_connect_clock_in(DEVICE(&bmc->soc), "sysclk", sysclk); 153366c895b8SJamin Lin 15344dd9d554SPeter Delevoryas object_property_set_link(OBJECT(&bmc->soc), "memory", 15354dd9d554SPeter Delevoryas OBJECT(get_system_memory()), &error_abort); 1536d2b3eaefSPeter Delevoryas connect_serial_hds_to_uarts(bmc); 153766c895b8SJamin Lin qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort); 153866c895b8SJamin Lin 153966c895b8SJamin Lin aspeed_board_init_flashes(&bmc->soc.fmc, 154066c895b8SJamin Lin bmc->fmc_model ? bmc->fmc_model : amc->fmc_model, 154166c895b8SJamin Lin amc->num_cs, 154266c895b8SJamin Lin 0); 154366c895b8SJamin Lin 154466c895b8SJamin Lin aspeed_board_init_flashes(&bmc->soc.spi[0], 154566c895b8SJamin Lin bmc->spi_model ? bmc->spi_model : amc->spi_model, 154666c895b8SJamin Lin amc->num_cs, amc->num_cs); 154766c895b8SJamin Lin 154866c895b8SJamin Lin aspeed_board_init_flashes(&bmc->soc.spi[1], 154966c895b8SJamin Lin bmc->spi_model ? bmc->spi_model : amc->spi_model, 155066c895b8SJamin Lin amc->num_cs, (amc->num_cs * 2)); 155166c895b8SJamin Lin 155266c895b8SJamin Lin if (amc->i2c_init) { 155366c895b8SJamin Lin amc->i2c_init(bmc); 155466c895b8SJamin Lin } 155566c895b8SJamin Lin 155666c895b8SJamin Lin armv7m_load_kernel(ARM_CPU(first_cpu), 155766c895b8SJamin Lin machine->kernel_filename, 1558761c532aSPeter Maydell 0, 155966c895b8SJamin Lin AST1030_INTERNAL_FLASH_SIZE); 156066c895b8SJamin Lin } 156166c895b8SJamin Lin 15624c70ab16STroy Lee static void ast1030_evb_i2c_init(AspeedMachineState *bmc) 15634c70ab16STroy Lee { 15644c70ab16STroy Lee AspeedSoCState *soc = &bmc->soc; 15654c70ab16STroy Lee 1566673d8215SMichael Tokarev /* U10 24C08 connects to SDA/SCL Group 1 by default */ 15674c70ab16STroy Lee uint8_t *eeprom_buf = g_malloc0(32 * 1024); 15684c70ab16STroy Lee smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, eeprom_buf); 15694c70ab16STroy Lee 15704c70ab16STroy Lee /* U11 LM75 connects to SDA/SCL Group 2 by default */ 15714c70ab16STroy Lee i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d); 15724c70ab16STroy Lee } 15734c70ab16STroy Lee 157466c895b8SJamin Lin static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc, 157566c895b8SJamin Lin void *data) 157666c895b8SJamin Lin { 157766c895b8SJamin Lin MachineClass *mc = MACHINE_CLASS(oc); 157866c895b8SJamin Lin AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 157966c895b8SJamin Lin 158066c895b8SJamin Lin mc->desc = "Aspeed AST1030 MiniBMC (Cortex-M4)"; 158166c895b8SJamin Lin amc->soc_name = "ast1030-a1"; 158266c895b8SJamin Lin amc->hw_strap1 = 0; 158366c895b8SJamin Lin amc->hw_strap2 = 0; 158466c895b8SJamin Lin mc->init = aspeed_minibmc_machine_init; 15854c70ab16STroy Lee amc->i2c_init = ast1030_evb_i2c_init; 158666c895b8SJamin Lin mc->default_ram_size = 0; 158766c895b8SJamin Lin mc->default_cpus = mc->min_cpus = mc->max_cpus = 1; 158866c895b8SJamin Lin amc->fmc_model = "sst25vf032b"; 158966c895b8SJamin Lin amc->spi_model = "sst25vf032b"; 159066c895b8SJamin Lin amc->num_cs = 2; 159166c895b8SJamin Lin amc->macs_mask = 0; 159266c895b8SJamin Lin } 159366c895b8SJamin Lin 1594fb6b3c8dSJae Hyun Yoo static void aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass *oc, 1595fb6b3c8dSJae Hyun Yoo void *data) 1596fb6b3c8dSJae Hyun Yoo { 1597fb6b3c8dSJae Hyun Yoo MachineClass *mc = MACHINE_CLASS(oc); 1598fb6b3c8dSJae Hyun Yoo AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1599fb6b3c8dSJae Hyun Yoo 1600fb6b3c8dSJae Hyun Yoo mc->desc = "Qualcomm DC-SCM V1 BMC (Cortex A7)"; 1601fb6b3c8dSJae Hyun Yoo amc->soc_name = "ast2600-a3"; 1602fb6b3c8dSJae Hyun Yoo amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1; 1603fb6b3c8dSJae Hyun Yoo amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2; 1604fb6b3c8dSJae Hyun Yoo amc->fmc_model = "n25q512a"; 1605fb6b3c8dSJae Hyun Yoo amc->spi_model = "n25q512a"; 1606fb6b3c8dSJae Hyun Yoo amc->num_cs = 2; 1607fb6b3c8dSJae Hyun Yoo amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON; 1608fb6b3c8dSJae Hyun Yoo amc->i2c_init = qcom_dc_scm_bmc_i2c_init; 1609fb6b3c8dSJae Hyun Yoo mc->default_ram_size = 1 * GiB; 1610fb6b3c8dSJae Hyun Yoo mc->default_cpus = mc->min_cpus = mc->max_cpus = 1611fb6b3c8dSJae Hyun Yoo aspeed_soc_num_cpus(amc->soc_name); 1612fb6b3c8dSJae Hyun Yoo }; 1613fb6b3c8dSJae Hyun Yoo 1614ece4cccdSGraeme Gregory static void aspeed_machine_qcom_firework_class_init(ObjectClass *oc, 1615ece4cccdSGraeme Gregory void *data) 1616ece4cccdSGraeme Gregory { 1617ece4cccdSGraeme Gregory MachineClass *mc = MACHINE_CLASS(oc); 1618ece4cccdSGraeme Gregory AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1619ece4cccdSGraeme Gregory 1620ece4cccdSGraeme Gregory mc->desc = "Qualcomm DC-SCM V1/Firework BMC (Cortex A7)"; 1621ece4cccdSGraeme Gregory amc->soc_name = "ast2600-a3"; 1622ece4cccdSGraeme Gregory amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1; 1623ece4cccdSGraeme Gregory amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2; 1624ece4cccdSGraeme Gregory amc->fmc_model = "n25q512a"; 1625ece4cccdSGraeme Gregory amc->spi_model = "n25q512a"; 1626ece4cccdSGraeme Gregory amc->num_cs = 2; 1627ece4cccdSGraeme Gregory amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON; 1628ece4cccdSGraeme Gregory amc->i2c_init = qcom_dc_scm_firework_i2c_init; 1629ece4cccdSGraeme Gregory mc->default_ram_size = 1 * GiB; 1630ece4cccdSGraeme Gregory mc->default_cpus = mc->min_cpus = mc->max_cpus = 1631ece4cccdSGraeme Gregory aspeed_soc_num_cpus(amc->soc_name); 1632ece4cccdSGraeme Gregory }; 1633ece4cccdSGraeme Gregory 1634baa4732bSCédric Le Goater static const TypeInfo aspeed_machine_types[] = { 1635baa4732bSCédric Le Goater { 1636baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("palmetto-bmc"), 1637baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1638baa4732bSCédric Le Goater .class_init = aspeed_machine_palmetto_class_init, 1639baa4732bSCédric Le Goater }, { 164040a38df5SErik Smit .name = MACHINE_TYPE_NAME("supermicrox11-bmc"), 164140a38df5SErik Smit .parent = TYPE_ASPEED_MACHINE, 164240a38df5SErik Smit .class_init = aspeed_machine_supermicrox11_bmc_class_init, 164340a38df5SErik Smit }, { 164447936597SGuenter Roeck .name = MACHINE_TYPE_NAME("supermicro-x11spi-bmc"), 164547936597SGuenter Roeck .parent = TYPE_ASPEED_MACHINE, 164647936597SGuenter Roeck .class_init = aspeed_machine_supermicro_x11spi_bmc_class_init, 164747936597SGuenter Roeck }, { 1648baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("ast2500-evb"), 1649baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1650baa4732bSCédric Le Goater .class_init = aspeed_machine_ast2500_evb_class_init, 1651baa4732bSCédric Le Goater }, { 1652baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("romulus-bmc"), 1653baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1654baa4732bSCédric Le Goater .class_init = aspeed_machine_romulus_class_init, 1655baa4732bSCédric Le Goater }, { 1656143b040fSPatrick Williams .name = MACHINE_TYPE_NAME("sonorapass-bmc"), 1657143b040fSPatrick Williams .parent = TYPE_ASPEED_MACHINE, 1658143b040fSPatrick Williams .class_init = aspeed_machine_sonorapass_class_init, 1659143b040fSPatrick Williams }, { 1660baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("witherspoon-bmc"), 1661baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1662baa4732bSCédric Le Goater .class_init = aspeed_machine_witherspoon_class_init, 1663baa4732bSCédric Le Goater }, { 1664baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("ast2600-evb"), 1665baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1666baa4732bSCédric Le Goater .class_init = aspeed_machine_ast2600_evb_class_init, 1667baa4732bSCédric Le Goater }, { 166834f73a81SKarthikeyan Pasupathi .name = MACHINE_TYPE_NAME("yosemitev2-bmc"), 166934f73a81SKarthikeyan Pasupathi .parent = TYPE_ASPEED_MACHINE, 167034f73a81SKarthikeyan Pasupathi .class_init = aspeed_machine_yosemitev2_class_init, 167134f73a81SKarthikeyan Pasupathi }, { 167263ceb818SCédric Le Goater .name = MACHINE_TYPE_NAME("tacoma-bmc"), 167363ceb818SCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 167463ceb818SCédric Le Goater .class_init = aspeed_machine_tacoma_class_init, 167563ceb818SCédric Le Goater }, { 16766c323abaSKarthikeyan Pasupathi .name = MACHINE_TYPE_NAME("tiogapass-bmc"), 16776c323abaSKarthikeyan Pasupathi .parent = TYPE_ASPEED_MACHINE, 16786c323abaSKarthikeyan Pasupathi .class_init = aspeed_machine_tiogapass_class_init, 16796c323abaSKarthikeyan Pasupathi }, { 168095f068c8SJohn Wang .name = MACHINE_TYPE_NAME("g220a-bmc"), 168195f068c8SJohn Wang .parent = TYPE_ASPEED_MACHINE, 168295f068c8SJohn Wang .class_init = aspeed_machine_g220a_class_init, 168395f068c8SJohn Wang }, { 1684fb6b3c8dSJae Hyun Yoo .name = MACHINE_TYPE_NAME("qcom-dc-scm-v1-bmc"), 1685fb6b3c8dSJae Hyun Yoo .parent = TYPE_ASPEED_MACHINE, 1686fb6b3c8dSJae Hyun Yoo .class_init = aspeed_machine_qcom_dc_scm_v1_class_init, 1687fb6b3c8dSJae Hyun Yoo }, { 1688ece4cccdSGraeme Gregory .name = MACHINE_TYPE_NAME("qcom-firework-bmc"), 1689ece4cccdSGraeme Gregory .parent = TYPE_ASPEED_MACHINE, 1690ece4cccdSGraeme Gregory .class_init = aspeed_machine_qcom_firework_class_init, 1691ece4cccdSGraeme Gregory }, { 169282b6a3f6SJohn Wang .name = MACHINE_TYPE_NAME("fp5280g2-bmc"), 169382b6a3f6SJohn Wang .parent = TYPE_ASPEED_MACHINE, 169482b6a3f6SJohn Wang .class_init = aspeed_machine_fp5280g2_class_init, 169582b6a3f6SJohn Wang }, { 16969cccb912SPatrick Venture .name = MACHINE_TYPE_NAME("quanta-q71l-bmc"), 16979cccb912SPatrick Venture .parent = TYPE_ASPEED_MACHINE, 16989cccb912SPatrick Venture .class_init = aspeed_machine_quanta_q71l_class_init, 16999cccb912SPatrick Venture }, { 170058e52bdbSCédric Le Goater .name = MACHINE_TYPE_NAME("rainier-bmc"), 170158e52bdbSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 170258e52bdbSCédric Le Goater .class_init = aspeed_machine_rainier_class_init, 170358e52bdbSCédric Le Goater }, { 1704febbe308SPeter Delevoryas .name = MACHINE_TYPE_NAME("fuji-bmc"), 1705febbe308SPeter Delevoryas .parent = TYPE_ASPEED_MACHINE, 1706febbe308SPeter Delevoryas .class_init = aspeed_machine_fuji_class_init, 1707febbe308SPeter Delevoryas }, { 1708a20c54b1SPatrick Williams .name = MACHINE_TYPE_NAME("bletchley-bmc"), 1709a20c54b1SPatrick Williams .parent = TYPE_ASPEED_MACHINE, 1710a20c54b1SPatrick Williams .class_init = aspeed_machine_bletchley_class_init, 1711a20c54b1SPatrick Williams }, { 1712fa699e80SPeter Delevoryas .name = MACHINE_TYPE_NAME("fby35-bmc"), 1713fa699e80SPeter Delevoryas .parent = MACHINE_TYPE_NAME("ast2600-evb"), 1714fa699e80SPeter Delevoryas .class_init = aspeed_machine_fby35_class_init, 1715fa699e80SPeter Delevoryas }, { 171666c895b8SJamin Lin .name = MACHINE_TYPE_NAME("ast1030-evb"), 171766c895b8SJamin Lin .parent = TYPE_ASPEED_MACHINE, 171866c895b8SJamin Lin .class_init = aspeed_minibmc_machine_ast1030_evb_class_init, 171966c895b8SJamin Lin }, { 1720fca9ca1bSCédric Le Goater .name = TYPE_ASPEED_MACHINE, 172162c2c2ebSCédric Le Goater .parent = TYPE_MACHINE, 1722888b2b03SPhilippe Mathieu-Daudé .instance_size = sizeof(AspeedMachineState), 17231a15311aSCédric Le Goater .instance_init = aspeed_machine_instance_init, 1724fca9ca1bSCédric Le Goater .class_size = sizeof(AspeedMachineClass), 1725fca9ca1bSCédric Le Goater .class_init = aspeed_machine_class_init, 1726baa4732bSCédric Le Goater .abstract = true, 1727baa4732bSCédric Le Goater } 1728fca9ca1bSCédric Le Goater }; 172974fb1f38SCédric Le Goater 1730baa4732bSCédric Le Goater DEFINE_TYPES(aspeed_machine_types) 1731