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" 183ec75e39SPatrick Venture #include "hw/i2c/i2c_mux_pca954x.h" 1993198b6cSCorey Minyard #include "hw/i2c/smbus_eeprom.h" 20044475f3SPhilippe Mathieu-Daudé #include "hw/misc/pca9552.h" 219618ebaeSPeter Delevoryas #include "hw/nvram/eeprom_at24c.h" 225e9ae4b1SCorey Minyard #include "hw/sensor/tmp105.h" 237cfbde5eSPhilippe Mathieu-Daudé #include "hw/misc/led.h" 24a27bd6c7SMarkus Armbruster #include "hw/qdev-properties.h" 25e1ad9bc4SCédric Le Goater #include "sysemu/block-backend.h" 26fa699e80SPeter Delevoryas #include "sysemu/reset.h" 27d769a1daSCédric Le Goater #include "hw/loader.h" 28d769a1daSCédric Le Goater #include "qemu/error-report.h" 29a9df9622SJoel Stanley #include "qemu/units.h" 3066c895b8SJamin Lin #include "hw/qdev-clock.h" 31d2b3eaefSPeter Delevoryas #include "sysemu/sysemu.h" 32327d8e4eSAndrew Jeffery 3374fb1f38SCédric Le Goater static struct arm_boot_info aspeed_board_binfo = { 34b033271fSCédric Le Goater .board_id = -1, /* device-tree-only board */ 35327d8e4eSAndrew Jeffery }; 36327d8e4eSAndrew Jeffery 37612b219aSPhilippe Mathieu-Daudé struct AspeedMachineState { 38888b2b03SPhilippe Mathieu-Daudé /* Private */ 39888b2b03SPhilippe Mathieu-Daudé MachineState parent_obj; 40888b2b03SPhilippe Mathieu-Daudé /* Public */ 41888b2b03SPhilippe Mathieu-Daudé 42ff90606fSCédric Le Goater AspeedSoCState soc; 43888b2b03SPhilippe Mathieu-Daudé bool mmio_exec; 449820e52fSCédric Le Goater char *fmc_model; 459820e52fSCédric Le Goater char *spi_model; 46ea066d39SThomas Huth }; 47327d8e4eSAndrew Jeffery 48ef17f836SCédric Le Goater /* Palmetto hardware value: 0x120CE416 */ 498da33ef7SCédric Le Goater #define PALMETTO_BMC_HW_STRAP1 ( \ 508da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_256MB) | \ 518da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_DRAM_CONFIG(2 /* DDR3 with CL=6, CWL=5 */) | \ 528da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_ACPI_DIS | \ 538da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) | \ 548da33ef7SCédric Le Goater SCU_HW_STRAP_VGA_CLASS_CODE | \ 558da33ef7SCédric Le Goater SCU_HW_STRAP_LPC_RESET_PIN | \ 568da33ef7SCédric Le Goater SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) | \ 578da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \ 588da33ef7SCédric Le Goater SCU_HW_STRAP_SPI_WIDTH | \ 598da33ef7SCédric Le Goater SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \ 608da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT)) 618da33ef7SCédric Le Goater 6240a38df5SErik Smit /* TODO: Find the actual hardware value */ 6340a38df5SErik Smit #define SUPERMICROX11_BMC_HW_STRAP1 ( \ 6440a38df5SErik Smit SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) | \ 6540a38df5SErik Smit SCU_AST2400_HW_STRAP_DRAM_CONFIG(2) | \ 6640a38df5SErik Smit SCU_AST2400_HW_STRAP_ACPI_DIS | \ 6740a38df5SErik Smit SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) | \ 6840a38df5SErik Smit SCU_HW_STRAP_VGA_CLASS_CODE | \ 6940a38df5SErik Smit SCU_HW_STRAP_LPC_RESET_PIN | \ 7040a38df5SErik Smit SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) | \ 7140a38df5SErik Smit SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \ 7240a38df5SErik Smit SCU_HW_STRAP_SPI_WIDTH | \ 7340a38df5SErik Smit SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \ 7440a38df5SErik Smit SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT)) 7540a38df5SErik Smit 7647936597SGuenter Roeck /* TODO: Find the actual hardware value */ 7747936597SGuenter Roeck #define SUPERMICRO_X11SPI_BMC_HW_STRAP1 ( \ 7847936597SGuenter Roeck AST2500_HW_STRAP1_DEFAULTS | \ 7947936597SGuenter Roeck SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 8047936597SGuenter Roeck SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 8147936597SGuenter Roeck SCU_AST2500_HW_STRAP_UART_DEBUG | \ 8247936597SGuenter Roeck SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 8347936597SGuenter Roeck SCU_HW_STRAP_SPI_WIDTH | \ 8447936597SGuenter Roeck SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN)) 8547936597SGuenter Roeck 86ef17f836SCédric Le Goater /* AST2500 evb hardware value: 0xF100C2E6 */ 879a7c1750SCédric Le Goater #define AST2500_EVB_HW_STRAP1 (( \ 889a7c1750SCédric Le Goater AST2500_HW_STRAP1_DEFAULTS | \ 899a7c1750SCédric Le Goater SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 909a7c1750SCédric Le Goater SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 919a7c1750SCédric Le Goater SCU_AST2500_HW_STRAP_UART_DEBUG | \ 929a7c1750SCédric Le Goater SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 939a7c1750SCédric Le Goater SCU_HW_STRAP_MAC1_RGMII | \ 949a7c1750SCédric Le Goater SCU_HW_STRAP_MAC0_RGMII) & \ 959a7c1750SCédric Le Goater ~SCU_HW_STRAP_2ND_BOOT_WDT) 969a7c1750SCédric Le Goater 97ef17f836SCédric Le Goater /* Romulus hardware value: 0xF10AD206 */ 98ef17f836SCédric Le Goater #define ROMULUS_BMC_HW_STRAP1 ( \ 99ef17f836SCédric Le Goater AST2500_HW_STRAP1_DEFAULTS | \ 100ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 101ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 102ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_UART_DEBUG | \ 103ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 104ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_ACPI_ENABLE | \ 105ef17f836SCédric Le Goater SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER)) 106ef17f836SCédric Le Goater 107143b040fSPatrick Williams /* Sonorapass hardware value: 0xF100D216 */ 108143b040fSPatrick Williams #define SONORAPASS_BMC_HW_STRAP1 ( \ 109143b040fSPatrick Williams SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 110143b040fSPatrick Williams SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 111143b040fSPatrick Williams SCU_AST2500_HW_STRAP_UART_DEBUG | \ 112143b040fSPatrick Williams SCU_AST2500_HW_STRAP_RESERVED28 | \ 113143b040fSPatrick Williams SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 114143b040fSPatrick Williams SCU_HW_STRAP_VGA_CLASS_CODE | \ 115143b040fSPatrick Williams SCU_HW_STRAP_LPC_RESET_PIN | \ 116143b040fSPatrick Williams SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \ 117143b040fSPatrick Williams SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \ 118143b040fSPatrick Williams SCU_HW_STRAP_VGA_BIOS_ROM | \ 119143b040fSPatrick Williams SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \ 120143b040fSPatrick Williams SCU_AST2500_HW_STRAP_RESERVED1) 121143b040fSPatrick Williams 12295f068c8SJohn Wang #define G220A_BMC_HW_STRAP1 ( \ 12395f068c8SJohn Wang SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 12495f068c8SJohn Wang SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 12595f068c8SJohn Wang SCU_AST2500_HW_STRAP_UART_DEBUG | \ 12695f068c8SJohn Wang SCU_AST2500_HW_STRAP_RESERVED28 | \ 12795f068c8SJohn Wang SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 12895f068c8SJohn Wang SCU_HW_STRAP_2ND_BOOT_WDT | \ 12995f068c8SJohn Wang SCU_HW_STRAP_VGA_CLASS_CODE | \ 13095f068c8SJohn Wang SCU_HW_STRAP_LPC_RESET_PIN | \ 13195f068c8SJohn Wang SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \ 13295f068c8SJohn Wang SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \ 13395f068c8SJohn Wang SCU_HW_STRAP_VGA_SIZE_SET(VGA_64M_DRAM) | \ 13495f068c8SJohn Wang SCU_AST2500_HW_STRAP_RESERVED1) 13595f068c8SJohn Wang 13682b6a3f6SJohn Wang /* FP5280G2 hardware value: 0XF100D286 */ 13782b6a3f6SJohn Wang #define FP5280G2_BMC_HW_STRAP1 ( \ 13882b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 13982b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 14082b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_UART_DEBUG | \ 14182b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_RESERVED28 | \ 14282b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 14382b6a3f6SJohn Wang SCU_HW_STRAP_VGA_CLASS_CODE | \ 14482b6a3f6SJohn Wang SCU_HW_STRAP_LPC_RESET_PIN | \ 14582b6a3f6SJohn Wang SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \ 14682b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \ 14782b6a3f6SJohn Wang SCU_HW_STRAP_MAC1_RGMII | \ 14882b6a3f6SJohn Wang SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \ 14982b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_RESERVED1) 15082b6a3f6SJohn Wang 15162c2c2ebSCédric Le Goater /* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */ 15262c2c2ebSCédric Le Goater #define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1 15362c2c2ebSCédric Le Goater 1549cccb912SPatrick Venture /* Quanta-Q71l hardware value */ 1559cccb912SPatrick Venture #define QUANTA_Q71L_BMC_HW_STRAP1 ( \ 1569cccb912SPatrick Venture SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) | \ 1579cccb912SPatrick Venture SCU_AST2400_HW_STRAP_DRAM_CONFIG(2/* DDR3 with CL=6, CWL=5 */) | \ 1589cccb912SPatrick Venture SCU_AST2400_HW_STRAP_ACPI_DIS | \ 1599cccb912SPatrick Venture SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_24M_IN) | \ 1609cccb912SPatrick Venture SCU_HW_STRAP_VGA_CLASS_CODE | \ 1619cccb912SPatrick Venture SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_PASS_THROUGH) | \ 1629cccb912SPatrick Venture SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \ 1639cccb912SPatrick Venture SCU_HW_STRAP_SPI_WIDTH | \ 1649cccb912SPatrick Venture SCU_HW_STRAP_VGA_SIZE_SET(VGA_8M_DRAM) | \ 1659cccb912SPatrick Venture SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT)) 1669cccb912SPatrick Venture 167ccc2c418SCédric Le Goater /* AST2600 evb hardware value */ 168ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP1 0x000000C0 169ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP2 0x00000003 170ccc2c418SCédric Le Goater 17163ceb818SCédric Le Goater /* Tacoma hardware value */ 17263ceb818SCédric Le Goater #define TACOMA_BMC_HW_STRAP1 0x00000000 1737582591aSJoel Stanley #define TACOMA_BMC_HW_STRAP2 0x00000040 17463ceb818SCédric Le Goater 17558e52bdbSCédric Le Goater /* Rainier hardware value: (QEMU prototype) */ 176b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP1 0x00422016 177b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP2 0x80000848 17858e52bdbSCédric Le Goater 179febbe308SPeter Delevoryas /* Fuji hardware value */ 180febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP1 0x00000000 181febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP2 0x00000000 182febbe308SPeter Delevoryas 183a20c54b1SPatrick Williams /* Bletchley hardware value */ 184a20c54b1SPatrick Williams /* TODO: Leave same as EVB for now. */ 185a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP1 AST2600_EVB_HW_STRAP1 186a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP2 AST2600_EVB_HW_STRAP2 187a20c54b1SPatrick Williams 188fb6b3c8dSJae Hyun Yoo /* Qualcomm DC-SCM hardware value */ 189fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP1 0x00000000 190fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP2 0x00000041 191fb6b3c8dSJae Hyun Yoo 1929bb6d140SJoel Stanley #define AST_SMP_MAILBOX_BASE 0x1e6e2180 1939bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_ENTRY (AST_SMP_MAILBOX_BASE + 0x0) 1949bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_GOSIGN (AST_SMP_MAILBOX_BASE + 0x4) 1959bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_READY (AST_SMP_MAILBOX_BASE + 0x8) 1969bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_POLLINSN (AST_SMP_MAILBOX_BASE + 0xc) 1979bb6d140SJoel Stanley #define AST_SMP_MBOX_CODE (AST_SMP_MAILBOX_BASE + 0x10) 1989bb6d140SJoel Stanley #define AST_SMP_MBOX_GOSIGN 0xabbaab00 1999bb6d140SJoel Stanley 2009bb6d140SJoel Stanley static void aspeed_write_smpboot(ARMCPU *cpu, 2019bb6d140SJoel Stanley const struct arm_boot_info *info) 2029bb6d140SJoel Stanley { 203*902bba54SCédric Le Goater AddressSpace *as = arm_boot_address_space(cpu, info); 204*902bba54SCédric Le Goater static const ARMInsnFixup poll_mailbox_ready[] = { 2059bb6d140SJoel Stanley /* 2069bb6d140SJoel Stanley * r2 = per-cpu go sign value 2079bb6d140SJoel Stanley * r1 = AST_SMP_MBOX_FIELD_ENTRY 2089bb6d140SJoel Stanley * r0 = AST_SMP_MBOX_FIELD_GOSIGN 2099bb6d140SJoel Stanley */ 210*902bba54SCédric Le Goater { 0xee100fb0 }, /* mrc p15, 0, r0, c0, c0, 5 */ 211*902bba54SCédric Le Goater { 0xe21000ff }, /* ands r0, r0, #255 */ 212*902bba54SCédric Le Goater { 0xe59f201c }, /* ldr r2, [pc, #28] */ 213*902bba54SCédric Le Goater { 0xe1822000 }, /* orr r2, r2, r0 */ 2149bb6d140SJoel Stanley 215*902bba54SCédric Le Goater { 0xe59f1018 }, /* ldr r1, [pc, #24] */ 216*902bba54SCédric Le Goater { 0xe59f0018 }, /* ldr r0, [pc, #24] */ 2179bb6d140SJoel Stanley 218*902bba54SCédric Le Goater { 0xe320f002 }, /* wfe */ 219*902bba54SCédric Le Goater { 0xe5904000 }, /* ldr r4, [r0] */ 220*902bba54SCédric Le Goater { 0xe1520004 }, /* cmp r2, r4 */ 221*902bba54SCédric Le Goater { 0x1afffffb }, /* bne <wfe> */ 222*902bba54SCédric Le Goater { 0xe591f000 }, /* ldr pc, [r1] */ 223*902bba54SCédric Le Goater { AST_SMP_MBOX_GOSIGN }, 224*902bba54SCédric Le Goater { AST_SMP_MBOX_FIELD_ENTRY }, 225*902bba54SCédric Le Goater { AST_SMP_MBOX_FIELD_GOSIGN }, 226*902bba54SCédric Le Goater { 0, FIXUP_TERMINATOR } 2279bb6d140SJoel Stanley }; 228*902bba54SCédric Le Goater static const uint32_t fixupcontext[FIXUP_MAX] = { 0 }; 2299bb6d140SJoel Stanley 230*902bba54SCédric Le Goater arm_write_bootloader("aspeed.smpboot", as, info->smp_loader_start, 231*902bba54SCédric Le Goater poll_mailbox_ready, fixupcontext); 2329bb6d140SJoel Stanley } 2339bb6d140SJoel Stanley 2349bb6d140SJoel Stanley static void aspeed_reset_secondary(ARMCPU *cpu, 2359bb6d140SJoel Stanley const struct arm_boot_info *info) 2369bb6d140SJoel Stanley { 2379bb6d140SJoel Stanley AddressSpace *as = arm_boot_address_space(cpu, info); 2389bb6d140SJoel Stanley CPUState *cs = CPU(cpu); 2399bb6d140SJoel Stanley 2409bb6d140SJoel Stanley /* info->smp_bootreg_addr */ 2419bb6d140SJoel Stanley address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0, 2429bb6d140SJoel Stanley MEMTXATTRS_UNSPECIFIED, NULL); 2439bb6d140SJoel Stanley cpu_set_pc(cs, info->smp_loader_start); 2449bb6d140SJoel Stanley } 2459bb6d140SJoel Stanley 2468b744a6aSCédric Le Goater static void write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size, 247d769a1daSCédric Le Goater Error **errp) 248d769a1daSCédric Le Goater { 24905e6e40aSWentao_Liang g_autofree void *storage = NULL; 2500c7209beSCédric Le Goater int64_t size; 251d769a1daSCédric Le Goater 2520c7209beSCédric Le Goater /* The block backend size should have already been 'validated' by 2530c7209beSCédric Le Goater * the creation of the m25p80 object. 2540c7209beSCédric Le Goater */ 2550c7209beSCédric Le Goater size = blk_getlength(blk); 2560c7209beSCédric Le Goater if (size <= 0) { 2570c7209beSCédric Le Goater error_setg(errp, "failed to get flash size"); 2580c7209beSCédric Le Goater return; 2590c7209beSCédric Le Goater } 2600c7209beSCédric Le Goater 2610c7209beSCédric Le Goater if (rom_size > size) { 2620c7209beSCédric Le Goater rom_size = size; 263d769a1daSCédric Le Goater } 264d769a1daSCédric Le Goater 26505e6e40aSWentao_Liang storage = g_malloc0(rom_size); 266a9262f55SAlberto Faria if (blk_pread(blk, 0, rom_size, storage, 0) < 0) { 267d769a1daSCédric Le Goater error_setg(errp, "failed to read the initial flash content"); 268d769a1daSCédric Le Goater return; 269d769a1daSCédric Le Goater } 270d769a1daSCédric Le Goater 271d769a1daSCédric Le Goater rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr); 272d769a1daSCédric Le Goater } 273d769a1daSCédric Le Goater 2748b744a6aSCédric Le Goater /* 2758b744a6aSCédric Le Goater * Create a ROM and copy the flash contents at the expected address 2768b744a6aSCédric Le Goater * (0x0). Boots faster than execute-in-place. 2778b744a6aSCédric Le Goater */ 2788b744a6aSCédric Le Goater static void aspeed_install_boot_rom(AspeedSoCState *soc, BlockBackend *blk, 2798b744a6aSCédric Le Goater uint64_t rom_size) 2808b744a6aSCédric Le Goater { 2818b744a6aSCédric Le Goater MemoryRegion *boot_rom = g_new(MemoryRegion, 1); 2828b744a6aSCédric Le Goater 2838b744a6aSCédric Le Goater memory_region_init_rom(boot_rom, NULL, "aspeed.boot_rom", rom_size, 2848b744a6aSCédric Le Goater &error_abort); 2858b744a6aSCédric Le Goater memory_region_add_subregion_overlap(&soc->spi_boot_container, 0, 2868b744a6aSCédric Le Goater boot_rom, 1); 2878b744a6aSCédric Le Goater write_boot_rom(blk, ASPEED_SOC_SPI_BOOT_ADDR, rom_size, &error_abort); 2888b744a6aSCédric Le Goater } 2898b744a6aSCédric Le Goater 2901099ad10SPeter Delevoryas void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype, 2919bd4ac61SCédric Le Goater unsigned int count, int unit0) 292e1ad9bc4SCédric Le Goater { 293e1ad9bc4SCédric Le Goater int i; 294179b2058SPatrick Williams 295179b2058SPatrick Williams if (!flashtype) { 296179b2058SPatrick Williams return; 297179b2058SPatrick Williams } 298e1ad9bc4SCédric Le Goater 2999bd4ac61SCédric Le Goater for (i = 0; i < count; ++i) { 3008ec239f2SMarkus Armbruster DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i); 301e1ad9bc4SCédric Le Goater qemu_irq cs_line; 302a7d78befSCédric Le Goater DeviceState *dev; 303e1ad9bc4SCédric Le Goater 304a7d78befSCédric Le Goater dev = qdev_new(flashtype); 305e1ad9bc4SCédric Le Goater if (dinfo) { 306a7d78befSCédric Le Goater qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo)); 307e1ad9bc4SCédric Le Goater } 308a7d78befSCédric Le Goater qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal); 309e1ad9bc4SCédric Le Goater 310a7d78befSCédric Le Goater cs_line = qdev_get_gpio_in_named(dev, SSI_GPIO_CS, 0); 311b22a2d40SCédric Le Goater qdev_connect_gpio_out_named(DEVICE(s), "cs", i, cs_line); 312e1ad9bc4SCédric Le Goater } 313e1ad9bc4SCédric Le Goater } 314e1ad9bc4SCédric Le Goater 315a29e3e12SAndrew Jeffery static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo) 316a29e3e12SAndrew Jeffery { 317a29e3e12SAndrew Jeffery DeviceState *card; 318a29e3e12SAndrew Jeffery 319756f739bSPhilippe Mathieu-Daudé if (!dinfo) { 320756f739bSPhilippe Mathieu-Daudé return; 321756f739bSPhilippe Mathieu-Daudé } 3223e80f690SMarkus Armbruster card = qdev_new(TYPE_SD_CARD); 323934df912SMarkus Armbruster qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo), 324a29e3e12SAndrew Jeffery &error_fatal); 3253e80f690SMarkus Armbruster qdev_realize_and_unref(card, 3263e80f690SMarkus Armbruster qdev_get_child_bus(DEVICE(sdhci), "sd-bus"), 3273e80f690SMarkus Armbruster &error_fatal); 328a29e3e12SAndrew Jeffery } 329a29e3e12SAndrew Jeffery 330d2b3eaefSPeter Delevoryas static void connect_serial_hds_to_uarts(AspeedMachineState *bmc) 331d2b3eaefSPeter Delevoryas { 332d2b3eaefSPeter Delevoryas AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc); 333d2b3eaefSPeter Delevoryas AspeedSoCState *s = &bmc->soc; 334d2b3eaefSPeter Delevoryas AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s); 335d2b3eaefSPeter Delevoryas 336d2b3eaefSPeter Delevoryas aspeed_soc_uart_set_chr(s, amc->uart_default, serial_hd(0)); 337d2b3eaefSPeter Delevoryas for (int i = 1, uart = ASPEED_DEV_UART1; i < sc->uarts_num; i++, uart++) { 338d2b3eaefSPeter Delevoryas if (uart == amc->uart_default) { 339d2b3eaefSPeter Delevoryas continue; 340d2b3eaefSPeter Delevoryas } 341d2b3eaefSPeter Delevoryas aspeed_soc_uart_set_chr(s, uart, serial_hd(i)); 342d2b3eaefSPeter Delevoryas } 343d2b3eaefSPeter Delevoryas } 344d2b3eaefSPeter Delevoryas 345baa4732bSCédric Le Goater static void aspeed_machine_init(MachineState *machine) 346327d8e4eSAndrew Jeffery { 347888b2b03SPhilippe Mathieu-Daudé AspeedMachineState *bmc = ASPEED_MACHINE(machine); 348baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine); 349b033271fSCédric Le Goater AspeedSoCClass *sc; 3502bea128cSEddie James int i; 351d3bad7e7SCédric Le Goater NICInfo *nd = &nd_table[0]; 352327d8e4eSAndrew Jeffery 3539fc7fc4dSMarkus Armbruster object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name); 354327d8e4eSAndrew Jeffery 355b033271fSCédric Le Goater sc = ASPEED_SOC_GET_CLASS(&bmc->soc); 356b033271fSCédric Le Goater 357533eb415SIgor Mammedov /* 358346160cbSCédric Le Goater * This will error out if the RAM size is not supported by the 359346160cbSCédric Le Goater * memory controller of the SoC. 360533eb415SIgor Mammedov */ 3616e504a98SPaolo Bonzini object_property_set_uint(OBJECT(&bmc->soc), "ram-size", machine->ram_size, 362533eb415SIgor Mammedov &error_fatal); 363533eb415SIgor Mammedov 364d3bad7e7SCédric Le Goater for (i = 0; i < sc->macs_num; i++) { 365d3bad7e7SCédric Le Goater if ((amc->macs_mask & (1 << i)) && nd->used) { 366d3bad7e7SCédric Le Goater qemu_check_nic_model(nd, TYPE_FTGMAC100); 367d3bad7e7SCédric Le Goater qdev_set_nic_properties(DEVICE(&bmc->soc.ftgmac100[i]), nd); 368d3bad7e7SCédric Le Goater nd++; 369d3bad7e7SCédric Le Goater } 370d3bad7e7SCédric Le Goater } 371d3bad7e7SCédric Le Goater 3725325cc34SMarkus Armbruster object_property_set_int(OBJECT(&bmc->soc), "hw-strap1", amc->hw_strap1, 37387e79af0SAndrew Jeffery &error_abort); 3745325cc34SMarkus Armbruster object_property_set_int(OBJECT(&bmc->soc), "hw-strap2", amc->hw_strap2, 375ccc2c418SCédric Le Goater &error_abort); 3764dd9d554SPeter Delevoryas object_property_set_link(OBJECT(&bmc->soc), "memory", 3774dd9d554SPeter Delevoryas OBJECT(get_system_memory()), &error_abort); 3785325cc34SMarkus Armbruster object_property_set_link(OBJECT(&bmc->soc), "dram", 3790df2d9a6SCédric Le Goater OBJECT(machine->ram), &error_abort); 380b6e70d1dSJoel Stanley if (machine->kernel_filename) { 381b6e70d1dSJoel Stanley /* 382b6e70d1dSJoel Stanley * When booting with a -kernel command line there is no u-boot 383b6e70d1dSJoel Stanley * that runs to unlock the SCU. In this case set the default to 384b6e70d1dSJoel Stanley * be unlocked as the kernel expects 385b6e70d1dSJoel Stanley */ 3865325cc34SMarkus Armbruster object_property_set_int(OBJECT(&bmc->soc), "hw-prot-key", 3875325cc34SMarkus Armbruster ASPEED_SCU_PROT_KEY, &error_abort); 388b6e70d1dSJoel Stanley } 389d2b3eaefSPeter Delevoryas connect_serial_hds_to_uarts(bmc); 390ce189ab2SMarkus Armbruster qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort); 391327d8e4eSAndrew Jeffery 3928ec239f2SMarkus Armbruster aspeed_board_init_flashes(&bmc->soc.fmc, 3938ec239f2SMarkus Armbruster bmc->fmc_model ? bmc->fmc_model : amc->fmc_model, 3949bd4ac61SCédric Le Goater amc->num_cs, 0); 3958ec239f2SMarkus Armbruster aspeed_board_init_flashes(&bmc->soc.spi[0], 3968ec239f2SMarkus Armbruster bmc->spi_model ? bmc->spi_model : amc->spi_model, 3979bd4ac61SCédric Le Goater 1, amc->num_cs); 398e1ad9bc4SCédric Le Goater 399b7f1a0cbSCédric Le Goater if (machine->kernel_filename && sc->num_cpus > 1) { 4009bb6d140SJoel Stanley /* With no u-boot we must set up a boot stub for the secondary CPU */ 4019bb6d140SJoel Stanley MemoryRegion *smpboot = g_new(MemoryRegion, 1); 402f489960dSPhilippe Mathieu-Daudé memory_region_init_ram(smpboot, NULL, "aspeed.smpboot", 4039bb6d140SJoel Stanley 0x80, &error_abort); 4049bb6d140SJoel Stanley memory_region_add_subregion(get_system_memory(), 4059bb6d140SJoel Stanley AST_SMP_MAILBOX_BASE, smpboot); 4069bb6d140SJoel Stanley 4079bb6d140SJoel Stanley aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot; 4089bb6d140SJoel Stanley aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary; 4099bb6d140SJoel Stanley aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE; 4109bb6d140SJoel Stanley } 4119bb6d140SJoel Stanley 4126e504a98SPaolo Bonzini aspeed_board_binfo.ram_size = machine->ram_size; 413347df6f8SEduardo Habkost aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM]; 414b033271fSCédric Le Goater 415baa4732bSCédric Le Goater if (amc->i2c_init) { 416baa4732bSCédric Le Goater amc->i2c_init(bmc); 4172cf6cb50SCédric Le Goater } 4182cf6cb50SCédric Le Goater 4190e2c24c6SAndrew Jeffery for (i = 0; i < bmc->soc.sdhci.num_slots; i++) { 4208ec239f2SMarkus Armbruster sdhci_attach_drive(&bmc->soc.sdhci.slots[i], 4218ec239f2SMarkus Armbruster drive_get(IF_SD, 0, i)); 422a29e3e12SAndrew Jeffery } 4232bea128cSEddie James 424a29e3e12SAndrew Jeffery if (bmc->soc.emmc.num_slots) { 4258ec239f2SMarkus Armbruster sdhci_attach_drive(&bmc->soc.emmc.slots[0], 4268ec239f2SMarkus Armbruster drive_get(IF_SD, 0, bmc->soc.sdhci.num_slots)); 4272bea128cSEddie James } 4282bea128cSEddie James 4298b744a6aSCédric Le Goater if (!bmc->mmio_exec) { 4308b744a6aSCédric Le Goater DriveInfo *mtd0 = drive_get(IF_MTD, 0, 0); 4318b744a6aSCédric Le Goater 4328b744a6aSCédric Le Goater if (mtd0) { 4338b744a6aSCédric Le Goater uint64_t rom_size = memory_region_size(&bmc->soc.spi_boot); 4348b744a6aSCédric Le Goater aspeed_install_boot_rom(&bmc->soc, blk_by_legacy_dinfo(mtd0), 4358b744a6aSCédric Le Goater rom_size); 4368b744a6aSCédric Le Goater } 4378b744a6aSCédric Le Goater } 4388b744a6aSCédric Le Goater 4392744ece8STao Xu arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo); 440327d8e4eSAndrew Jeffery } 441327d8e4eSAndrew Jeffery 442612b219aSPhilippe Mathieu-Daudé static void palmetto_bmc_i2c_init(AspeedMachineState *bmc) 4432cf6cb50SCédric Le Goater { 4442cf6cb50SCédric Le Goater AspeedSoCState *soc = &bmc->soc; 445a87e81b9SCédric Le Goater DeviceState *dev; 4463d165f12SCédric Le Goater uint8_t *eeprom_buf = g_malloc0(32 * 1024); 4472cf6cb50SCédric Le Goater 4482cf6cb50SCédric Le Goater /* The palmetto platform expects a ds3231 RTC but a ds1338 is 4492cf6cb50SCédric Le Goater * enough to provide basic RTC features. Alarms will be missing */ 4501373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68); 451a87e81b9SCédric Le Goater 4527a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, 4533d165f12SCédric Le Goater eeprom_buf); 4543d165f12SCédric Le Goater 455a87e81b9SCédric Le Goater /* add a TMP423 temperature sensor */ 4561373b15bSPhilippe Mathieu-Daudé dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), 4571373b15bSPhilippe Mathieu-Daudé "tmp423", 0x4c)); 4585325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 4595325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 4605325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 4615325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort); 4622cf6cb50SCédric Le Goater } 4632cf6cb50SCédric Le Goater 4649cccb912SPatrick Venture static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc) 4659cccb912SPatrick Venture { 4669cccb912SPatrick Venture AspeedSoCState *soc = &bmc->soc; 4679cccb912SPatrick Venture 4689cccb912SPatrick Venture /* 4699cccb912SPatrick Venture * The quanta-q71l platform expects tmp75s which are compatible with 4709cccb912SPatrick Venture * tmp105s. 4719cccb912SPatrick Venture */ 4729cccb912SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c); 4739cccb912SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e); 4749cccb912SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f); 4759cccb912SPatrick Venture 4769cccb912SPatrick Venture /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */ 4779cccb912SPatrick Venture /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */ 4789cccb912SPatrick Venture /* TODO: Add Memory Riser i2c mux and eeproms. */ 4799cccb912SPatrick Venture 4803ec75e39SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74); 4813ec75e39SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77); 4823ec75e39SPatrick Venture 4839cccb912SPatrick Venture /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */ 4843ec75e39SPatrick Venture 4853ec75e39SPatrick Venture /* i2c-7 */ 4863ec75e39SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70); 4879cccb912SPatrick Venture /* - i2c@0: pmbus@59 */ 4889cccb912SPatrick Venture /* - i2c@1: pmbus@58 */ 4899cccb912SPatrick Venture /* - i2c@2: pmbus@58 */ 4909cccb912SPatrick Venture /* - i2c@3: pmbus@59 */ 4913ec75e39SPatrick Venture 4929cccb912SPatrick Venture /* TODO: i2c-7: Add PDB FRU eeprom@52 */ 4939cccb912SPatrick Venture /* TODO: i2c-8: Add BMC FRU eeprom@50 */ 4949cccb912SPatrick Venture } 4959cccb912SPatrick Venture 496612b219aSPhilippe Mathieu-Daudé static void ast2500_evb_i2c_init(AspeedMachineState *bmc) 4972cf6cb50SCédric Le Goater { 4982cf6cb50SCédric Le Goater AspeedSoCState *soc = &bmc->soc; 4993d165f12SCédric Le Goater uint8_t *eeprom_buf = g_malloc0(8 * 1024); 5003d165f12SCédric Le Goater 5017a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50, 5023d165f12SCédric Le Goater eeprom_buf); 5032cf6cb50SCédric Le Goater 5042cf6cb50SCédric Le Goater /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */ 5051373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), 506044475f3SPhilippe Mathieu-Daudé TYPE_TMP105, 0x4d); 5072cf6cb50SCédric Le Goater } 5082cf6cb50SCédric Le Goater 509612b219aSPhilippe Mathieu-Daudé static void ast2600_evb_i2c_init(AspeedMachineState *bmc) 510ccc2c418SCédric Le Goater { 51152bcd997SHoward Chiu AspeedSoCState *soc = &bmc->soc; 51252bcd997SHoward Chiu uint8_t *eeprom_buf = g_malloc0(8 * 1024); 51352bcd997SHoward Chiu 51452bcd997SHoward Chiu smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 51552bcd997SHoward Chiu eeprom_buf); 51652bcd997SHoward Chiu 51752bcd997SHoward Chiu /* LM75 is compatible with TMP105 driver */ 51852bcd997SHoward Chiu i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), 51952bcd997SHoward Chiu TYPE_TMP105, 0x4d); 520ccc2c418SCédric Le Goater } 521ccc2c418SCédric Le Goater 52234f73a81SKarthikeyan Pasupathi static void yosemitev2_bmc_i2c_init(AspeedMachineState *bmc) 52334f73a81SKarthikeyan Pasupathi { 52434f73a81SKarthikeyan Pasupathi AspeedSoCState *soc = &bmc->soc; 52534f73a81SKarthikeyan Pasupathi 52634f73a81SKarthikeyan Pasupathi at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x51, 128 * KiB); 52734f73a81SKarthikeyan Pasupathi at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 128 * KiB, 52834f73a81SKarthikeyan Pasupathi yosemitev2_bmc_fruid, yosemitev2_bmc_fruid_len); 5290a1f86baSKarthikeyan Pasupathi /* TMP421 */ 5300a1f86baSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "tmp421", 0x1f); 5310a1f86baSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4e); 5320a1f86baSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4f); 5330a1f86baSKarthikeyan Pasupathi 53434f73a81SKarthikeyan Pasupathi } 53534f73a81SKarthikeyan Pasupathi 536612b219aSPhilippe Mathieu-Daudé static void romulus_bmc_i2c_init(AspeedMachineState *bmc) 5376c4567c7SCédric Le Goater { 5386c4567c7SCédric Le Goater AspeedSoCState *soc = &bmc->soc; 5396c4567c7SCédric Le Goater 5406c4567c7SCédric Le Goater /* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is 5416c4567c7SCédric Le Goater * good enough */ 5421373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32); 5436c4567c7SCédric Le Goater } 5446c4567c7SCédric Le Goater 5456c323abaSKarthikeyan Pasupathi static void tiogapass_bmc_i2c_init(AspeedMachineState *bmc) 5466c323abaSKarthikeyan Pasupathi { 5476c323abaSKarthikeyan Pasupathi AspeedSoCState *soc = &bmc->soc; 5486c323abaSKarthikeyan Pasupathi 5496c323abaSKarthikeyan Pasupathi at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 128 * KiB); 5506c323abaSKarthikeyan Pasupathi at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 6), 0x54, 128 * KiB, 5516c323abaSKarthikeyan Pasupathi tiogapass_bmc_fruid, tiogapass_bmc_fruid_len); 552a09d357dSKarthikeyan Pasupathi /* TMP421 */ 553a09d357dSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "tmp421", 0x1f); 554a09d357dSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4f); 555a09d357dSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4e); 5566c323abaSKarthikeyan Pasupathi } 5576c323abaSKarthikeyan Pasupathi 558f4aec252SCédric Le Goater static void create_pca9552(AspeedSoCState *soc, int bus_id, int addr) 559f4aec252SCédric Le Goater { 560f4aec252SCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, bus_id), 561f4aec252SCédric Le Goater TYPE_PCA9552, addr); 562f4aec252SCédric Le Goater } 563f4aec252SCédric Le Goater 564612b219aSPhilippe Mathieu-Daudé static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc) 565143b040fSPatrick Williams { 566143b040fSPatrick Williams AspeedSoCState *soc = &bmc->soc; 567143b040fSPatrick Williams 568143b040fSPatrick Williams /* bus 2 : */ 5691373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48); 5701373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49); 571143b040fSPatrick Williams /* bus 2 : pca9546 @ 0x73 */ 572143b040fSPatrick Williams 573143b040fSPatrick Williams /* bus 3 : pca9548 @ 0x70 */ 574143b040fSPatrick Williams 575143b040fSPatrick Williams /* bus 4 : */ 576143b040fSPatrick Williams uint8_t *eeprom4_54 = g_malloc0(8 * 1024); 5777a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 578143b040fSPatrick Williams eeprom4_54); 579143b040fSPatrick Williams /* PCA9539 @ 0x76, but PCA9552 is compatible */ 580f4aec252SCédric Le Goater create_pca9552(soc, 4, 0x76); 581143b040fSPatrick Williams /* PCA9539 @ 0x77, but PCA9552 is compatible */ 582f4aec252SCédric Le Goater create_pca9552(soc, 4, 0x77); 583143b040fSPatrick Williams 584143b040fSPatrick Williams /* bus 6 : */ 5851373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48); 5861373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49); 587143b040fSPatrick Williams /* bus 6 : pca9546 @ 0x73 */ 588143b040fSPatrick Williams 589143b040fSPatrick Williams /* bus 8 : */ 590143b040fSPatrick Williams uint8_t *eeprom8_56 = g_malloc0(8 * 1024); 5917a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56, 592143b040fSPatrick Williams eeprom8_56); 593f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x60); 594f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x61); 595143b040fSPatrick Williams /* bus 8 : adc128d818 @ 0x1d */ 596143b040fSPatrick Williams /* bus 8 : adc128d818 @ 0x1f */ 597143b040fSPatrick Williams 598143b040fSPatrick Williams /* 599143b040fSPatrick Williams * bus 13 : pca9548 @ 0x71 600143b040fSPatrick Williams * - channel 3: 601143b040fSPatrick Williams * - tmm421 @ 0x4c 602143b040fSPatrick Williams * - tmp421 @ 0x4e 603143b040fSPatrick Williams * - tmp421 @ 0x4f 604143b040fSPatrick Williams */ 605143b040fSPatrick Williams 606143b040fSPatrick Williams } 607143b040fSPatrick Williams 608612b219aSPhilippe Mathieu-Daudé static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc) 60962c2c2ebSCédric Le Goater { 6107cfbde5eSPhilippe Mathieu-Daudé static const struct { 6117cfbde5eSPhilippe Mathieu-Daudé unsigned gpio_id; 6127cfbde5eSPhilippe Mathieu-Daudé LEDColor color; 6137cfbde5eSPhilippe Mathieu-Daudé const char *description; 6147cfbde5eSPhilippe Mathieu-Daudé bool gpio_polarity; 6157cfbde5eSPhilippe Mathieu-Daudé } pca1_leds[] = { 6167cfbde5eSPhilippe Mathieu-Daudé {13, LED_COLOR_GREEN, "front-fault-4", GPIO_POLARITY_ACTIVE_LOW}, 6177cfbde5eSPhilippe Mathieu-Daudé {14, LED_COLOR_GREEN, "front-power-3", GPIO_POLARITY_ACTIVE_LOW}, 6187cfbde5eSPhilippe Mathieu-Daudé {15, LED_COLOR_GREEN, "front-id-5", GPIO_POLARITY_ACTIVE_LOW}, 6197cfbde5eSPhilippe Mathieu-Daudé }; 62062c2c2ebSCédric Le Goater AspeedSoCState *soc = &bmc->soc; 6213d165f12SCédric Le Goater uint8_t *eeprom_buf = g_malloc0(8 * 1024); 62215ce12cfSPhilippe Mathieu-Daudé DeviceState *dev; 6237cfbde5eSPhilippe Mathieu-Daudé LEDState *led; 62462c2c2ebSCédric Le Goater 62563ceb818SCédric Le Goater /* Bus 3: TODO bmp280@77 */ 626db437ca6SPhilippe Mathieu-Daudé dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60)); 62715ce12cfSPhilippe Mathieu-Daudé qdev_prop_set_string(dev, "description", "pca1"); 6282616f572SPhilippe Mathieu-Daudé i2c_slave_realize_and_unref(I2C_SLAVE(dev), 6292616f572SPhilippe Mathieu-Daudé aspeed_i2c_get_bus(&soc->i2c, 3), 63015ce12cfSPhilippe Mathieu-Daudé &error_fatal); 6318c9a61d7SCédric Le Goater 6327cfbde5eSPhilippe Mathieu-Daudé for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) { 6337cfbde5eSPhilippe Mathieu-Daudé led = led_create_simple(OBJECT(bmc), 6347cfbde5eSPhilippe Mathieu-Daudé pca1_leds[i].gpio_polarity, 6357cfbde5eSPhilippe Mathieu-Daudé pca1_leds[i].color, 6367cfbde5eSPhilippe Mathieu-Daudé pca1_leds[i].description); 6377cfbde5eSPhilippe Mathieu-Daudé qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id, 6387cfbde5eSPhilippe Mathieu-Daudé qdev_get_gpio_in(DEVICE(led), 0)); 6397cfbde5eSPhilippe Mathieu-Daudé } 640b61ea6e7SJoel Stanley i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76); 6412a75e8c3SMaheswara Kurapati i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "max31785", 0x52); 6421373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c); 6431373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c); 64462c2c2ebSCédric Le Goater 64562c2c2ebSCédric Le Goater /* The Witherspoon expects a TMP275 but a TMP105 is compatible */ 6461373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105, 647044475f3SPhilippe Mathieu-Daudé 0x4a); 6486c4567c7SCédric Le Goater 6496c4567c7SCédric Le Goater /* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is 6506c4567c7SCédric Le Goater * good enough */ 6511373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32); 6523d165f12SCédric Le Goater 6537a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51, 6543d165f12SCédric Le Goater eeprom_buf); 655db437ca6SPhilippe Mathieu-Daudé dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60)); 65615ce12cfSPhilippe Mathieu-Daudé qdev_prop_set_string(dev, "description", "pca0"); 6572616f572SPhilippe Mathieu-Daudé i2c_slave_realize_and_unref(I2C_SLAVE(dev), 6582616f572SPhilippe Mathieu-Daudé aspeed_i2c_get_bus(&soc->i2c, 11), 65915ce12cfSPhilippe Mathieu-Daudé &error_fatal); 66063ceb818SCédric Le Goater /* Bus 11: TODO ucd90160@64 */ 66162c2c2ebSCédric Le Goater } 66262c2c2ebSCédric Le Goater 66395f068c8SJohn Wang static void g220a_bmc_i2c_init(AspeedMachineState *bmc) 66495f068c8SJohn Wang { 66595f068c8SJohn Wang AspeedSoCState *soc = &bmc->soc; 66695f068c8SJohn Wang DeviceState *dev; 66795f068c8SJohn Wang 66895f068c8SJohn Wang dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), 66995f068c8SJohn Wang "emc1413", 0x4c)); 67095f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 67195f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 67295f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 67395f068c8SJohn Wang 67495f068c8SJohn Wang dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12), 67595f068c8SJohn Wang "emc1413", 0x4c)); 67695f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 67795f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 67895f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 67995f068c8SJohn Wang 68095f068c8SJohn Wang dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13), 68195f068c8SJohn Wang "emc1413", 0x4c)); 68295f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 68395f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 68495f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 6856f5f6507SJohn Wang 6866f5f6507SJohn Wang static uint8_t eeprom_buf[2 * 1024] = { 6876f5f6507SJohn Wang 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe, 6886f5f6507SJohn Wang 0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65, 6896f5f6507SJohn Wang 0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32, 6906f5f6507SJohn Wang 0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42, 6916f5f6507SJohn Wang 0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45, 6926f5f6507SJohn Wang 0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1, 6936f5f6507SJohn Wang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, 6946f5f6507SJohn Wang }; 6956f5f6507SJohn Wang smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57, 6966f5f6507SJohn Wang eeprom_buf); 69795f068c8SJohn Wang } 69895f068c8SJohn Wang 69982b6a3f6SJohn Wang static void fp5280g2_bmc_i2c_init(AspeedMachineState *bmc) 70082b6a3f6SJohn Wang { 70182b6a3f6SJohn Wang AspeedSoCState *soc = &bmc->soc; 70282b6a3f6SJohn Wang I2CSlave *i2c_mux; 70382b6a3f6SJohn Wang 70482b6a3f6SJohn Wang /* The at24c256 */ 70582b6a3f6SJohn Wang at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 1), 0x50, 32768); 70682b6a3f6SJohn Wang 70782b6a3f6SJohn Wang /* The fp5280g2 expects a TMP112 but a TMP105 is compatible */ 70882b6a3f6SJohn Wang i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105, 70982b6a3f6SJohn Wang 0x48); 71082b6a3f6SJohn Wang i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105, 71182b6a3f6SJohn Wang 0x49); 71282b6a3f6SJohn Wang 71382b6a3f6SJohn Wang i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), 71482b6a3f6SJohn Wang "pca9546", 0x70); 71582b6a3f6SJohn Wang /* It expects a TMP112 but a TMP105 is compatible */ 71682b6a3f6SJohn Wang i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0), TYPE_TMP105, 71782b6a3f6SJohn Wang 0x4a); 71882b6a3f6SJohn Wang 71982b6a3f6SJohn Wang /* It expects a ds3232 but a ds1338 is good enough */ 72082b6a3f6SJohn Wang i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "ds1338", 0x68); 72182b6a3f6SJohn Wang 72282b6a3f6SJohn Wang /* It expects a pca9555 but a pca9552 is compatible */ 723f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x30); 72482b6a3f6SJohn Wang } 72582b6a3f6SJohn Wang 72658e52bdbSCédric Le Goater static void rainier_bmc_i2c_init(AspeedMachineState *bmc) 72758e52bdbSCédric Le Goater { 72858e52bdbSCédric Le Goater AspeedSoCState *soc = &bmc->soc; 729fa6d98c0SJoel Stanley I2CSlave *i2c_mux; 730fa6d98c0SJoel Stanley 7319077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB); 73258e52bdbSCédric Le Goater 733f4aec252SCédric Le Goater create_pca9552(soc, 3, 0x61); 734bcb122f8SJoel Stanley 73558e52bdbSCédric Le Goater /* The rainier expects a TMP275 but a TMP105 is compatible */ 73658e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105, 73758e52bdbSCédric Le Goater 0x48); 73858e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105, 73958e52bdbSCédric Le Goater 0x49); 74058e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105, 74158e52bdbSCédric Le Goater 0x4a); 742fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), 743fa6d98c0SJoel Stanley "pca9546", 0x70); 7449077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 7459077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 7469077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB); 747f4aec252SCédric Le Goater create_pca9552(soc, 4, 0x60); 74858e52bdbSCédric Le Goater 74958e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105, 75058e52bdbSCédric Le Goater 0x48); 75158e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105, 75258e52bdbSCédric Le Goater 0x49); 753f4aec252SCédric Le Goater create_pca9552(soc, 5, 0x60); 754f4aec252SCédric Le Goater create_pca9552(soc, 5, 0x61); 755fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), 756fa6d98c0SJoel Stanley "pca9546", 0x70); 7579077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 7589077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 75958e52bdbSCédric Le Goater 76058e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105, 76158e52bdbSCédric Le Goater 0x48); 76258e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105, 76358e52bdbSCédric Le Goater 0x4a); 76458e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105, 76558e52bdbSCédric Le Goater 0x4b); 766fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), 767fa6d98c0SJoel Stanley "pca9546", 0x70); 7689077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 7699077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 7709077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB); 7719077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB); 77258e52bdbSCédric Le Goater 773f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x30); 774f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x31); 775f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x32); 776f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x33); 777f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x60); 778f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x61); 779b61ea6e7SJoel Stanley i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76); 78058e52bdbSCédric Le Goater /* Bus 7: TODO si7021-a20@20 */ 78158e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105, 78258e52bdbSCédric Le Goater 0x48); 7832a75e8c3SMaheswara Kurapati i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "max31785", 0x52); 7849077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB); 7859077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB); 78658e52bdbSCédric Le Goater 78758e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105, 78858e52bdbSCédric Le Goater 0x48); 78958e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105, 79058e52bdbSCédric Le Goater 0x4a); 7919077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50, 64 * KiB); 7929077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 64 * KiB); 793f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x60); 794f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x61); 79558e52bdbSCédric Le Goater /* Bus 8: ucd90320@11 */ 79658e52bdbSCédric Le Goater /* Bus 8: ucd90320@b */ 79758e52bdbSCédric Le Goater /* Bus 8: ucd90320@c */ 79858e52bdbSCédric Le Goater 79958e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c); 80058e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d); 8019077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB); 80258e52bdbSCédric Le Goater 80358e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c); 80458e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d); 8059077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB); 80658e52bdbSCédric Le Goater 80758e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105, 80858e52bdbSCédric Le Goater 0x48); 80958e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105, 81058e52bdbSCédric Le Goater 0x49); 811fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), 812fa6d98c0SJoel Stanley "pca9546", 0x70); 8139077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 8149077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 815f4aec252SCédric Le Goater create_pca9552(soc, 11, 0x60); 816fa6d98c0SJoel Stanley 817fa6d98c0SJoel Stanley 8189077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB); 819f4aec252SCédric Le Goater create_pca9552(soc, 13, 0x60); 820fa6d98c0SJoel Stanley 8219077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB); 822f4aec252SCédric Le Goater create_pca9552(soc, 14, 0x60); 823fa6d98c0SJoel Stanley 8249077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB); 825f4aec252SCédric Le Goater create_pca9552(soc, 15, 0x60); 82658e52bdbSCédric Le Goater } 82758e52bdbSCédric Le Goater 828febbe308SPeter Delevoryas static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr, 829febbe308SPeter Delevoryas I2CBus **channels) 830febbe308SPeter Delevoryas { 831febbe308SPeter Delevoryas I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr); 832febbe308SPeter Delevoryas for (int i = 0; i < 8; i++) { 833febbe308SPeter Delevoryas channels[i] = pca954x_i2c_get_bus(mux, i); 834febbe308SPeter Delevoryas } 835febbe308SPeter Delevoryas } 836febbe308SPeter Delevoryas 837febbe308SPeter Delevoryas #define TYPE_LM75 TYPE_TMP105 838febbe308SPeter Delevoryas #define TYPE_TMP75 TYPE_TMP105 839febbe308SPeter Delevoryas #define TYPE_TMP422 "tmp422" 840febbe308SPeter Delevoryas 841febbe308SPeter Delevoryas static void fuji_bmc_i2c_init(AspeedMachineState *bmc) 842febbe308SPeter Delevoryas { 843febbe308SPeter Delevoryas AspeedSoCState *soc = &bmc->soc; 844febbe308SPeter Delevoryas I2CBus *i2c[144] = {}; 845febbe308SPeter Delevoryas 846febbe308SPeter Delevoryas for (int i = 0; i < 16; i++) { 847febbe308SPeter Delevoryas i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i); 848febbe308SPeter Delevoryas } 849febbe308SPeter Delevoryas I2CBus *i2c180 = i2c[2]; 850febbe308SPeter Delevoryas I2CBus *i2c480 = i2c[8]; 851febbe308SPeter Delevoryas I2CBus *i2c600 = i2c[11]; 852febbe308SPeter Delevoryas 853febbe308SPeter Delevoryas get_pca9548_channels(i2c180, 0x70, &i2c[16]); 854febbe308SPeter Delevoryas get_pca9548_channels(i2c480, 0x70, &i2c[24]); 855febbe308SPeter Delevoryas /* NOTE: The device tree skips [32, 40) in the alias numbering */ 856febbe308SPeter Delevoryas get_pca9548_channels(i2c600, 0x77, &i2c[40]); 857febbe308SPeter Delevoryas get_pca9548_channels(i2c[24], 0x71, &i2c[48]); 858febbe308SPeter Delevoryas get_pca9548_channels(i2c[25], 0x72, &i2c[56]); 859febbe308SPeter Delevoryas get_pca9548_channels(i2c[26], 0x76, &i2c[64]); 860febbe308SPeter Delevoryas get_pca9548_channels(i2c[27], 0x76, &i2c[72]); 861febbe308SPeter Delevoryas for (int i = 0; i < 8; i++) { 862febbe308SPeter Delevoryas get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]); 863febbe308SPeter Delevoryas } 864febbe308SPeter Delevoryas 865febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c); 866febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d); 867febbe308SPeter Delevoryas 868ef0eb67eSSittisak Sinprem /* 869ef0eb67eSSittisak Sinprem * EEPROM 24c64 size is 64Kbits or 8 Kbytes 870ef0eb67eSSittisak Sinprem * 24c02 size is 2Kbits or 256 bytes 871ef0eb67eSSittisak Sinprem */ 872ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[19], 0x52, 8 * KiB); 873ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[20], 0x50, 256); 874ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[22], 0x52, 256); 875febbe308SPeter Delevoryas 876febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x48); 877febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x49); 878febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x4a); 879febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_TMP422, 0x4c); 880febbe308SPeter Delevoryas 881ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[8], 0x51, 8 * KiB); 882febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a); 883febbe308SPeter Delevoryas 884febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[50], TYPE_LM75, 0x4c); 885ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[50], 0x52, 8 * KiB); 886febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[51], TYPE_TMP75, 0x48); 887febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[52], TYPE_TMP75, 0x49); 888febbe308SPeter Delevoryas 889febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[59], TYPE_TMP75, 0x48); 890febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[60], TYPE_TMP75, 0x49); 891febbe308SPeter Delevoryas 892ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[65], 0x53, 8 * KiB); 893febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x49); 894febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x48); 895ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[68], 0x52, 8 * KiB); 896ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[69], 0x52, 8 * KiB); 897ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[70], 0x52, 8 * KiB); 898ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[71], 0x52, 8 * KiB); 899febbe308SPeter Delevoryas 900ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[73], 0x53, 8 * KiB); 901febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x49); 902febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x48); 903ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[76], 0x52, 8 * KiB); 904ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[77], 0x52, 8 * KiB); 905ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[78], 0x52, 8 * KiB); 906ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[79], 0x52, 8 * KiB); 907ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[28], 0x50, 256); 908febbe308SPeter Delevoryas 909febbe308SPeter Delevoryas for (int i = 0; i < 8; i++) { 9109077e09aSPeter Delevoryas at24c_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB); 911febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[82 + i * 8], TYPE_TMP75, 0x48); 912febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[83 + i * 8], TYPE_TMP75, 0x4b); 913febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[84 + i * 8], TYPE_TMP75, 0x4a); 914febbe308SPeter Delevoryas } 915febbe308SPeter Delevoryas } 916febbe308SPeter Delevoryas 917a20c54b1SPatrick Williams #define TYPE_TMP421 "tmp421" 918a20c54b1SPatrick Williams 919a20c54b1SPatrick Williams static void bletchley_bmc_i2c_init(AspeedMachineState *bmc) 920a20c54b1SPatrick Williams { 921a20c54b1SPatrick Williams AspeedSoCState *soc = &bmc->soc; 922a20c54b1SPatrick Williams I2CBus *i2c[13] = {}; 923a20c54b1SPatrick Williams for (int i = 0; i < 13; i++) { 924a20c54b1SPatrick Williams if ((i == 8) || (i == 11)) { 925a20c54b1SPatrick Williams continue; 926a20c54b1SPatrick Williams } 927a20c54b1SPatrick Williams i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i); 928a20c54b1SPatrick Williams } 929a20c54b1SPatrick Williams 930a20c54b1SPatrick Williams /* Bus 0 - 5 all have the same config. */ 931a20c54b1SPatrick Williams for (int i = 0; i < 6; i++) { 932a20c54b1SPatrick Williams /* Missing model: ti,ina230 @ 0x45 */ 933a20c54b1SPatrick Williams /* Missing model: mps,mp5023 @ 0x40 */ 934a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[i], TYPE_TMP421, 0x4f); 935a20c54b1SPatrick Williams /* Missing model: nxp,pca9539 @ 0x76, but PCA9552 works enough */ 936a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x76); 937a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x67); 938a20c54b1SPatrick Williams /* Missing model: fsc,fusb302 @ 0x22 */ 939a20c54b1SPatrick Williams } 940a20c54b1SPatrick Williams 941a20c54b1SPatrick Williams /* Bus 6 */ 942a20c54b1SPatrick Williams at24c_eeprom_init(i2c[6], 0x56, 65536); 943a20c54b1SPatrick Williams /* Missing model: nxp,pcf85263 @ 0x51 , but ds1338 works enough */ 944a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[6], "ds1338", 0x51); 945a20c54b1SPatrick Williams 946a20c54b1SPatrick Williams 947a20c54b1SPatrick Williams /* Bus 7 */ 948a20c54b1SPatrick Williams at24c_eeprom_init(i2c[7], 0x54, 65536); 949a20c54b1SPatrick Williams 950a20c54b1SPatrick Williams /* Bus 9 */ 951a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[9], TYPE_TMP421, 0x4f); 952a20c54b1SPatrick Williams 953a20c54b1SPatrick Williams /* Bus 10 */ 954a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[10], TYPE_TMP421, 0x4f); 955a20c54b1SPatrick Williams /* Missing model: ti,hdc1080 @ 0x40 */ 956a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[10], TYPE_PCA9552, 0x67); 957a20c54b1SPatrick Williams 958a20c54b1SPatrick Williams /* Bus 12 */ 959a20c54b1SPatrick Williams /* Missing model: adi,adm1278 @ 0x11 */ 960a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4c); 961a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4d); 962a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[12], TYPE_PCA9552, 0x67); 963a20c54b1SPatrick Williams } 964a20c54b1SPatrick Williams 965fa699e80SPeter Delevoryas static void fby35_i2c_init(AspeedMachineState *bmc) 966fa699e80SPeter Delevoryas { 967fa699e80SPeter Delevoryas AspeedSoCState *soc = &bmc->soc; 968fa699e80SPeter Delevoryas I2CBus *i2c[16]; 969fa699e80SPeter Delevoryas 970fa699e80SPeter Delevoryas for (int i = 0; i < 16; i++) { 971fa699e80SPeter Delevoryas i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i); 972fa699e80SPeter Delevoryas } 973fa699e80SPeter Delevoryas 974fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[2], TYPE_LM75, 0x4f); 975fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[8], TYPE_TMP421, 0x1f); 976fa699e80SPeter Delevoryas /* Hotswap controller is actually supposed to be mp5920 or ltc4282. */ 977fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[11], "adm1272", 0x44); 978fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4e); 979fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4f); 980fa699e80SPeter Delevoryas 9819077e09aSPeter Delevoryas at24c_eeprom_init(i2c[4], 0x51, 128 * KiB); 9829077e09aSPeter Delevoryas at24c_eeprom_init(i2c[6], 0x51, 128 * KiB); 983c0216b94SPeter Delevoryas at24c_eeprom_init_rom(i2c[8], 0x50, 32 * KiB, fby35_nic_fruid, 984c0216b94SPeter Delevoryas fby35_nic_fruid_len); 985c0216b94SPeter Delevoryas at24c_eeprom_init_rom(i2c[11], 0x51, 128 * KiB, fby35_bb_fruid, 986c0216b94SPeter Delevoryas fby35_bb_fruid_len); 987c0216b94SPeter Delevoryas at24c_eeprom_init_rom(i2c[11], 0x54, 128 * KiB, fby35_bmc_fruid, 988c0216b94SPeter Delevoryas fby35_bmc_fruid_len); 989fa699e80SPeter Delevoryas 990fa699e80SPeter Delevoryas /* 991fa699e80SPeter Delevoryas * TODO: There is a multi-master i2c connection to an AST1030 MiniBMC on 992fa699e80SPeter Delevoryas * buses 0, 1, 2, 3, and 9. Source address 0x10, target address 0x20 on 993fa699e80SPeter Delevoryas * each. 994fa699e80SPeter Delevoryas */ 995fa699e80SPeter Delevoryas } 996fa699e80SPeter Delevoryas 997fb6b3c8dSJae Hyun Yoo static void qcom_dc_scm_bmc_i2c_init(AspeedMachineState *bmc) 998fb6b3c8dSJae Hyun Yoo { 999fb6b3c8dSJae Hyun Yoo AspeedSoCState *soc = &bmc->soc; 1000fb6b3c8dSJae Hyun Yoo 1001fb6b3c8dSJae Hyun Yoo i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 15), "tmp105", 0x4d); 1002fb6b3c8dSJae Hyun Yoo } 1003fb6b3c8dSJae Hyun Yoo 1004ece4cccdSGraeme Gregory static void qcom_dc_scm_firework_i2c_init(AspeedMachineState *bmc) 1005ece4cccdSGraeme Gregory { 1006ece4cccdSGraeme Gregory AspeedSoCState *soc = &bmc->soc; 10072a7a5d5cSJae Hyun Yoo I2CSlave *therm_mux, *cpuvr_mux; 1008ece4cccdSGraeme Gregory 1009ece4cccdSGraeme Gregory /* Create the generic DC-SCM hardware */ 1010ece4cccdSGraeme Gregory qcom_dc_scm_bmc_i2c_init(bmc); 1011ece4cccdSGraeme Gregory 1012ece4cccdSGraeme Gregory /* Now create the Firework specific hardware */ 10132a75e8c3SMaheswara Kurapati 10142a7a5d5cSJae Hyun Yoo /* I2C7 CPUVR MUX */ 10152a7a5d5cSJae Hyun Yoo cpuvr_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), 10162a7a5d5cSJae Hyun Yoo "pca9546", 0x70); 10172a7a5d5cSJae Hyun Yoo i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 0), "pca9548", 0x72); 10182a7a5d5cSJae Hyun Yoo i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 1), "pca9548", 0x72); 10192a7a5d5cSJae Hyun Yoo i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 2), "pca9548", 0x72); 10202a7a5d5cSJae Hyun Yoo i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 3), "pca9548", 0x72); 10212a7a5d5cSJae Hyun Yoo 1022cfc68f16SMaheswara Kurapati /* I2C8 Thermal Diodes*/ 1023cfc68f16SMaheswara Kurapati therm_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), 1024cfc68f16SMaheswara Kurapati "pca9548", 0x70); 1025cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 0), TYPE_LM75, 0x4C); 1026cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 1), TYPE_LM75, 0x4C); 1027cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 2), TYPE_LM75, 0x48); 1028cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 3), TYPE_LM75, 0x48); 1029cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 4), TYPE_LM75, 0x48); 1030cfc68f16SMaheswara Kurapati 10312a75e8c3SMaheswara Kurapati /* I2C9 Fan Controller (MAX31785) */ 10322a75e8c3SMaheswara Kurapati i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x52); 10332a75e8c3SMaheswara Kurapati i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x54); 1034ece4cccdSGraeme Gregory } 1035ece4cccdSGraeme Gregory 10361a15311aSCédric Le Goater static bool aspeed_get_mmio_exec(Object *obj, Error **errp) 10371a15311aSCédric Le Goater { 10381a15311aSCédric Le Goater return ASPEED_MACHINE(obj)->mmio_exec; 10391a15311aSCédric Le Goater } 10401a15311aSCédric Le Goater 10411a15311aSCédric Le Goater static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp) 10421a15311aSCédric Le Goater { 10431a15311aSCédric Le Goater ASPEED_MACHINE(obj)->mmio_exec = value; 10441a15311aSCédric Le Goater } 10451a15311aSCédric Le Goater 10461a15311aSCédric Le Goater static void aspeed_machine_instance_init(Object *obj) 10471a15311aSCédric Le Goater { 10481a15311aSCédric Le Goater ASPEED_MACHINE(obj)->mmio_exec = false; 10491a15311aSCédric Le Goater } 10501a15311aSCédric Le Goater 10519820e52fSCédric Le Goater static char *aspeed_get_fmc_model(Object *obj, Error **errp) 10529820e52fSCédric Le Goater { 10539820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 10549820e52fSCédric Le Goater return g_strdup(bmc->fmc_model); 10559820e52fSCédric Le Goater } 10569820e52fSCédric Le Goater 10579820e52fSCédric Le Goater static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp) 10589820e52fSCédric Le Goater { 10599820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 10609820e52fSCédric Le Goater 10619820e52fSCédric Le Goater g_free(bmc->fmc_model); 10629820e52fSCédric Le Goater bmc->fmc_model = g_strdup(value); 10639820e52fSCédric Le Goater } 10649820e52fSCédric Le Goater 10659820e52fSCédric Le Goater static char *aspeed_get_spi_model(Object *obj, Error **errp) 10669820e52fSCédric Le Goater { 10679820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 10689820e52fSCédric Le Goater return g_strdup(bmc->spi_model); 10699820e52fSCédric Le Goater } 10709820e52fSCédric Le Goater 10719820e52fSCédric Le Goater static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp) 10729820e52fSCédric Le Goater { 10739820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 10749820e52fSCédric Le Goater 10759820e52fSCédric Le Goater g_free(bmc->spi_model); 10769820e52fSCédric Le Goater bmc->spi_model = g_strdup(value); 10779820e52fSCédric Le Goater } 10789820e52fSCédric Le Goater 10791a15311aSCédric Le Goater static void aspeed_machine_class_props_init(ObjectClass *oc) 10801a15311aSCédric Le Goater { 10811a15311aSCédric Le Goater object_class_property_add_bool(oc, "execute-in-place", 10821a15311aSCédric Le Goater aspeed_get_mmio_exec, 1083d2623129SMarkus Armbruster aspeed_set_mmio_exec); 10841a15311aSCédric Le Goater object_class_property_set_description(oc, "execute-in-place", 10857eecec7dSMarkus Armbruster "boot directly from CE0 flash device"); 10869820e52fSCédric Le Goater 10879820e52fSCédric Le Goater object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model, 10889820e52fSCédric Le Goater aspeed_set_fmc_model); 10899820e52fSCédric Le Goater object_class_property_set_description(oc, "fmc-model", 10909820e52fSCédric Le Goater "Change the FMC Flash model"); 10919820e52fSCédric Le Goater object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model, 10929820e52fSCédric Le Goater aspeed_set_spi_model); 10939820e52fSCédric Le Goater object_class_property_set_description(oc, "spi-model", 10949820e52fSCédric Le Goater "Change the SPI Flash model"); 10951a15311aSCédric Le Goater } 10961a15311aSCédric Le Goater 1097b7f1a0cbSCédric Le Goater static int aspeed_soc_num_cpus(const char *soc_name) 1098b7f1a0cbSCédric Le Goater { 1099b7f1a0cbSCédric Le Goater AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(soc_name)); 1100b7f1a0cbSCédric Le Goater return sc->num_cpus; 1101b7f1a0cbSCédric Le Goater } 1102b7f1a0cbSCédric Le Goater 1103fca9ca1bSCédric Le Goater static void aspeed_machine_class_init(ObjectClass *oc, void *data) 110462c2c2ebSCédric Le Goater { 110562c2c2ebSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1106d3bad7e7SCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 110762c2c2ebSCédric Le Goater 1108fca9ca1bSCédric Le Goater mc->init = aspeed_machine_init; 110962c2c2ebSCédric Le Goater mc->no_floppy = 1; 111062c2c2ebSCédric Le Goater mc->no_cdrom = 1; 111162c2c2ebSCédric Le Goater mc->no_parallel = 1; 1112afcbaed6SIgor Mammedov mc->default_ram_id = "ram"; 1113d3bad7e7SCédric Le Goater amc->macs_mask = ASPEED_MAC0_ON; 11145d63d0c7SPeter Delevoryas amc->uart_default = ASPEED_DEV_UART5; 11151a15311aSCédric Le Goater 11161a15311aSCédric Le Goater aspeed_machine_class_props_init(oc); 111762c2c2ebSCédric Le Goater } 111862c2c2ebSCédric Le Goater 1119baa4732bSCédric Le Goater static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data) 1120baa4732bSCédric Le Goater { 1121baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1122baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1123baa4732bSCédric Le Goater 1124baa4732bSCédric Le Goater mc->desc = "OpenPOWER Palmetto BMC (ARM926EJ-S)"; 1125baa4732bSCédric Le Goater amc->soc_name = "ast2400-a1"; 1126baa4732bSCédric Le Goater amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1; 1127baa4732bSCédric Le Goater amc->fmc_model = "n25q256a"; 112870322913SCédric Le Goater amc->spi_model = "mx25l25635f"; 1129baa4732bSCédric Le Goater amc->num_cs = 1; 1130baa4732bSCédric Le Goater amc->i2c_init = palmetto_bmc_i2c_init; 1131baa4732bSCédric Le Goater mc->default_ram_size = 256 * MiB; 1132b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1133b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1134baa4732bSCédric Le Goater }; 1135baa4732bSCédric Le Goater 11369cccb912SPatrick Venture static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data) 11379cccb912SPatrick Venture { 11389cccb912SPatrick Venture MachineClass *mc = MACHINE_CLASS(oc); 11399cccb912SPatrick Venture AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 11409cccb912SPatrick Venture 11419cccb912SPatrick Venture mc->desc = "Quanta-Q71l BMC (ARM926EJ-S)"; 11429cccb912SPatrick Venture amc->soc_name = "ast2400-a1"; 11439cccb912SPatrick Venture amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1; 11449cccb912SPatrick Venture amc->fmc_model = "n25q256a"; 11459cccb912SPatrick Venture amc->spi_model = "mx25l25635e"; 11469cccb912SPatrick Venture amc->num_cs = 1; 11479cccb912SPatrick Venture amc->i2c_init = quanta_q71l_bmc_i2c_init; 11489cccb912SPatrick Venture mc->default_ram_size = 128 * MiB; 11499cccb912SPatrick Venture mc->default_cpus = mc->min_cpus = mc->max_cpus = 11509cccb912SPatrick Venture aspeed_soc_num_cpus(amc->soc_name); 11519cccb912SPatrick Venture } 11529cccb912SPatrick Venture 115340a38df5SErik Smit static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc, 115440a38df5SErik Smit void *data) 115540a38df5SErik Smit { 115640a38df5SErik Smit MachineClass *mc = MACHINE_CLASS(oc); 115740a38df5SErik Smit AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 115840a38df5SErik Smit 115940a38df5SErik Smit mc->desc = "Supermicro X11 BMC (ARM926EJ-S)"; 116040a38df5SErik Smit amc->soc_name = "ast2400-a1"; 116140a38df5SErik Smit amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1; 116240a38df5SErik Smit amc->fmc_model = "mx25l25635e"; 116340a38df5SErik Smit amc->spi_model = "mx25l25635e"; 116440a38df5SErik Smit amc->num_cs = 1; 116540a38df5SErik Smit amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 116640a38df5SErik Smit amc->i2c_init = palmetto_bmc_i2c_init; 116740a38df5SErik Smit mc->default_ram_size = 256 * MiB; 116840a38df5SErik Smit } 116940a38df5SErik Smit 117047936597SGuenter Roeck static void aspeed_machine_supermicro_x11spi_bmc_class_init(ObjectClass *oc, 117147936597SGuenter Roeck void *data) 117247936597SGuenter Roeck { 117347936597SGuenter Roeck MachineClass *mc = MACHINE_CLASS(oc); 117447936597SGuenter Roeck AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 117547936597SGuenter Roeck 117647936597SGuenter Roeck mc->desc = "Supermicro X11 SPI BMC (ARM1176)"; 117747936597SGuenter Roeck amc->soc_name = "ast2500-a1"; 117847936597SGuenter Roeck amc->hw_strap1 = SUPERMICRO_X11SPI_BMC_HW_STRAP1; 117947936597SGuenter Roeck amc->fmc_model = "mx25l25635e"; 118047936597SGuenter Roeck amc->spi_model = "mx25l25635e"; 118147936597SGuenter Roeck amc->num_cs = 1; 118247936597SGuenter Roeck amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 118347936597SGuenter Roeck amc->i2c_init = palmetto_bmc_i2c_init; 118447936597SGuenter Roeck mc->default_ram_size = 512 * MiB; 118547936597SGuenter Roeck mc->default_cpus = mc->min_cpus = mc->max_cpus = 118647936597SGuenter Roeck aspeed_soc_num_cpus(amc->soc_name); 118747936597SGuenter Roeck } 118847936597SGuenter Roeck 1189baa4732bSCédric Le Goater static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data) 1190baa4732bSCédric Le Goater { 1191baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1192baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1193baa4732bSCédric Le Goater 1194baa4732bSCédric Le Goater mc->desc = "Aspeed AST2500 EVB (ARM1176)"; 1195baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1"; 1196baa4732bSCédric Le Goater amc->hw_strap1 = AST2500_EVB_HW_STRAP1; 1197753abfc4SJae Hyun Yoo amc->fmc_model = "mx25l25635e"; 119870322913SCédric Le Goater amc->spi_model = "mx25l25635f"; 1199baa4732bSCédric Le Goater amc->num_cs = 1; 1200baa4732bSCédric Le Goater amc->i2c_init = ast2500_evb_i2c_init; 1201baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB; 1202b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1203b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1204baa4732bSCédric Le Goater }; 1205baa4732bSCédric Le Goater 120634f73a81SKarthikeyan Pasupathi static void aspeed_machine_yosemitev2_class_init(ObjectClass *oc, void *data) 120734f73a81SKarthikeyan Pasupathi { 120834f73a81SKarthikeyan Pasupathi MachineClass *mc = MACHINE_CLASS(oc); 120934f73a81SKarthikeyan Pasupathi AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 121034f73a81SKarthikeyan Pasupathi 121134f73a81SKarthikeyan Pasupathi mc->desc = "Facebook YosemiteV2 BMC (ARM1176)"; 121234f73a81SKarthikeyan Pasupathi amc->soc_name = "ast2500-a1"; 121334f73a81SKarthikeyan Pasupathi amc->hw_strap1 = AST2500_EVB_HW_STRAP1; 121434f73a81SKarthikeyan Pasupathi amc->hw_strap2 = 0; 121534f73a81SKarthikeyan Pasupathi amc->fmc_model = "n25q256a"; 121634f73a81SKarthikeyan Pasupathi amc->spi_model = "mx25l25635e"; 121734f73a81SKarthikeyan Pasupathi amc->num_cs = 2; 121834f73a81SKarthikeyan Pasupathi amc->i2c_init = yosemitev2_bmc_i2c_init; 121934f73a81SKarthikeyan Pasupathi mc->default_ram_size = 512 * MiB; 122034f73a81SKarthikeyan Pasupathi mc->default_cpus = mc->min_cpus = mc->max_cpus = 122134f73a81SKarthikeyan Pasupathi aspeed_soc_num_cpus(amc->soc_name); 122234f73a81SKarthikeyan Pasupathi }; 122334f73a81SKarthikeyan Pasupathi 1224baa4732bSCédric Le Goater static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data) 1225baa4732bSCédric Le Goater { 1226baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1227baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1228baa4732bSCédric Le Goater 1229baa4732bSCédric Le Goater mc->desc = "OpenPOWER Romulus BMC (ARM1176)"; 1230baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1"; 1231baa4732bSCédric Le Goater amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1; 1232baa4732bSCédric Le Goater amc->fmc_model = "n25q256a"; 1233baa4732bSCédric Le Goater amc->spi_model = "mx66l1g45g"; 1234baa4732bSCédric Le Goater amc->num_cs = 2; 1235baa4732bSCédric Le Goater amc->i2c_init = romulus_bmc_i2c_init; 1236baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB; 1237b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1238b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1239baa4732bSCédric Le Goater }; 1240baa4732bSCédric Le Goater 12416c323abaSKarthikeyan Pasupathi static void aspeed_machine_tiogapass_class_init(ObjectClass *oc, void *data) 12426c323abaSKarthikeyan Pasupathi { 12436c323abaSKarthikeyan Pasupathi MachineClass *mc = MACHINE_CLASS(oc); 12446c323abaSKarthikeyan Pasupathi AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 12456c323abaSKarthikeyan Pasupathi 12466c323abaSKarthikeyan Pasupathi mc->desc = "Facebook Tiogapass BMC (ARM1176)"; 12476c323abaSKarthikeyan Pasupathi amc->soc_name = "ast2500-a1"; 12486c323abaSKarthikeyan Pasupathi amc->hw_strap1 = AST2500_EVB_HW_STRAP1; 12496c323abaSKarthikeyan Pasupathi amc->hw_strap2 = 0; 12506c323abaSKarthikeyan Pasupathi amc->fmc_model = "n25q256a"; 12516c323abaSKarthikeyan Pasupathi amc->spi_model = "mx25l25635e"; 12526c323abaSKarthikeyan Pasupathi amc->num_cs = 2; 12536c323abaSKarthikeyan Pasupathi amc->i2c_init = tiogapass_bmc_i2c_init; 12546c323abaSKarthikeyan Pasupathi mc->default_ram_size = 1 * GiB; 12556c323abaSKarthikeyan Pasupathi mc->default_cpus = mc->min_cpus = mc->max_cpus = 12566c323abaSKarthikeyan Pasupathi aspeed_soc_num_cpus(amc->soc_name); 12576c323abaSKarthikeyan Pasupathi aspeed_soc_num_cpus(amc->soc_name); 12586c323abaSKarthikeyan Pasupathi }; 12596c323abaSKarthikeyan Pasupathi 1260143b040fSPatrick Williams static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data) 1261143b040fSPatrick Williams { 1262143b040fSPatrick Williams MachineClass *mc = MACHINE_CLASS(oc); 1263143b040fSPatrick Williams AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1264143b040fSPatrick Williams 1265143b040fSPatrick Williams mc->desc = "OCP SonoraPass BMC (ARM1176)"; 1266143b040fSPatrick Williams amc->soc_name = "ast2500-a1"; 1267143b040fSPatrick Williams amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1; 1268143b040fSPatrick Williams amc->fmc_model = "mx66l1g45g"; 1269143b040fSPatrick Williams amc->spi_model = "mx66l1g45g"; 1270143b040fSPatrick Williams amc->num_cs = 2; 1271143b040fSPatrick Williams amc->i2c_init = sonorapass_bmc_i2c_init; 1272143b040fSPatrick Williams mc->default_ram_size = 512 * MiB; 1273b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1274b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1275143b040fSPatrick Williams }; 1276143b040fSPatrick Williams 1277baa4732bSCédric Le Goater static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data) 1278baa4732bSCédric Le Goater { 1279baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1280baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1281baa4732bSCédric Le Goater 1282baa4732bSCédric Le Goater mc->desc = "OpenPOWER Witherspoon BMC (ARM1176)"; 1283baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1"; 1284baa4732bSCédric Le Goater amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1; 128570322913SCédric Le Goater amc->fmc_model = "mx25l25635f"; 1286baa4732bSCédric Le Goater amc->spi_model = "mx66l1g45g"; 1287baa4732bSCédric Le Goater amc->num_cs = 2; 1288baa4732bSCédric Le Goater amc->i2c_init = witherspoon_bmc_i2c_init; 1289baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB; 1290b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1291b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1292baa4732bSCédric Le Goater }; 1293baa4732bSCédric Le Goater 1294baa4732bSCédric Le Goater static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data) 1295baa4732bSCédric Le Goater { 1296baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1297baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1298baa4732bSCédric Le Goater 1299f548f201SPeter Maydell mc->desc = "Aspeed AST2600 EVB (Cortex-A7)"; 1300c5811bb3SJoel Stanley amc->soc_name = "ast2600-a3"; 1301baa4732bSCédric Le Goater amc->hw_strap1 = AST2600_EVB_HW_STRAP1; 1302baa4732bSCédric Le Goater amc->hw_strap2 = AST2600_EVB_HW_STRAP2; 1303753abfc4SJae Hyun Yoo amc->fmc_model = "mx66u51235f"; 1304baa4732bSCédric Le Goater amc->spi_model = "mx66u51235f"; 1305baa4732bSCédric Le Goater amc->num_cs = 1; 130629193286SGuenter Roeck amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON | 130729193286SGuenter Roeck ASPEED_MAC3_ON; 1308baa4732bSCédric Le Goater amc->i2c_init = ast2600_evb_i2c_init; 1309baa4732bSCédric Le Goater mc->default_ram_size = 1 * GiB; 1310b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1311b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1312baa4732bSCédric Le Goater }; 1313baa4732bSCédric Le Goater 131463ceb818SCédric Le Goater static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data) 131563ceb818SCédric Le Goater { 131663ceb818SCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 131763ceb818SCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 131863ceb818SCédric Le Goater 1319f548f201SPeter Maydell mc->desc = "OpenPOWER Tacoma BMC (Cortex-A7)"; 1320c5811bb3SJoel Stanley amc->soc_name = "ast2600-a3"; 132163ceb818SCédric Le Goater amc->hw_strap1 = TACOMA_BMC_HW_STRAP1; 132263ceb818SCédric Le Goater amc->hw_strap2 = TACOMA_BMC_HW_STRAP2; 132363ceb818SCédric Le Goater amc->fmc_model = "mx66l1g45g"; 132463ceb818SCédric Le Goater amc->spi_model = "mx66l1g45g"; 132563ceb818SCédric Le Goater amc->num_cs = 2; 1326d3bad7e7SCédric Le Goater amc->macs_mask = ASPEED_MAC2_ON; 132763ceb818SCédric Le Goater amc->i2c_init = witherspoon_bmc_i2c_init; /* Same board layout */ 132863ceb818SCédric Le Goater mc->default_ram_size = 1 * GiB; 1329b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1330b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 133163ceb818SCédric Le Goater }; 133263ceb818SCédric Le Goater 133395f068c8SJohn Wang static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data) 133495f068c8SJohn Wang { 133595f068c8SJohn Wang MachineClass *mc = MACHINE_CLASS(oc); 133695f068c8SJohn Wang AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 133795f068c8SJohn Wang 133895f068c8SJohn Wang mc->desc = "Bytedance G220A BMC (ARM1176)"; 133995f068c8SJohn Wang amc->soc_name = "ast2500-a1"; 134095f068c8SJohn Wang amc->hw_strap1 = G220A_BMC_HW_STRAP1; 134195f068c8SJohn Wang amc->fmc_model = "n25q512a"; 134295f068c8SJohn Wang amc->spi_model = "mx25l25635e"; 134395f068c8SJohn Wang amc->num_cs = 2; 13445bb825c8SGuenter Roeck amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 134595f068c8SJohn Wang amc->i2c_init = g220a_bmc_i2c_init; 134695f068c8SJohn Wang mc->default_ram_size = 1024 * MiB; 134795f068c8SJohn Wang mc->default_cpus = mc->min_cpus = mc->max_cpus = 134895f068c8SJohn Wang aspeed_soc_num_cpus(amc->soc_name); 134995f068c8SJohn Wang }; 135095f068c8SJohn Wang 135182b6a3f6SJohn Wang static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc, void *data) 135282b6a3f6SJohn Wang { 135382b6a3f6SJohn Wang MachineClass *mc = MACHINE_CLASS(oc); 135482b6a3f6SJohn Wang AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 135582b6a3f6SJohn Wang 135682b6a3f6SJohn Wang mc->desc = "Inspur FP5280G2 BMC (ARM1176)"; 135782b6a3f6SJohn Wang amc->soc_name = "ast2500-a1"; 135882b6a3f6SJohn Wang amc->hw_strap1 = FP5280G2_BMC_HW_STRAP1; 135982b6a3f6SJohn Wang amc->fmc_model = "n25q512a"; 136082b6a3f6SJohn Wang amc->spi_model = "mx25l25635e"; 136182b6a3f6SJohn Wang amc->num_cs = 2; 136282b6a3f6SJohn Wang amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 136382b6a3f6SJohn Wang amc->i2c_init = fp5280g2_bmc_i2c_init; 136482b6a3f6SJohn Wang mc->default_ram_size = 512 * MiB; 136582b6a3f6SJohn Wang mc->default_cpus = mc->min_cpus = mc->max_cpus = 136682b6a3f6SJohn Wang aspeed_soc_num_cpus(amc->soc_name); 136782b6a3f6SJohn Wang }; 136882b6a3f6SJohn Wang 136958e52bdbSCédric Le Goater static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data) 137058e52bdbSCédric Le Goater { 137158e52bdbSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 137258e52bdbSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 137358e52bdbSCédric Le Goater 1374f548f201SPeter Maydell mc->desc = "IBM Rainier BMC (Cortex-A7)"; 1375c5811bb3SJoel Stanley amc->soc_name = "ast2600-a3"; 137658e52bdbSCédric Le Goater amc->hw_strap1 = RAINIER_BMC_HW_STRAP1; 137758e52bdbSCédric Le Goater amc->hw_strap2 = RAINIER_BMC_HW_STRAP2; 137858e52bdbSCédric Le Goater amc->fmc_model = "mx66l1g45g"; 137958e52bdbSCédric Le Goater amc->spi_model = "mx66l1g45g"; 138058e52bdbSCédric Le Goater amc->num_cs = 2; 138158e52bdbSCédric Le Goater amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON; 138258e52bdbSCédric Le Goater amc->i2c_init = rainier_bmc_i2c_init; 138358e52bdbSCédric Le Goater mc->default_ram_size = 1 * GiB; 138458e52bdbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 138558e52bdbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 138658e52bdbSCédric Le Goater }; 138758e52bdbSCédric Le Goater 1388febbe308SPeter Delevoryas /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */ 1389febbe308SPeter Delevoryas #if HOST_LONG_BITS == 32 1390febbe308SPeter Delevoryas #define FUJI_BMC_RAM_SIZE (1 * GiB) 1391febbe308SPeter Delevoryas #else 1392febbe308SPeter Delevoryas #define FUJI_BMC_RAM_SIZE (2 * GiB) 1393febbe308SPeter Delevoryas #endif 1394febbe308SPeter Delevoryas 1395febbe308SPeter Delevoryas static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data) 1396febbe308SPeter Delevoryas { 1397febbe308SPeter Delevoryas MachineClass *mc = MACHINE_CLASS(oc); 1398febbe308SPeter Delevoryas AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1399febbe308SPeter Delevoryas 1400febbe308SPeter Delevoryas mc->desc = "Facebook Fuji BMC (Cortex-A7)"; 1401febbe308SPeter Delevoryas amc->soc_name = "ast2600-a3"; 1402febbe308SPeter Delevoryas amc->hw_strap1 = FUJI_BMC_HW_STRAP1; 1403febbe308SPeter Delevoryas amc->hw_strap2 = FUJI_BMC_HW_STRAP2; 1404febbe308SPeter Delevoryas amc->fmc_model = "mx66l1g45g"; 1405febbe308SPeter Delevoryas amc->spi_model = "mx66l1g45g"; 1406febbe308SPeter Delevoryas amc->num_cs = 2; 1407febbe308SPeter Delevoryas amc->macs_mask = ASPEED_MAC3_ON; 1408febbe308SPeter Delevoryas amc->i2c_init = fuji_bmc_i2c_init; 1409febbe308SPeter Delevoryas amc->uart_default = ASPEED_DEV_UART1; 1410febbe308SPeter Delevoryas mc->default_ram_size = FUJI_BMC_RAM_SIZE; 1411febbe308SPeter Delevoryas mc->default_cpus = mc->min_cpus = mc->max_cpus = 1412febbe308SPeter Delevoryas aspeed_soc_num_cpus(amc->soc_name); 1413febbe308SPeter Delevoryas }; 1414febbe308SPeter Delevoryas 1415104bdaffSPatrick Williams /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */ 1416104bdaffSPatrick Williams #if HOST_LONG_BITS == 32 1417104bdaffSPatrick Williams #define BLETCHLEY_BMC_RAM_SIZE (1 * GiB) 1418104bdaffSPatrick Williams #else 1419104bdaffSPatrick Williams #define BLETCHLEY_BMC_RAM_SIZE (2 * GiB) 1420104bdaffSPatrick Williams #endif 1421104bdaffSPatrick Williams 1422a20c54b1SPatrick Williams static void aspeed_machine_bletchley_class_init(ObjectClass *oc, void *data) 1423a20c54b1SPatrick Williams { 1424a20c54b1SPatrick Williams MachineClass *mc = MACHINE_CLASS(oc); 1425a20c54b1SPatrick Williams AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1426a20c54b1SPatrick Williams 1427a20c54b1SPatrick Williams mc->desc = "Facebook Bletchley BMC (Cortex-A7)"; 1428a20c54b1SPatrick Williams amc->soc_name = "ast2600-a3"; 1429a20c54b1SPatrick Williams amc->hw_strap1 = BLETCHLEY_BMC_HW_STRAP1; 1430a20c54b1SPatrick Williams amc->hw_strap2 = BLETCHLEY_BMC_HW_STRAP2; 1431a20c54b1SPatrick Williams amc->fmc_model = "w25q01jvq"; 1432a20c54b1SPatrick Williams amc->spi_model = NULL; 1433a20c54b1SPatrick Williams amc->num_cs = 2; 1434a20c54b1SPatrick Williams amc->macs_mask = ASPEED_MAC2_ON; 1435a20c54b1SPatrick Williams amc->i2c_init = bletchley_bmc_i2c_init; 1436104bdaffSPatrick Williams mc->default_ram_size = BLETCHLEY_BMC_RAM_SIZE; 1437a20c54b1SPatrick Williams mc->default_cpus = mc->min_cpus = mc->max_cpus = 1438a20c54b1SPatrick Williams aspeed_soc_num_cpus(amc->soc_name); 1439a20c54b1SPatrick Williams } 1440a20c54b1SPatrick Williams 14417966d70fSJason A. Donenfeld static void fby35_reset(MachineState *state, ShutdownCause reason) 1442fa699e80SPeter Delevoryas { 1443fa699e80SPeter Delevoryas AspeedMachineState *bmc = ASPEED_MACHINE(state); 1444fa699e80SPeter Delevoryas AspeedGPIOState *gpio = &bmc->soc.gpio; 1445fa699e80SPeter Delevoryas 14467966d70fSJason A. Donenfeld qemu_devices_reset(reason); 1447fa699e80SPeter Delevoryas 1448f0418558SPeter Delevoryas /* Board ID: 7 (Class-1, 4 slots) */ 1449fa699e80SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioV4", true, &error_fatal); 1450fa699e80SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioV5", true, &error_fatal); 1451fa699e80SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioV6", true, &error_fatal); 1452fa699e80SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioV7", false, &error_fatal); 1453f0418558SPeter Delevoryas 1454f0418558SPeter Delevoryas /* Slot presence pins, inverse polarity. (False means present) */ 1455f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioH4", false, &error_fatal); 1456f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioH5", true, &error_fatal); 1457f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioH6", true, &error_fatal); 1458f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioH7", true, &error_fatal); 1459f0418558SPeter Delevoryas 1460f0418558SPeter Delevoryas /* Slot 12v power pins, normal polarity. (True means powered-on) */ 1461f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioB2", true, &error_fatal); 1462f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioB3", false, &error_fatal); 1463f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioB4", false, &error_fatal); 1464f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioB5", false, &error_fatal); 1465fa699e80SPeter Delevoryas } 1466fa699e80SPeter Delevoryas 1467fa699e80SPeter Delevoryas static void aspeed_machine_fby35_class_init(ObjectClass *oc, void *data) 1468fa699e80SPeter Delevoryas { 1469fa699e80SPeter Delevoryas MachineClass *mc = MACHINE_CLASS(oc); 1470fa699e80SPeter Delevoryas AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1471fa699e80SPeter Delevoryas 1472fa699e80SPeter Delevoryas mc->desc = "Facebook fby35 BMC (Cortex-A7)"; 1473fa699e80SPeter Delevoryas mc->reset = fby35_reset; 1474fa699e80SPeter Delevoryas amc->fmc_model = "mx66l1g45g"; 1475fa699e80SPeter Delevoryas amc->num_cs = 2; 1476fa699e80SPeter Delevoryas amc->macs_mask = ASPEED_MAC3_ON; 1477fa699e80SPeter Delevoryas amc->i2c_init = fby35_i2c_init; 1478fa699e80SPeter Delevoryas /* FIXME: Replace this macro with something more general */ 1479fa699e80SPeter Delevoryas mc->default_ram_size = FUJI_BMC_RAM_SIZE; 1480fa699e80SPeter Delevoryas } 1481fa699e80SPeter Delevoryas 148266c895b8SJamin Lin #define AST1030_INTERNAL_FLASH_SIZE (1024 * 1024) 148366c895b8SJamin Lin /* Main SYSCLK frequency in Hz (200MHz) */ 148466c895b8SJamin Lin #define SYSCLK_FRQ 200000000ULL 148566c895b8SJamin Lin 148666c895b8SJamin Lin static void aspeed_minibmc_machine_init(MachineState *machine) 148766c895b8SJamin Lin { 148866c895b8SJamin Lin AspeedMachineState *bmc = ASPEED_MACHINE(machine); 148966c895b8SJamin Lin AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine); 149066c895b8SJamin Lin Clock *sysclk; 149166c895b8SJamin Lin 149266c895b8SJamin Lin sysclk = clock_new(OBJECT(machine), "SYSCLK"); 149366c895b8SJamin Lin clock_set_hz(sysclk, SYSCLK_FRQ); 149466c895b8SJamin Lin 149566c895b8SJamin Lin object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name); 149666c895b8SJamin Lin qdev_connect_clock_in(DEVICE(&bmc->soc), "sysclk", sysclk); 149766c895b8SJamin Lin 14984dd9d554SPeter Delevoryas object_property_set_link(OBJECT(&bmc->soc), "memory", 14994dd9d554SPeter Delevoryas OBJECT(get_system_memory()), &error_abort); 1500d2b3eaefSPeter Delevoryas connect_serial_hds_to_uarts(bmc); 150166c895b8SJamin Lin qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort); 150266c895b8SJamin Lin 150366c895b8SJamin Lin aspeed_board_init_flashes(&bmc->soc.fmc, 150466c895b8SJamin Lin bmc->fmc_model ? bmc->fmc_model : amc->fmc_model, 150566c895b8SJamin Lin amc->num_cs, 150666c895b8SJamin Lin 0); 150766c895b8SJamin Lin 150866c895b8SJamin Lin aspeed_board_init_flashes(&bmc->soc.spi[0], 150966c895b8SJamin Lin bmc->spi_model ? bmc->spi_model : amc->spi_model, 151066c895b8SJamin Lin amc->num_cs, amc->num_cs); 151166c895b8SJamin Lin 151266c895b8SJamin Lin aspeed_board_init_flashes(&bmc->soc.spi[1], 151366c895b8SJamin Lin bmc->spi_model ? bmc->spi_model : amc->spi_model, 151466c895b8SJamin Lin amc->num_cs, (amc->num_cs * 2)); 151566c895b8SJamin Lin 151666c895b8SJamin Lin if (amc->i2c_init) { 151766c895b8SJamin Lin amc->i2c_init(bmc); 151866c895b8SJamin Lin } 151966c895b8SJamin Lin 152066c895b8SJamin Lin armv7m_load_kernel(ARM_CPU(first_cpu), 152166c895b8SJamin Lin machine->kernel_filename, 1522761c532aSPeter Maydell 0, 152366c895b8SJamin Lin AST1030_INTERNAL_FLASH_SIZE); 152466c895b8SJamin Lin } 152566c895b8SJamin Lin 15264c70ab16STroy Lee static void ast1030_evb_i2c_init(AspeedMachineState *bmc) 15274c70ab16STroy Lee { 15284c70ab16STroy Lee AspeedSoCState *soc = &bmc->soc; 15294c70ab16STroy Lee 15304c70ab16STroy Lee /* U10 24C08 connects to SDA/SCL Groupt 1 by default */ 15314c70ab16STroy Lee uint8_t *eeprom_buf = g_malloc0(32 * 1024); 15324c70ab16STroy Lee smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, eeprom_buf); 15334c70ab16STroy Lee 15344c70ab16STroy Lee /* U11 LM75 connects to SDA/SCL Group 2 by default */ 15354c70ab16STroy Lee i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d); 15364c70ab16STroy Lee } 15374c70ab16STroy Lee 153866c895b8SJamin Lin static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc, 153966c895b8SJamin Lin void *data) 154066c895b8SJamin Lin { 154166c895b8SJamin Lin MachineClass *mc = MACHINE_CLASS(oc); 154266c895b8SJamin Lin AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 154366c895b8SJamin Lin 154466c895b8SJamin Lin mc->desc = "Aspeed AST1030 MiniBMC (Cortex-M4)"; 154566c895b8SJamin Lin amc->soc_name = "ast1030-a1"; 154666c895b8SJamin Lin amc->hw_strap1 = 0; 154766c895b8SJamin Lin amc->hw_strap2 = 0; 154866c895b8SJamin Lin mc->init = aspeed_minibmc_machine_init; 15494c70ab16STroy Lee amc->i2c_init = ast1030_evb_i2c_init; 155066c895b8SJamin Lin mc->default_ram_size = 0; 155166c895b8SJamin Lin mc->default_cpus = mc->min_cpus = mc->max_cpus = 1; 155266c895b8SJamin Lin amc->fmc_model = "sst25vf032b"; 155366c895b8SJamin Lin amc->spi_model = "sst25vf032b"; 155466c895b8SJamin Lin amc->num_cs = 2; 155566c895b8SJamin Lin amc->macs_mask = 0; 155666c895b8SJamin Lin } 155766c895b8SJamin Lin 1558fb6b3c8dSJae Hyun Yoo static void aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass *oc, 1559fb6b3c8dSJae Hyun Yoo void *data) 1560fb6b3c8dSJae Hyun Yoo { 1561fb6b3c8dSJae Hyun Yoo MachineClass *mc = MACHINE_CLASS(oc); 1562fb6b3c8dSJae Hyun Yoo AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1563fb6b3c8dSJae Hyun Yoo 1564fb6b3c8dSJae Hyun Yoo mc->desc = "Qualcomm DC-SCM V1 BMC (Cortex A7)"; 1565fb6b3c8dSJae Hyun Yoo amc->soc_name = "ast2600-a3"; 1566fb6b3c8dSJae Hyun Yoo amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1; 1567fb6b3c8dSJae Hyun Yoo amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2; 1568fb6b3c8dSJae Hyun Yoo amc->fmc_model = "n25q512a"; 1569fb6b3c8dSJae Hyun Yoo amc->spi_model = "n25q512a"; 1570fb6b3c8dSJae Hyun Yoo amc->num_cs = 2; 1571fb6b3c8dSJae Hyun Yoo amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON; 1572fb6b3c8dSJae Hyun Yoo amc->i2c_init = qcom_dc_scm_bmc_i2c_init; 1573fb6b3c8dSJae Hyun Yoo mc->default_ram_size = 1 * GiB; 1574fb6b3c8dSJae Hyun Yoo mc->default_cpus = mc->min_cpus = mc->max_cpus = 1575fb6b3c8dSJae Hyun Yoo aspeed_soc_num_cpus(amc->soc_name); 1576fb6b3c8dSJae Hyun Yoo }; 1577fb6b3c8dSJae Hyun Yoo 1578ece4cccdSGraeme Gregory static void aspeed_machine_qcom_firework_class_init(ObjectClass *oc, 1579ece4cccdSGraeme Gregory void *data) 1580ece4cccdSGraeme Gregory { 1581ece4cccdSGraeme Gregory MachineClass *mc = MACHINE_CLASS(oc); 1582ece4cccdSGraeme Gregory AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1583ece4cccdSGraeme Gregory 1584ece4cccdSGraeme Gregory mc->desc = "Qualcomm DC-SCM V1/Firework BMC (Cortex A7)"; 1585ece4cccdSGraeme Gregory amc->soc_name = "ast2600-a3"; 1586ece4cccdSGraeme Gregory amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1; 1587ece4cccdSGraeme Gregory amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2; 1588ece4cccdSGraeme Gregory amc->fmc_model = "n25q512a"; 1589ece4cccdSGraeme Gregory amc->spi_model = "n25q512a"; 1590ece4cccdSGraeme Gregory amc->num_cs = 2; 1591ece4cccdSGraeme Gregory amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON; 1592ece4cccdSGraeme Gregory amc->i2c_init = qcom_dc_scm_firework_i2c_init; 1593ece4cccdSGraeme Gregory mc->default_ram_size = 1 * GiB; 1594ece4cccdSGraeme Gregory mc->default_cpus = mc->min_cpus = mc->max_cpus = 1595ece4cccdSGraeme Gregory aspeed_soc_num_cpus(amc->soc_name); 1596ece4cccdSGraeme Gregory }; 1597ece4cccdSGraeme Gregory 1598baa4732bSCédric Le Goater static const TypeInfo aspeed_machine_types[] = { 1599baa4732bSCédric Le Goater { 1600baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("palmetto-bmc"), 1601baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1602baa4732bSCédric Le Goater .class_init = aspeed_machine_palmetto_class_init, 1603baa4732bSCédric Le Goater }, { 160440a38df5SErik Smit .name = MACHINE_TYPE_NAME("supermicrox11-bmc"), 160540a38df5SErik Smit .parent = TYPE_ASPEED_MACHINE, 160640a38df5SErik Smit .class_init = aspeed_machine_supermicrox11_bmc_class_init, 160740a38df5SErik Smit }, { 160847936597SGuenter Roeck .name = MACHINE_TYPE_NAME("supermicro-x11spi-bmc"), 160947936597SGuenter Roeck .parent = TYPE_ASPEED_MACHINE, 161047936597SGuenter Roeck .class_init = aspeed_machine_supermicro_x11spi_bmc_class_init, 161147936597SGuenter Roeck }, { 1612baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("ast2500-evb"), 1613baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1614baa4732bSCédric Le Goater .class_init = aspeed_machine_ast2500_evb_class_init, 1615baa4732bSCédric Le Goater }, { 1616baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("romulus-bmc"), 1617baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1618baa4732bSCédric Le Goater .class_init = aspeed_machine_romulus_class_init, 1619baa4732bSCédric Le Goater }, { 1620143b040fSPatrick Williams .name = MACHINE_TYPE_NAME("sonorapass-bmc"), 1621143b040fSPatrick Williams .parent = TYPE_ASPEED_MACHINE, 1622143b040fSPatrick Williams .class_init = aspeed_machine_sonorapass_class_init, 1623143b040fSPatrick Williams }, { 1624baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("witherspoon-bmc"), 1625baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1626baa4732bSCédric Le Goater .class_init = aspeed_machine_witherspoon_class_init, 1627baa4732bSCédric Le Goater }, { 1628baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("ast2600-evb"), 1629baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1630baa4732bSCédric Le Goater .class_init = aspeed_machine_ast2600_evb_class_init, 1631baa4732bSCédric Le Goater }, { 163234f73a81SKarthikeyan Pasupathi .name = MACHINE_TYPE_NAME("yosemitev2-bmc"), 163334f73a81SKarthikeyan Pasupathi .parent = TYPE_ASPEED_MACHINE, 163434f73a81SKarthikeyan Pasupathi .class_init = aspeed_machine_yosemitev2_class_init, 163534f73a81SKarthikeyan Pasupathi }, { 163663ceb818SCédric Le Goater .name = MACHINE_TYPE_NAME("tacoma-bmc"), 163763ceb818SCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 163863ceb818SCédric Le Goater .class_init = aspeed_machine_tacoma_class_init, 163963ceb818SCédric Le Goater }, { 16406c323abaSKarthikeyan Pasupathi .name = MACHINE_TYPE_NAME("tiogapass-bmc"), 16416c323abaSKarthikeyan Pasupathi .parent = TYPE_ASPEED_MACHINE, 16426c323abaSKarthikeyan Pasupathi .class_init = aspeed_machine_tiogapass_class_init, 16436c323abaSKarthikeyan Pasupathi }, { 164495f068c8SJohn Wang .name = MACHINE_TYPE_NAME("g220a-bmc"), 164595f068c8SJohn Wang .parent = TYPE_ASPEED_MACHINE, 164695f068c8SJohn Wang .class_init = aspeed_machine_g220a_class_init, 164795f068c8SJohn Wang }, { 1648fb6b3c8dSJae Hyun Yoo .name = MACHINE_TYPE_NAME("qcom-dc-scm-v1-bmc"), 1649fb6b3c8dSJae Hyun Yoo .parent = TYPE_ASPEED_MACHINE, 1650fb6b3c8dSJae Hyun Yoo .class_init = aspeed_machine_qcom_dc_scm_v1_class_init, 1651fb6b3c8dSJae Hyun Yoo }, { 1652ece4cccdSGraeme Gregory .name = MACHINE_TYPE_NAME("qcom-firework-bmc"), 1653ece4cccdSGraeme Gregory .parent = TYPE_ASPEED_MACHINE, 1654ece4cccdSGraeme Gregory .class_init = aspeed_machine_qcom_firework_class_init, 1655ece4cccdSGraeme Gregory }, { 165682b6a3f6SJohn Wang .name = MACHINE_TYPE_NAME("fp5280g2-bmc"), 165782b6a3f6SJohn Wang .parent = TYPE_ASPEED_MACHINE, 165882b6a3f6SJohn Wang .class_init = aspeed_machine_fp5280g2_class_init, 165982b6a3f6SJohn Wang }, { 16609cccb912SPatrick Venture .name = MACHINE_TYPE_NAME("quanta-q71l-bmc"), 16619cccb912SPatrick Venture .parent = TYPE_ASPEED_MACHINE, 16629cccb912SPatrick Venture .class_init = aspeed_machine_quanta_q71l_class_init, 16639cccb912SPatrick Venture }, { 166458e52bdbSCédric Le Goater .name = MACHINE_TYPE_NAME("rainier-bmc"), 166558e52bdbSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 166658e52bdbSCédric Le Goater .class_init = aspeed_machine_rainier_class_init, 166758e52bdbSCédric Le Goater }, { 1668febbe308SPeter Delevoryas .name = MACHINE_TYPE_NAME("fuji-bmc"), 1669febbe308SPeter Delevoryas .parent = TYPE_ASPEED_MACHINE, 1670febbe308SPeter Delevoryas .class_init = aspeed_machine_fuji_class_init, 1671febbe308SPeter Delevoryas }, { 1672a20c54b1SPatrick Williams .name = MACHINE_TYPE_NAME("bletchley-bmc"), 1673a20c54b1SPatrick Williams .parent = TYPE_ASPEED_MACHINE, 1674a20c54b1SPatrick Williams .class_init = aspeed_machine_bletchley_class_init, 1675a20c54b1SPatrick Williams }, { 1676fa699e80SPeter Delevoryas .name = MACHINE_TYPE_NAME("fby35-bmc"), 1677fa699e80SPeter Delevoryas .parent = MACHINE_TYPE_NAME("ast2600-evb"), 1678fa699e80SPeter Delevoryas .class_init = aspeed_machine_fby35_class_init, 1679fa699e80SPeter Delevoryas }, { 168066c895b8SJamin Lin .name = MACHINE_TYPE_NAME("ast1030-evb"), 168166c895b8SJamin Lin .parent = TYPE_ASPEED_MACHINE, 168266c895b8SJamin Lin .class_init = aspeed_minibmc_machine_ast1030_evb_class_init, 168366c895b8SJamin Lin }, { 1684fca9ca1bSCédric Le Goater .name = TYPE_ASPEED_MACHINE, 168562c2c2ebSCédric Le Goater .parent = TYPE_MACHINE, 1686888b2b03SPhilippe Mathieu-Daudé .instance_size = sizeof(AspeedMachineState), 16871a15311aSCédric Le Goater .instance_init = aspeed_machine_instance_init, 1688fca9ca1bSCédric Le Goater .class_size = sizeof(AspeedMachineClass), 1689fca9ca1bSCédric Le Goater .class_init = aspeed_machine_class_init, 1690baa4732bSCédric Le Goater .abstract = true, 1691baa4732bSCédric Le Goater } 1692fca9ca1bSCédric Le Goater }; 169374fb1f38SCédric Le Goater 1694baa4732bSCédric Le Goater DEFINE_TYPES(aspeed_machine_types) 1695