1327d8e4eSAndrew Jeffery /* 2327d8e4eSAndrew Jeffery * OpenPOWER Palmetto BMC 3327d8e4eSAndrew Jeffery * 4327d8e4eSAndrew Jeffery * Andrew Jeffery <andrew@aj.id.au> 5327d8e4eSAndrew Jeffery * 6327d8e4eSAndrew Jeffery * Copyright 2016 IBM Corp. 7327d8e4eSAndrew Jeffery * 8327d8e4eSAndrew Jeffery * This code is licensed under the GPL version 2 or later. See 9327d8e4eSAndrew Jeffery * the COPYING file in the top-level directory. 10327d8e4eSAndrew Jeffery */ 11327d8e4eSAndrew Jeffery 12327d8e4eSAndrew Jeffery #include "qemu/osdep.h" 13da34e65cSMarkus Armbruster #include "qapi/error.h" 1412ec8bd5SPeter Maydell #include "hw/arm/boot.h" 15fca9ca1bSCédric Le Goater #include "hw/arm/aspeed.h" 1600442402SCédric Le Goater #include "hw/arm/aspeed_soc.h" 17c0216b94SPeter Delevoryas #include "hw/arm/aspeed_eeprom.h" 188285490bSCédric Le Goater #include "hw/block/flash.h" 193ec75e39SPatrick Venture #include "hw/i2c/i2c_mux_pca954x.h" 2093198b6cSCorey Minyard #include "hw/i2c/smbus_eeprom.h" 216328d8ffSCédric Le Goater #include "hw/gpio/pca9552.h" 229618ebaeSPeter Delevoryas #include "hw/nvram/eeprom_at24c.h" 235e9ae4b1SCorey Minyard #include "hw/sensor/tmp105.h" 247cfbde5eSPhilippe Mathieu-Daudé #include "hw/misc/led.h" 25a27bd6c7SMarkus Armbruster #include "hw/qdev-properties.h" 2632cad1ffSPhilippe Mathieu-Daudé #include "system/block-backend.h" 2732cad1ffSPhilippe Mathieu-Daudé #include "system/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" 3232cad1ffSPhilippe Mathieu-Daudé #include "system/system.h" 33327d8e4eSAndrew Jeffery 3474fb1f38SCédric Le Goater static struct arm_boot_info aspeed_board_binfo = { 35b033271fSCédric Le Goater .board_id = -1, /* device-tree-only board */ 36327d8e4eSAndrew Jeffery }; 37327d8e4eSAndrew Jeffery 38612b219aSPhilippe Mathieu-Daudé struct AspeedMachineState { 39888b2b03SPhilippe Mathieu-Daudé /* Private */ 40888b2b03SPhilippe Mathieu-Daudé MachineState parent_obj; 41888b2b03SPhilippe Mathieu-Daudé /* Public */ 42888b2b03SPhilippe Mathieu-Daudé 433c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc; 44262259eaSCédric Le Goater MemoryRegion boot_rom; 45888b2b03SPhilippe Mathieu-Daudé bool mmio_exec; 46f65f6ad5SCédric Le Goater uint32_t uart_chosen; 479820e52fSCédric Le Goater char *fmc_model; 489820e52fSCédric Le Goater char *spi_model; 49621845a9SCédric Le Goater uint32_t hw_strap1; 50ea066d39SThomas Huth }; 51327d8e4eSAndrew Jeffery 521e2c22c9SCédric Le Goater /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */ 531e2c22c9SCédric Le Goater #if HOST_LONG_BITS == 32 541e2c22c9SCédric Le Goater #define ASPEED_RAM_SIZE(sz) MIN((sz), 1 * GiB) 551e2c22c9SCédric Le Goater #else 561e2c22c9SCédric Le Goater #define ASPEED_RAM_SIZE(sz) (sz) 571e2c22c9SCédric Le Goater #endif 581e2c22c9SCédric Le Goater 59ef17f836SCédric Le Goater /* Palmetto hardware value: 0x120CE416 */ 608da33ef7SCédric Le Goater #define PALMETTO_BMC_HW_STRAP1 ( \ 618da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_256MB) | \ 628da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_DRAM_CONFIG(2 /* DDR3 with CL=6, CWL=5 */) | \ 638da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_ACPI_DIS | \ 648da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) | \ 658da33ef7SCédric Le Goater SCU_HW_STRAP_VGA_CLASS_CODE | \ 668da33ef7SCédric Le Goater SCU_HW_STRAP_LPC_RESET_PIN | \ 678da33ef7SCédric Le Goater SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) | \ 688da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \ 698da33ef7SCédric Le Goater SCU_HW_STRAP_SPI_WIDTH | \ 708da33ef7SCédric Le Goater SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \ 718da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT)) 728da33ef7SCédric Le Goater 7340a38df5SErik Smit /* TODO: Find the actual hardware value */ 7440a38df5SErik Smit #define SUPERMICROX11_BMC_HW_STRAP1 ( \ 7540a38df5SErik Smit SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) | \ 7640a38df5SErik Smit SCU_AST2400_HW_STRAP_DRAM_CONFIG(2) | \ 7740a38df5SErik Smit SCU_AST2400_HW_STRAP_ACPI_DIS | \ 7840a38df5SErik Smit SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) | \ 7940a38df5SErik Smit SCU_HW_STRAP_VGA_CLASS_CODE | \ 8040a38df5SErik Smit SCU_HW_STRAP_LPC_RESET_PIN | \ 8140a38df5SErik Smit SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) | \ 8240a38df5SErik Smit SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \ 8340a38df5SErik Smit SCU_HW_STRAP_SPI_WIDTH | \ 8440a38df5SErik Smit SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \ 8540a38df5SErik Smit SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT)) 8640a38df5SErik Smit 8747936597SGuenter Roeck /* TODO: Find the actual hardware value */ 8847936597SGuenter Roeck #define SUPERMICRO_X11SPI_BMC_HW_STRAP1 ( \ 8947936597SGuenter Roeck AST2500_HW_STRAP1_DEFAULTS | \ 9047936597SGuenter Roeck SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 9147936597SGuenter Roeck SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 9247936597SGuenter Roeck SCU_AST2500_HW_STRAP_UART_DEBUG | \ 9347936597SGuenter Roeck SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 9447936597SGuenter Roeck SCU_HW_STRAP_SPI_WIDTH | \ 9547936597SGuenter Roeck SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN)) 9647936597SGuenter Roeck 97ef17f836SCédric Le Goater /* AST2500 evb hardware value: 0xF100C2E6 */ 989a7c1750SCédric Le Goater #define AST2500_EVB_HW_STRAP1 (( \ 999a7c1750SCédric Le Goater AST2500_HW_STRAP1_DEFAULTS | \ 1009a7c1750SCédric Le Goater SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 1019a7c1750SCédric Le Goater SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 1029a7c1750SCédric Le Goater SCU_AST2500_HW_STRAP_UART_DEBUG | \ 1039a7c1750SCédric Le Goater SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 1049a7c1750SCédric Le Goater SCU_HW_STRAP_MAC1_RGMII | \ 1059a7c1750SCédric Le Goater SCU_HW_STRAP_MAC0_RGMII) & \ 1069a7c1750SCédric Le Goater ~SCU_HW_STRAP_2ND_BOOT_WDT) 1079a7c1750SCédric Le Goater 108ef17f836SCédric Le Goater /* Romulus hardware value: 0xF10AD206 */ 109ef17f836SCédric Le Goater #define ROMULUS_BMC_HW_STRAP1 ( \ 110ef17f836SCédric Le Goater AST2500_HW_STRAP1_DEFAULTS | \ 111ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 112ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 113ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_UART_DEBUG | \ 114ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 115ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_ACPI_ENABLE | \ 116ef17f836SCédric Le Goater SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER)) 117ef17f836SCédric Le Goater 118143b040fSPatrick Williams /* Sonorapass hardware value: 0xF100D216 */ 119143b040fSPatrick Williams #define SONORAPASS_BMC_HW_STRAP1 ( \ 120143b040fSPatrick Williams SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 121143b040fSPatrick Williams SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 122143b040fSPatrick Williams SCU_AST2500_HW_STRAP_UART_DEBUG | \ 123143b040fSPatrick Williams SCU_AST2500_HW_STRAP_RESERVED28 | \ 124143b040fSPatrick Williams SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 125143b040fSPatrick Williams SCU_HW_STRAP_VGA_CLASS_CODE | \ 126143b040fSPatrick Williams SCU_HW_STRAP_LPC_RESET_PIN | \ 127143b040fSPatrick Williams SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \ 128143b040fSPatrick Williams SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \ 129143b040fSPatrick Williams SCU_HW_STRAP_VGA_BIOS_ROM | \ 130143b040fSPatrick Williams SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \ 131143b040fSPatrick Williams SCU_AST2500_HW_STRAP_RESERVED1) 132143b040fSPatrick Williams 13395f068c8SJohn Wang #define G220A_BMC_HW_STRAP1 ( \ 13495f068c8SJohn Wang SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 13595f068c8SJohn Wang SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 13695f068c8SJohn Wang SCU_AST2500_HW_STRAP_UART_DEBUG | \ 13795f068c8SJohn Wang SCU_AST2500_HW_STRAP_RESERVED28 | \ 13895f068c8SJohn Wang SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 13995f068c8SJohn Wang SCU_HW_STRAP_2ND_BOOT_WDT | \ 14095f068c8SJohn Wang SCU_HW_STRAP_VGA_CLASS_CODE | \ 14195f068c8SJohn Wang SCU_HW_STRAP_LPC_RESET_PIN | \ 14295f068c8SJohn Wang SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \ 14395f068c8SJohn Wang SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \ 14495f068c8SJohn Wang SCU_HW_STRAP_VGA_SIZE_SET(VGA_64M_DRAM) | \ 14595f068c8SJohn Wang SCU_AST2500_HW_STRAP_RESERVED1) 14695f068c8SJohn Wang 14782b6a3f6SJohn Wang /* FP5280G2 hardware value: 0XF100D286 */ 14882b6a3f6SJohn Wang #define FP5280G2_BMC_HW_STRAP1 ( \ 14982b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 15082b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 15182b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_UART_DEBUG | \ 15282b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_RESERVED28 | \ 15382b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 15482b6a3f6SJohn Wang SCU_HW_STRAP_VGA_CLASS_CODE | \ 15582b6a3f6SJohn Wang SCU_HW_STRAP_LPC_RESET_PIN | \ 15682b6a3f6SJohn Wang SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \ 15782b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \ 15882b6a3f6SJohn Wang SCU_HW_STRAP_MAC1_RGMII | \ 15982b6a3f6SJohn Wang SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \ 16082b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_RESERVED1) 16182b6a3f6SJohn Wang 16262c2c2ebSCédric Le Goater /* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */ 16362c2c2ebSCédric Le Goater #define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1 16462c2c2ebSCédric Le Goater 1659cccb912SPatrick Venture /* Quanta-Q71l hardware value */ 1669cccb912SPatrick Venture #define QUANTA_Q71L_BMC_HW_STRAP1 ( \ 1679cccb912SPatrick Venture SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) | \ 1689cccb912SPatrick Venture SCU_AST2400_HW_STRAP_DRAM_CONFIG(2/* DDR3 with CL=6, CWL=5 */) | \ 1699cccb912SPatrick Venture SCU_AST2400_HW_STRAP_ACPI_DIS | \ 1709cccb912SPatrick Venture SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_24M_IN) | \ 1719cccb912SPatrick Venture SCU_HW_STRAP_VGA_CLASS_CODE | \ 1729cccb912SPatrick Venture SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_PASS_THROUGH) | \ 1739cccb912SPatrick Venture SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \ 1749cccb912SPatrick Venture SCU_HW_STRAP_SPI_WIDTH | \ 1759cccb912SPatrick Venture SCU_HW_STRAP_VGA_SIZE_SET(VGA_8M_DRAM) | \ 1769cccb912SPatrick Venture SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT)) 1779cccb912SPatrick Venture 178ccc2c418SCédric Le Goater /* AST2600 evb hardware value */ 179ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP1 0x000000C0 180ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP2 0x00000003 181ccc2c418SCédric Le Goater 18292707992SJamin Lin #ifdef TARGET_AARCH64 18392707992SJamin Lin /* AST2700 evb hardware value */ 18492707992SJamin Lin #define AST2700_EVB_HW_STRAP1 0x000000C0 18592707992SJamin Lin #define AST2700_EVB_HW_STRAP2 0x00000003 18692707992SJamin Lin #endif 18792707992SJamin Lin 18858e52bdbSCédric Le Goater /* Rainier hardware value: (QEMU prototype) */ 18901ea09ebSCédric Le Goater #define RAINIER_BMC_HW_STRAP1 (0x00422016 | SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC) 190b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP2 0x80000848 19158e52bdbSCédric Le Goater 192febbe308SPeter Delevoryas /* Fuji hardware value */ 193febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP1 0x00000000 194febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP2 0x00000000 195febbe308SPeter Delevoryas 196a20c54b1SPatrick Williams /* Bletchley hardware value */ 197a20c54b1SPatrick Williams /* TODO: Leave same as EVB for now. */ 198a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP1 AST2600_EVB_HW_STRAP1 199a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP2 AST2600_EVB_HW_STRAP2 200a20c54b1SPatrick Williams 201fb6b3c8dSJae Hyun Yoo /* Qualcomm DC-SCM hardware value */ 202fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP1 0x00000000 203fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP2 0x00000041 204fb6b3c8dSJae Hyun Yoo 2059bb6d140SJoel Stanley #define AST_SMP_MAILBOX_BASE 0x1e6e2180 2069bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_ENTRY (AST_SMP_MAILBOX_BASE + 0x0) 2079bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_GOSIGN (AST_SMP_MAILBOX_BASE + 0x4) 2089bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_READY (AST_SMP_MAILBOX_BASE + 0x8) 2099bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_POLLINSN (AST_SMP_MAILBOX_BASE + 0xc) 2109bb6d140SJoel Stanley #define AST_SMP_MBOX_CODE (AST_SMP_MAILBOX_BASE + 0x10) 2119bb6d140SJoel Stanley #define AST_SMP_MBOX_GOSIGN 0xabbaab00 2129bb6d140SJoel Stanley 2139bb6d140SJoel Stanley static void aspeed_write_smpboot(ARMCPU *cpu, 2149bb6d140SJoel Stanley const struct arm_boot_info *info) 2159bb6d140SJoel Stanley { 216902bba54SCédric Le Goater AddressSpace *as = arm_boot_address_space(cpu, info); 217902bba54SCédric Le Goater static const ARMInsnFixup poll_mailbox_ready[] = { 2189bb6d140SJoel Stanley /* 2199bb6d140SJoel Stanley * r2 = per-cpu go sign value 2209bb6d140SJoel Stanley * r1 = AST_SMP_MBOX_FIELD_ENTRY 2219bb6d140SJoel Stanley * r0 = AST_SMP_MBOX_FIELD_GOSIGN 2229bb6d140SJoel Stanley */ 223902bba54SCédric Le Goater { 0xee100fb0 }, /* mrc p15, 0, r0, c0, c0, 5 */ 224902bba54SCédric Le Goater { 0xe21000ff }, /* ands r0, r0, #255 */ 225902bba54SCédric Le Goater { 0xe59f201c }, /* ldr r2, [pc, #28] */ 226902bba54SCédric Le Goater { 0xe1822000 }, /* orr r2, r2, r0 */ 2279bb6d140SJoel Stanley 228902bba54SCédric Le Goater { 0xe59f1018 }, /* ldr r1, [pc, #24] */ 229902bba54SCédric Le Goater { 0xe59f0018 }, /* ldr r0, [pc, #24] */ 2309bb6d140SJoel Stanley 231902bba54SCédric Le Goater { 0xe320f002 }, /* wfe */ 232902bba54SCédric Le Goater { 0xe5904000 }, /* ldr r4, [r0] */ 233902bba54SCédric Le Goater { 0xe1520004 }, /* cmp r2, r4 */ 234902bba54SCédric Le Goater { 0x1afffffb }, /* bne <wfe> */ 235902bba54SCédric Le Goater { 0xe591f000 }, /* ldr pc, [r1] */ 236902bba54SCédric Le Goater { AST_SMP_MBOX_GOSIGN }, 237902bba54SCédric Le Goater { AST_SMP_MBOX_FIELD_ENTRY }, 238902bba54SCédric Le Goater { AST_SMP_MBOX_FIELD_GOSIGN }, 239902bba54SCédric Le Goater { 0, FIXUP_TERMINATOR } 2409bb6d140SJoel Stanley }; 241902bba54SCédric Le Goater static const uint32_t fixupcontext[FIXUP_MAX] = { 0 }; 2429bb6d140SJoel Stanley 243902bba54SCédric Le Goater arm_write_bootloader("aspeed.smpboot", as, info->smp_loader_start, 244902bba54SCédric Le Goater poll_mailbox_ready, fixupcontext); 2459bb6d140SJoel Stanley } 2469bb6d140SJoel Stanley 2479bb6d140SJoel Stanley static void aspeed_reset_secondary(ARMCPU *cpu, 2489bb6d140SJoel Stanley const struct arm_boot_info *info) 2499bb6d140SJoel Stanley { 2509bb6d140SJoel Stanley AddressSpace *as = arm_boot_address_space(cpu, info); 2519bb6d140SJoel Stanley CPUState *cs = CPU(cpu); 2529bb6d140SJoel Stanley 2539bb6d140SJoel Stanley /* info->smp_bootreg_addr */ 2549bb6d140SJoel Stanley address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0, 2559bb6d140SJoel Stanley MEMTXATTRS_UNSPECIFIED, NULL); 2569bb6d140SJoel Stanley cpu_set_pc(cs, info->smp_loader_start); 2579bb6d140SJoel Stanley } 2589bb6d140SJoel Stanley 2598b744a6aSCédric Le Goater static void write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size, 260d769a1daSCédric Le Goater Error **errp) 261d769a1daSCédric Le Goater { 26205e6e40aSWentao_Liang g_autofree void *storage = NULL; 2630c7209beSCédric Le Goater int64_t size; 264d769a1daSCédric Le Goater 2654db1c164SJamin Lin /* 2664db1c164SJamin Lin * The block backend size should have already been 'validated' by 2670c7209beSCédric Le Goater * the creation of the m25p80 object. 2680c7209beSCédric Le Goater */ 2690c7209beSCédric Le Goater size = blk_getlength(blk); 2700c7209beSCédric Le Goater if (size <= 0) { 2710c7209beSCédric Le Goater error_setg(errp, "failed to get flash size"); 2720c7209beSCédric Le Goater return; 2730c7209beSCédric Le Goater } 2740c7209beSCédric Le Goater 2750c7209beSCédric Le Goater if (rom_size > size) { 2760c7209beSCédric Le Goater rom_size = size; 277d769a1daSCédric Le Goater } 278d769a1daSCédric Le Goater 27905e6e40aSWentao_Liang storage = g_malloc0(rom_size); 280a9262f55SAlberto Faria if (blk_pread(blk, 0, rom_size, storage, 0) < 0) { 281d769a1daSCédric Le Goater error_setg(errp, "failed to read the initial flash content"); 282d769a1daSCédric Le Goater return; 283d769a1daSCédric Le Goater } 284d769a1daSCédric Le Goater 285d769a1daSCédric Le Goater rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr); 286d769a1daSCédric Le Goater } 287d769a1daSCédric Le Goater 2888b744a6aSCédric Le Goater /* 2898b744a6aSCédric Le Goater * Create a ROM and copy the flash contents at the expected address 2908b744a6aSCédric Le Goater * (0x0). Boots faster than execute-in-place. 2918b744a6aSCédric Le Goater */ 292262259eaSCédric Le Goater static void aspeed_install_boot_rom(AspeedMachineState *bmc, BlockBackend *blk, 2938b744a6aSCédric Le Goater uint64_t rom_size) 2948b744a6aSCédric Le Goater { 2953c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 296db052d0eSJamin Lin AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(soc); 2978b744a6aSCédric Le Goater 298262259eaSCédric Le Goater memory_region_init_rom(&bmc->boot_rom, NULL, "aspeed.boot_rom", rom_size, 2998b744a6aSCédric Le Goater &error_abort); 3008b744a6aSCédric Le Goater memory_region_add_subregion_overlap(&soc->spi_boot_container, 0, 301262259eaSCédric Le Goater &bmc->boot_rom, 1); 302db052d0eSJamin Lin write_boot_rom(blk, sc->memmap[ASPEED_DEV_SPI_BOOT], 303db052d0eSJamin Lin rom_size, &error_abort); 3048b744a6aSCédric Le Goater } 3058b744a6aSCédric Le Goater 3061099ad10SPeter Delevoryas void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype, 3079bd4ac61SCédric Le Goater unsigned int count, int unit0) 308e1ad9bc4SCédric Le Goater { 309e1ad9bc4SCédric Le Goater int i; 310179b2058SPatrick Williams 311179b2058SPatrick Williams if (!flashtype) { 312179b2058SPatrick Williams return; 313179b2058SPatrick Williams } 314e1ad9bc4SCédric Le Goater 3159bd4ac61SCédric Le Goater for (i = 0; i < count; ++i) { 3168ec239f2SMarkus Armbruster DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i); 317a7d78befSCédric Le Goater DeviceState *dev; 318e1ad9bc4SCédric Le Goater 319a7d78befSCédric Le Goater dev = qdev_new(flashtype); 320e1ad9bc4SCédric Le Goater if (dinfo) { 321a7d78befSCédric Le Goater qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo)); 322e1ad9bc4SCédric Le Goater } 32327a2c66cSCédric Le Goater qdev_prop_set_uint8(dev, "cs", i); 324a7d78befSCédric Le Goater qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal); 325e1ad9bc4SCédric Le Goater } 326e1ad9bc4SCédric Le Goater } 327e1ad9bc4SCédric Le Goater 328e554e45bSCédric Le Goater static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo, bool emmc, 329e554e45bSCédric Le Goater bool boot_emmc) 330a29e3e12SAndrew Jeffery { 331a29e3e12SAndrew Jeffery DeviceState *card; 332a29e3e12SAndrew Jeffery 333756f739bSPhilippe Mathieu-Daudé if (!dinfo) { 334756f739bSPhilippe Mathieu-Daudé return; 335756f739bSPhilippe Mathieu-Daudé } 336dddfc771SCédric Le Goater card = qdev_new(emmc ? TYPE_EMMC : TYPE_SD_CARD); 337e8f3acdbSCédric Le Goater 338e8f3acdbSCédric Le Goater /* 339e8f3acdbSCédric Le Goater * Force the boot properties of the eMMC device only when the 340e8f3acdbSCédric Le Goater * machine is strapped to boot from eMMC. Without these 341e8f3acdbSCédric Le Goater * settings, the machine would not boot. 342e8f3acdbSCédric Le Goater * 343e8f3acdbSCédric Le Goater * This also allows the machine to use an eMMC device without 344e8f3acdbSCédric Le Goater * boot areas when booting from the flash device (or -kernel) 345e8f3acdbSCédric Le Goater * Ideally, the device and its properties should be defined on 346e8f3acdbSCédric Le Goater * the command line. 347e8f3acdbSCédric Le Goater */ 348e8f3acdbSCédric Le Goater if (emmc && boot_emmc) { 349e554e45bSCédric Le Goater qdev_prop_set_uint64(card, "boot-partition-size", 1 * MiB); 350e8f3acdbSCédric Le Goater qdev_prop_set_uint8(card, "boot-config", 0x1 << 3); 351e554e45bSCédric Le Goater } 352934df912SMarkus Armbruster qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo), 353a29e3e12SAndrew Jeffery &error_fatal); 3543e80f690SMarkus Armbruster qdev_realize_and_unref(card, 3553e80f690SMarkus Armbruster qdev_get_child_bus(DEVICE(sdhci), "sd-bus"), 3563e80f690SMarkus Armbruster &error_fatal); 357a29e3e12SAndrew Jeffery } 358a29e3e12SAndrew Jeffery 359d2b3eaefSPeter Delevoryas static void connect_serial_hds_to_uarts(AspeedMachineState *bmc) 360d2b3eaefSPeter Delevoryas { 361d2b3eaefSPeter Delevoryas AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc); 3623c392e87SPhilippe Mathieu-Daudé AspeedSoCState *s = bmc->soc; 363d2b3eaefSPeter Delevoryas AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s); 364f65f6ad5SCédric Le Goater int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default; 365d2b3eaefSPeter Delevoryas 366f65f6ad5SCédric Le Goater aspeed_soc_uart_set_chr(s, uart_chosen, serial_hd(0)); 367*8a139ae7SKenneth Jia for (int i = 1, uart = sc->uarts_base; i < sc->uarts_num; uart++) { 368f65f6ad5SCédric Le Goater if (uart == uart_chosen) { 369d2b3eaefSPeter Delevoryas continue; 370d2b3eaefSPeter Delevoryas } 371*8a139ae7SKenneth Jia aspeed_soc_uart_set_chr(s, uart, serial_hd(i++)); 372d2b3eaefSPeter Delevoryas } 373d2b3eaefSPeter Delevoryas } 374d2b3eaefSPeter Delevoryas 375baa4732bSCédric Le Goater static void aspeed_machine_init(MachineState *machine) 376327d8e4eSAndrew Jeffery { 377888b2b03SPhilippe Mathieu-Daudé AspeedMachineState *bmc = ASPEED_MACHINE(machine); 378baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine); 379b033271fSCédric Le Goater AspeedSoCClass *sc; 3802bea128cSEddie James int i; 381255aed81SCédric Le Goater DriveInfo *emmc0 = NULL; 382e554e45bSCédric Le Goater bool boot_emmc; 383327d8e4eSAndrew Jeffery 3843c392e87SPhilippe Mathieu-Daudé bmc->soc = ASPEED_SOC(object_new(amc->soc_name)); 3853c392e87SPhilippe Mathieu-Daudé object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc)); 3863c392e87SPhilippe Mathieu-Daudé object_unref(OBJECT(bmc->soc)); 3873c392e87SPhilippe Mathieu-Daudé sc = ASPEED_SOC_GET_CLASS(bmc->soc); 388b033271fSCédric Le Goater 389533eb415SIgor Mammedov /* 390346160cbSCédric Le Goater * This will error out if the RAM size is not supported by the 391346160cbSCédric Le Goater * memory controller of the SoC. 392533eb415SIgor Mammedov */ 3933c392e87SPhilippe Mathieu-Daudé object_property_set_uint(OBJECT(bmc->soc), "ram-size", machine->ram_size, 394533eb415SIgor Mammedov &error_fatal); 395533eb415SIgor Mammedov 396d3bad7e7SCédric Le Goater for (i = 0; i < sc->macs_num; i++) { 397b3cfec5bSDavid Woodhouse if ((amc->macs_mask & (1 << i)) && 398b3cfec5bSDavid Woodhouse !qemu_configure_nic_device(DEVICE(&bmc->soc->ftgmac100[i]), 399b3cfec5bSDavid Woodhouse true, NULL)) { 400b3cfec5bSDavid Woodhouse break; /* No configs left; stop asking */ 401d3bad7e7SCédric Le Goater } 402d3bad7e7SCédric Le Goater } 403d3bad7e7SCédric Le Goater 404621845a9SCédric Le Goater object_property_set_int(OBJECT(bmc->soc), "hw-strap1", bmc->hw_strap1, 40587e79af0SAndrew Jeffery &error_abort); 4063c392e87SPhilippe Mathieu-Daudé object_property_set_int(OBJECT(bmc->soc), "hw-strap2", amc->hw_strap2, 407ccc2c418SCédric Le Goater &error_abort); 4083c392e87SPhilippe Mathieu-Daudé object_property_set_link(OBJECT(bmc->soc), "memory", 4094dd9d554SPeter Delevoryas OBJECT(get_system_memory()), &error_abort); 4103c392e87SPhilippe Mathieu-Daudé object_property_set_link(OBJECT(bmc->soc), "dram", 4110df2d9a6SCédric Le Goater OBJECT(machine->ram), &error_abort); 412b6e70d1dSJoel Stanley if (machine->kernel_filename) { 413b6e70d1dSJoel Stanley /* 414b6e70d1dSJoel Stanley * When booting with a -kernel command line there is no u-boot 415b6e70d1dSJoel Stanley * that runs to unlock the SCU. In this case set the default to 416b6e70d1dSJoel Stanley * be unlocked as the kernel expects 417b6e70d1dSJoel Stanley */ 4183c392e87SPhilippe Mathieu-Daudé object_property_set_int(OBJECT(bmc->soc), "hw-prot-key", 4195325cc34SMarkus Armbruster ASPEED_SCU_PROT_KEY, &error_abort); 420b6e70d1dSJoel Stanley } 421d2b3eaefSPeter Delevoryas connect_serial_hds_to_uarts(bmc); 4223c392e87SPhilippe Mathieu-Daudé qdev_realize(DEVICE(bmc->soc), NULL, &error_abort); 423327d8e4eSAndrew Jeffery 424c7e313aeSCédric Le Goater if (defaults_enabled()) { 4253c392e87SPhilippe Mathieu-Daudé aspeed_board_init_flashes(&bmc->soc->fmc, 4268ec239f2SMarkus Armbruster bmc->fmc_model ? bmc->fmc_model : amc->fmc_model, 4279bd4ac61SCédric Le Goater amc->num_cs, 0); 4283c392e87SPhilippe Mathieu-Daudé aspeed_board_init_flashes(&bmc->soc->spi[0], 4298ec239f2SMarkus Armbruster bmc->spi_model ? bmc->spi_model : amc->spi_model, 4309bd4ac61SCédric Le Goater 1, amc->num_cs); 431c7e313aeSCédric Le Goater } 432e1ad9bc4SCédric Le Goater 433b7f1a0cbSCédric Le Goater if (machine->kernel_filename && sc->num_cpus > 1) { 4349bb6d140SJoel Stanley /* With no u-boot we must set up a boot stub for the secondary CPU */ 4359bb6d140SJoel Stanley MemoryRegion *smpboot = g_new(MemoryRegion, 1); 436f489960dSPhilippe Mathieu-Daudé memory_region_init_ram(smpboot, NULL, "aspeed.smpboot", 4379bb6d140SJoel Stanley 0x80, &error_abort); 4389bb6d140SJoel Stanley memory_region_add_subregion(get_system_memory(), 4399bb6d140SJoel Stanley AST_SMP_MAILBOX_BASE, smpboot); 4409bb6d140SJoel Stanley 4419bb6d140SJoel Stanley aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot; 4429bb6d140SJoel Stanley aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary; 4439bb6d140SJoel Stanley aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE; 4449bb6d140SJoel Stanley } 4459bb6d140SJoel Stanley 4466e504a98SPaolo Bonzini aspeed_board_binfo.ram_size = machine->ram_size; 447347df6f8SEduardo Habkost aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM]; 448b033271fSCédric Le Goater 449baa4732bSCédric Le Goater if (amc->i2c_init) { 450baa4732bSCédric Le Goater amc->i2c_init(bmc); 4512cf6cb50SCédric Le Goater } 4522cf6cb50SCédric Le Goater 4533c392e87SPhilippe Mathieu-Daudé for (i = 0; i < bmc->soc->sdhci.num_slots; i++) { 4543c392e87SPhilippe Mathieu-Daudé sdhci_attach_drive(&bmc->soc->sdhci.slots[i], 455e554e45bSCédric Le Goater drive_get(IF_SD, 0, i), false, false); 456a29e3e12SAndrew Jeffery } 4572bea128cSEddie James 458e554e45bSCédric Le Goater boot_emmc = sc->boot_from_emmc(bmc->soc); 459e554e45bSCédric Le Goater 4603c392e87SPhilippe Mathieu-Daudé if (bmc->soc->emmc.num_slots) { 461255aed81SCédric Le Goater emmc0 = drive_get(IF_SD, 0, bmc->soc->sdhci.num_slots); 462e554e45bSCédric Le Goater sdhci_attach_drive(&bmc->soc->emmc.slots[0], emmc0, true, boot_emmc); 4632bea128cSEddie James } 4642bea128cSEddie James 4658b744a6aSCédric Le Goater if (!bmc->mmio_exec) { 4663c392e87SPhilippe Mathieu-Daudé DeviceState *dev = ssi_get_cs(bmc->soc->fmc.spi, 0); 4678285490bSCédric Le Goater BlockBackend *fmc0 = dev ? m25p80_get_blk(dev) : NULL; 4688b744a6aSCédric Le Goater 469e554e45bSCédric Le Goater if (fmc0 && !boot_emmc) { 4703c392e87SPhilippe Mathieu-Daudé uint64_t rom_size = memory_region_size(&bmc->soc->spi_boot); 4718285490bSCédric Le Goater aspeed_install_boot_rom(bmc, fmc0, rom_size); 472255aed81SCédric Le Goater } else if (emmc0) { 473255aed81SCédric Le Goater aspeed_install_boot_rom(bmc, blk_by_legacy_dinfo(emmc0), 64 * KiB); 4748b744a6aSCédric Le Goater } 4758b744a6aSCédric Le Goater } 4768b744a6aSCédric Le Goater 4772744ece8STao Xu arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo); 478327d8e4eSAndrew Jeffery } 479327d8e4eSAndrew Jeffery 480612b219aSPhilippe Mathieu-Daudé static void palmetto_bmc_i2c_init(AspeedMachineState *bmc) 4812cf6cb50SCédric Le Goater { 4823c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 483a87e81b9SCédric Le Goater DeviceState *dev; 4843d165f12SCédric Le Goater uint8_t *eeprom_buf = g_malloc0(32 * 1024); 4852cf6cb50SCédric Le Goater 4864db1c164SJamin Lin /* 4874db1c164SJamin Lin * The palmetto platform expects a ds3231 RTC but a ds1338 is 4884db1c164SJamin Lin * enough to provide basic RTC features. Alarms will be missing 4894db1c164SJamin Lin */ 4901373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68); 491a87e81b9SCédric Le Goater 4927a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, 4933d165f12SCédric Le Goater eeprom_buf); 4943d165f12SCédric Le Goater 495a87e81b9SCédric Le Goater /* add a TMP423 temperature sensor */ 4961373b15bSPhilippe Mathieu-Daudé dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), 4971373b15bSPhilippe Mathieu-Daudé "tmp423", 0x4c)); 4985325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 4995325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 5005325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 5015325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort); 5022cf6cb50SCédric Le Goater } 5032cf6cb50SCédric Le Goater 5049cccb912SPatrick Venture static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc) 5059cccb912SPatrick Venture { 5063c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 5079cccb912SPatrick Venture 5089cccb912SPatrick Venture /* 5099cccb912SPatrick Venture * The quanta-q71l platform expects tmp75s which are compatible with 5109cccb912SPatrick Venture * tmp105s. 5119cccb912SPatrick Venture */ 5129cccb912SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c); 5139cccb912SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e); 5149cccb912SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f); 5159cccb912SPatrick Venture 5169cccb912SPatrick Venture /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */ 5179cccb912SPatrick Venture /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */ 5189cccb912SPatrick Venture /* TODO: Add Memory Riser i2c mux and eeproms. */ 5199cccb912SPatrick Venture 5203ec75e39SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74); 5213ec75e39SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77); 5223ec75e39SPatrick Venture 5239cccb912SPatrick Venture /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */ 5243ec75e39SPatrick Venture 5253ec75e39SPatrick Venture /* i2c-7 */ 5263ec75e39SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70); 5279cccb912SPatrick Venture /* - i2c@0: pmbus@59 */ 5289cccb912SPatrick Venture /* - i2c@1: pmbus@58 */ 5299cccb912SPatrick Venture /* - i2c@2: pmbus@58 */ 5309cccb912SPatrick Venture /* - i2c@3: pmbus@59 */ 5313ec75e39SPatrick Venture 5329cccb912SPatrick Venture /* TODO: i2c-7: Add PDB FRU eeprom@52 */ 5339cccb912SPatrick Venture /* TODO: i2c-8: Add BMC FRU eeprom@50 */ 5349cccb912SPatrick Venture } 5359cccb912SPatrick Venture 536612b219aSPhilippe Mathieu-Daudé static void ast2500_evb_i2c_init(AspeedMachineState *bmc) 5372cf6cb50SCédric Le Goater { 5383c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 5393d165f12SCédric Le Goater uint8_t *eeprom_buf = g_malloc0(8 * 1024); 5403d165f12SCédric Le Goater 5417a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50, 5423d165f12SCédric Le Goater eeprom_buf); 5432cf6cb50SCédric Le Goater 5442cf6cb50SCédric Le Goater /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */ 5451373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), 546044475f3SPhilippe Mathieu-Daudé TYPE_TMP105, 0x4d); 5472cf6cb50SCédric Le Goater } 5482cf6cb50SCédric Le Goater 549612b219aSPhilippe Mathieu-Daudé static void ast2600_evb_i2c_init(AspeedMachineState *bmc) 550ccc2c418SCédric Le Goater { 5513c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 55252bcd997SHoward Chiu uint8_t *eeprom_buf = g_malloc0(8 * 1024); 55352bcd997SHoward Chiu 55452bcd997SHoward Chiu smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 55552bcd997SHoward Chiu eeprom_buf); 55652bcd997SHoward Chiu 55752bcd997SHoward Chiu /* LM75 is compatible with TMP105 driver */ 55852bcd997SHoward Chiu i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), 55952bcd997SHoward Chiu TYPE_TMP105, 0x4d); 560ccc2c418SCédric Le Goater } 561ccc2c418SCédric Le Goater 56234f73a81SKarthikeyan Pasupathi static void yosemitev2_bmc_i2c_init(AspeedMachineState *bmc) 56334f73a81SKarthikeyan Pasupathi { 5643c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 56534f73a81SKarthikeyan Pasupathi 56634f73a81SKarthikeyan Pasupathi at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x51, 128 * KiB); 56734f73a81SKarthikeyan Pasupathi at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 128 * KiB, 56834f73a81SKarthikeyan Pasupathi yosemitev2_bmc_fruid, yosemitev2_bmc_fruid_len); 5690a1f86baSKarthikeyan Pasupathi /* TMP421 */ 5700a1f86baSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "tmp421", 0x1f); 5710a1f86baSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4e); 5720a1f86baSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4f); 5730a1f86baSKarthikeyan Pasupathi 57434f73a81SKarthikeyan Pasupathi } 57534f73a81SKarthikeyan Pasupathi 576612b219aSPhilippe Mathieu-Daudé static void romulus_bmc_i2c_init(AspeedMachineState *bmc) 5776c4567c7SCédric Le Goater { 5783c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 5796c4567c7SCédric Le Goater 5804db1c164SJamin Lin /* 5814db1c164SJamin Lin * The romulus board expects Epson RX8900 I2C RTC but a ds1338 is 5824db1c164SJamin Lin * good enough 5834db1c164SJamin Lin */ 5841373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32); 5856c4567c7SCédric Le Goater } 5866c4567c7SCédric Le Goater 5876c323abaSKarthikeyan Pasupathi static void tiogapass_bmc_i2c_init(AspeedMachineState *bmc) 5886c323abaSKarthikeyan Pasupathi { 5893c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 5906c323abaSKarthikeyan Pasupathi 5916c323abaSKarthikeyan Pasupathi at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 128 * KiB); 5926c323abaSKarthikeyan Pasupathi at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 6), 0x54, 128 * KiB, 5936c323abaSKarthikeyan Pasupathi tiogapass_bmc_fruid, tiogapass_bmc_fruid_len); 594a09d357dSKarthikeyan Pasupathi /* TMP421 */ 595a09d357dSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "tmp421", 0x1f); 596a09d357dSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4f); 597a09d357dSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4e); 5986c323abaSKarthikeyan Pasupathi } 5996c323abaSKarthikeyan Pasupathi 600f4aec252SCédric Le Goater static void create_pca9552(AspeedSoCState *soc, int bus_id, int addr) 601f4aec252SCédric Le Goater { 602f4aec252SCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, bus_id), 603f4aec252SCédric Le Goater TYPE_PCA9552, addr); 604f4aec252SCédric Le Goater } 605f4aec252SCédric Le Goater 606612b219aSPhilippe Mathieu-Daudé static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc) 607143b040fSPatrick Williams { 6083c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 609143b040fSPatrick Williams 610143b040fSPatrick Williams /* bus 2 : */ 6111373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48); 6121373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49); 613143b040fSPatrick Williams /* bus 2 : pca9546 @ 0x73 */ 614143b040fSPatrick Williams 615143b040fSPatrick Williams /* bus 3 : pca9548 @ 0x70 */ 616143b040fSPatrick Williams 617143b040fSPatrick Williams /* bus 4 : */ 618143b040fSPatrick Williams uint8_t *eeprom4_54 = g_malloc0(8 * 1024); 6197a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 620143b040fSPatrick Williams eeprom4_54); 621143b040fSPatrick Williams /* PCA9539 @ 0x76, but PCA9552 is compatible */ 622f4aec252SCédric Le Goater create_pca9552(soc, 4, 0x76); 623143b040fSPatrick Williams /* PCA9539 @ 0x77, but PCA9552 is compatible */ 624f4aec252SCédric Le Goater create_pca9552(soc, 4, 0x77); 625143b040fSPatrick Williams 626143b040fSPatrick Williams /* bus 6 : */ 6271373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48); 6281373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49); 629143b040fSPatrick Williams /* bus 6 : pca9546 @ 0x73 */ 630143b040fSPatrick Williams 631143b040fSPatrick Williams /* bus 8 : */ 632143b040fSPatrick Williams uint8_t *eeprom8_56 = g_malloc0(8 * 1024); 6337a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56, 634143b040fSPatrick Williams eeprom8_56); 635f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x60); 636f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x61); 637143b040fSPatrick Williams /* bus 8 : adc128d818 @ 0x1d */ 638143b040fSPatrick Williams /* bus 8 : adc128d818 @ 0x1f */ 639143b040fSPatrick Williams 640143b040fSPatrick Williams /* 641143b040fSPatrick Williams * bus 13 : pca9548 @ 0x71 642143b040fSPatrick Williams * - channel 3: 643143b040fSPatrick Williams * - tmm421 @ 0x4c 644143b040fSPatrick Williams * - tmp421 @ 0x4e 645143b040fSPatrick Williams * - tmp421 @ 0x4f 646143b040fSPatrick Williams */ 647143b040fSPatrick Williams 648143b040fSPatrick Williams } 649143b040fSPatrick Williams 650612b219aSPhilippe Mathieu-Daudé static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc) 65162c2c2ebSCédric Le Goater { 6527cfbde5eSPhilippe Mathieu-Daudé static const struct { 6537cfbde5eSPhilippe Mathieu-Daudé unsigned gpio_id; 6547cfbde5eSPhilippe Mathieu-Daudé LEDColor color; 6557cfbde5eSPhilippe Mathieu-Daudé const char *description; 6567cfbde5eSPhilippe Mathieu-Daudé bool gpio_polarity; 6577cfbde5eSPhilippe Mathieu-Daudé } pca1_leds[] = { 6587cfbde5eSPhilippe Mathieu-Daudé {13, LED_COLOR_GREEN, "front-fault-4", GPIO_POLARITY_ACTIVE_LOW}, 6597cfbde5eSPhilippe Mathieu-Daudé {14, LED_COLOR_GREEN, "front-power-3", GPIO_POLARITY_ACTIVE_LOW}, 6607cfbde5eSPhilippe Mathieu-Daudé {15, LED_COLOR_GREEN, "front-id-5", GPIO_POLARITY_ACTIVE_LOW}, 6617cfbde5eSPhilippe Mathieu-Daudé }; 6623c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 6633d165f12SCédric Le Goater uint8_t *eeprom_buf = g_malloc0(8 * 1024); 66415ce12cfSPhilippe Mathieu-Daudé DeviceState *dev; 6657cfbde5eSPhilippe Mathieu-Daudé LEDState *led; 66662c2c2ebSCédric Le Goater 66763ceb818SCédric Le Goater /* Bus 3: TODO bmp280@77 */ 668db437ca6SPhilippe Mathieu-Daudé dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60)); 66915ce12cfSPhilippe Mathieu-Daudé qdev_prop_set_string(dev, "description", "pca1"); 6702616f572SPhilippe Mathieu-Daudé i2c_slave_realize_and_unref(I2C_SLAVE(dev), 6712616f572SPhilippe Mathieu-Daudé aspeed_i2c_get_bus(&soc->i2c, 3), 67215ce12cfSPhilippe Mathieu-Daudé &error_fatal); 6738c9a61d7SCédric Le Goater 6747cfbde5eSPhilippe Mathieu-Daudé for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) { 6757cfbde5eSPhilippe Mathieu-Daudé led = led_create_simple(OBJECT(bmc), 6767cfbde5eSPhilippe Mathieu-Daudé pca1_leds[i].gpio_polarity, 6777cfbde5eSPhilippe Mathieu-Daudé pca1_leds[i].color, 6787cfbde5eSPhilippe Mathieu-Daudé pca1_leds[i].description); 6797cfbde5eSPhilippe Mathieu-Daudé qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id, 6807cfbde5eSPhilippe Mathieu-Daudé qdev_get_gpio_in(DEVICE(led), 0)); 6817cfbde5eSPhilippe Mathieu-Daudé } 682b61ea6e7SJoel Stanley i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76); 6832a75e8c3SMaheswara Kurapati i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "max31785", 0x52); 6841373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c); 6851373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c); 68662c2c2ebSCédric Le Goater 68762c2c2ebSCédric Le Goater /* The Witherspoon expects a TMP275 but a TMP105 is compatible */ 6881373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105, 689044475f3SPhilippe Mathieu-Daudé 0x4a); 6906c4567c7SCédric Le Goater 6914db1c164SJamin Lin /* 6924db1c164SJamin Lin * The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is 6934db1c164SJamin Lin * good enough 6944db1c164SJamin Lin */ 6951373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32); 6963d165f12SCédric Le Goater 6977a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51, 6983d165f12SCédric Le Goater eeprom_buf); 699db437ca6SPhilippe Mathieu-Daudé dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60)); 70015ce12cfSPhilippe Mathieu-Daudé qdev_prop_set_string(dev, "description", "pca0"); 7012616f572SPhilippe Mathieu-Daudé i2c_slave_realize_and_unref(I2C_SLAVE(dev), 7022616f572SPhilippe Mathieu-Daudé aspeed_i2c_get_bus(&soc->i2c, 11), 70315ce12cfSPhilippe Mathieu-Daudé &error_fatal); 70463ceb818SCédric Le Goater /* Bus 11: TODO ucd90160@64 */ 70562c2c2ebSCédric Le Goater } 70662c2c2ebSCédric Le Goater 70795f068c8SJohn Wang static void g220a_bmc_i2c_init(AspeedMachineState *bmc) 70895f068c8SJohn Wang { 7093c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 71095f068c8SJohn Wang DeviceState *dev; 71195f068c8SJohn Wang 71295f068c8SJohn Wang dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), 71395f068c8SJohn Wang "emc1413", 0x4c)); 71495f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 71595f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 71695f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 71795f068c8SJohn Wang 71895f068c8SJohn Wang dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12), 71995f068c8SJohn Wang "emc1413", 0x4c)); 72095f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 72195f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 72295f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 72395f068c8SJohn Wang 72495f068c8SJohn Wang dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13), 72595f068c8SJohn Wang "emc1413", 0x4c)); 72695f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 72795f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 72895f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 7296f5f6507SJohn Wang 7306f5f6507SJohn Wang static uint8_t eeprom_buf[2 * 1024] = { 7316f5f6507SJohn Wang 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe, 7326f5f6507SJohn Wang 0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65, 7336f5f6507SJohn Wang 0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32, 7346f5f6507SJohn Wang 0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42, 7356f5f6507SJohn Wang 0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45, 7366f5f6507SJohn Wang 0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1, 7376f5f6507SJohn Wang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, 7386f5f6507SJohn Wang }; 7396f5f6507SJohn Wang smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57, 7406f5f6507SJohn Wang eeprom_buf); 74195f068c8SJohn Wang } 74295f068c8SJohn Wang 74382b6a3f6SJohn Wang static void fp5280g2_bmc_i2c_init(AspeedMachineState *bmc) 74482b6a3f6SJohn Wang { 7453c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 74682b6a3f6SJohn Wang I2CSlave *i2c_mux; 74782b6a3f6SJohn Wang 74882b6a3f6SJohn Wang /* The at24c256 */ 74982b6a3f6SJohn Wang at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 1), 0x50, 32768); 75082b6a3f6SJohn Wang 75182b6a3f6SJohn Wang /* The fp5280g2 expects a TMP112 but a TMP105 is compatible */ 75282b6a3f6SJohn Wang i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105, 75382b6a3f6SJohn Wang 0x48); 75482b6a3f6SJohn Wang i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105, 75582b6a3f6SJohn Wang 0x49); 75682b6a3f6SJohn Wang 75782b6a3f6SJohn Wang i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), 75882b6a3f6SJohn Wang "pca9546", 0x70); 75982b6a3f6SJohn Wang /* It expects a TMP112 but a TMP105 is compatible */ 76082b6a3f6SJohn Wang i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0), TYPE_TMP105, 76182b6a3f6SJohn Wang 0x4a); 76282b6a3f6SJohn Wang 76382b6a3f6SJohn Wang /* It expects a ds3232 but a ds1338 is good enough */ 76482b6a3f6SJohn Wang i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "ds1338", 0x68); 76582b6a3f6SJohn Wang 76682b6a3f6SJohn Wang /* It expects a pca9555 but a pca9552 is compatible */ 767f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x30); 76882b6a3f6SJohn Wang } 76982b6a3f6SJohn Wang 77058e52bdbSCédric Le Goater static void rainier_bmc_i2c_init(AspeedMachineState *bmc) 77158e52bdbSCédric Le Goater { 7723c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 773fa6d98c0SJoel Stanley I2CSlave *i2c_mux; 774fa6d98c0SJoel Stanley 7759077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB); 77658e52bdbSCédric Le Goater 777f4aec252SCédric Le Goater create_pca9552(soc, 3, 0x61); 778bcb122f8SJoel Stanley 77958e52bdbSCédric Le Goater /* The rainier expects a TMP275 but a TMP105 is compatible */ 78058e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105, 78158e52bdbSCédric Le Goater 0x48); 78258e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105, 78358e52bdbSCédric Le Goater 0x49); 78458e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105, 78558e52bdbSCédric Le Goater 0x4a); 786fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), 787fa6d98c0SJoel Stanley "pca9546", 0x70); 7889077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 7899077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 7909077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB); 791f4aec252SCédric Le Goater create_pca9552(soc, 4, 0x60); 79258e52bdbSCédric Le Goater 79358e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105, 79458e52bdbSCédric Le Goater 0x48); 79558e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105, 79658e52bdbSCédric Le Goater 0x49); 797f4aec252SCédric Le Goater create_pca9552(soc, 5, 0x60); 798f4aec252SCédric Le Goater create_pca9552(soc, 5, 0x61); 799fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), 800fa6d98c0SJoel Stanley "pca9546", 0x70); 8019077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 8029077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 80358e52bdbSCédric Le Goater 80458e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105, 80558e52bdbSCédric Le Goater 0x48); 80658e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105, 80758e52bdbSCédric Le Goater 0x4a); 80858e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105, 80958e52bdbSCédric Le Goater 0x4b); 810fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), 811fa6d98c0SJoel Stanley "pca9546", 0x70); 8129077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 8139077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 8149077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB); 8159077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB); 81658e52bdbSCédric Le Goater 817f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x30); 818f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x31); 819f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x32); 820f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x33); 821f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x60); 822f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x61); 823b61ea6e7SJoel Stanley i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76); 82458e52bdbSCédric Le Goater /* Bus 7: TODO si7021-a20@20 */ 82558e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105, 82658e52bdbSCédric Le Goater 0x48); 8272a75e8c3SMaheswara Kurapati i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "max31785", 0x52); 8289077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB); 8299077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB); 83058e52bdbSCédric Le Goater 83158e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105, 83258e52bdbSCédric Le Goater 0x48); 83358e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105, 83458e52bdbSCédric Le Goater 0x4a); 835be85508fSNinad Palsule at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50, 836be85508fSNinad Palsule 64 * KiB, rainier_bb_fruid, rainier_bb_fruid_len); 837be85508fSNinad Palsule at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 838be85508fSNinad Palsule 64 * KiB, rainier_bmc_fruid, rainier_bmc_fruid_len); 839f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x60); 840f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x61); 84158e52bdbSCédric Le Goater /* Bus 8: ucd90320@11 */ 84258e52bdbSCédric Le Goater /* Bus 8: ucd90320@b */ 84358e52bdbSCédric Le Goater /* Bus 8: ucd90320@c */ 84458e52bdbSCédric Le Goater 84558e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c); 84658e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d); 8479077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB); 84858e52bdbSCédric Le Goater 84958e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c); 85058e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d); 8519077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB); 85258e52bdbSCédric Le Goater 85358e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105, 85458e52bdbSCédric Le Goater 0x48); 85558e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105, 85658e52bdbSCédric Le Goater 0x49); 857fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), 858fa6d98c0SJoel Stanley "pca9546", 0x70); 8599077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 8609077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 861f4aec252SCédric Le Goater create_pca9552(soc, 11, 0x60); 862fa6d98c0SJoel Stanley 863fa6d98c0SJoel Stanley 8649077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB); 865f4aec252SCédric Le Goater create_pca9552(soc, 13, 0x60); 866fa6d98c0SJoel Stanley 8679077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB); 868f4aec252SCédric Le Goater create_pca9552(soc, 14, 0x60); 869fa6d98c0SJoel Stanley 8709077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB); 871f4aec252SCédric Le Goater create_pca9552(soc, 15, 0x60); 87258e52bdbSCédric Le Goater } 87358e52bdbSCédric Le Goater 874febbe308SPeter Delevoryas static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr, 875febbe308SPeter Delevoryas I2CBus **channels) 876febbe308SPeter Delevoryas { 877febbe308SPeter Delevoryas I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr); 878febbe308SPeter Delevoryas for (int i = 0; i < 8; i++) { 879febbe308SPeter Delevoryas channels[i] = pca954x_i2c_get_bus(mux, i); 880febbe308SPeter Delevoryas } 881febbe308SPeter Delevoryas } 882febbe308SPeter Delevoryas 883febbe308SPeter Delevoryas #define TYPE_LM75 TYPE_TMP105 884febbe308SPeter Delevoryas #define TYPE_TMP75 TYPE_TMP105 885febbe308SPeter Delevoryas #define TYPE_TMP422 "tmp422" 886febbe308SPeter Delevoryas 887febbe308SPeter Delevoryas static void fuji_bmc_i2c_init(AspeedMachineState *bmc) 888febbe308SPeter Delevoryas { 8893c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 890febbe308SPeter Delevoryas I2CBus *i2c[144] = {}; 891febbe308SPeter Delevoryas 892febbe308SPeter Delevoryas for (int i = 0; i < 16; i++) { 893febbe308SPeter Delevoryas i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i); 894febbe308SPeter Delevoryas } 895febbe308SPeter Delevoryas I2CBus *i2c180 = i2c[2]; 896febbe308SPeter Delevoryas I2CBus *i2c480 = i2c[8]; 897febbe308SPeter Delevoryas I2CBus *i2c600 = i2c[11]; 898febbe308SPeter Delevoryas 899febbe308SPeter Delevoryas get_pca9548_channels(i2c180, 0x70, &i2c[16]); 900febbe308SPeter Delevoryas get_pca9548_channels(i2c480, 0x70, &i2c[24]); 901febbe308SPeter Delevoryas /* NOTE: The device tree skips [32, 40) in the alias numbering */ 902febbe308SPeter Delevoryas get_pca9548_channels(i2c600, 0x77, &i2c[40]); 903febbe308SPeter Delevoryas get_pca9548_channels(i2c[24], 0x71, &i2c[48]); 904febbe308SPeter Delevoryas get_pca9548_channels(i2c[25], 0x72, &i2c[56]); 905febbe308SPeter Delevoryas get_pca9548_channels(i2c[26], 0x76, &i2c[64]); 906febbe308SPeter Delevoryas get_pca9548_channels(i2c[27], 0x76, &i2c[72]); 907febbe308SPeter Delevoryas for (int i = 0; i < 8; i++) { 908febbe308SPeter Delevoryas get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]); 909febbe308SPeter Delevoryas } 910febbe308SPeter Delevoryas 911febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c); 912febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d); 913febbe308SPeter Delevoryas 914ef0eb67eSSittisak Sinprem /* 915ef0eb67eSSittisak Sinprem * EEPROM 24c64 size is 64Kbits or 8 Kbytes 916ef0eb67eSSittisak Sinprem * 24c02 size is 2Kbits or 256 bytes 917ef0eb67eSSittisak Sinprem */ 918ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[19], 0x52, 8 * KiB); 919ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[20], 0x50, 256); 920ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[22], 0x52, 256); 921febbe308SPeter Delevoryas 922febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x48); 923febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x49); 924febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x4a); 925febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_TMP422, 0x4c); 926febbe308SPeter Delevoryas 927ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[8], 0x51, 8 * KiB); 928febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a); 929febbe308SPeter Delevoryas 930febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[50], TYPE_LM75, 0x4c); 931ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[50], 0x52, 8 * KiB); 932febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[51], TYPE_TMP75, 0x48); 933febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[52], TYPE_TMP75, 0x49); 934febbe308SPeter Delevoryas 935febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[59], TYPE_TMP75, 0x48); 936febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[60], TYPE_TMP75, 0x49); 937febbe308SPeter Delevoryas 938ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[65], 0x53, 8 * KiB); 939febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x49); 940febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x48); 941ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[68], 0x52, 8 * KiB); 942ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[69], 0x52, 8 * KiB); 943ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[70], 0x52, 8 * KiB); 944ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[71], 0x52, 8 * KiB); 945febbe308SPeter Delevoryas 946ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[73], 0x53, 8 * KiB); 947febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x49); 948febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x48); 949ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[76], 0x52, 8 * KiB); 950ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[77], 0x52, 8 * KiB); 951ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[78], 0x52, 8 * KiB); 952ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[79], 0x52, 8 * KiB); 953ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[28], 0x50, 256); 954febbe308SPeter Delevoryas 955febbe308SPeter Delevoryas for (int i = 0; i < 8; i++) { 9569077e09aSPeter Delevoryas at24c_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB); 957febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[82 + i * 8], TYPE_TMP75, 0x48); 958febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[83 + i * 8], TYPE_TMP75, 0x4b); 959febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[84 + i * 8], TYPE_TMP75, 0x4a); 960febbe308SPeter Delevoryas } 961febbe308SPeter Delevoryas } 962febbe308SPeter Delevoryas 963a20c54b1SPatrick Williams #define TYPE_TMP421 "tmp421" 964a20c54b1SPatrick Williams 965a20c54b1SPatrick Williams static void bletchley_bmc_i2c_init(AspeedMachineState *bmc) 966a20c54b1SPatrick Williams { 9673c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 968a20c54b1SPatrick Williams I2CBus *i2c[13] = {}; 969a20c54b1SPatrick Williams for (int i = 0; i < 13; i++) { 970a20c54b1SPatrick Williams if ((i == 8) || (i == 11)) { 971a20c54b1SPatrick Williams continue; 972a20c54b1SPatrick Williams } 973a20c54b1SPatrick Williams i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i); 974a20c54b1SPatrick Williams } 975a20c54b1SPatrick Williams 976a20c54b1SPatrick Williams /* Bus 0 - 5 all have the same config. */ 977a20c54b1SPatrick Williams for (int i = 0; i < 6; i++) { 978a20c54b1SPatrick Williams /* Missing model: ti,ina230 @ 0x45 */ 979a20c54b1SPatrick Williams /* Missing model: mps,mp5023 @ 0x40 */ 980a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[i], TYPE_TMP421, 0x4f); 981a20c54b1SPatrick Williams /* Missing model: nxp,pca9539 @ 0x76, but PCA9552 works enough */ 982a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x76); 983a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x67); 984a20c54b1SPatrick Williams /* Missing model: fsc,fusb302 @ 0x22 */ 985a20c54b1SPatrick Williams } 986a20c54b1SPatrick Williams 987a20c54b1SPatrick Williams /* Bus 6 */ 988a20c54b1SPatrick Williams at24c_eeprom_init(i2c[6], 0x56, 65536); 989a20c54b1SPatrick Williams /* Missing model: nxp,pcf85263 @ 0x51 , but ds1338 works enough */ 990a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[6], "ds1338", 0x51); 991a20c54b1SPatrick Williams 992a20c54b1SPatrick Williams 993a20c54b1SPatrick Williams /* Bus 7 */ 994a20c54b1SPatrick Williams at24c_eeprom_init(i2c[7], 0x54, 65536); 995a20c54b1SPatrick Williams 996a20c54b1SPatrick Williams /* Bus 9 */ 997a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[9], TYPE_TMP421, 0x4f); 998a20c54b1SPatrick Williams 999a20c54b1SPatrick Williams /* Bus 10 */ 1000a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[10], TYPE_TMP421, 0x4f); 1001a20c54b1SPatrick Williams /* Missing model: ti,hdc1080 @ 0x40 */ 1002a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[10], TYPE_PCA9552, 0x67); 1003a20c54b1SPatrick Williams 1004a20c54b1SPatrick Williams /* Bus 12 */ 1005a20c54b1SPatrick Williams /* Missing model: adi,adm1278 @ 0x11 */ 1006a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4c); 1007a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4d); 1008a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[12], TYPE_PCA9552, 0x67); 1009a20c54b1SPatrick Williams } 1010a20c54b1SPatrick Williams 1011fa699e80SPeter Delevoryas static void fby35_i2c_init(AspeedMachineState *bmc) 1012fa699e80SPeter Delevoryas { 10133c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 1014fa699e80SPeter Delevoryas I2CBus *i2c[16]; 1015fa699e80SPeter Delevoryas 1016fa699e80SPeter Delevoryas for (int i = 0; i < 16; i++) { 1017fa699e80SPeter Delevoryas i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i); 1018fa699e80SPeter Delevoryas } 1019fa699e80SPeter Delevoryas 1020fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[2], TYPE_LM75, 0x4f); 1021fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[8], TYPE_TMP421, 0x1f); 1022fa699e80SPeter Delevoryas /* Hotswap controller is actually supposed to be mp5920 or ltc4282. */ 1023fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[11], "adm1272", 0x44); 1024fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4e); 1025fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4f); 1026fa699e80SPeter Delevoryas 10279077e09aSPeter Delevoryas at24c_eeprom_init(i2c[4], 0x51, 128 * KiB); 10289077e09aSPeter Delevoryas at24c_eeprom_init(i2c[6], 0x51, 128 * KiB); 1029c0216b94SPeter Delevoryas at24c_eeprom_init_rom(i2c[8], 0x50, 32 * KiB, fby35_nic_fruid, 1030c0216b94SPeter Delevoryas fby35_nic_fruid_len); 1031c0216b94SPeter Delevoryas at24c_eeprom_init_rom(i2c[11], 0x51, 128 * KiB, fby35_bb_fruid, 1032c0216b94SPeter Delevoryas fby35_bb_fruid_len); 1033c0216b94SPeter Delevoryas at24c_eeprom_init_rom(i2c[11], 0x54, 128 * KiB, fby35_bmc_fruid, 1034c0216b94SPeter Delevoryas fby35_bmc_fruid_len); 1035fa699e80SPeter Delevoryas 1036fa699e80SPeter Delevoryas /* 1037fa699e80SPeter Delevoryas * TODO: There is a multi-master i2c connection to an AST1030 MiniBMC on 1038fa699e80SPeter Delevoryas * buses 0, 1, 2, 3, and 9. Source address 0x10, target address 0x20 on 1039fa699e80SPeter Delevoryas * each. 1040fa699e80SPeter Delevoryas */ 1041fa699e80SPeter Delevoryas } 1042fa699e80SPeter Delevoryas 1043fb6b3c8dSJae Hyun Yoo static void qcom_dc_scm_bmc_i2c_init(AspeedMachineState *bmc) 1044fb6b3c8dSJae Hyun Yoo { 10453c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 1046fb6b3c8dSJae Hyun Yoo 1047fb6b3c8dSJae Hyun Yoo i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 15), "tmp105", 0x4d); 1048fb6b3c8dSJae Hyun Yoo } 1049fb6b3c8dSJae Hyun Yoo 1050ece4cccdSGraeme Gregory static void qcom_dc_scm_firework_i2c_init(AspeedMachineState *bmc) 1051ece4cccdSGraeme Gregory { 10523c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 10532a7a5d5cSJae Hyun Yoo I2CSlave *therm_mux, *cpuvr_mux; 1054ece4cccdSGraeme Gregory 1055ece4cccdSGraeme Gregory /* Create the generic DC-SCM hardware */ 1056ece4cccdSGraeme Gregory qcom_dc_scm_bmc_i2c_init(bmc); 1057ece4cccdSGraeme Gregory 1058ece4cccdSGraeme Gregory /* Now create the Firework specific hardware */ 10592a75e8c3SMaheswara Kurapati 10602a7a5d5cSJae Hyun Yoo /* I2C7 CPUVR MUX */ 10612a7a5d5cSJae Hyun Yoo cpuvr_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), 10622a7a5d5cSJae Hyun Yoo "pca9546", 0x70); 10632a7a5d5cSJae Hyun Yoo i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 0), "pca9548", 0x72); 10642a7a5d5cSJae Hyun Yoo i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 1), "pca9548", 0x72); 10652a7a5d5cSJae Hyun Yoo i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 2), "pca9548", 0x72); 10662a7a5d5cSJae Hyun Yoo i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 3), "pca9548", 0x72); 10672a7a5d5cSJae Hyun Yoo 1068cfc68f16SMaheswara Kurapati /* I2C8 Thermal Diodes*/ 1069cfc68f16SMaheswara Kurapati therm_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), 1070cfc68f16SMaheswara Kurapati "pca9548", 0x70); 1071cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 0), TYPE_LM75, 0x4C); 1072cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 1), TYPE_LM75, 0x4C); 1073cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 2), TYPE_LM75, 0x48); 1074cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 3), TYPE_LM75, 0x48); 1075cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 4), TYPE_LM75, 0x48); 1076cfc68f16SMaheswara Kurapati 10772a75e8c3SMaheswara Kurapati /* I2C9 Fan Controller (MAX31785) */ 10782a75e8c3SMaheswara Kurapati i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x52); 10792a75e8c3SMaheswara Kurapati i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x54); 1080ece4cccdSGraeme Gregory } 1081ece4cccdSGraeme Gregory 10821a15311aSCédric Le Goater static bool aspeed_get_mmio_exec(Object *obj, Error **errp) 10831a15311aSCédric Le Goater { 10841a15311aSCédric Le Goater return ASPEED_MACHINE(obj)->mmio_exec; 10851a15311aSCédric Le Goater } 10861a15311aSCédric Le Goater 10871a15311aSCédric Le Goater static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp) 10881a15311aSCédric Le Goater { 10891a15311aSCédric Le Goater ASPEED_MACHINE(obj)->mmio_exec = value; 10901a15311aSCédric Le Goater } 10911a15311aSCédric Le Goater 10921a15311aSCédric Le Goater static void aspeed_machine_instance_init(Object *obj) 10931a15311aSCédric Le Goater { 1094621845a9SCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(obj); 1095621845a9SCédric Le Goater 10961a15311aSCédric Le Goater ASPEED_MACHINE(obj)->mmio_exec = false; 1097621845a9SCédric Le Goater ASPEED_MACHINE(obj)->hw_strap1 = amc->hw_strap1; 10981a15311aSCédric Le Goater } 10991a15311aSCédric Le Goater 11009820e52fSCédric Le Goater static char *aspeed_get_fmc_model(Object *obj, Error **errp) 11019820e52fSCédric Le Goater { 11029820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 11039820e52fSCédric Le Goater return g_strdup(bmc->fmc_model); 11049820e52fSCédric Le Goater } 11059820e52fSCédric Le Goater 11069820e52fSCédric Le Goater static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp) 11079820e52fSCédric Le Goater { 11089820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 11099820e52fSCédric Le Goater 11109820e52fSCédric Le Goater g_free(bmc->fmc_model); 11119820e52fSCédric Le Goater bmc->fmc_model = g_strdup(value); 11129820e52fSCédric Le Goater } 11139820e52fSCédric Le Goater 11149820e52fSCédric Le Goater static char *aspeed_get_spi_model(Object *obj, Error **errp) 11159820e52fSCédric Le Goater { 11169820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 11179820e52fSCédric Le Goater return g_strdup(bmc->spi_model); 11189820e52fSCédric Le Goater } 11199820e52fSCédric Le Goater 11209820e52fSCédric Le Goater static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp) 11219820e52fSCédric Le Goater { 11229820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 11239820e52fSCédric Le Goater 11249820e52fSCédric Le Goater g_free(bmc->spi_model); 11259820e52fSCédric Le Goater bmc->spi_model = g_strdup(value); 11269820e52fSCédric Le Goater } 11279820e52fSCédric Le Goater 1128f65f6ad5SCédric Le Goater static char *aspeed_get_bmc_console(Object *obj, Error **errp) 1129f65f6ad5SCédric Le Goater { 1130f65f6ad5SCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 1131f65f6ad5SCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc); 1132f65f6ad5SCédric Le Goater int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default; 1133f65f6ad5SCédric Le Goater 1134944128eeSJamin Lin return g_strdup_printf("uart%d", aspeed_uart_index(uart_chosen)); 1135f65f6ad5SCédric Le Goater } 1136f65f6ad5SCédric Le Goater 1137f65f6ad5SCédric Le Goater static void aspeed_set_bmc_console(Object *obj, const char *value, Error **errp) 1138f65f6ad5SCédric Le Goater { 1139f65f6ad5SCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 1140f65f6ad5SCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc); 1141f65f6ad5SCédric Le Goater AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(amc->soc_name)); 1142f65f6ad5SCédric Le Goater int val; 1143944128eeSJamin Lin int uart_first = aspeed_uart_first(sc); 1144944128eeSJamin Lin int uart_last = aspeed_uart_last(sc); 1145f65f6ad5SCédric Le Goater 1146f65f6ad5SCédric Le Goater if (sscanf(value, "uart%u", &val) != 1) { 1147f65f6ad5SCédric Le Goater error_setg(errp, "Bad value for \"uart\" property"); 1148f65f6ad5SCédric Le Goater return; 1149f65f6ad5SCédric Le Goater } 1150f65f6ad5SCédric Le Goater 1151f65f6ad5SCédric Le Goater /* The number of UART depends on the SoC */ 1152944128eeSJamin Lin if (val < uart_first || val > uart_last) { 1153944128eeSJamin Lin error_setg(errp, "\"uart\" should be in range [%d - %d]", 1154944128eeSJamin Lin uart_first, uart_last); 1155f65f6ad5SCédric Le Goater return; 1156f65f6ad5SCédric Le Goater } 1157944128eeSJamin Lin bmc->uart_chosen = val + ASPEED_DEV_UART0; 1158f65f6ad5SCédric Le Goater } 1159f65f6ad5SCédric Le Goater 11601a15311aSCédric Le Goater static void aspeed_machine_class_props_init(ObjectClass *oc) 11611a15311aSCédric Le Goater { 11621a15311aSCédric Le Goater object_class_property_add_bool(oc, "execute-in-place", 11631a15311aSCédric Le Goater aspeed_get_mmio_exec, 1164d2623129SMarkus Armbruster aspeed_set_mmio_exec); 11651a15311aSCédric Le Goater object_class_property_set_description(oc, "execute-in-place", 11667eecec7dSMarkus Armbruster "boot directly from CE0 flash device"); 11679820e52fSCédric Le Goater 1168f65f6ad5SCédric Le Goater object_class_property_add_str(oc, "bmc-console", aspeed_get_bmc_console, 1169f65f6ad5SCédric Le Goater aspeed_set_bmc_console); 1170f65f6ad5SCédric Le Goater object_class_property_set_description(oc, "bmc-console", 1171f65f6ad5SCédric Le Goater "Change the default UART to \"uartX\""); 1172f65f6ad5SCédric Le Goater 11739820e52fSCédric Le Goater object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model, 11749820e52fSCédric Le Goater aspeed_set_fmc_model); 11759820e52fSCédric Le Goater object_class_property_set_description(oc, "fmc-model", 11769820e52fSCédric Le Goater "Change the FMC Flash model"); 11779820e52fSCédric Le Goater object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model, 11789820e52fSCédric Le Goater aspeed_set_spi_model); 11799820e52fSCédric Le Goater object_class_property_set_description(oc, "spi-model", 11809820e52fSCédric Le Goater "Change the SPI Flash model"); 11811a15311aSCédric Le Goater } 11821a15311aSCédric Le Goater 118343a0a5c9SPhilippe Mathieu-Daudé static void aspeed_machine_class_init_cpus_defaults(MachineClass *mc) 1184b7f1a0cbSCédric Le Goater { 118543a0a5c9SPhilippe Mathieu-Daudé AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(mc); 118643a0a5c9SPhilippe Mathieu-Daudé AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(amc->soc_name)); 118743a0a5c9SPhilippe Mathieu-Daudé 118843a0a5c9SPhilippe Mathieu-Daudé mc->default_cpus = sc->num_cpus; 118943a0a5c9SPhilippe Mathieu-Daudé mc->min_cpus = sc->num_cpus; 119043a0a5c9SPhilippe Mathieu-Daudé mc->max_cpus = sc->num_cpus; 1191dc13909eSPhilippe Mathieu-Daudé mc->valid_cpu_types = sc->valid_cpu_types; 1192b7f1a0cbSCédric Le Goater } 1193b7f1a0cbSCédric Le Goater 1194056b779eSCédric Le Goater static bool aspeed_machine_ast2600_get_boot_from_emmc(Object *obj, Error **errp) 1195056b779eSCédric Le Goater { 1196056b779eSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 1197056b779eSCédric Le Goater 1198056b779eSCédric Le Goater return !!(bmc->hw_strap1 & SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC); 1199056b779eSCédric Le Goater } 1200056b779eSCédric Le Goater 1201056b779eSCédric Le Goater static void aspeed_machine_ast2600_set_boot_from_emmc(Object *obj, bool value, 1202056b779eSCédric Le Goater Error **errp) 1203056b779eSCédric Le Goater { 1204056b779eSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 1205056b779eSCédric Le Goater 1206056b779eSCédric Le Goater if (value) { 1207056b779eSCédric Le Goater bmc->hw_strap1 |= SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC; 1208056b779eSCédric Le Goater } else { 1209056b779eSCédric Le Goater bmc->hw_strap1 &= ~SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC; 1210056b779eSCédric Le Goater } 1211056b779eSCédric Le Goater } 1212056b779eSCédric Le Goater 1213056b779eSCédric Le Goater static void aspeed_machine_ast2600_class_emmc_init(ObjectClass *oc) 1214056b779eSCédric Le Goater { 1215056b779eSCédric Le Goater object_class_property_add_bool(oc, "boot-emmc", 1216056b779eSCédric Le Goater aspeed_machine_ast2600_get_boot_from_emmc, 1217056b779eSCédric Le Goater aspeed_machine_ast2600_set_boot_from_emmc); 1218056b779eSCédric Le Goater object_class_property_set_description(oc, "boot-emmc", 1219056b779eSCédric Le Goater "Set or unset boot from EMMC"); 1220056b779eSCédric Le Goater } 1221056b779eSCédric Le Goater 1222fca9ca1bSCédric Le Goater static void aspeed_machine_class_init(ObjectClass *oc, void *data) 122362c2c2ebSCédric Le Goater { 122462c2c2ebSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1225d3bad7e7SCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 122662c2c2ebSCédric Le Goater 1227fca9ca1bSCédric Le Goater mc->init = aspeed_machine_init; 122862c2c2ebSCédric Le Goater mc->no_floppy = 1; 122962c2c2ebSCédric Le Goater mc->no_cdrom = 1; 123062c2c2ebSCédric Le Goater mc->no_parallel = 1; 1231afcbaed6SIgor Mammedov mc->default_ram_id = "ram"; 1232d3bad7e7SCédric Le Goater amc->macs_mask = ASPEED_MAC0_ON; 12335d63d0c7SPeter Delevoryas amc->uart_default = ASPEED_DEV_UART5; 12341a15311aSCédric Le Goater 12351a15311aSCédric Le Goater aspeed_machine_class_props_init(oc); 123662c2c2ebSCédric Le Goater } 123762c2c2ebSCédric Le Goater 1238baa4732bSCédric Le Goater static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data) 1239baa4732bSCédric Le Goater { 1240baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1241baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1242baa4732bSCédric Le Goater 1243baa4732bSCédric Le Goater mc->desc = "OpenPOWER Palmetto BMC (ARM926EJ-S)"; 1244baa4732bSCédric Le Goater amc->soc_name = "ast2400-a1"; 1245baa4732bSCédric Le Goater amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1; 1246baa4732bSCédric Le Goater amc->fmc_model = "n25q256a"; 124770322913SCédric Le Goater amc->spi_model = "mx25l25635f"; 1248baa4732bSCédric Le Goater amc->num_cs = 1; 1249baa4732bSCédric Le Goater amc->i2c_init = palmetto_bmc_i2c_init; 1250baa4732bSCédric Le Goater mc->default_ram_size = 256 * MiB; 125143a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 1252baa4732bSCédric Le Goater }; 1253baa4732bSCédric Le Goater 12549cccb912SPatrick Venture static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data) 12559cccb912SPatrick Venture { 12569cccb912SPatrick Venture MachineClass *mc = MACHINE_CLASS(oc); 12579cccb912SPatrick Venture AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 12589cccb912SPatrick Venture 12599cccb912SPatrick Venture mc->desc = "Quanta-Q71l BMC (ARM926EJ-S)"; 12609cccb912SPatrick Venture amc->soc_name = "ast2400-a1"; 12619cccb912SPatrick Venture amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1; 12629cccb912SPatrick Venture amc->fmc_model = "n25q256a"; 12639cccb912SPatrick Venture amc->spi_model = "mx25l25635e"; 12649cccb912SPatrick Venture amc->num_cs = 1; 12659cccb912SPatrick Venture amc->i2c_init = quanta_q71l_bmc_i2c_init; 12669cccb912SPatrick Venture mc->default_ram_size = 128 * MiB; 126743a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 12689cccb912SPatrick Venture } 12699cccb912SPatrick Venture 127040a38df5SErik Smit static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc, 127140a38df5SErik Smit void *data) 127240a38df5SErik Smit { 127340a38df5SErik Smit MachineClass *mc = MACHINE_CLASS(oc); 127440a38df5SErik Smit AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 127540a38df5SErik Smit 127640a38df5SErik Smit mc->desc = "Supermicro X11 BMC (ARM926EJ-S)"; 127740a38df5SErik Smit amc->soc_name = "ast2400-a1"; 127840a38df5SErik Smit amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1; 127940a38df5SErik Smit amc->fmc_model = "mx25l25635e"; 128040a38df5SErik Smit amc->spi_model = "mx25l25635e"; 128140a38df5SErik Smit amc->num_cs = 1; 128240a38df5SErik Smit amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 128340a38df5SErik Smit amc->i2c_init = palmetto_bmc_i2c_init; 128440a38df5SErik Smit mc->default_ram_size = 256 * MiB; 128543a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 128640a38df5SErik Smit } 128740a38df5SErik Smit 128847936597SGuenter Roeck static void aspeed_machine_supermicro_x11spi_bmc_class_init(ObjectClass *oc, 128947936597SGuenter Roeck void *data) 129047936597SGuenter Roeck { 129147936597SGuenter Roeck MachineClass *mc = MACHINE_CLASS(oc); 129247936597SGuenter Roeck AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 129347936597SGuenter Roeck 129447936597SGuenter Roeck mc->desc = "Supermicro X11 SPI BMC (ARM1176)"; 129547936597SGuenter Roeck amc->soc_name = "ast2500-a1"; 129647936597SGuenter Roeck amc->hw_strap1 = SUPERMICRO_X11SPI_BMC_HW_STRAP1; 129747936597SGuenter Roeck amc->fmc_model = "mx25l25635e"; 129847936597SGuenter Roeck amc->spi_model = "mx25l25635e"; 129947936597SGuenter Roeck amc->num_cs = 1; 130047936597SGuenter Roeck amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 130147936597SGuenter Roeck amc->i2c_init = palmetto_bmc_i2c_init; 130247936597SGuenter Roeck mc->default_ram_size = 512 * MiB; 130343a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 130447936597SGuenter Roeck } 130547936597SGuenter Roeck 1306baa4732bSCédric Le Goater static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data) 1307baa4732bSCédric Le Goater { 1308baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1309baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1310baa4732bSCédric Le Goater 1311baa4732bSCédric Le Goater mc->desc = "Aspeed AST2500 EVB (ARM1176)"; 1312baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1"; 1313baa4732bSCédric Le Goater amc->hw_strap1 = AST2500_EVB_HW_STRAP1; 1314753abfc4SJae Hyun Yoo amc->fmc_model = "mx25l25635e"; 131570322913SCédric Le Goater amc->spi_model = "mx25l25635f"; 1316baa4732bSCédric Le Goater amc->num_cs = 1; 1317baa4732bSCédric Le Goater amc->i2c_init = ast2500_evb_i2c_init; 1318baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB; 131943a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 1320baa4732bSCédric Le Goater }; 1321baa4732bSCédric Le Goater 132234f73a81SKarthikeyan Pasupathi static void aspeed_machine_yosemitev2_class_init(ObjectClass *oc, void *data) 132334f73a81SKarthikeyan Pasupathi { 132434f73a81SKarthikeyan Pasupathi MachineClass *mc = MACHINE_CLASS(oc); 132534f73a81SKarthikeyan Pasupathi AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 132634f73a81SKarthikeyan Pasupathi 132734f73a81SKarthikeyan Pasupathi mc->desc = "Facebook YosemiteV2 BMC (ARM1176)"; 132834f73a81SKarthikeyan Pasupathi amc->soc_name = "ast2500-a1"; 132934f73a81SKarthikeyan Pasupathi amc->hw_strap1 = AST2500_EVB_HW_STRAP1; 133034f73a81SKarthikeyan Pasupathi amc->hw_strap2 = 0; 133134f73a81SKarthikeyan Pasupathi amc->fmc_model = "n25q256a"; 133234f73a81SKarthikeyan Pasupathi amc->spi_model = "mx25l25635e"; 133334f73a81SKarthikeyan Pasupathi amc->num_cs = 2; 133434f73a81SKarthikeyan Pasupathi amc->i2c_init = yosemitev2_bmc_i2c_init; 133534f73a81SKarthikeyan Pasupathi mc->default_ram_size = 512 * MiB; 133643a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 133734f73a81SKarthikeyan Pasupathi }; 133834f73a81SKarthikeyan Pasupathi 1339baa4732bSCédric Le Goater static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data) 1340baa4732bSCédric Le Goater { 1341baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1342baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1343baa4732bSCédric Le Goater 1344baa4732bSCédric Le Goater mc->desc = "OpenPOWER Romulus BMC (ARM1176)"; 1345baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1"; 1346baa4732bSCédric Le Goater amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1; 1347baa4732bSCédric Le Goater amc->fmc_model = "n25q256a"; 1348baa4732bSCédric Le Goater amc->spi_model = "mx66l1g45g"; 1349baa4732bSCédric Le Goater amc->num_cs = 2; 1350baa4732bSCédric Le Goater amc->i2c_init = romulus_bmc_i2c_init; 1351baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB; 135243a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 1353baa4732bSCédric Le Goater }; 1354baa4732bSCédric Le Goater 13556c323abaSKarthikeyan Pasupathi static void aspeed_machine_tiogapass_class_init(ObjectClass *oc, void *data) 13566c323abaSKarthikeyan Pasupathi { 13576c323abaSKarthikeyan Pasupathi MachineClass *mc = MACHINE_CLASS(oc); 13586c323abaSKarthikeyan Pasupathi AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 13596c323abaSKarthikeyan Pasupathi 13606c323abaSKarthikeyan Pasupathi mc->desc = "Facebook Tiogapass BMC (ARM1176)"; 13616c323abaSKarthikeyan Pasupathi amc->soc_name = "ast2500-a1"; 13626c323abaSKarthikeyan Pasupathi amc->hw_strap1 = AST2500_EVB_HW_STRAP1; 13636c323abaSKarthikeyan Pasupathi amc->hw_strap2 = 0; 13646c323abaSKarthikeyan Pasupathi amc->fmc_model = "n25q256a"; 13656c323abaSKarthikeyan Pasupathi amc->spi_model = "mx25l25635e"; 13666c323abaSKarthikeyan Pasupathi amc->num_cs = 2; 13676c323abaSKarthikeyan Pasupathi amc->i2c_init = tiogapass_bmc_i2c_init; 13686c323abaSKarthikeyan Pasupathi mc->default_ram_size = 1 * GiB; 136943a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 13706c323abaSKarthikeyan Pasupathi }; 13716c323abaSKarthikeyan Pasupathi 1372143b040fSPatrick Williams static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data) 1373143b040fSPatrick Williams { 1374143b040fSPatrick Williams MachineClass *mc = MACHINE_CLASS(oc); 1375143b040fSPatrick Williams AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1376143b040fSPatrick Williams 1377143b040fSPatrick Williams mc->desc = "OCP SonoraPass BMC (ARM1176)"; 1378143b040fSPatrick Williams amc->soc_name = "ast2500-a1"; 1379143b040fSPatrick Williams amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1; 1380143b040fSPatrick Williams amc->fmc_model = "mx66l1g45g"; 1381143b040fSPatrick Williams amc->spi_model = "mx66l1g45g"; 1382143b040fSPatrick Williams amc->num_cs = 2; 1383143b040fSPatrick Williams amc->i2c_init = sonorapass_bmc_i2c_init; 1384143b040fSPatrick Williams mc->default_ram_size = 512 * MiB; 138543a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 1386143b040fSPatrick Williams }; 1387143b040fSPatrick Williams 1388baa4732bSCédric Le Goater static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data) 1389baa4732bSCédric Le Goater { 1390baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1391baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1392baa4732bSCédric Le Goater 1393baa4732bSCédric Le Goater mc->desc = "OpenPOWER Witherspoon BMC (ARM1176)"; 1394baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1"; 1395baa4732bSCédric Le Goater amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1; 139670322913SCédric Le Goater amc->fmc_model = "mx25l25635f"; 1397baa4732bSCédric Le Goater amc->spi_model = "mx66l1g45g"; 1398baa4732bSCédric Le Goater amc->num_cs = 2; 1399baa4732bSCédric Le Goater amc->i2c_init = witherspoon_bmc_i2c_init; 1400baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB; 140143a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 1402baa4732bSCédric Le Goater }; 1403baa4732bSCédric Le Goater 1404baa4732bSCédric Le Goater static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data) 1405baa4732bSCédric Le Goater { 1406baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1407baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1408baa4732bSCédric Le Goater 1409f548f201SPeter Maydell mc->desc = "Aspeed AST2600 EVB (Cortex-A7)"; 1410c5811bb3SJoel Stanley amc->soc_name = "ast2600-a3"; 1411baa4732bSCédric Le Goater amc->hw_strap1 = AST2600_EVB_HW_STRAP1; 1412baa4732bSCédric Le Goater amc->hw_strap2 = AST2600_EVB_HW_STRAP2; 1413753abfc4SJae Hyun Yoo amc->fmc_model = "mx66u51235f"; 1414baa4732bSCédric Le Goater amc->spi_model = "mx66u51235f"; 1415baa4732bSCédric Le Goater amc->num_cs = 1; 141629193286SGuenter Roeck amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON | 141729193286SGuenter Roeck ASPEED_MAC3_ON; 1418baa4732bSCédric Le Goater amc->i2c_init = ast2600_evb_i2c_init; 1419baa4732bSCédric Le Goater mc->default_ram_size = 1 * GiB; 142043a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 1421056b779eSCédric Le Goater aspeed_machine_ast2600_class_emmc_init(oc); 1422baa4732bSCédric Le Goater }; 1423baa4732bSCédric Le Goater 142495f068c8SJohn Wang static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data) 142595f068c8SJohn Wang { 142695f068c8SJohn Wang MachineClass *mc = MACHINE_CLASS(oc); 142795f068c8SJohn Wang AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 142895f068c8SJohn Wang 142995f068c8SJohn Wang mc->desc = "Bytedance G220A BMC (ARM1176)"; 143095f068c8SJohn Wang amc->soc_name = "ast2500-a1"; 143195f068c8SJohn Wang amc->hw_strap1 = G220A_BMC_HW_STRAP1; 143295f068c8SJohn Wang amc->fmc_model = "n25q512a"; 143395f068c8SJohn Wang amc->spi_model = "mx25l25635e"; 143495f068c8SJohn Wang amc->num_cs = 2; 14355bb825c8SGuenter Roeck amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 143695f068c8SJohn Wang amc->i2c_init = g220a_bmc_i2c_init; 143795f068c8SJohn Wang mc->default_ram_size = 1024 * MiB; 143843a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 143995f068c8SJohn Wang }; 144095f068c8SJohn Wang 144182b6a3f6SJohn Wang static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc, void *data) 144282b6a3f6SJohn Wang { 144382b6a3f6SJohn Wang MachineClass *mc = MACHINE_CLASS(oc); 144482b6a3f6SJohn Wang AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 144582b6a3f6SJohn Wang 144682b6a3f6SJohn Wang mc->desc = "Inspur FP5280G2 BMC (ARM1176)"; 144782b6a3f6SJohn Wang amc->soc_name = "ast2500-a1"; 144882b6a3f6SJohn Wang amc->hw_strap1 = FP5280G2_BMC_HW_STRAP1; 144982b6a3f6SJohn Wang amc->fmc_model = "n25q512a"; 145082b6a3f6SJohn Wang amc->spi_model = "mx25l25635e"; 145182b6a3f6SJohn Wang amc->num_cs = 2; 145282b6a3f6SJohn Wang amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 145382b6a3f6SJohn Wang amc->i2c_init = fp5280g2_bmc_i2c_init; 145482b6a3f6SJohn Wang mc->default_ram_size = 512 * MiB; 145543a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 145682b6a3f6SJohn Wang }; 145782b6a3f6SJohn Wang 145858e52bdbSCédric Le Goater static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data) 145958e52bdbSCédric Le Goater { 146058e52bdbSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 146158e52bdbSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 146258e52bdbSCédric Le Goater 1463f548f201SPeter Maydell mc->desc = "IBM Rainier BMC (Cortex-A7)"; 1464c5811bb3SJoel Stanley amc->soc_name = "ast2600-a3"; 146558e52bdbSCédric Le Goater amc->hw_strap1 = RAINIER_BMC_HW_STRAP1; 146658e52bdbSCédric Le Goater amc->hw_strap2 = RAINIER_BMC_HW_STRAP2; 146758e52bdbSCédric Le Goater amc->fmc_model = "mx66l1g45g"; 146858e52bdbSCédric Le Goater amc->spi_model = "mx66l1g45g"; 146958e52bdbSCédric Le Goater amc->num_cs = 2; 147058e52bdbSCédric Le Goater amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON; 147158e52bdbSCédric Le Goater amc->i2c_init = rainier_bmc_i2c_init; 147258e52bdbSCédric Le Goater mc->default_ram_size = 1 * GiB; 147343a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 1474056b779eSCédric Le Goater aspeed_machine_ast2600_class_emmc_init(oc); 147558e52bdbSCédric Le Goater }; 147658e52bdbSCédric Le Goater 14771e2c22c9SCédric Le Goater #define FUJI_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB) 1478febbe308SPeter Delevoryas 1479febbe308SPeter Delevoryas static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data) 1480febbe308SPeter Delevoryas { 1481febbe308SPeter Delevoryas MachineClass *mc = MACHINE_CLASS(oc); 1482febbe308SPeter Delevoryas AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1483febbe308SPeter Delevoryas 1484febbe308SPeter Delevoryas mc->desc = "Facebook Fuji BMC (Cortex-A7)"; 1485febbe308SPeter Delevoryas amc->soc_name = "ast2600-a3"; 1486febbe308SPeter Delevoryas amc->hw_strap1 = FUJI_BMC_HW_STRAP1; 1487febbe308SPeter Delevoryas amc->hw_strap2 = FUJI_BMC_HW_STRAP2; 1488febbe308SPeter Delevoryas amc->fmc_model = "mx66l1g45g"; 1489febbe308SPeter Delevoryas amc->spi_model = "mx66l1g45g"; 1490febbe308SPeter Delevoryas amc->num_cs = 2; 1491febbe308SPeter Delevoryas amc->macs_mask = ASPEED_MAC3_ON; 1492febbe308SPeter Delevoryas amc->i2c_init = fuji_bmc_i2c_init; 1493febbe308SPeter Delevoryas amc->uart_default = ASPEED_DEV_UART1; 1494febbe308SPeter Delevoryas mc->default_ram_size = FUJI_BMC_RAM_SIZE; 149543a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 1496febbe308SPeter Delevoryas }; 1497febbe308SPeter Delevoryas 14981e2c22c9SCédric Le Goater #define BLETCHLEY_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB) 1499104bdaffSPatrick Williams 1500a20c54b1SPatrick Williams static void aspeed_machine_bletchley_class_init(ObjectClass *oc, void *data) 1501a20c54b1SPatrick Williams { 1502a20c54b1SPatrick Williams MachineClass *mc = MACHINE_CLASS(oc); 1503a20c54b1SPatrick Williams AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1504a20c54b1SPatrick Williams 1505a20c54b1SPatrick Williams mc->desc = "Facebook Bletchley BMC (Cortex-A7)"; 1506a20c54b1SPatrick Williams amc->soc_name = "ast2600-a3"; 1507a20c54b1SPatrick Williams amc->hw_strap1 = BLETCHLEY_BMC_HW_STRAP1; 1508a20c54b1SPatrick Williams amc->hw_strap2 = BLETCHLEY_BMC_HW_STRAP2; 1509a20c54b1SPatrick Williams amc->fmc_model = "w25q01jvq"; 1510a20c54b1SPatrick Williams amc->spi_model = NULL; 1511a20c54b1SPatrick Williams amc->num_cs = 2; 1512a20c54b1SPatrick Williams amc->macs_mask = ASPEED_MAC2_ON; 1513a20c54b1SPatrick Williams amc->i2c_init = bletchley_bmc_i2c_init; 1514104bdaffSPatrick Williams mc->default_ram_size = BLETCHLEY_BMC_RAM_SIZE; 151543a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 1516a20c54b1SPatrick Williams } 1517a20c54b1SPatrick Williams 15181b063fe2SJuraj Marcin static void fby35_reset(MachineState *state, ResetType type) 1519fa699e80SPeter Delevoryas { 1520fa699e80SPeter Delevoryas AspeedMachineState *bmc = ASPEED_MACHINE(state); 15213c392e87SPhilippe Mathieu-Daudé AspeedGPIOState *gpio = &bmc->soc->gpio; 1522fa699e80SPeter Delevoryas 15231b063fe2SJuraj Marcin qemu_devices_reset(type); 1524fa699e80SPeter Delevoryas 1525f0418558SPeter Delevoryas /* Board ID: 7 (Class-1, 4 slots) */ 1526fa699e80SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioV4", true, &error_fatal); 1527fa699e80SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioV5", true, &error_fatal); 1528fa699e80SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioV6", true, &error_fatal); 1529fa699e80SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioV7", false, &error_fatal); 1530f0418558SPeter Delevoryas 1531f0418558SPeter Delevoryas /* Slot presence pins, inverse polarity. (False means present) */ 1532f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioH4", false, &error_fatal); 1533f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioH5", true, &error_fatal); 1534f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioH6", true, &error_fatal); 1535f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioH7", true, &error_fatal); 1536f0418558SPeter Delevoryas 1537f0418558SPeter Delevoryas /* Slot 12v power pins, normal polarity. (True means powered-on) */ 1538f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioB2", true, &error_fatal); 1539f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioB3", false, &error_fatal); 1540f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioB4", false, &error_fatal); 1541f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioB5", false, &error_fatal); 1542fa699e80SPeter Delevoryas } 1543fa699e80SPeter Delevoryas 1544fa699e80SPeter Delevoryas static void aspeed_machine_fby35_class_init(ObjectClass *oc, void *data) 1545fa699e80SPeter Delevoryas { 1546fa699e80SPeter Delevoryas MachineClass *mc = MACHINE_CLASS(oc); 1547fa699e80SPeter Delevoryas AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1548fa699e80SPeter Delevoryas 1549fa699e80SPeter Delevoryas mc->desc = "Facebook fby35 BMC (Cortex-A7)"; 1550fa699e80SPeter Delevoryas mc->reset = fby35_reset; 1551fa699e80SPeter Delevoryas amc->fmc_model = "mx66l1g45g"; 1552fa699e80SPeter Delevoryas amc->num_cs = 2; 1553fa699e80SPeter Delevoryas amc->macs_mask = ASPEED_MAC3_ON; 1554fa699e80SPeter Delevoryas amc->i2c_init = fby35_i2c_init; 1555fa699e80SPeter Delevoryas /* FIXME: Replace this macro with something more general */ 1556fa699e80SPeter Delevoryas mc->default_ram_size = FUJI_BMC_RAM_SIZE; 155743a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 1558fa699e80SPeter Delevoryas } 1559fa699e80SPeter Delevoryas 156066c895b8SJamin Lin #define AST1030_INTERNAL_FLASH_SIZE (1024 * 1024) 156166c895b8SJamin Lin /* Main SYSCLK frequency in Hz (200MHz) */ 156266c895b8SJamin Lin #define SYSCLK_FRQ 200000000ULL 156366c895b8SJamin Lin 156466c895b8SJamin Lin static void aspeed_minibmc_machine_init(MachineState *machine) 156566c895b8SJamin Lin { 156666c895b8SJamin Lin AspeedMachineState *bmc = ASPEED_MACHINE(machine); 156766c895b8SJamin Lin AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine); 156866c895b8SJamin Lin Clock *sysclk; 156966c895b8SJamin Lin 157066c895b8SJamin Lin sysclk = clock_new(OBJECT(machine), "SYSCLK"); 157166c895b8SJamin Lin clock_set_hz(sysclk, SYSCLK_FRQ); 157266c895b8SJamin Lin 15733c392e87SPhilippe Mathieu-Daudé bmc->soc = ASPEED_SOC(object_new(amc->soc_name)); 15743c392e87SPhilippe Mathieu-Daudé object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc)); 15753c392e87SPhilippe Mathieu-Daudé object_unref(OBJECT(bmc->soc)); 15763c392e87SPhilippe Mathieu-Daudé qdev_connect_clock_in(DEVICE(bmc->soc), "sysclk", sysclk); 157766c895b8SJamin Lin 15783c392e87SPhilippe Mathieu-Daudé object_property_set_link(OBJECT(bmc->soc), "memory", 15794dd9d554SPeter Delevoryas OBJECT(get_system_memory()), &error_abort); 1580d2b3eaefSPeter Delevoryas connect_serial_hds_to_uarts(bmc); 15813c392e87SPhilippe Mathieu-Daudé qdev_realize(DEVICE(bmc->soc), NULL, &error_abort); 158266c895b8SJamin Lin 158322b3c557SJamin Lin if (defaults_enabled()) { 15843c392e87SPhilippe Mathieu-Daudé aspeed_board_init_flashes(&bmc->soc->fmc, 158566c895b8SJamin Lin bmc->fmc_model ? bmc->fmc_model : amc->fmc_model, 158666c895b8SJamin Lin amc->num_cs, 158766c895b8SJamin Lin 0); 158866c895b8SJamin Lin 15893c392e87SPhilippe Mathieu-Daudé aspeed_board_init_flashes(&bmc->soc->spi[0], 159066c895b8SJamin Lin bmc->spi_model ? bmc->spi_model : amc->spi_model, 159166c895b8SJamin Lin amc->num_cs, amc->num_cs); 159266c895b8SJamin Lin 15933c392e87SPhilippe Mathieu-Daudé aspeed_board_init_flashes(&bmc->soc->spi[1], 159466c895b8SJamin Lin bmc->spi_model ? bmc->spi_model : amc->spi_model, 159566c895b8SJamin Lin amc->num_cs, (amc->num_cs * 2)); 159622b3c557SJamin Lin } 159766c895b8SJamin Lin 159866c895b8SJamin Lin if (amc->i2c_init) { 159966c895b8SJamin Lin amc->i2c_init(bmc); 160066c895b8SJamin Lin } 160166c895b8SJamin Lin 160266c895b8SJamin Lin armv7m_load_kernel(ARM_CPU(first_cpu), 160366c895b8SJamin Lin machine->kernel_filename, 1604761c532aSPeter Maydell 0, 160566c895b8SJamin Lin AST1030_INTERNAL_FLASH_SIZE); 160666c895b8SJamin Lin } 160766c895b8SJamin Lin 16084c70ab16STroy Lee static void ast1030_evb_i2c_init(AspeedMachineState *bmc) 16094c70ab16STroy Lee { 16103c392e87SPhilippe Mathieu-Daudé AspeedSoCState *soc = bmc->soc; 16114c70ab16STroy Lee 1612673d8215SMichael Tokarev /* U10 24C08 connects to SDA/SCL Group 1 by default */ 16134c70ab16STroy Lee uint8_t *eeprom_buf = g_malloc0(32 * 1024); 16144c70ab16STroy Lee smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, eeprom_buf); 16154c70ab16STroy Lee 16164c70ab16STroy Lee /* U11 LM75 connects to SDA/SCL Group 2 by default */ 16174c70ab16STroy Lee i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d); 16184c70ab16STroy Lee } 16194c70ab16STroy Lee 162066c895b8SJamin Lin static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc, 162166c895b8SJamin Lin void *data) 162266c895b8SJamin Lin { 162366c895b8SJamin Lin MachineClass *mc = MACHINE_CLASS(oc); 162466c895b8SJamin Lin AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 162566c895b8SJamin Lin 162666c895b8SJamin Lin mc->desc = "Aspeed AST1030 MiniBMC (Cortex-M4)"; 162766c895b8SJamin Lin amc->soc_name = "ast1030-a1"; 162866c895b8SJamin Lin amc->hw_strap1 = 0; 162966c895b8SJamin Lin amc->hw_strap2 = 0; 163066c895b8SJamin Lin mc->init = aspeed_minibmc_machine_init; 16314c70ab16STroy Lee amc->i2c_init = ast1030_evb_i2c_init; 163266c895b8SJamin Lin mc->default_ram_size = 0; 1633e15001bcSJamin Lin amc->fmc_model = "w25q80bl"; 1634a37bbfbbSJamin Lin amc->spi_model = "w25q256"; 163566c895b8SJamin Lin amc->num_cs = 2; 163666c895b8SJamin Lin amc->macs_mask = 0; 163743a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 163866c895b8SJamin Lin } 163966c895b8SJamin Lin 164092707992SJamin Lin #ifdef TARGET_AARCH64 16412c075ff3SJamin Lin static void ast2700_evb_i2c_init(AspeedMachineState *bmc) 16422c075ff3SJamin Lin { 16432c075ff3SJamin Lin AspeedSoCState *soc = bmc->soc; 16442c075ff3SJamin Lin 16452c075ff3SJamin Lin /* LM75 is compatible with TMP105 driver */ 16462c075ff3SJamin Lin i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), 16472c075ff3SJamin Lin TYPE_TMP105, 0x4d); 16482c075ff3SJamin Lin } 16492c075ff3SJamin Lin 165092707992SJamin Lin static void aspeed_machine_ast2700_evb_class_init(ObjectClass *oc, void *data) 165192707992SJamin Lin { 165292707992SJamin Lin MachineClass *mc = MACHINE_CLASS(oc); 165392707992SJamin Lin AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 165492707992SJamin Lin 165592707992SJamin Lin mc->desc = "Aspeed AST2700 EVB (Cortex-A35)"; 165692707992SJamin Lin amc->soc_name = "ast2700-a0"; 165792707992SJamin Lin amc->hw_strap1 = AST2700_EVB_HW_STRAP1; 165892707992SJamin Lin amc->hw_strap2 = AST2700_EVB_HW_STRAP2; 165992707992SJamin Lin amc->fmc_model = "w25q01jvq"; 166092707992SJamin Lin amc->spi_model = "w25q512jv"; 166192707992SJamin Lin amc->num_cs = 2; 166292707992SJamin Lin amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON; 166392707992SJamin Lin amc->uart_default = ASPEED_DEV_UART12; 16642c075ff3SJamin Lin amc->i2c_init = ast2700_evb_i2c_init; 166592707992SJamin Lin mc->default_ram_size = 1 * GiB; 166692707992SJamin Lin aspeed_machine_class_init_cpus_defaults(mc); 166792707992SJamin Lin } 166892707992SJamin Lin #endif 166992707992SJamin Lin 1670fb6b3c8dSJae Hyun Yoo static void aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass *oc, 1671fb6b3c8dSJae Hyun Yoo void *data) 1672fb6b3c8dSJae Hyun Yoo { 1673fb6b3c8dSJae Hyun Yoo MachineClass *mc = MACHINE_CLASS(oc); 1674fb6b3c8dSJae Hyun Yoo AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1675fb6b3c8dSJae Hyun Yoo 1676fb6b3c8dSJae Hyun Yoo mc->desc = "Qualcomm DC-SCM V1 BMC (Cortex A7)"; 1677fb6b3c8dSJae Hyun Yoo amc->soc_name = "ast2600-a3"; 1678fb6b3c8dSJae Hyun Yoo amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1; 1679fb6b3c8dSJae Hyun Yoo amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2; 1680fb6b3c8dSJae Hyun Yoo amc->fmc_model = "n25q512a"; 1681fb6b3c8dSJae Hyun Yoo amc->spi_model = "n25q512a"; 1682fb6b3c8dSJae Hyun Yoo amc->num_cs = 2; 1683fb6b3c8dSJae Hyun Yoo amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON; 1684fb6b3c8dSJae Hyun Yoo amc->i2c_init = qcom_dc_scm_bmc_i2c_init; 1685fb6b3c8dSJae Hyun Yoo mc->default_ram_size = 1 * GiB; 168643a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 1687fb6b3c8dSJae Hyun Yoo }; 1688fb6b3c8dSJae Hyun Yoo 1689ece4cccdSGraeme Gregory static void aspeed_machine_qcom_firework_class_init(ObjectClass *oc, 1690ece4cccdSGraeme Gregory void *data) 1691ece4cccdSGraeme Gregory { 1692ece4cccdSGraeme Gregory MachineClass *mc = MACHINE_CLASS(oc); 1693ece4cccdSGraeme Gregory AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1694ece4cccdSGraeme Gregory 1695ece4cccdSGraeme Gregory mc->desc = "Qualcomm DC-SCM V1/Firework BMC (Cortex A7)"; 1696ece4cccdSGraeme Gregory amc->soc_name = "ast2600-a3"; 1697ece4cccdSGraeme Gregory amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1; 1698ece4cccdSGraeme Gregory amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2; 1699ece4cccdSGraeme Gregory amc->fmc_model = "n25q512a"; 1700ece4cccdSGraeme Gregory amc->spi_model = "n25q512a"; 1701ece4cccdSGraeme Gregory amc->num_cs = 2; 1702ece4cccdSGraeme Gregory amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON; 1703ece4cccdSGraeme Gregory amc->i2c_init = qcom_dc_scm_firework_i2c_init; 1704ece4cccdSGraeme Gregory mc->default_ram_size = 1 * GiB; 170543a0a5c9SPhilippe Mathieu-Daudé aspeed_machine_class_init_cpus_defaults(mc); 1706ece4cccdSGraeme Gregory }; 1707ece4cccdSGraeme Gregory 1708baa4732bSCédric Le Goater static const TypeInfo aspeed_machine_types[] = { 1709baa4732bSCédric Le Goater { 1710baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("palmetto-bmc"), 1711baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1712baa4732bSCédric Le Goater .class_init = aspeed_machine_palmetto_class_init, 1713baa4732bSCédric Le Goater }, { 171440a38df5SErik Smit .name = MACHINE_TYPE_NAME("supermicrox11-bmc"), 171540a38df5SErik Smit .parent = TYPE_ASPEED_MACHINE, 171640a38df5SErik Smit .class_init = aspeed_machine_supermicrox11_bmc_class_init, 171740a38df5SErik Smit }, { 171847936597SGuenter Roeck .name = MACHINE_TYPE_NAME("supermicro-x11spi-bmc"), 171947936597SGuenter Roeck .parent = TYPE_ASPEED_MACHINE, 172047936597SGuenter Roeck .class_init = aspeed_machine_supermicro_x11spi_bmc_class_init, 172147936597SGuenter Roeck }, { 1722baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("ast2500-evb"), 1723baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1724baa4732bSCédric Le Goater .class_init = aspeed_machine_ast2500_evb_class_init, 1725baa4732bSCédric Le Goater }, { 1726baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("romulus-bmc"), 1727baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1728baa4732bSCédric Le Goater .class_init = aspeed_machine_romulus_class_init, 1729baa4732bSCédric Le Goater }, { 1730143b040fSPatrick Williams .name = MACHINE_TYPE_NAME("sonorapass-bmc"), 1731143b040fSPatrick Williams .parent = TYPE_ASPEED_MACHINE, 1732143b040fSPatrick Williams .class_init = aspeed_machine_sonorapass_class_init, 1733143b040fSPatrick Williams }, { 1734baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("witherspoon-bmc"), 1735baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1736baa4732bSCédric Le Goater .class_init = aspeed_machine_witherspoon_class_init, 1737baa4732bSCédric Le Goater }, { 1738baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("ast2600-evb"), 1739baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1740baa4732bSCédric Le Goater .class_init = aspeed_machine_ast2600_evb_class_init, 1741baa4732bSCédric Le Goater }, { 174234f73a81SKarthikeyan Pasupathi .name = MACHINE_TYPE_NAME("yosemitev2-bmc"), 174334f73a81SKarthikeyan Pasupathi .parent = TYPE_ASPEED_MACHINE, 174434f73a81SKarthikeyan Pasupathi .class_init = aspeed_machine_yosemitev2_class_init, 174534f73a81SKarthikeyan Pasupathi }, { 17466c323abaSKarthikeyan Pasupathi .name = MACHINE_TYPE_NAME("tiogapass-bmc"), 17476c323abaSKarthikeyan Pasupathi .parent = TYPE_ASPEED_MACHINE, 17486c323abaSKarthikeyan Pasupathi .class_init = aspeed_machine_tiogapass_class_init, 17496c323abaSKarthikeyan Pasupathi }, { 175095f068c8SJohn Wang .name = MACHINE_TYPE_NAME("g220a-bmc"), 175195f068c8SJohn Wang .parent = TYPE_ASPEED_MACHINE, 175295f068c8SJohn Wang .class_init = aspeed_machine_g220a_class_init, 175395f068c8SJohn Wang }, { 1754fb6b3c8dSJae Hyun Yoo .name = MACHINE_TYPE_NAME("qcom-dc-scm-v1-bmc"), 1755fb6b3c8dSJae Hyun Yoo .parent = TYPE_ASPEED_MACHINE, 1756fb6b3c8dSJae Hyun Yoo .class_init = aspeed_machine_qcom_dc_scm_v1_class_init, 1757fb6b3c8dSJae Hyun Yoo }, { 1758ece4cccdSGraeme Gregory .name = MACHINE_TYPE_NAME("qcom-firework-bmc"), 1759ece4cccdSGraeme Gregory .parent = TYPE_ASPEED_MACHINE, 1760ece4cccdSGraeme Gregory .class_init = aspeed_machine_qcom_firework_class_init, 1761ece4cccdSGraeme Gregory }, { 176282b6a3f6SJohn Wang .name = MACHINE_TYPE_NAME("fp5280g2-bmc"), 176382b6a3f6SJohn Wang .parent = TYPE_ASPEED_MACHINE, 176482b6a3f6SJohn Wang .class_init = aspeed_machine_fp5280g2_class_init, 176582b6a3f6SJohn Wang }, { 17669cccb912SPatrick Venture .name = MACHINE_TYPE_NAME("quanta-q71l-bmc"), 17679cccb912SPatrick Venture .parent = TYPE_ASPEED_MACHINE, 17689cccb912SPatrick Venture .class_init = aspeed_machine_quanta_q71l_class_init, 17699cccb912SPatrick Venture }, { 177058e52bdbSCédric Le Goater .name = MACHINE_TYPE_NAME("rainier-bmc"), 177158e52bdbSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 177258e52bdbSCédric Le Goater .class_init = aspeed_machine_rainier_class_init, 177358e52bdbSCédric Le Goater }, { 1774febbe308SPeter Delevoryas .name = MACHINE_TYPE_NAME("fuji-bmc"), 1775febbe308SPeter Delevoryas .parent = TYPE_ASPEED_MACHINE, 1776febbe308SPeter Delevoryas .class_init = aspeed_machine_fuji_class_init, 1777febbe308SPeter Delevoryas }, { 1778a20c54b1SPatrick Williams .name = MACHINE_TYPE_NAME("bletchley-bmc"), 1779a20c54b1SPatrick Williams .parent = TYPE_ASPEED_MACHINE, 1780a20c54b1SPatrick Williams .class_init = aspeed_machine_bletchley_class_init, 1781a20c54b1SPatrick Williams }, { 1782fa699e80SPeter Delevoryas .name = MACHINE_TYPE_NAME("fby35-bmc"), 1783fa699e80SPeter Delevoryas .parent = MACHINE_TYPE_NAME("ast2600-evb"), 1784fa699e80SPeter Delevoryas .class_init = aspeed_machine_fby35_class_init, 1785fa699e80SPeter Delevoryas }, { 178666c895b8SJamin Lin .name = MACHINE_TYPE_NAME("ast1030-evb"), 178766c895b8SJamin Lin .parent = TYPE_ASPEED_MACHINE, 178866c895b8SJamin Lin .class_init = aspeed_minibmc_machine_ast1030_evb_class_init, 178992707992SJamin Lin #ifdef TARGET_AARCH64 179092707992SJamin Lin }, { 179192707992SJamin Lin .name = MACHINE_TYPE_NAME("ast2700-evb"), 179292707992SJamin Lin .parent = TYPE_ASPEED_MACHINE, 179392707992SJamin Lin .class_init = aspeed_machine_ast2700_evb_class_init, 179492707992SJamin Lin #endif 179566c895b8SJamin Lin }, { 1796fca9ca1bSCédric Le Goater .name = TYPE_ASPEED_MACHINE, 179762c2c2ebSCédric Le Goater .parent = TYPE_MACHINE, 1798888b2b03SPhilippe Mathieu-Daudé .instance_size = sizeof(AspeedMachineState), 17991a15311aSCédric Le Goater .instance_init = aspeed_machine_instance_init, 1800fca9ca1bSCédric Le Goater .class_size = sizeof(AspeedMachineClass), 1801fca9ca1bSCédric Le Goater .class_init = aspeed_machine_class_init, 1802baa4732bSCédric Le Goater .abstract = true, 1803baa4732bSCédric Le Goater } 1804fca9ca1bSCédric Le Goater }; 180574fb1f38SCédric Le Goater 1806baa4732bSCédric Le Goater DEFINE_TYPES(aspeed_machine_types) 1807