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; 43262259eaSCédric Le Goater MemoryRegion boot_rom; 44888b2b03SPhilippe Mathieu-Daudé bool mmio_exec; 45*f65f6ad5SCédric Le Goater uint32_t uart_chosen; 469820e52fSCédric Le Goater char *fmc_model; 479820e52fSCédric Le Goater char *spi_model; 48ea066d39SThomas Huth }; 49327d8e4eSAndrew Jeffery 50ef17f836SCédric Le Goater /* Palmetto hardware value: 0x120CE416 */ 518da33ef7SCédric Le Goater #define PALMETTO_BMC_HW_STRAP1 ( \ 528da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_256MB) | \ 538da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_DRAM_CONFIG(2 /* DDR3 with CL=6, CWL=5 */) | \ 548da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_ACPI_DIS | \ 558da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) | \ 568da33ef7SCédric Le Goater SCU_HW_STRAP_VGA_CLASS_CODE | \ 578da33ef7SCédric Le Goater SCU_HW_STRAP_LPC_RESET_PIN | \ 588da33ef7SCédric Le Goater SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) | \ 598da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \ 608da33ef7SCédric Le Goater SCU_HW_STRAP_SPI_WIDTH | \ 618da33ef7SCédric Le Goater SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \ 628da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT)) 638da33ef7SCédric Le Goater 6440a38df5SErik Smit /* TODO: Find the actual hardware value */ 6540a38df5SErik Smit #define SUPERMICROX11_BMC_HW_STRAP1 ( \ 6640a38df5SErik Smit SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) | \ 6740a38df5SErik Smit SCU_AST2400_HW_STRAP_DRAM_CONFIG(2) | \ 6840a38df5SErik Smit SCU_AST2400_HW_STRAP_ACPI_DIS | \ 6940a38df5SErik Smit SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) | \ 7040a38df5SErik Smit SCU_HW_STRAP_VGA_CLASS_CODE | \ 7140a38df5SErik Smit SCU_HW_STRAP_LPC_RESET_PIN | \ 7240a38df5SErik Smit SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) | \ 7340a38df5SErik Smit SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \ 7440a38df5SErik Smit SCU_HW_STRAP_SPI_WIDTH | \ 7540a38df5SErik Smit SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \ 7640a38df5SErik Smit SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT)) 7740a38df5SErik Smit 7847936597SGuenter Roeck /* TODO: Find the actual hardware value */ 7947936597SGuenter Roeck #define SUPERMICRO_X11SPI_BMC_HW_STRAP1 ( \ 8047936597SGuenter Roeck AST2500_HW_STRAP1_DEFAULTS | \ 8147936597SGuenter Roeck SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 8247936597SGuenter Roeck SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 8347936597SGuenter Roeck SCU_AST2500_HW_STRAP_UART_DEBUG | \ 8447936597SGuenter Roeck SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 8547936597SGuenter Roeck SCU_HW_STRAP_SPI_WIDTH | \ 8647936597SGuenter Roeck SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN)) 8747936597SGuenter Roeck 88ef17f836SCédric Le Goater /* AST2500 evb hardware value: 0xF100C2E6 */ 899a7c1750SCédric Le Goater #define AST2500_EVB_HW_STRAP1 (( \ 909a7c1750SCédric Le Goater AST2500_HW_STRAP1_DEFAULTS | \ 919a7c1750SCédric Le Goater SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 929a7c1750SCédric Le Goater SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 939a7c1750SCédric Le Goater SCU_AST2500_HW_STRAP_UART_DEBUG | \ 949a7c1750SCédric Le Goater SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 959a7c1750SCédric Le Goater SCU_HW_STRAP_MAC1_RGMII | \ 969a7c1750SCédric Le Goater SCU_HW_STRAP_MAC0_RGMII) & \ 979a7c1750SCédric Le Goater ~SCU_HW_STRAP_2ND_BOOT_WDT) 989a7c1750SCédric Le Goater 99ef17f836SCédric Le Goater /* Romulus hardware value: 0xF10AD206 */ 100ef17f836SCédric Le Goater #define ROMULUS_BMC_HW_STRAP1 ( \ 101ef17f836SCédric Le Goater AST2500_HW_STRAP1_DEFAULTS | \ 102ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 103ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 104ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_UART_DEBUG | \ 105ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 106ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_ACPI_ENABLE | \ 107ef17f836SCédric Le Goater SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER)) 108ef17f836SCédric Le Goater 109143b040fSPatrick Williams /* Sonorapass hardware value: 0xF100D216 */ 110143b040fSPatrick Williams #define SONORAPASS_BMC_HW_STRAP1 ( \ 111143b040fSPatrick Williams SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 112143b040fSPatrick Williams SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 113143b040fSPatrick Williams SCU_AST2500_HW_STRAP_UART_DEBUG | \ 114143b040fSPatrick Williams SCU_AST2500_HW_STRAP_RESERVED28 | \ 115143b040fSPatrick Williams SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 116143b040fSPatrick Williams SCU_HW_STRAP_VGA_CLASS_CODE | \ 117143b040fSPatrick Williams SCU_HW_STRAP_LPC_RESET_PIN | \ 118143b040fSPatrick Williams SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \ 119143b040fSPatrick Williams SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \ 120143b040fSPatrick Williams SCU_HW_STRAP_VGA_BIOS_ROM | \ 121143b040fSPatrick Williams SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \ 122143b040fSPatrick Williams SCU_AST2500_HW_STRAP_RESERVED1) 123143b040fSPatrick Williams 12495f068c8SJohn Wang #define G220A_BMC_HW_STRAP1 ( \ 12595f068c8SJohn Wang SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 12695f068c8SJohn Wang SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 12795f068c8SJohn Wang SCU_AST2500_HW_STRAP_UART_DEBUG | \ 12895f068c8SJohn Wang SCU_AST2500_HW_STRAP_RESERVED28 | \ 12995f068c8SJohn Wang SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 13095f068c8SJohn Wang SCU_HW_STRAP_2ND_BOOT_WDT | \ 13195f068c8SJohn Wang SCU_HW_STRAP_VGA_CLASS_CODE | \ 13295f068c8SJohn Wang SCU_HW_STRAP_LPC_RESET_PIN | \ 13395f068c8SJohn Wang SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \ 13495f068c8SJohn Wang SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \ 13595f068c8SJohn Wang SCU_HW_STRAP_VGA_SIZE_SET(VGA_64M_DRAM) | \ 13695f068c8SJohn Wang SCU_AST2500_HW_STRAP_RESERVED1) 13795f068c8SJohn Wang 13882b6a3f6SJohn Wang /* FP5280G2 hardware value: 0XF100D286 */ 13982b6a3f6SJohn Wang #define FP5280G2_BMC_HW_STRAP1 ( \ 14082b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 14182b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 14282b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_UART_DEBUG | \ 14382b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_RESERVED28 | \ 14482b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 14582b6a3f6SJohn Wang SCU_HW_STRAP_VGA_CLASS_CODE | \ 14682b6a3f6SJohn Wang SCU_HW_STRAP_LPC_RESET_PIN | \ 14782b6a3f6SJohn Wang SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \ 14882b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \ 14982b6a3f6SJohn Wang SCU_HW_STRAP_MAC1_RGMII | \ 15082b6a3f6SJohn Wang SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \ 15182b6a3f6SJohn Wang SCU_AST2500_HW_STRAP_RESERVED1) 15282b6a3f6SJohn Wang 15362c2c2ebSCédric Le Goater /* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */ 15462c2c2ebSCédric Le Goater #define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1 15562c2c2ebSCédric Le Goater 1569cccb912SPatrick Venture /* Quanta-Q71l hardware value */ 1579cccb912SPatrick Venture #define QUANTA_Q71L_BMC_HW_STRAP1 ( \ 1589cccb912SPatrick Venture SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) | \ 1599cccb912SPatrick Venture SCU_AST2400_HW_STRAP_DRAM_CONFIG(2/* DDR3 with CL=6, CWL=5 */) | \ 1609cccb912SPatrick Venture SCU_AST2400_HW_STRAP_ACPI_DIS | \ 1619cccb912SPatrick Venture SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_24M_IN) | \ 1629cccb912SPatrick Venture SCU_HW_STRAP_VGA_CLASS_CODE | \ 1639cccb912SPatrick Venture SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_PASS_THROUGH) | \ 1649cccb912SPatrick Venture SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \ 1659cccb912SPatrick Venture SCU_HW_STRAP_SPI_WIDTH | \ 1669cccb912SPatrick Venture SCU_HW_STRAP_VGA_SIZE_SET(VGA_8M_DRAM) | \ 1679cccb912SPatrick Venture SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT)) 1689cccb912SPatrick Venture 169ccc2c418SCédric Le Goater /* AST2600 evb hardware value */ 170ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP1 0x000000C0 171ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP2 0x00000003 172ccc2c418SCédric Le Goater 17363ceb818SCédric Le Goater /* Tacoma hardware value */ 17463ceb818SCédric Le Goater #define TACOMA_BMC_HW_STRAP1 0x00000000 1757582591aSJoel Stanley #define TACOMA_BMC_HW_STRAP2 0x00000040 17663ceb818SCédric Le Goater 17758e52bdbSCédric Le Goater /* Rainier hardware value: (QEMU prototype) */ 178b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP1 0x00422016 179b6d1df64SJoel Stanley #define RAINIER_BMC_HW_STRAP2 0x80000848 18058e52bdbSCédric Le Goater 181febbe308SPeter Delevoryas /* Fuji hardware value */ 182febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP1 0x00000000 183febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP2 0x00000000 184febbe308SPeter Delevoryas 185a20c54b1SPatrick Williams /* Bletchley hardware value */ 186a20c54b1SPatrick Williams /* TODO: Leave same as EVB for now. */ 187a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP1 AST2600_EVB_HW_STRAP1 188a20c54b1SPatrick Williams #define BLETCHLEY_BMC_HW_STRAP2 AST2600_EVB_HW_STRAP2 189a20c54b1SPatrick Williams 190fb6b3c8dSJae Hyun Yoo /* Qualcomm DC-SCM hardware value */ 191fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP1 0x00000000 192fb6b3c8dSJae Hyun Yoo #define QCOM_DC_SCM_V1_BMC_HW_STRAP2 0x00000041 193fb6b3c8dSJae Hyun Yoo 1949bb6d140SJoel Stanley #define AST_SMP_MAILBOX_BASE 0x1e6e2180 1959bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_ENTRY (AST_SMP_MAILBOX_BASE + 0x0) 1969bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_GOSIGN (AST_SMP_MAILBOX_BASE + 0x4) 1979bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_READY (AST_SMP_MAILBOX_BASE + 0x8) 1989bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_POLLINSN (AST_SMP_MAILBOX_BASE + 0xc) 1999bb6d140SJoel Stanley #define AST_SMP_MBOX_CODE (AST_SMP_MAILBOX_BASE + 0x10) 2009bb6d140SJoel Stanley #define AST_SMP_MBOX_GOSIGN 0xabbaab00 2019bb6d140SJoel Stanley 2029bb6d140SJoel Stanley static void aspeed_write_smpboot(ARMCPU *cpu, 2039bb6d140SJoel Stanley const struct arm_boot_info *info) 2049bb6d140SJoel Stanley { 205902bba54SCédric Le Goater AddressSpace *as = arm_boot_address_space(cpu, info); 206902bba54SCédric Le Goater static const ARMInsnFixup poll_mailbox_ready[] = { 2079bb6d140SJoel Stanley /* 2089bb6d140SJoel Stanley * r2 = per-cpu go sign value 2099bb6d140SJoel Stanley * r1 = AST_SMP_MBOX_FIELD_ENTRY 2109bb6d140SJoel Stanley * r0 = AST_SMP_MBOX_FIELD_GOSIGN 2119bb6d140SJoel Stanley */ 212902bba54SCédric Le Goater { 0xee100fb0 }, /* mrc p15, 0, r0, c0, c0, 5 */ 213902bba54SCédric Le Goater { 0xe21000ff }, /* ands r0, r0, #255 */ 214902bba54SCédric Le Goater { 0xe59f201c }, /* ldr r2, [pc, #28] */ 215902bba54SCédric Le Goater { 0xe1822000 }, /* orr r2, r2, r0 */ 2169bb6d140SJoel Stanley 217902bba54SCédric Le Goater { 0xe59f1018 }, /* ldr r1, [pc, #24] */ 218902bba54SCédric Le Goater { 0xe59f0018 }, /* ldr r0, [pc, #24] */ 2199bb6d140SJoel Stanley 220902bba54SCédric Le Goater { 0xe320f002 }, /* wfe */ 221902bba54SCédric Le Goater { 0xe5904000 }, /* ldr r4, [r0] */ 222902bba54SCédric Le Goater { 0xe1520004 }, /* cmp r2, r4 */ 223902bba54SCédric Le Goater { 0x1afffffb }, /* bne <wfe> */ 224902bba54SCédric Le Goater { 0xe591f000 }, /* ldr pc, [r1] */ 225902bba54SCédric Le Goater { AST_SMP_MBOX_GOSIGN }, 226902bba54SCédric Le Goater { AST_SMP_MBOX_FIELD_ENTRY }, 227902bba54SCédric Le Goater { AST_SMP_MBOX_FIELD_GOSIGN }, 228902bba54SCédric Le Goater { 0, FIXUP_TERMINATOR } 2299bb6d140SJoel Stanley }; 230902bba54SCédric Le Goater static const uint32_t fixupcontext[FIXUP_MAX] = { 0 }; 2319bb6d140SJoel Stanley 232902bba54SCédric Le Goater arm_write_bootloader("aspeed.smpboot", as, info->smp_loader_start, 233902bba54SCédric Le Goater poll_mailbox_ready, fixupcontext); 2349bb6d140SJoel Stanley } 2359bb6d140SJoel Stanley 2369bb6d140SJoel Stanley static void aspeed_reset_secondary(ARMCPU *cpu, 2379bb6d140SJoel Stanley const struct arm_boot_info *info) 2389bb6d140SJoel Stanley { 2399bb6d140SJoel Stanley AddressSpace *as = arm_boot_address_space(cpu, info); 2409bb6d140SJoel Stanley CPUState *cs = CPU(cpu); 2419bb6d140SJoel Stanley 2429bb6d140SJoel Stanley /* info->smp_bootreg_addr */ 2439bb6d140SJoel Stanley address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0, 2449bb6d140SJoel Stanley MEMTXATTRS_UNSPECIFIED, NULL); 2459bb6d140SJoel Stanley cpu_set_pc(cs, info->smp_loader_start); 2469bb6d140SJoel Stanley } 2479bb6d140SJoel Stanley 2488b744a6aSCédric Le Goater static void write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size, 249d769a1daSCédric Le Goater Error **errp) 250d769a1daSCédric Le Goater { 25105e6e40aSWentao_Liang g_autofree void *storage = NULL; 2520c7209beSCédric Le Goater int64_t size; 253d769a1daSCédric Le Goater 2540c7209beSCédric Le Goater /* The block backend size should have already been 'validated' by 2550c7209beSCédric Le Goater * the creation of the m25p80 object. 2560c7209beSCédric Le Goater */ 2570c7209beSCédric Le Goater size = blk_getlength(blk); 2580c7209beSCédric Le Goater if (size <= 0) { 2590c7209beSCédric Le Goater error_setg(errp, "failed to get flash size"); 2600c7209beSCédric Le Goater return; 2610c7209beSCédric Le Goater } 2620c7209beSCédric Le Goater 2630c7209beSCédric Le Goater if (rom_size > size) { 2640c7209beSCédric Le Goater rom_size = size; 265d769a1daSCédric Le Goater } 266d769a1daSCédric Le Goater 26705e6e40aSWentao_Liang storage = g_malloc0(rom_size); 268a9262f55SAlberto Faria if (blk_pread(blk, 0, rom_size, storage, 0) < 0) { 269d769a1daSCédric Le Goater error_setg(errp, "failed to read the initial flash content"); 270d769a1daSCédric Le Goater return; 271d769a1daSCédric Le Goater } 272d769a1daSCédric Le Goater 273d769a1daSCédric Le Goater rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr); 274d769a1daSCédric Le Goater } 275d769a1daSCédric Le Goater 2768b744a6aSCédric Le Goater /* 2778b744a6aSCédric Le Goater * Create a ROM and copy the flash contents at the expected address 2788b744a6aSCédric Le Goater * (0x0). Boots faster than execute-in-place. 2798b744a6aSCédric Le Goater */ 280262259eaSCédric Le Goater static void aspeed_install_boot_rom(AspeedMachineState *bmc, BlockBackend *blk, 2818b744a6aSCédric Le Goater uint64_t rom_size) 2828b744a6aSCédric Le Goater { 283262259eaSCédric Le Goater AspeedSoCState *soc = &bmc->soc; 2848b744a6aSCédric Le Goater 285262259eaSCédric Le Goater memory_region_init_rom(&bmc->boot_rom, NULL, "aspeed.boot_rom", rom_size, 2868b744a6aSCédric Le Goater &error_abort); 2878b744a6aSCédric Le Goater memory_region_add_subregion_overlap(&soc->spi_boot_container, 0, 288262259eaSCédric Le Goater &bmc->boot_rom, 1); 2898b744a6aSCédric Le Goater write_boot_rom(blk, ASPEED_SOC_SPI_BOOT_ADDR, rom_size, &error_abort); 2908b744a6aSCédric Le Goater } 2918b744a6aSCédric Le Goater 2921099ad10SPeter Delevoryas void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype, 2939bd4ac61SCédric Le Goater unsigned int count, int unit0) 294e1ad9bc4SCédric Le Goater { 295e1ad9bc4SCédric Le Goater int i; 296179b2058SPatrick Williams 297179b2058SPatrick Williams if (!flashtype) { 298179b2058SPatrick Williams return; 299179b2058SPatrick Williams } 300e1ad9bc4SCédric Le Goater 3019bd4ac61SCédric Le Goater for (i = 0; i < count; ++i) { 3028ec239f2SMarkus Armbruster DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i); 303e1ad9bc4SCédric Le Goater qemu_irq cs_line; 304a7d78befSCédric Le Goater DeviceState *dev; 305e1ad9bc4SCédric Le Goater 306a7d78befSCédric Le Goater dev = qdev_new(flashtype); 307e1ad9bc4SCédric Le Goater if (dinfo) { 308a7d78befSCédric Le Goater qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo)); 309e1ad9bc4SCédric Le Goater } 310a7d78befSCédric Le Goater qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal); 311e1ad9bc4SCédric Le Goater 312a7d78befSCédric Le Goater cs_line = qdev_get_gpio_in_named(dev, SSI_GPIO_CS, 0); 313b22a2d40SCédric Le Goater qdev_connect_gpio_out_named(DEVICE(s), "cs", i, cs_line); 314e1ad9bc4SCédric Le Goater } 315e1ad9bc4SCédric Le Goater } 316e1ad9bc4SCédric Le Goater 317a29e3e12SAndrew Jeffery static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo) 318a29e3e12SAndrew Jeffery { 319a29e3e12SAndrew Jeffery DeviceState *card; 320a29e3e12SAndrew Jeffery 321756f739bSPhilippe Mathieu-Daudé if (!dinfo) { 322756f739bSPhilippe Mathieu-Daudé return; 323756f739bSPhilippe Mathieu-Daudé } 3243e80f690SMarkus Armbruster card = qdev_new(TYPE_SD_CARD); 325934df912SMarkus Armbruster qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo), 326a29e3e12SAndrew Jeffery &error_fatal); 3273e80f690SMarkus Armbruster qdev_realize_and_unref(card, 3283e80f690SMarkus Armbruster qdev_get_child_bus(DEVICE(sdhci), "sd-bus"), 3293e80f690SMarkus Armbruster &error_fatal); 330a29e3e12SAndrew Jeffery } 331a29e3e12SAndrew Jeffery 332d2b3eaefSPeter Delevoryas static void connect_serial_hds_to_uarts(AspeedMachineState *bmc) 333d2b3eaefSPeter Delevoryas { 334d2b3eaefSPeter Delevoryas AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc); 335d2b3eaefSPeter Delevoryas AspeedSoCState *s = &bmc->soc; 336d2b3eaefSPeter Delevoryas AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s); 337*f65f6ad5SCédric Le Goater int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default; 338d2b3eaefSPeter Delevoryas 339*f65f6ad5SCédric Le Goater aspeed_soc_uart_set_chr(s, uart_chosen, serial_hd(0)); 340d2b3eaefSPeter Delevoryas for (int i = 1, uart = ASPEED_DEV_UART1; i < sc->uarts_num; i++, uart++) { 341*f65f6ad5SCédric Le Goater if (uart == uart_chosen) { 342d2b3eaefSPeter Delevoryas continue; 343d2b3eaefSPeter Delevoryas } 344d2b3eaefSPeter Delevoryas aspeed_soc_uart_set_chr(s, uart, serial_hd(i)); 345d2b3eaefSPeter Delevoryas } 346d2b3eaefSPeter Delevoryas } 347d2b3eaefSPeter Delevoryas 348baa4732bSCédric Le Goater static void aspeed_machine_init(MachineState *machine) 349327d8e4eSAndrew Jeffery { 350888b2b03SPhilippe Mathieu-Daudé AspeedMachineState *bmc = ASPEED_MACHINE(machine); 351baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine); 352b033271fSCédric Le Goater AspeedSoCClass *sc; 3532bea128cSEddie James int i; 354d3bad7e7SCédric Le Goater NICInfo *nd = &nd_table[0]; 355327d8e4eSAndrew Jeffery 3569fc7fc4dSMarkus Armbruster object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name); 357327d8e4eSAndrew Jeffery 358b033271fSCédric Le Goater sc = ASPEED_SOC_GET_CLASS(&bmc->soc); 359b033271fSCédric Le Goater 360533eb415SIgor Mammedov /* 361346160cbSCédric Le Goater * This will error out if the RAM size is not supported by the 362346160cbSCédric Le Goater * memory controller of the SoC. 363533eb415SIgor Mammedov */ 3646e504a98SPaolo Bonzini object_property_set_uint(OBJECT(&bmc->soc), "ram-size", machine->ram_size, 365533eb415SIgor Mammedov &error_fatal); 366533eb415SIgor Mammedov 367d3bad7e7SCédric Le Goater for (i = 0; i < sc->macs_num; i++) { 368d3bad7e7SCédric Le Goater if ((amc->macs_mask & (1 << i)) && nd->used) { 369d3bad7e7SCédric Le Goater qemu_check_nic_model(nd, TYPE_FTGMAC100); 370d3bad7e7SCédric Le Goater qdev_set_nic_properties(DEVICE(&bmc->soc.ftgmac100[i]), nd); 371d3bad7e7SCédric Le Goater nd++; 372d3bad7e7SCédric Le Goater } 373d3bad7e7SCédric Le Goater } 374d3bad7e7SCédric Le Goater 3755325cc34SMarkus Armbruster object_property_set_int(OBJECT(&bmc->soc), "hw-strap1", amc->hw_strap1, 37687e79af0SAndrew Jeffery &error_abort); 3775325cc34SMarkus Armbruster object_property_set_int(OBJECT(&bmc->soc), "hw-strap2", amc->hw_strap2, 378ccc2c418SCédric Le Goater &error_abort); 3794dd9d554SPeter Delevoryas object_property_set_link(OBJECT(&bmc->soc), "memory", 3804dd9d554SPeter Delevoryas OBJECT(get_system_memory()), &error_abort); 3815325cc34SMarkus Armbruster object_property_set_link(OBJECT(&bmc->soc), "dram", 3820df2d9a6SCédric Le Goater OBJECT(machine->ram), &error_abort); 383b6e70d1dSJoel Stanley if (machine->kernel_filename) { 384b6e70d1dSJoel Stanley /* 385b6e70d1dSJoel Stanley * When booting with a -kernel command line there is no u-boot 386b6e70d1dSJoel Stanley * that runs to unlock the SCU. In this case set the default to 387b6e70d1dSJoel Stanley * be unlocked as the kernel expects 388b6e70d1dSJoel Stanley */ 3895325cc34SMarkus Armbruster object_property_set_int(OBJECT(&bmc->soc), "hw-prot-key", 3905325cc34SMarkus Armbruster ASPEED_SCU_PROT_KEY, &error_abort); 391b6e70d1dSJoel Stanley } 392d2b3eaefSPeter Delevoryas connect_serial_hds_to_uarts(bmc); 393ce189ab2SMarkus Armbruster qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort); 394327d8e4eSAndrew Jeffery 3958ec239f2SMarkus Armbruster aspeed_board_init_flashes(&bmc->soc.fmc, 3968ec239f2SMarkus Armbruster bmc->fmc_model ? bmc->fmc_model : amc->fmc_model, 3979bd4ac61SCédric Le Goater amc->num_cs, 0); 3988ec239f2SMarkus Armbruster aspeed_board_init_flashes(&bmc->soc.spi[0], 3998ec239f2SMarkus Armbruster bmc->spi_model ? bmc->spi_model : amc->spi_model, 4009bd4ac61SCédric Le Goater 1, amc->num_cs); 401e1ad9bc4SCédric Le Goater 402b7f1a0cbSCédric Le Goater if (machine->kernel_filename && sc->num_cpus > 1) { 4039bb6d140SJoel Stanley /* With no u-boot we must set up a boot stub for the secondary CPU */ 4049bb6d140SJoel Stanley MemoryRegion *smpboot = g_new(MemoryRegion, 1); 405f489960dSPhilippe Mathieu-Daudé memory_region_init_ram(smpboot, NULL, "aspeed.smpboot", 4069bb6d140SJoel Stanley 0x80, &error_abort); 4079bb6d140SJoel Stanley memory_region_add_subregion(get_system_memory(), 4089bb6d140SJoel Stanley AST_SMP_MAILBOX_BASE, smpboot); 4099bb6d140SJoel Stanley 4109bb6d140SJoel Stanley aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot; 4119bb6d140SJoel Stanley aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary; 4129bb6d140SJoel Stanley aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE; 4139bb6d140SJoel Stanley } 4149bb6d140SJoel Stanley 4156e504a98SPaolo Bonzini aspeed_board_binfo.ram_size = machine->ram_size; 416347df6f8SEduardo Habkost aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM]; 417b033271fSCédric Le Goater 418baa4732bSCédric Le Goater if (amc->i2c_init) { 419baa4732bSCédric Le Goater amc->i2c_init(bmc); 4202cf6cb50SCédric Le Goater } 4212cf6cb50SCédric Le Goater 4220e2c24c6SAndrew Jeffery for (i = 0; i < bmc->soc.sdhci.num_slots; i++) { 4238ec239f2SMarkus Armbruster sdhci_attach_drive(&bmc->soc.sdhci.slots[i], 4248ec239f2SMarkus Armbruster drive_get(IF_SD, 0, i)); 425a29e3e12SAndrew Jeffery } 4262bea128cSEddie James 427a29e3e12SAndrew Jeffery if (bmc->soc.emmc.num_slots) { 4288ec239f2SMarkus Armbruster sdhci_attach_drive(&bmc->soc.emmc.slots[0], 4298ec239f2SMarkus Armbruster drive_get(IF_SD, 0, bmc->soc.sdhci.num_slots)); 4302bea128cSEddie James } 4312bea128cSEddie James 4328b744a6aSCédric Le Goater if (!bmc->mmio_exec) { 4338b744a6aSCédric Le Goater DriveInfo *mtd0 = drive_get(IF_MTD, 0, 0); 4348b744a6aSCédric Le Goater 4358b744a6aSCédric Le Goater if (mtd0) { 4368b744a6aSCédric Le Goater uint64_t rom_size = memory_region_size(&bmc->soc.spi_boot); 437262259eaSCédric Le Goater aspeed_install_boot_rom(bmc, blk_by_legacy_dinfo(mtd0), rom_size); 4388b744a6aSCédric Le Goater } 4398b744a6aSCédric Le Goater } 4408b744a6aSCédric Le Goater 4412744ece8STao Xu arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo); 442327d8e4eSAndrew Jeffery } 443327d8e4eSAndrew Jeffery 444612b219aSPhilippe Mathieu-Daudé static void palmetto_bmc_i2c_init(AspeedMachineState *bmc) 4452cf6cb50SCédric Le Goater { 4462cf6cb50SCédric Le Goater AspeedSoCState *soc = &bmc->soc; 447a87e81b9SCédric Le Goater DeviceState *dev; 4483d165f12SCédric Le Goater uint8_t *eeprom_buf = g_malloc0(32 * 1024); 4492cf6cb50SCédric Le Goater 4502cf6cb50SCédric Le Goater /* The palmetto platform expects a ds3231 RTC but a ds1338 is 4512cf6cb50SCédric Le Goater * enough to provide basic RTC features. Alarms will be missing */ 4521373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68); 453a87e81b9SCédric Le Goater 4547a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, 4553d165f12SCédric Le Goater eeprom_buf); 4563d165f12SCédric Le Goater 457a87e81b9SCédric Le Goater /* add a TMP423 temperature sensor */ 4581373b15bSPhilippe Mathieu-Daudé dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), 4591373b15bSPhilippe Mathieu-Daudé "tmp423", 0x4c)); 4605325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 4615325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 4625325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 4635325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort); 4642cf6cb50SCédric Le Goater } 4652cf6cb50SCédric Le Goater 4669cccb912SPatrick Venture static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc) 4679cccb912SPatrick Venture { 4689cccb912SPatrick Venture AspeedSoCState *soc = &bmc->soc; 4699cccb912SPatrick Venture 4709cccb912SPatrick Venture /* 4719cccb912SPatrick Venture * The quanta-q71l platform expects tmp75s which are compatible with 4729cccb912SPatrick Venture * tmp105s. 4739cccb912SPatrick Venture */ 4749cccb912SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c); 4759cccb912SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e); 4769cccb912SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f); 4779cccb912SPatrick Venture 4789cccb912SPatrick Venture /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */ 4799cccb912SPatrick Venture /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */ 4809cccb912SPatrick Venture /* TODO: Add Memory Riser i2c mux and eeproms. */ 4819cccb912SPatrick Venture 4823ec75e39SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74); 4833ec75e39SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77); 4843ec75e39SPatrick Venture 4859cccb912SPatrick Venture /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */ 4863ec75e39SPatrick Venture 4873ec75e39SPatrick Venture /* i2c-7 */ 4883ec75e39SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70); 4899cccb912SPatrick Venture /* - i2c@0: pmbus@59 */ 4909cccb912SPatrick Venture /* - i2c@1: pmbus@58 */ 4919cccb912SPatrick Venture /* - i2c@2: pmbus@58 */ 4929cccb912SPatrick Venture /* - i2c@3: pmbus@59 */ 4933ec75e39SPatrick Venture 4949cccb912SPatrick Venture /* TODO: i2c-7: Add PDB FRU eeprom@52 */ 4959cccb912SPatrick Venture /* TODO: i2c-8: Add BMC FRU eeprom@50 */ 4969cccb912SPatrick Venture } 4979cccb912SPatrick Venture 498612b219aSPhilippe Mathieu-Daudé static void ast2500_evb_i2c_init(AspeedMachineState *bmc) 4992cf6cb50SCédric Le Goater { 5002cf6cb50SCédric Le Goater AspeedSoCState *soc = &bmc->soc; 5013d165f12SCédric Le Goater uint8_t *eeprom_buf = g_malloc0(8 * 1024); 5023d165f12SCédric Le Goater 5037a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50, 5043d165f12SCédric Le Goater eeprom_buf); 5052cf6cb50SCédric Le Goater 5062cf6cb50SCédric Le Goater /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */ 5071373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), 508044475f3SPhilippe Mathieu-Daudé TYPE_TMP105, 0x4d); 5092cf6cb50SCédric Le Goater } 5102cf6cb50SCédric Le Goater 511612b219aSPhilippe Mathieu-Daudé static void ast2600_evb_i2c_init(AspeedMachineState *bmc) 512ccc2c418SCédric Le Goater { 51352bcd997SHoward Chiu AspeedSoCState *soc = &bmc->soc; 51452bcd997SHoward Chiu uint8_t *eeprom_buf = g_malloc0(8 * 1024); 51552bcd997SHoward Chiu 51652bcd997SHoward Chiu smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 51752bcd997SHoward Chiu eeprom_buf); 51852bcd997SHoward Chiu 51952bcd997SHoward Chiu /* LM75 is compatible with TMP105 driver */ 52052bcd997SHoward Chiu i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), 52152bcd997SHoward Chiu TYPE_TMP105, 0x4d); 522ccc2c418SCédric Le Goater } 523ccc2c418SCédric Le Goater 52434f73a81SKarthikeyan Pasupathi static void yosemitev2_bmc_i2c_init(AspeedMachineState *bmc) 52534f73a81SKarthikeyan Pasupathi { 52634f73a81SKarthikeyan Pasupathi AspeedSoCState *soc = &bmc->soc; 52734f73a81SKarthikeyan Pasupathi 52834f73a81SKarthikeyan Pasupathi at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x51, 128 * KiB); 52934f73a81SKarthikeyan Pasupathi at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 128 * KiB, 53034f73a81SKarthikeyan Pasupathi yosemitev2_bmc_fruid, yosemitev2_bmc_fruid_len); 5310a1f86baSKarthikeyan Pasupathi /* TMP421 */ 5320a1f86baSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "tmp421", 0x1f); 5330a1f86baSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4e); 5340a1f86baSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4f); 5350a1f86baSKarthikeyan Pasupathi 53634f73a81SKarthikeyan Pasupathi } 53734f73a81SKarthikeyan Pasupathi 538612b219aSPhilippe Mathieu-Daudé static void romulus_bmc_i2c_init(AspeedMachineState *bmc) 5396c4567c7SCédric Le Goater { 5406c4567c7SCédric Le Goater AspeedSoCState *soc = &bmc->soc; 5416c4567c7SCédric Le Goater 5426c4567c7SCédric Le Goater /* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is 5436c4567c7SCédric Le Goater * good enough */ 5441373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32); 5456c4567c7SCédric Le Goater } 5466c4567c7SCédric Le Goater 5476c323abaSKarthikeyan Pasupathi static void tiogapass_bmc_i2c_init(AspeedMachineState *bmc) 5486c323abaSKarthikeyan Pasupathi { 5496c323abaSKarthikeyan Pasupathi AspeedSoCState *soc = &bmc->soc; 5506c323abaSKarthikeyan Pasupathi 5516c323abaSKarthikeyan Pasupathi at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 128 * KiB); 5526c323abaSKarthikeyan Pasupathi at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 6), 0x54, 128 * KiB, 5536c323abaSKarthikeyan Pasupathi tiogapass_bmc_fruid, tiogapass_bmc_fruid_len); 554a09d357dSKarthikeyan Pasupathi /* TMP421 */ 555a09d357dSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "tmp421", 0x1f); 556a09d357dSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4f); 557a09d357dSKarthikeyan Pasupathi i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4e); 5586c323abaSKarthikeyan Pasupathi } 5596c323abaSKarthikeyan Pasupathi 560f4aec252SCédric Le Goater static void create_pca9552(AspeedSoCState *soc, int bus_id, int addr) 561f4aec252SCédric Le Goater { 562f4aec252SCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, bus_id), 563f4aec252SCédric Le Goater TYPE_PCA9552, addr); 564f4aec252SCédric Le Goater } 565f4aec252SCédric Le Goater 566612b219aSPhilippe Mathieu-Daudé static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc) 567143b040fSPatrick Williams { 568143b040fSPatrick Williams AspeedSoCState *soc = &bmc->soc; 569143b040fSPatrick Williams 570143b040fSPatrick Williams /* bus 2 : */ 5711373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48); 5721373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49); 573143b040fSPatrick Williams /* bus 2 : pca9546 @ 0x73 */ 574143b040fSPatrick Williams 575143b040fSPatrick Williams /* bus 3 : pca9548 @ 0x70 */ 576143b040fSPatrick Williams 577143b040fSPatrick Williams /* bus 4 : */ 578143b040fSPatrick Williams uint8_t *eeprom4_54 = g_malloc0(8 * 1024); 5797a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 580143b040fSPatrick Williams eeprom4_54); 581143b040fSPatrick Williams /* PCA9539 @ 0x76, but PCA9552 is compatible */ 582f4aec252SCédric Le Goater create_pca9552(soc, 4, 0x76); 583143b040fSPatrick Williams /* PCA9539 @ 0x77, but PCA9552 is compatible */ 584f4aec252SCédric Le Goater create_pca9552(soc, 4, 0x77); 585143b040fSPatrick Williams 586143b040fSPatrick Williams /* bus 6 : */ 5871373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48); 5881373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49); 589143b040fSPatrick Williams /* bus 6 : pca9546 @ 0x73 */ 590143b040fSPatrick Williams 591143b040fSPatrick Williams /* bus 8 : */ 592143b040fSPatrick Williams uint8_t *eeprom8_56 = g_malloc0(8 * 1024); 5937a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56, 594143b040fSPatrick Williams eeprom8_56); 595f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x60); 596f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x61); 597143b040fSPatrick Williams /* bus 8 : adc128d818 @ 0x1d */ 598143b040fSPatrick Williams /* bus 8 : adc128d818 @ 0x1f */ 599143b040fSPatrick Williams 600143b040fSPatrick Williams /* 601143b040fSPatrick Williams * bus 13 : pca9548 @ 0x71 602143b040fSPatrick Williams * - channel 3: 603143b040fSPatrick Williams * - tmm421 @ 0x4c 604143b040fSPatrick Williams * - tmp421 @ 0x4e 605143b040fSPatrick Williams * - tmp421 @ 0x4f 606143b040fSPatrick Williams */ 607143b040fSPatrick Williams 608143b040fSPatrick Williams } 609143b040fSPatrick Williams 610612b219aSPhilippe Mathieu-Daudé static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc) 61162c2c2ebSCédric Le Goater { 6127cfbde5eSPhilippe Mathieu-Daudé static const struct { 6137cfbde5eSPhilippe Mathieu-Daudé unsigned gpio_id; 6147cfbde5eSPhilippe Mathieu-Daudé LEDColor color; 6157cfbde5eSPhilippe Mathieu-Daudé const char *description; 6167cfbde5eSPhilippe Mathieu-Daudé bool gpio_polarity; 6177cfbde5eSPhilippe Mathieu-Daudé } pca1_leds[] = { 6187cfbde5eSPhilippe Mathieu-Daudé {13, LED_COLOR_GREEN, "front-fault-4", GPIO_POLARITY_ACTIVE_LOW}, 6197cfbde5eSPhilippe Mathieu-Daudé {14, LED_COLOR_GREEN, "front-power-3", GPIO_POLARITY_ACTIVE_LOW}, 6207cfbde5eSPhilippe Mathieu-Daudé {15, LED_COLOR_GREEN, "front-id-5", GPIO_POLARITY_ACTIVE_LOW}, 6217cfbde5eSPhilippe Mathieu-Daudé }; 62262c2c2ebSCédric Le Goater AspeedSoCState *soc = &bmc->soc; 6233d165f12SCédric Le Goater uint8_t *eeprom_buf = g_malloc0(8 * 1024); 62415ce12cfSPhilippe Mathieu-Daudé DeviceState *dev; 6257cfbde5eSPhilippe Mathieu-Daudé LEDState *led; 62662c2c2ebSCédric Le Goater 62763ceb818SCédric Le Goater /* Bus 3: TODO bmp280@77 */ 628db437ca6SPhilippe Mathieu-Daudé dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60)); 62915ce12cfSPhilippe Mathieu-Daudé qdev_prop_set_string(dev, "description", "pca1"); 6302616f572SPhilippe Mathieu-Daudé i2c_slave_realize_and_unref(I2C_SLAVE(dev), 6312616f572SPhilippe Mathieu-Daudé aspeed_i2c_get_bus(&soc->i2c, 3), 63215ce12cfSPhilippe Mathieu-Daudé &error_fatal); 6338c9a61d7SCédric Le Goater 6347cfbde5eSPhilippe Mathieu-Daudé for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) { 6357cfbde5eSPhilippe Mathieu-Daudé led = led_create_simple(OBJECT(bmc), 6367cfbde5eSPhilippe Mathieu-Daudé pca1_leds[i].gpio_polarity, 6377cfbde5eSPhilippe Mathieu-Daudé pca1_leds[i].color, 6387cfbde5eSPhilippe Mathieu-Daudé pca1_leds[i].description); 6397cfbde5eSPhilippe Mathieu-Daudé qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id, 6407cfbde5eSPhilippe Mathieu-Daudé qdev_get_gpio_in(DEVICE(led), 0)); 6417cfbde5eSPhilippe Mathieu-Daudé } 642b61ea6e7SJoel Stanley i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76); 6432a75e8c3SMaheswara Kurapati i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "max31785", 0x52); 6441373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c); 6451373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c); 64662c2c2ebSCédric Le Goater 64762c2c2ebSCédric Le Goater /* The Witherspoon expects a TMP275 but a TMP105 is compatible */ 6481373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105, 649044475f3SPhilippe Mathieu-Daudé 0x4a); 6506c4567c7SCédric Le Goater 6516c4567c7SCédric Le Goater /* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is 6526c4567c7SCédric Le Goater * good enough */ 6531373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32); 6543d165f12SCédric Le Goater 6557a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51, 6563d165f12SCédric Le Goater eeprom_buf); 657db437ca6SPhilippe Mathieu-Daudé dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60)); 65815ce12cfSPhilippe Mathieu-Daudé qdev_prop_set_string(dev, "description", "pca0"); 6592616f572SPhilippe Mathieu-Daudé i2c_slave_realize_and_unref(I2C_SLAVE(dev), 6602616f572SPhilippe Mathieu-Daudé aspeed_i2c_get_bus(&soc->i2c, 11), 66115ce12cfSPhilippe Mathieu-Daudé &error_fatal); 66263ceb818SCédric Le Goater /* Bus 11: TODO ucd90160@64 */ 66362c2c2ebSCédric Le Goater } 66462c2c2ebSCédric Le Goater 66595f068c8SJohn Wang static void g220a_bmc_i2c_init(AspeedMachineState *bmc) 66695f068c8SJohn Wang { 66795f068c8SJohn Wang AspeedSoCState *soc = &bmc->soc; 66895f068c8SJohn Wang DeviceState *dev; 66995f068c8SJohn Wang 67095f068c8SJohn Wang dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), 67195f068c8SJohn Wang "emc1413", 0x4c)); 67295f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 67395f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 67495f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 67595f068c8SJohn Wang 67695f068c8SJohn Wang dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12), 67795f068c8SJohn Wang "emc1413", 0x4c)); 67895f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 67995f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 68095f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 68195f068c8SJohn Wang 68295f068c8SJohn Wang dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13), 68395f068c8SJohn Wang "emc1413", 0x4c)); 68495f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 68595f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 68695f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 6876f5f6507SJohn Wang 6886f5f6507SJohn Wang static uint8_t eeprom_buf[2 * 1024] = { 6896f5f6507SJohn Wang 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe, 6906f5f6507SJohn Wang 0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65, 6916f5f6507SJohn Wang 0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32, 6926f5f6507SJohn Wang 0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42, 6936f5f6507SJohn Wang 0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45, 6946f5f6507SJohn Wang 0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1, 6956f5f6507SJohn Wang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, 6966f5f6507SJohn Wang }; 6976f5f6507SJohn Wang smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57, 6986f5f6507SJohn Wang eeprom_buf); 69995f068c8SJohn Wang } 70095f068c8SJohn Wang 70182b6a3f6SJohn Wang static void fp5280g2_bmc_i2c_init(AspeedMachineState *bmc) 70282b6a3f6SJohn Wang { 70382b6a3f6SJohn Wang AspeedSoCState *soc = &bmc->soc; 70482b6a3f6SJohn Wang I2CSlave *i2c_mux; 70582b6a3f6SJohn Wang 70682b6a3f6SJohn Wang /* The at24c256 */ 70782b6a3f6SJohn Wang at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 1), 0x50, 32768); 70882b6a3f6SJohn Wang 70982b6a3f6SJohn Wang /* The fp5280g2 expects a TMP112 but a TMP105 is compatible */ 71082b6a3f6SJohn Wang i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105, 71182b6a3f6SJohn Wang 0x48); 71282b6a3f6SJohn Wang i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105, 71382b6a3f6SJohn Wang 0x49); 71482b6a3f6SJohn Wang 71582b6a3f6SJohn Wang i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), 71682b6a3f6SJohn Wang "pca9546", 0x70); 71782b6a3f6SJohn Wang /* It expects a TMP112 but a TMP105 is compatible */ 71882b6a3f6SJohn Wang i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0), TYPE_TMP105, 71982b6a3f6SJohn Wang 0x4a); 72082b6a3f6SJohn Wang 72182b6a3f6SJohn Wang /* It expects a ds3232 but a ds1338 is good enough */ 72282b6a3f6SJohn Wang i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "ds1338", 0x68); 72382b6a3f6SJohn Wang 72482b6a3f6SJohn Wang /* It expects a pca9555 but a pca9552 is compatible */ 725f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x30); 72682b6a3f6SJohn Wang } 72782b6a3f6SJohn Wang 72858e52bdbSCédric Le Goater static void rainier_bmc_i2c_init(AspeedMachineState *bmc) 72958e52bdbSCédric Le Goater { 73058e52bdbSCédric Le Goater AspeedSoCState *soc = &bmc->soc; 731fa6d98c0SJoel Stanley I2CSlave *i2c_mux; 732fa6d98c0SJoel Stanley 7339077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB); 73458e52bdbSCédric Le Goater 735f4aec252SCédric Le Goater create_pca9552(soc, 3, 0x61); 736bcb122f8SJoel Stanley 73758e52bdbSCédric Le Goater /* The rainier expects a TMP275 but a TMP105 is compatible */ 73858e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105, 73958e52bdbSCédric Le Goater 0x48); 74058e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105, 74158e52bdbSCédric Le Goater 0x49); 74258e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105, 74358e52bdbSCédric Le Goater 0x4a); 744fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), 745fa6d98c0SJoel Stanley "pca9546", 0x70); 7469077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 7479077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 7489077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB); 749f4aec252SCédric Le Goater create_pca9552(soc, 4, 0x60); 75058e52bdbSCédric Le Goater 75158e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105, 75258e52bdbSCédric Le Goater 0x48); 75358e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105, 75458e52bdbSCédric Le Goater 0x49); 755f4aec252SCédric Le Goater create_pca9552(soc, 5, 0x60); 756f4aec252SCédric Le Goater create_pca9552(soc, 5, 0x61); 757fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), 758fa6d98c0SJoel Stanley "pca9546", 0x70); 7599077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 7609077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 76158e52bdbSCédric Le Goater 76258e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105, 76358e52bdbSCédric Le Goater 0x48); 76458e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105, 76558e52bdbSCédric Le Goater 0x4a); 76658e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105, 76758e52bdbSCédric Le Goater 0x4b); 768fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), 769fa6d98c0SJoel Stanley "pca9546", 0x70); 7709077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 7719077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 7729077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB); 7739077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB); 77458e52bdbSCédric Le Goater 775f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x30); 776f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x31); 777f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x32); 778f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x33); 779f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x60); 780f4aec252SCédric Le Goater create_pca9552(soc, 7, 0x61); 781b61ea6e7SJoel Stanley i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76); 78258e52bdbSCédric Le Goater /* Bus 7: TODO si7021-a20@20 */ 78358e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105, 78458e52bdbSCédric Le Goater 0x48); 7852a75e8c3SMaheswara Kurapati i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "max31785", 0x52); 7869077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB); 7879077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB); 78858e52bdbSCédric Le Goater 78958e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105, 79058e52bdbSCédric Le Goater 0x48); 79158e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105, 79258e52bdbSCédric Le Goater 0x4a); 793be85508fSNinad Palsule at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50, 794be85508fSNinad Palsule 64 * KiB, rainier_bb_fruid, rainier_bb_fruid_len); 795be85508fSNinad Palsule at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 796be85508fSNinad Palsule 64 * KiB, rainier_bmc_fruid, rainier_bmc_fruid_len); 797f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x60); 798f4aec252SCédric Le Goater create_pca9552(soc, 8, 0x61); 79958e52bdbSCédric Le Goater /* Bus 8: ucd90320@11 */ 80058e52bdbSCédric Le Goater /* Bus 8: ucd90320@b */ 80158e52bdbSCédric Le Goater /* Bus 8: ucd90320@c */ 80258e52bdbSCédric Le Goater 80358e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c); 80458e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d); 8059077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB); 80658e52bdbSCédric Le Goater 80758e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c); 80858e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d); 8099077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB); 81058e52bdbSCédric Le Goater 81158e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105, 81258e52bdbSCédric Le Goater 0x48); 81358e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105, 81458e52bdbSCédric Le Goater 0x49); 815fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), 816fa6d98c0SJoel Stanley "pca9546", 0x70); 8179077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 8189077e09aSPeter Delevoryas at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 819f4aec252SCédric Le Goater create_pca9552(soc, 11, 0x60); 820fa6d98c0SJoel Stanley 821fa6d98c0SJoel Stanley 8229077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB); 823f4aec252SCédric Le Goater create_pca9552(soc, 13, 0x60); 824fa6d98c0SJoel Stanley 8259077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB); 826f4aec252SCédric Le Goater create_pca9552(soc, 14, 0x60); 827fa6d98c0SJoel Stanley 8289077e09aSPeter Delevoryas at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB); 829f4aec252SCédric Le Goater create_pca9552(soc, 15, 0x60); 83058e52bdbSCédric Le Goater } 83158e52bdbSCédric Le Goater 832febbe308SPeter Delevoryas static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr, 833febbe308SPeter Delevoryas I2CBus **channels) 834febbe308SPeter Delevoryas { 835febbe308SPeter Delevoryas I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr); 836febbe308SPeter Delevoryas for (int i = 0; i < 8; i++) { 837febbe308SPeter Delevoryas channels[i] = pca954x_i2c_get_bus(mux, i); 838febbe308SPeter Delevoryas } 839febbe308SPeter Delevoryas } 840febbe308SPeter Delevoryas 841febbe308SPeter Delevoryas #define TYPE_LM75 TYPE_TMP105 842febbe308SPeter Delevoryas #define TYPE_TMP75 TYPE_TMP105 843febbe308SPeter Delevoryas #define TYPE_TMP422 "tmp422" 844febbe308SPeter Delevoryas 845febbe308SPeter Delevoryas static void fuji_bmc_i2c_init(AspeedMachineState *bmc) 846febbe308SPeter Delevoryas { 847febbe308SPeter Delevoryas AspeedSoCState *soc = &bmc->soc; 848febbe308SPeter Delevoryas I2CBus *i2c[144] = {}; 849febbe308SPeter Delevoryas 850febbe308SPeter Delevoryas for (int i = 0; i < 16; i++) { 851febbe308SPeter Delevoryas i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i); 852febbe308SPeter Delevoryas } 853febbe308SPeter Delevoryas I2CBus *i2c180 = i2c[2]; 854febbe308SPeter Delevoryas I2CBus *i2c480 = i2c[8]; 855febbe308SPeter Delevoryas I2CBus *i2c600 = i2c[11]; 856febbe308SPeter Delevoryas 857febbe308SPeter Delevoryas get_pca9548_channels(i2c180, 0x70, &i2c[16]); 858febbe308SPeter Delevoryas get_pca9548_channels(i2c480, 0x70, &i2c[24]); 859febbe308SPeter Delevoryas /* NOTE: The device tree skips [32, 40) in the alias numbering */ 860febbe308SPeter Delevoryas get_pca9548_channels(i2c600, 0x77, &i2c[40]); 861febbe308SPeter Delevoryas get_pca9548_channels(i2c[24], 0x71, &i2c[48]); 862febbe308SPeter Delevoryas get_pca9548_channels(i2c[25], 0x72, &i2c[56]); 863febbe308SPeter Delevoryas get_pca9548_channels(i2c[26], 0x76, &i2c[64]); 864febbe308SPeter Delevoryas get_pca9548_channels(i2c[27], 0x76, &i2c[72]); 865febbe308SPeter Delevoryas for (int i = 0; i < 8; i++) { 866febbe308SPeter Delevoryas get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]); 867febbe308SPeter Delevoryas } 868febbe308SPeter Delevoryas 869febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c); 870febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d); 871febbe308SPeter Delevoryas 872ef0eb67eSSittisak Sinprem /* 873ef0eb67eSSittisak Sinprem * EEPROM 24c64 size is 64Kbits or 8 Kbytes 874ef0eb67eSSittisak Sinprem * 24c02 size is 2Kbits or 256 bytes 875ef0eb67eSSittisak Sinprem */ 876ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[19], 0x52, 8 * KiB); 877ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[20], 0x50, 256); 878ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[22], 0x52, 256); 879febbe308SPeter Delevoryas 880febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x48); 881febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x49); 882febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x4a); 883febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_TMP422, 0x4c); 884febbe308SPeter Delevoryas 885ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[8], 0x51, 8 * KiB); 886febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a); 887febbe308SPeter Delevoryas 888febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[50], TYPE_LM75, 0x4c); 889ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[50], 0x52, 8 * KiB); 890febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[51], TYPE_TMP75, 0x48); 891febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[52], TYPE_TMP75, 0x49); 892febbe308SPeter Delevoryas 893febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[59], TYPE_TMP75, 0x48); 894febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[60], TYPE_TMP75, 0x49); 895febbe308SPeter Delevoryas 896ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[65], 0x53, 8 * KiB); 897febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x49); 898febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x48); 899ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[68], 0x52, 8 * KiB); 900ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[69], 0x52, 8 * KiB); 901ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[70], 0x52, 8 * KiB); 902ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[71], 0x52, 8 * KiB); 903febbe308SPeter Delevoryas 904ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[73], 0x53, 8 * KiB); 905febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x49); 906febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x48); 907ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[76], 0x52, 8 * KiB); 908ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[77], 0x52, 8 * KiB); 909ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[78], 0x52, 8 * KiB); 910ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[79], 0x52, 8 * KiB); 911ef0eb67eSSittisak Sinprem at24c_eeprom_init(i2c[28], 0x50, 256); 912febbe308SPeter Delevoryas 913febbe308SPeter Delevoryas for (int i = 0; i < 8; i++) { 9149077e09aSPeter Delevoryas at24c_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB); 915febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[82 + i * 8], TYPE_TMP75, 0x48); 916febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[83 + i * 8], TYPE_TMP75, 0x4b); 917febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[84 + i * 8], TYPE_TMP75, 0x4a); 918febbe308SPeter Delevoryas } 919febbe308SPeter Delevoryas } 920febbe308SPeter Delevoryas 921a20c54b1SPatrick Williams #define TYPE_TMP421 "tmp421" 922a20c54b1SPatrick Williams 923a20c54b1SPatrick Williams static void bletchley_bmc_i2c_init(AspeedMachineState *bmc) 924a20c54b1SPatrick Williams { 925a20c54b1SPatrick Williams AspeedSoCState *soc = &bmc->soc; 926a20c54b1SPatrick Williams I2CBus *i2c[13] = {}; 927a20c54b1SPatrick Williams for (int i = 0; i < 13; i++) { 928a20c54b1SPatrick Williams if ((i == 8) || (i == 11)) { 929a20c54b1SPatrick Williams continue; 930a20c54b1SPatrick Williams } 931a20c54b1SPatrick Williams i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i); 932a20c54b1SPatrick Williams } 933a20c54b1SPatrick Williams 934a20c54b1SPatrick Williams /* Bus 0 - 5 all have the same config. */ 935a20c54b1SPatrick Williams for (int i = 0; i < 6; i++) { 936a20c54b1SPatrick Williams /* Missing model: ti,ina230 @ 0x45 */ 937a20c54b1SPatrick Williams /* Missing model: mps,mp5023 @ 0x40 */ 938a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[i], TYPE_TMP421, 0x4f); 939a20c54b1SPatrick Williams /* Missing model: nxp,pca9539 @ 0x76, but PCA9552 works enough */ 940a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x76); 941a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x67); 942a20c54b1SPatrick Williams /* Missing model: fsc,fusb302 @ 0x22 */ 943a20c54b1SPatrick Williams } 944a20c54b1SPatrick Williams 945a20c54b1SPatrick Williams /* Bus 6 */ 946a20c54b1SPatrick Williams at24c_eeprom_init(i2c[6], 0x56, 65536); 947a20c54b1SPatrick Williams /* Missing model: nxp,pcf85263 @ 0x51 , but ds1338 works enough */ 948a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[6], "ds1338", 0x51); 949a20c54b1SPatrick Williams 950a20c54b1SPatrick Williams 951a20c54b1SPatrick Williams /* Bus 7 */ 952a20c54b1SPatrick Williams at24c_eeprom_init(i2c[7], 0x54, 65536); 953a20c54b1SPatrick Williams 954a20c54b1SPatrick Williams /* Bus 9 */ 955a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[9], TYPE_TMP421, 0x4f); 956a20c54b1SPatrick Williams 957a20c54b1SPatrick Williams /* Bus 10 */ 958a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[10], TYPE_TMP421, 0x4f); 959a20c54b1SPatrick Williams /* Missing model: ti,hdc1080 @ 0x40 */ 960a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[10], TYPE_PCA9552, 0x67); 961a20c54b1SPatrick Williams 962a20c54b1SPatrick Williams /* Bus 12 */ 963a20c54b1SPatrick Williams /* Missing model: adi,adm1278 @ 0x11 */ 964a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4c); 965a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4d); 966a20c54b1SPatrick Williams i2c_slave_create_simple(i2c[12], TYPE_PCA9552, 0x67); 967a20c54b1SPatrick Williams } 968a20c54b1SPatrick Williams 969fa699e80SPeter Delevoryas static void fby35_i2c_init(AspeedMachineState *bmc) 970fa699e80SPeter Delevoryas { 971fa699e80SPeter Delevoryas AspeedSoCState *soc = &bmc->soc; 972fa699e80SPeter Delevoryas I2CBus *i2c[16]; 973fa699e80SPeter Delevoryas 974fa699e80SPeter Delevoryas for (int i = 0; i < 16; i++) { 975fa699e80SPeter Delevoryas i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i); 976fa699e80SPeter Delevoryas } 977fa699e80SPeter Delevoryas 978fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[2], TYPE_LM75, 0x4f); 979fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[8], TYPE_TMP421, 0x1f); 980fa699e80SPeter Delevoryas /* Hotswap controller is actually supposed to be mp5920 or ltc4282. */ 981fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[11], "adm1272", 0x44); 982fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4e); 983fa699e80SPeter Delevoryas i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4f); 984fa699e80SPeter Delevoryas 9859077e09aSPeter Delevoryas at24c_eeprom_init(i2c[4], 0x51, 128 * KiB); 9869077e09aSPeter Delevoryas at24c_eeprom_init(i2c[6], 0x51, 128 * KiB); 987c0216b94SPeter Delevoryas at24c_eeprom_init_rom(i2c[8], 0x50, 32 * KiB, fby35_nic_fruid, 988c0216b94SPeter Delevoryas fby35_nic_fruid_len); 989c0216b94SPeter Delevoryas at24c_eeprom_init_rom(i2c[11], 0x51, 128 * KiB, fby35_bb_fruid, 990c0216b94SPeter Delevoryas fby35_bb_fruid_len); 991c0216b94SPeter Delevoryas at24c_eeprom_init_rom(i2c[11], 0x54, 128 * KiB, fby35_bmc_fruid, 992c0216b94SPeter Delevoryas fby35_bmc_fruid_len); 993fa699e80SPeter Delevoryas 994fa699e80SPeter Delevoryas /* 995fa699e80SPeter Delevoryas * TODO: There is a multi-master i2c connection to an AST1030 MiniBMC on 996fa699e80SPeter Delevoryas * buses 0, 1, 2, 3, and 9. Source address 0x10, target address 0x20 on 997fa699e80SPeter Delevoryas * each. 998fa699e80SPeter Delevoryas */ 999fa699e80SPeter Delevoryas } 1000fa699e80SPeter Delevoryas 1001fb6b3c8dSJae Hyun Yoo static void qcom_dc_scm_bmc_i2c_init(AspeedMachineState *bmc) 1002fb6b3c8dSJae Hyun Yoo { 1003fb6b3c8dSJae Hyun Yoo AspeedSoCState *soc = &bmc->soc; 1004fb6b3c8dSJae Hyun Yoo 1005fb6b3c8dSJae Hyun Yoo i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 15), "tmp105", 0x4d); 1006fb6b3c8dSJae Hyun Yoo } 1007fb6b3c8dSJae Hyun Yoo 1008ece4cccdSGraeme Gregory static void qcom_dc_scm_firework_i2c_init(AspeedMachineState *bmc) 1009ece4cccdSGraeme Gregory { 1010ece4cccdSGraeme Gregory AspeedSoCState *soc = &bmc->soc; 10112a7a5d5cSJae Hyun Yoo I2CSlave *therm_mux, *cpuvr_mux; 1012ece4cccdSGraeme Gregory 1013ece4cccdSGraeme Gregory /* Create the generic DC-SCM hardware */ 1014ece4cccdSGraeme Gregory qcom_dc_scm_bmc_i2c_init(bmc); 1015ece4cccdSGraeme Gregory 1016ece4cccdSGraeme Gregory /* Now create the Firework specific hardware */ 10172a75e8c3SMaheswara Kurapati 10182a7a5d5cSJae Hyun Yoo /* I2C7 CPUVR MUX */ 10192a7a5d5cSJae Hyun Yoo cpuvr_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), 10202a7a5d5cSJae Hyun Yoo "pca9546", 0x70); 10212a7a5d5cSJae Hyun Yoo i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 0), "pca9548", 0x72); 10222a7a5d5cSJae Hyun Yoo i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 1), "pca9548", 0x72); 10232a7a5d5cSJae Hyun Yoo i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 2), "pca9548", 0x72); 10242a7a5d5cSJae Hyun Yoo i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 3), "pca9548", 0x72); 10252a7a5d5cSJae Hyun Yoo 1026cfc68f16SMaheswara Kurapati /* I2C8 Thermal Diodes*/ 1027cfc68f16SMaheswara Kurapati therm_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), 1028cfc68f16SMaheswara Kurapati "pca9548", 0x70); 1029cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 0), TYPE_LM75, 0x4C); 1030cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 1), TYPE_LM75, 0x4C); 1031cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 2), TYPE_LM75, 0x48); 1032cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 3), TYPE_LM75, 0x48); 1033cfc68f16SMaheswara Kurapati i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 4), TYPE_LM75, 0x48); 1034cfc68f16SMaheswara Kurapati 10352a75e8c3SMaheswara Kurapati /* I2C9 Fan Controller (MAX31785) */ 10362a75e8c3SMaheswara Kurapati i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x52); 10372a75e8c3SMaheswara Kurapati i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x54); 1038ece4cccdSGraeme Gregory } 1039ece4cccdSGraeme Gregory 10401a15311aSCédric Le Goater static bool aspeed_get_mmio_exec(Object *obj, Error **errp) 10411a15311aSCédric Le Goater { 10421a15311aSCédric Le Goater return ASPEED_MACHINE(obj)->mmio_exec; 10431a15311aSCédric Le Goater } 10441a15311aSCédric Le Goater 10451a15311aSCédric Le Goater static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp) 10461a15311aSCédric Le Goater { 10471a15311aSCédric Le Goater ASPEED_MACHINE(obj)->mmio_exec = value; 10481a15311aSCédric Le Goater } 10491a15311aSCédric Le Goater 10501a15311aSCédric Le Goater static void aspeed_machine_instance_init(Object *obj) 10511a15311aSCédric Le Goater { 10521a15311aSCédric Le Goater ASPEED_MACHINE(obj)->mmio_exec = false; 10531a15311aSCédric Le Goater } 10541a15311aSCédric Le Goater 10559820e52fSCédric Le Goater static char *aspeed_get_fmc_model(Object *obj, Error **errp) 10569820e52fSCédric Le Goater { 10579820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 10589820e52fSCédric Le Goater return g_strdup(bmc->fmc_model); 10599820e52fSCédric Le Goater } 10609820e52fSCédric Le Goater 10619820e52fSCédric Le Goater static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp) 10629820e52fSCédric Le Goater { 10639820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 10649820e52fSCédric Le Goater 10659820e52fSCédric Le Goater g_free(bmc->fmc_model); 10669820e52fSCédric Le Goater bmc->fmc_model = g_strdup(value); 10679820e52fSCédric Le Goater } 10689820e52fSCédric Le Goater 10699820e52fSCédric Le Goater static char *aspeed_get_spi_model(Object *obj, Error **errp) 10709820e52fSCédric Le Goater { 10719820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 10729820e52fSCédric Le Goater return g_strdup(bmc->spi_model); 10739820e52fSCédric Le Goater } 10749820e52fSCédric Le Goater 10759820e52fSCédric Le Goater static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp) 10769820e52fSCédric Le Goater { 10779820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 10789820e52fSCédric Le Goater 10799820e52fSCédric Le Goater g_free(bmc->spi_model); 10809820e52fSCédric Le Goater bmc->spi_model = g_strdup(value); 10819820e52fSCédric Le Goater } 10829820e52fSCédric Le Goater 1083*f65f6ad5SCédric Le Goater static char *aspeed_get_bmc_console(Object *obj, Error **errp) 1084*f65f6ad5SCédric Le Goater { 1085*f65f6ad5SCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 1086*f65f6ad5SCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc); 1087*f65f6ad5SCédric Le Goater int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default; 1088*f65f6ad5SCédric Le Goater 1089*f65f6ad5SCédric Le Goater return g_strdup_printf("uart%d", uart_chosen - ASPEED_DEV_UART1 + 1); 1090*f65f6ad5SCédric Le Goater } 1091*f65f6ad5SCédric Le Goater 1092*f65f6ad5SCédric Le Goater static void aspeed_set_bmc_console(Object *obj, const char *value, Error **errp) 1093*f65f6ad5SCédric Le Goater { 1094*f65f6ad5SCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 1095*f65f6ad5SCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc); 1096*f65f6ad5SCédric Le Goater AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(amc->soc_name)); 1097*f65f6ad5SCédric Le Goater int val; 1098*f65f6ad5SCédric Le Goater 1099*f65f6ad5SCédric Le Goater if (sscanf(value, "uart%u", &val) != 1) { 1100*f65f6ad5SCédric Le Goater error_setg(errp, "Bad value for \"uart\" property"); 1101*f65f6ad5SCédric Le Goater return; 1102*f65f6ad5SCédric Le Goater } 1103*f65f6ad5SCédric Le Goater 1104*f65f6ad5SCédric Le Goater /* The number of UART depends on the SoC */ 1105*f65f6ad5SCédric Le Goater if (val < 1 || val > sc->uarts_num) { 1106*f65f6ad5SCédric Le Goater error_setg(errp, "\"uart\" should be in range [1 - %d]", sc->uarts_num); 1107*f65f6ad5SCédric Le Goater return; 1108*f65f6ad5SCédric Le Goater } 1109*f65f6ad5SCédric Le Goater bmc->uart_chosen = ASPEED_DEV_UART1 + val - 1; 1110*f65f6ad5SCédric Le Goater } 1111*f65f6ad5SCédric Le Goater 11121a15311aSCédric Le Goater static void aspeed_machine_class_props_init(ObjectClass *oc) 11131a15311aSCédric Le Goater { 11141a15311aSCédric Le Goater object_class_property_add_bool(oc, "execute-in-place", 11151a15311aSCédric Le Goater aspeed_get_mmio_exec, 1116d2623129SMarkus Armbruster aspeed_set_mmio_exec); 11171a15311aSCédric Le Goater object_class_property_set_description(oc, "execute-in-place", 11187eecec7dSMarkus Armbruster "boot directly from CE0 flash device"); 11199820e52fSCédric Le Goater 1120*f65f6ad5SCédric Le Goater object_class_property_add_str(oc, "bmc-console", aspeed_get_bmc_console, 1121*f65f6ad5SCédric Le Goater aspeed_set_bmc_console); 1122*f65f6ad5SCédric Le Goater object_class_property_set_description(oc, "bmc-console", 1123*f65f6ad5SCédric Le Goater "Change the default UART to \"uartX\""); 1124*f65f6ad5SCédric Le Goater 11259820e52fSCédric Le Goater object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model, 11269820e52fSCédric Le Goater aspeed_set_fmc_model); 11279820e52fSCédric Le Goater object_class_property_set_description(oc, "fmc-model", 11289820e52fSCédric Le Goater "Change the FMC Flash model"); 11299820e52fSCédric Le Goater object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model, 11309820e52fSCédric Le Goater aspeed_set_spi_model); 11319820e52fSCédric Le Goater object_class_property_set_description(oc, "spi-model", 11329820e52fSCédric Le Goater "Change the SPI Flash model"); 11331a15311aSCédric Le Goater } 11341a15311aSCédric Le Goater 1135b7f1a0cbSCédric Le Goater static int aspeed_soc_num_cpus(const char *soc_name) 1136b7f1a0cbSCédric Le Goater { 1137b7f1a0cbSCédric Le Goater AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(soc_name)); 1138b7f1a0cbSCédric Le Goater return sc->num_cpus; 1139b7f1a0cbSCédric Le Goater } 1140b7f1a0cbSCédric Le Goater 1141fca9ca1bSCédric Le Goater static void aspeed_machine_class_init(ObjectClass *oc, void *data) 114262c2c2ebSCédric Le Goater { 114362c2c2ebSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1144d3bad7e7SCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 114562c2c2ebSCédric Le Goater 1146fca9ca1bSCédric Le Goater mc->init = aspeed_machine_init; 114762c2c2ebSCédric Le Goater mc->no_floppy = 1; 114862c2c2ebSCédric Le Goater mc->no_cdrom = 1; 114962c2c2ebSCédric Le Goater mc->no_parallel = 1; 1150afcbaed6SIgor Mammedov mc->default_ram_id = "ram"; 1151d3bad7e7SCédric Le Goater amc->macs_mask = ASPEED_MAC0_ON; 11525d63d0c7SPeter Delevoryas amc->uart_default = ASPEED_DEV_UART5; 11531a15311aSCédric Le Goater 11541a15311aSCédric Le Goater aspeed_machine_class_props_init(oc); 115562c2c2ebSCédric Le Goater } 115662c2c2ebSCédric Le Goater 1157baa4732bSCédric Le Goater static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data) 1158baa4732bSCédric Le Goater { 1159baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1160baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1161baa4732bSCédric Le Goater 1162baa4732bSCédric Le Goater mc->desc = "OpenPOWER Palmetto BMC (ARM926EJ-S)"; 1163baa4732bSCédric Le Goater amc->soc_name = "ast2400-a1"; 1164baa4732bSCédric Le Goater amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1; 1165baa4732bSCédric Le Goater amc->fmc_model = "n25q256a"; 116670322913SCédric Le Goater amc->spi_model = "mx25l25635f"; 1167baa4732bSCédric Le Goater amc->num_cs = 1; 1168baa4732bSCédric Le Goater amc->i2c_init = palmetto_bmc_i2c_init; 1169baa4732bSCédric Le Goater mc->default_ram_size = 256 * MiB; 1170b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1171b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1172baa4732bSCédric Le Goater }; 1173baa4732bSCédric Le Goater 11749cccb912SPatrick Venture static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data) 11759cccb912SPatrick Venture { 11769cccb912SPatrick Venture MachineClass *mc = MACHINE_CLASS(oc); 11779cccb912SPatrick Venture AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 11789cccb912SPatrick Venture 11799cccb912SPatrick Venture mc->desc = "Quanta-Q71l BMC (ARM926EJ-S)"; 11809cccb912SPatrick Venture amc->soc_name = "ast2400-a1"; 11819cccb912SPatrick Venture amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1; 11829cccb912SPatrick Venture amc->fmc_model = "n25q256a"; 11839cccb912SPatrick Venture amc->spi_model = "mx25l25635e"; 11849cccb912SPatrick Venture amc->num_cs = 1; 11859cccb912SPatrick Venture amc->i2c_init = quanta_q71l_bmc_i2c_init; 11869cccb912SPatrick Venture mc->default_ram_size = 128 * MiB; 11879cccb912SPatrick Venture mc->default_cpus = mc->min_cpus = mc->max_cpus = 11889cccb912SPatrick Venture aspeed_soc_num_cpus(amc->soc_name); 11899cccb912SPatrick Venture } 11909cccb912SPatrick Venture 119140a38df5SErik Smit static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc, 119240a38df5SErik Smit void *data) 119340a38df5SErik Smit { 119440a38df5SErik Smit MachineClass *mc = MACHINE_CLASS(oc); 119540a38df5SErik Smit AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 119640a38df5SErik Smit 119740a38df5SErik Smit mc->desc = "Supermicro X11 BMC (ARM926EJ-S)"; 119840a38df5SErik Smit amc->soc_name = "ast2400-a1"; 119940a38df5SErik Smit amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1; 120040a38df5SErik Smit amc->fmc_model = "mx25l25635e"; 120140a38df5SErik Smit amc->spi_model = "mx25l25635e"; 120240a38df5SErik Smit amc->num_cs = 1; 120340a38df5SErik Smit amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 120440a38df5SErik Smit amc->i2c_init = palmetto_bmc_i2c_init; 120540a38df5SErik Smit mc->default_ram_size = 256 * MiB; 120640a38df5SErik Smit } 120740a38df5SErik Smit 120847936597SGuenter Roeck static void aspeed_machine_supermicro_x11spi_bmc_class_init(ObjectClass *oc, 120947936597SGuenter Roeck void *data) 121047936597SGuenter Roeck { 121147936597SGuenter Roeck MachineClass *mc = MACHINE_CLASS(oc); 121247936597SGuenter Roeck AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 121347936597SGuenter Roeck 121447936597SGuenter Roeck mc->desc = "Supermicro X11 SPI BMC (ARM1176)"; 121547936597SGuenter Roeck amc->soc_name = "ast2500-a1"; 121647936597SGuenter Roeck amc->hw_strap1 = SUPERMICRO_X11SPI_BMC_HW_STRAP1; 121747936597SGuenter Roeck amc->fmc_model = "mx25l25635e"; 121847936597SGuenter Roeck amc->spi_model = "mx25l25635e"; 121947936597SGuenter Roeck amc->num_cs = 1; 122047936597SGuenter Roeck amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 122147936597SGuenter Roeck amc->i2c_init = palmetto_bmc_i2c_init; 122247936597SGuenter Roeck mc->default_ram_size = 512 * MiB; 122347936597SGuenter Roeck mc->default_cpus = mc->min_cpus = mc->max_cpus = 122447936597SGuenter Roeck aspeed_soc_num_cpus(amc->soc_name); 122547936597SGuenter Roeck } 122647936597SGuenter Roeck 1227baa4732bSCédric Le Goater static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data) 1228baa4732bSCédric Le Goater { 1229baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1230baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1231baa4732bSCédric Le Goater 1232baa4732bSCédric Le Goater mc->desc = "Aspeed AST2500 EVB (ARM1176)"; 1233baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1"; 1234baa4732bSCédric Le Goater amc->hw_strap1 = AST2500_EVB_HW_STRAP1; 1235753abfc4SJae Hyun Yoo amc->fmc_model = "mx25l25635e"; 123670322913SCédric Le Goater amc->spi_model = "mx25l25635f"; 1237baa4732bSCédric Le Goater amc->num_cs = 1; 1238baa4732bSCédric Le Goater amc->i2c_init = ast2500_evb_i2c_init; 1239baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB; 1240b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1241b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1242baa4732bSCédric Le Goater }; 1243baa4732bSCédric Le Goater 124434f73a81SKarthikeyan Pasupathi static void aspeed_machine_yosemitev2_class_init(ObjectClass *oc, void *data) 124534f73a81SKarthikeyan Pasupathi { 124634f73a81SKarthikeyan Pasupathi MachineClass *mc = MACHINE_CLASS(oc); 124734f73a81SKarthikeyan Pasupathi AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 124834f73a81SKarthikeyan Pasupathi 124934f73a81SKarthikeyan Pasupathi mc->desc = "Facebook YosemiteV2 BMC (ARM1176)"; 125034f73a81SKarthikeyan Pasupathi amc->soc_name = "ast2500-a1"; 125134f73a81SKarthikeyan Pasupathi amc->hw_strap1 = AST2500_EVB_HW_STRAP1; 125234f73a81SKarthikeyan Pasupathi amc->hw_strap2 = 0; 125334f73a81SKarthikeyan Pasupathi amc->fmc_model = "n25q256a"; 125434f73a81SKarthikeyan Pasupathi amc->spi_model = "mx25l25635e"; 125534f73a81SKarthikeyan Pasupathi amc->num_cs = 2; 125634f73a81SKarthikeyan Pasupathi amc->i2c_init = yosemitev2_bmc_i2c_init; 125734f73a81SKarthikeyan Pasupathi mc->default_ram_size = 512 * MiB; 125834f73a81SKarthikeyan Pasupathi mc->default_cpus = mc->min_cpus = mc->max_cpus = 125934f73a81SKarthikeyan Pasupathi aspeed_soc_num_cpus(amc->soc_name); 126034f73a81SKarthikeyan Pasupathi }; 126134f73a81SKarthikeyan Pasupathi 1262baa4732bSCédric Le Goater static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data) 1263baa4732bSCédric Le Goater { 1264baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1265baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1266baa4732bSCédric Le Goater 1267baa4732bSCédric Le Goater mc->desc = "OpenPOWER Romulus BMC (ARM1176)"; 1268baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1"; 1269baa4732bSCédric Le Goater amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1; 1270baa4732bSCédric Le Goater amc->fmc_model = "n25q256a"; 1271baa4732bSCédric Le Goater amc->spi_model = "mx66l1g45g"; 1272baa4732bSCédric Le Goater amc->num_cs = 2; 1273baa4732bSCédric Le Goater amc->i2c_init = romulus_bmc_i2c_init; 1274baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB; 1275b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1276b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1277baa4732bSCédric Le Goater }; 1278baa4732bSCédric Le Goater 12796c323abaSKarthikeyan Pasupathi static void aspeed_machine_tiogapass_class_init(ObjectClass *oc, void *data) 12806c323abaSKarthikeyan Pasupathi { 12816c323abaSKarthikeyan Pasupathi MachineClass *mc = MACHINE_CLASS(oc); 12826c323abaSKarthikeyan Pasupathi AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 12836c323abaSKarthikeyan Pasupathi 12846c323abaSKarthikeyan Pasupathi mc->desc = "Facebook Tiogapass BMC (ARM1176)"; 12856c323abaSKarthikeyan Pasupathi amc->soc_name = "ast2500-a1"; 12866c323abaSKarthikeyan Pasupathi amc->hw_strap1 = AST2500_EVB_HW_STRAP1; 12876c323abaSKarthikeyan Pasupathi amc->hw_strap2 = 0; 12886c323abaSKarthikeyan Pasupathi amc->fmc_model = "n25q256a"; 12896c323abaSKarthikeyan Pasupathi amc->spi_model = "mx25l25635e"; 12906c323abaSKarthikeyan Pasupathi amc->num_cs = 2; 12916c323abaSKarthikeyan Pasupathi amc->i2c_init = tiogapass_bmc_i2c_init; 12926c323abaSKarthikeyan Pasupathi mc->default_ram_size = 1 * GiB; 12936c323abaSKarthikeyan Pasupathi mc->default_cpus = mc->min_cpus = mc->max_cpus = 12946c323abaSKarthikeyan Pasupathi aspeed_soc_num_cpus(amc->soc_name); 12956c323abaSKarthikeyan Pasupathi aspeed_soc_num_cpus(amc->soc_name); 12966c323abaSKarthikeyan Pasupathi }; 12976c323abaSKarthikeyan Pasupathi 1298143b040fSPatrick Williams static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data) 1299143b040fSPatrick Williams { 1300143b040fSPatrick Williams MachineClass *mc = MACHINE_CLASS(oc); 1301143b040fSPatrick Williams AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1302143b040fSPatrick Williams 1303143b040fSPatrick Williams mc->desc = "OCP SonoraPass BMC (ARM1176)"; 1304143b040fSPatrick Williams amc->soc_name = "ast2500-a1"; 1305143b040fSPatrick Williams amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1; 1306143b040fSPatrick Williams amc->fmc_model = "mx66l1g45g"; 1307143b040fSPatrick Williams amc->spi_model = "mx66l1g45g"; 1308143b040fSPatrick Williams amc->num_cs = 2; 1309143b040fSPatrick Williams amc->i2c_init = sonorapass_bmc_i2c_init; 1310143b040fSPatrick Williams mc->default_ram_size = 512 * MiB; 1311b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1312b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1313143b040fSPatrick Williams }; 1314143b040fSPatrick Williams 1315baa4732bSCédric Le Goater static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data) 1316baa4732bSCédric Le Goater { 1317baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1318baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1319baa4732bSCédric Le Goater 1320baa4732bSCédric Le Goater mc->desc = "OpenPOWER Witherspoon BMC (ARM1176)"; 1321baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1"; 1322baa4732bSCédric Le Goater amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1; 132370322913SCédric Le Goater amc->fmc_model = "mx25l25635f"; 1324baa4732bSCédric Le Goater amc->spi_model = "mx66l1g45g"; 1325baa4732bSCédric Le Goater amc->num_cs = 2; 1326baa4732bSCédric Le Goater amc->i2c_init = witherspoon_bmc_i2c_init; 1327baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB; 1328b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1329b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1330baa4732bSCédric Le Goater }; 1331baa4732bSCédric Le Goater 1332baa4732bSCédric Le Goater static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data) 1333baa4732bSCédric Le Goater { 1334baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1335baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1336baa4732bSCédric Le Goater 1337f548f201SPeter Maydell mc->desc = "Aspeed AST2600 EVB (Cortex-A7)"; 1338c5811bb3SJoel Stanley amc->soc_name = "ast2600-a3"; 1339baa4732bSCédric Le Goater amc->hw_strap1 = AST2600_EVB_HW_STRAP1; 1340baa4732bSCédric Le Goater amc->hw_strap2 = AST2600_EVB_HW_STRAP2; 1341753abfc4SJae Hyun Yoo amc->fmc_model = "mx66u51235f"; 1342baa4732bSCédric Le Goater amc->spi_model = "mx66u51235f"; 1343baa4732bSCédric Le Goater amc->num_cs = 1; 134429193286SGuenter Roeck amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON | 134529193286SGuenter Roeck ASPEED_MAC3_ON; 1346baa4732bSCédric Le Goater amc->i2c_init = ast2600_evb_i2c_init; 1347baa4732bSCédric Le Goater mc->default_ram_size = 1 * GiB; 1348b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1349b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1350baa4732bSCédric Le Goater }; 1351baa4732bSCédric Le Goater 135263ceb818SCédric Le Goater static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data) 135363ceb818SCédric Le Goater { 135463ceb818SCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 135563ceb818SCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 135663ceb818SCédric Le Goater 1357f548f201SPeter Maydell mc->desc = "OpenPOWER Tacoma BMC (Cortex-A7)"; 1358c5811bb3SJoel Stanley amc->soc_name = "ast2600-a3"; 135963ceb818SCédric Le Goater amc->hw_strap1 = TACOMA_BMC_HW_STRAP1; 136063ceb818SCédric Le Goater amc->hw_strap2 = TACOMA_BMC_HW_STRAP2; 136163ceb818SCédric Le Goater amc->fmc_model = "mx66l1g45g"; 136263ceb818SCédric Le Goater amc->spi_model = "mx66l1g45g"; 136363ceb818SCédric Le Goater amc->num_cs = 2; 1364d3bad7e7SCédric Le Goater amc->macs_mask = ASPEED_MAC2_ON; 136563ceb818SCédric Le Goater amc->i2c_init = witherspoon_bmc_i2c_init; /* Same board layout */ 136663ceb818SCédric Le Goater mc->default_ram_size = 1 * GiB; 1367b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1368b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 136963ceb818SCédric Le Goater }; 137063ceb818SCédric Le Goater 137195f068c8SJohn Wang static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data) 137295f068c8SJohn Wang { 137395f068c8SJohn Wang MachineClass *mc = MACHINE_CLASS(oc); 137495f068c8SJohn Wang AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 137595f068c8SJohn Wang 137695f068c8SJohn Wang mc->desc = "Bytedance G220A BMC (ARM1176)"; 137795f068c8SJohn Wang amc->soc_name = "ast2500-a1"; 137895f068c8SJohn Wang amc->hw_strap1 = G220A_BMC_HW_STRAP1; 137995f068c8SJohn Wang amc->fmc_model = "n25q512a"; 138095f068c8SJohn Wang amc->spi_model = "mx25l25635e"; 138195f068c8SJohn Wang amc->num_cs = 2; 13825bb825c8SGuenter Roeck amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 138395f068c8SJohn Wang amc->i2c_init = g220a_bmc_i2c_init; 138495f068c8SJohn Wang mc->default_ram_size = 1024 * MiB; 138595f068c8SJohn Wang mc->default_cpus = mc->min_cpus = mc->max_cpus = 138695f068c8SJohn Wang aspeed_soc_num_cpus(amc->soc_name); 138795f068c8SJohn Wang }; 138895f068c8SJohn Wang 138982b6a3f6SJohn Wang static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc, void *data) 139082b6a3f6SJohn Wang { 139182b6a3f6SJohn Wang MachineClass *mc = MACHINE_CLASS(oc); 139282b6a3f6SJohn Wang AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 139382b6a3f6SJohn Wang 139482b6a3f6SJohn Wang mc->desc = "Inspur FP5280G2 BMC (ARM1176)"; 139582b6a3f6SJohn Wang amc->soc_name = "ast2500-a1"; 139682b6a3f6SJohn Wang amc->hw_strap1 = FP5280G2_BMC_HW_STRAP1; 139782b6a3f6SJohn Wang amc->fmc_model = "n25q512a"; 139882b6a3f6SJohn Wang amc->spi_model = "mx25l25635e"; 139982b6a3f6SJohn Wang amc->num_cs = 2; 140082b6a3f6SJohn Wang amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 140182b6a3f6SJohn Wang amc->i2c_init = fp5280g2_bmc_i2c_init; 140282b6a3f6SJohn Wang mc->default_ram_size = 512 * MiB; 140382b6a3f6SJohn Wang mc->default_cpus = mc->min_cpus = mc->max_cpus = 140482b6a3f6SJohn Wang aspeed_soc_num_cpus(amc->soc_name); 140582b6a3f6SJohn Wang }; 140682b6a3f6SJohn Wang 140758e52bdbSCédric Le Goater static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data) 140858e52bdbSCédric Le Goater { 140958e52bdbSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 141058e52bdbSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 141158e52bdbSCédric Le Goater 1412f548f201SPeter Maydell mc->desc = "IBM Rainier BMC (Cortex-A7)"; 1413c5811bb3SJoel Stanley amc->soc_name = "ast2600-a3"; 141458e52bdbSCédric Le Goater amc->hw_strap1 = RAINIER_BMC_HW_STRAP1; 141558e52bdbSCédric Le Goater amc->hw_strap2 = RAINIER_BMC_HW_STRAP2; 141658e52bdbSCédric Le Goater amc->fmc_model = "mx66l1g45g"; 141758e52bdbSCédric Le Goater amc->spi_model = "mx66l1g45g"; 141858e52bdbSCédric Le Goater amc->num_cs = 2; 141958e52bdbSCédric Le Goater amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON; 142058e52bdbSCédric Le Goater amc->i2c_init = rainier_bmc_i2c_init; 142158e52bdbSCédric Le Goater mc->default_ram_size = 1 * GiB; 142258e52bdbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 142358e52bdbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 142458e52bdbSCédric Le Goater }; 142558e52bdbSCédric Le Goater 1426febbe308SPeter Delevoryas /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */ 1427febbe308SPeter Delevoryas #if HOST_LONG_BITS == 32 1428febbe308SPeter Delevoryas #define FUJI_BMC_RAM_SIZE (1 * GiB) 1429febbe308SPeter Delevoryas #else 1430febbe308SPeter Delevoryas #define FUJI_BMC_RAM_SIZE (2 * GiB) 1431febbe308SPeter Delevoryas #endif 1432febbe308SPeter Delevoryas 1433febbe308SPeter Delevoryas static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data) 1434febbe308SPeter Delevoryas { 1435febbe308SPeter Delevoryas MachineClass *mc = MACHINE_CLASS(oc); 1436febbe308SPeter Delevoryas AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1437febbe308SPeter Delevoryas 1438febbe308SPeter Delevoryas mc->desc = "Facebook Fuji BMC (Cortex-A7)"; 1439febbe308SPeter Delevoryas amc->soc_name = "ast2600-a3"; 1440febbe308SPeter Delevoryas amc->hw_strap1 = FUJI_BMC_HW_STRAP1; 1441febbe308SPeter Delevoryas amc->hw_strap2 = FUJI_BMC_HW_STRAP2; 1442febbe308SPeter Delevoryas amc->fmc_model = "mx66l1g45g"; 1443febbe308SPeter Delevoryas amc->spi_model = "mx66l1g45g"; 1444febbe308SPeter Delevoryas amc->num_cs = 2; 1445febbe308SPeter Delevoryas amc->macs_mask = ASPEED_MAC3_ON; 1446febbe308SPeter Delevoryas amc->i2c_init = fuji_bmc_i2c_init; 1447febbe308SPeter Delevoryas amc->uart_default = ASPEED_DEV_UART1; 1448febbe308SPeter Delevoryas mc->default_ram_size = FUJI_BMC_RAM_SIZE; 1449febbe308SPeter Delevoryas mc->default_cpus = mc->min_cpus = mc->max_cpus = 1450febbe308SPeter Delevoryas aspeed_soc_num_cpus(amc->soc_name); 1451febbe308SPeter Delevoryas }; 1452febbe308SPeter Delevoryas 1453104bdaffSPatrick Williams /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */ 1454104bdaffSPatrick Williams #if HOST_LONG_BITS == 32 1455104bdaffSPatrick Williams #define BLETCHLEY_BMC_RAM_SIZE (1 * GiB) 1456104bdaffSPatrick Williams #else 1457104bdaffSPatrick Williams #define BLETCHLEY_BMC_RAM_SIZE (2 * GiB) 1458104bdaffSPatrick Williams #endif 1459104bdaffSPatrick Williams 1460a20c54b1SPatrick Williams static void aspeed_machine_bletchley_class_init(ObjectClass *oc, void *data) 1461a20c54b1SPatrick Williams { 1462a20c54b1SPatrick Williams MachineClass *mc = MACHINE_CLASS(oc); 1463a20c54b1SPatrick Williams AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1464a20c54b1SPatrick Williams 1465a20c54b1SPatrick Williams mc->desc = "Facebook Bletchley BMC (Cortex-A7)"; 1466a20c54b1SPatrick Williams amc->soc_name = "ast2600-a3"; 1467a20c54b1SPatrick Williams amc->hw_strap1 = BLETCHLEY_BMC_HW_STRAP1; 1468a20c54b1SPatrick Williams amc->hw_strap2 = BLETCHLEY_BMC_HW_STRAP2; 1469a20c54b1SPatrick Williams amc->fmc_model = "w25q01jvq"; 1470a20c54b1SPatrick Williams amc->spi_model = NULL; 1471a20c54b1SPatrick Williams amc->num_cs = 2; 1472a20c54b1SPatrick Williams amc->macs_mask = ASPEED_MAC2_ON; 1473a20c54b1SPatrick Williams amc->i2c_init = bletchley_bmc_i2c_init; 1474104bdaffSPatrick Williams mc->default_ram_size = BLETCHLEY_BMC_RAM_SIZE; 1475a20c54b1SPatrick Williams mc->default_cpus = mc->min_cpus = mc->max_cpus = 1476a20c54b1SPatrick Williams aspeed_soc_num_cpus(amc->soc_name); 1477a20c54b1SPatrick Williams } 1478a20c54b1SPatrick Williams 14797966d70fSJason A. Donenfeld static void fby35_reset(MachineState *state, ShutdownCause reason) 1480fa699e80SPeter Delevoryas { 1481fa699e80SPeter Delevoryas AspeedMachineState *bmc = ASPEED_MACHINE(state); 1482fa699e80SPeter Delevoryas AspeedGPIOState *gpio = &bmc->soc.gpio; 1483fa699e80SPeter Delevoryas 14847966d70fSJason A. Donenfeld qemu_devices_reset(reason); 1485fa699e80SPeter Delevoryas 1486f0418558SPeter Delevoryas /* Board ID: 7 (Class-1, 4 slots) */ 1487fa699e80SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioV4", true, &error_fatal); 1488fa699e80SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioV5", true, &error_fatal); 1489fa699e80SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioV6", true, &error_fatal); 1490fa699e80SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioV7", false, &error_fatal); 1491f0418558SPeter Delevoryas 1492f0418558SPeter Delevoryas /* Slot presence pins, inverse polarity. (False means present) */ 1493f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioH4", false, &error_fatal); 1494f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioH5", true, &error_fatal); 1495f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioH6", true, &error_fatal); 1496f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioH7", true, &error_fatal); 1497f0418558SPeter Delevoryas 1498f0418558SPeter Delevoryas /* Slot 12v power pins, normal polarity. (True means powered-on) */ 1499f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioB2", true, &error_fatal); 1500f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioB3", false, &error_fatal); 1501f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioB4", false, &error_fatal); 1502f0418558SPeter Delevoryas object_property_set_bool(OBJECT(gpio), "gpioB5", false, &error_fatal); 1503fa699e80SPeter Delevoryas } 1504fa699e80SPeter Delevoryas 1505fa699e80SPeter Delevoryas static void aspeed_machine_fby35_class_init(ObjectClass *oc, void *data) 1506fa699e80SPeter Delevoryas { 1507fa699e80SPeter Delevoryas MachineClass *mc = MACHINE_CLASS(oc); 1508fa699e80SPeter Delevoryas AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1509fa699e80SPeter Delevoryas 1510fa699e80SPeter Delevoryas mc->desc = "Facebook fby35 BMC (Cortex-A7)"; 1511fa699e80SPeter Delevoryas mc->reset = fby35_reset; 1512fa699e80SPeter Delevoryas amc->fmc_model = "mx66l1g45g"; 1513fa699e80SPeter Delevoryas amc->num_cs = 2; 1514fa699e80SPeter Delevoryas amc->macs_mask = ASPEED_MAC3_ON; 1515fa699e80SPeter Delevoryas amc->i2c_init = fby35_i2c_init; 1516fa699e80SPeter Delevoryas /* FIXME: Replace this macro with something more general */ 1517fa699e80SPeter Delevoryas mc->default_ram_size = FUJI_BMC_RAM_SIZE; 1518fa699e80SPeter Delevoryas } 1519fa699e80SPeter Delevoryas 152066c895b8SJamin Lin #define AST1030_INTERNAL_FLASH_SIZE (1024 * 1024) 152166c895b8SJamin Lin /* Main SYSCLK frequency in Hz (200MHz) */ 152266c895b8SJamin Lin #define SYSCLK_FRQ 200000000ULL 152366c895b8SJamin Lin 152466c895b8SJamin Lin static void aspeed_minibmc_machine_init(MachineState *machine) 152566c895b8SJamin Lin { 152666c895b8SJamin Lin AspeedMachineState *bmc = ASPEED_MACHINE(machine); 152766c895b8SJamin Lin AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine); 152866c895b8SJamin Lin Clock *sysclk; 152966c895b8SJamin Lin 153066c895b8SJamin Lin sysclk = clock_new(OBJECT(machine), "SYSCLK"); 153166c895b8SJamin Lin clock_set_hz(sysclk, SYSCLK_FRQ); 153266c895b8SJamin Lin 153366c895b8SJamin Lin object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name); 153466c895b8SJamin Lin qdev_connect_clock_in(DEVICE(&bmc->soc), "sysclk", sysclk); 153566c895b8SJamin Lin 15364dd9d554SPeter Delevoryas object_property_set_link(OBJECT(&bmc->soc), "memory", 15374dd9d554SPeter Delevoryas OBJECT(get_system_memory()), &error_abort); 1538d2b3eaefSPeter Delevoryas connect_serial_hds_to_uarts(bmc); 153966c895b8SJamin Lin qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort); 154066c895b8SJamin Lin 154166c895b8SJamin Lin aspeed_board_init_flashes(&bmc->soc.fmc, 154266c895b8SJamin Lin bmc->fmc_model ? bmc->fmc_model : amc->fmc_model, 154366c895b8SJamin Lin amc->num_cs, 154466c895b8SJamin Lin 0); 154566c895b8SJamin Lin 154666c895b8SJamin Lin aspeed_board_init_flashes(&bmc->soc.spi[0], 154766c895b8SJamin Lin bmc->spi_model ? bmc->spi_model : amc->spi_model, 154866c895b8SJamin Lin amc->num_cs, amc->num_cs); 154966c895b8SJamin Lin 155066c895b8SJamin Lin aspeed_board_init_flashes(&bmc->soc.spi[1], 155166c895b8SJamin Lin bmc->spi_model ? bmc->spi_model : amc->spi_model, 155266c895b8SJamin Lin amc->num_cs, (amc->num_cs * 2)); 155366c895b8SJamin Lin 155466c895b8SJamin Lin if (amc->i2c_init) { 155566c895b8SJamin Lin amc->i2c_init(bmc); 155666c895b8SJamin Lin } 155766c895b8SJamin Lin 155866c895b8SJamin Lin armv7m_load_kernel(ARM_CPU(first_cpu), 155966c895b8SJamin Lin machine->kernel_filename, 1560761c532aSPeter Maydell 0, 156166c895b8SJamin Lin AST1030_INTERNAL_FLASH_SIZE); 156266c895b8SJamin Lin } 156366c895b8SJamin Lin 15644c70ab16STroy Lee static void ast1030_evb_i2c_init(AspeedMachineState *bmc) 15654c70ab16STroy Lee { 15664c70ab16STroy Lee AspeedSoCState *soc = &bmc->soc; 15674c70ab16STroy Lee 15684c70ab16STroy Lee /* U10 24C08 connects to SDA/SCL Groupt 1 by default */ 15694c70ab16STroy Lee uint8_t *eeprom_buf = g_malloc0(32 * 1024); 15704c70ab16STroy Lee smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, eeprom_buf); 15714c70ab16STroy Lee 15724c70ab16STroy Lee /* U11 LM75 connects to SDA/SCL Group 2 by default */ 15734c70ab16STroy Lee i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d); 15744c70ab16STroy Lee } 15754c70ab16STroy Lee 157666c895b8SJamin Lin static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc, 157766c895b8SJamin Lin void *data) 157866c895b8SJamin Lin { 157966c895b8SJamin Lin MachineClass *mc = MACHINE_CLASS(oc); 158066c895b8SJamin Lin AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 158166c895b8SJamin Lin 158266c895b8SJamin Lin mc->desc = "Aspeed AST1030 MiniBMC (Cortex-M4)"; 158366c895b8SJamin Lin amc->soc_name = "ast1030-a1"; 158466c895b8SJamin Lin amc->hw_strap1 = 0; 158566c895b8SJamin Lin amc->hw_strap2 = 0; 158666c895b8SJamin Lin mc->init = aspeed_minibmc_machine_init; 15874c70ab16STroy Lee amc->i2c_init = ast1030_evb_i2c_init; 158866c895b8SJamin Lin mc->default_ram_size = 0; 158966c895b8SJamin Lin mc->default_cpus = mc->min_cpus = mc->max_cpus = 1; 159066c895b8SJamin Lin amc->fmc_model = "sst25vf032b"; 159166c895b8SJamin Lin amc->spi_model = "sst25vf032b"; 159266c895b8SJamin Lin amc->num_cs = 2; 159366c895b8SJamin Lin amc->macs_mask = 0; 159466c895b8SJamin Lin } 159566c895b8SJamin Lin 1596fb6b3c8dSJae Hyun Yoo static void aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass *oc, 1597fb6b3c8dSJae Hyun Yoo void *data) 1598fb6b3c8dSJae Hyun Yoo { 1599fb6b3c8dSJae Hyun Yoo MachineClass *mc = MACHINE_CLASS(oc); 1600fb6b3c8dSJae Hyun Yoo AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1601fb6b3c8dSJae Hyun Yoo 1602fb6b3c8dSJae Hyun Yoo mc->desc = "Qualcomm DC-SCM V1 BMC (Cortex A7)"; 1603fb6b3c8dSJae Hyun Yoo amc->soc_name = "ast2600-a3"; 1604fb6b3c8dSJae Hyun Yoo amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1; 1605fb6b3c8dSJae Hyun Yoo amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2; 1606fb6b3c8dSJae Hyun Yoo amc->fmc_model = "n25q512a"; 1607fb6b3c8dSJae Hyun Yoo amc->spi_model = "n25q512a"; 1608fb6b3c8dSJae Hyun Yoo amc->num_cs = 2; 1609fb6b3c8dSJae Hyun Yoo amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON; 1610fb6b3c8dSJae Hyun Yoo amc->i2c_init = qcom_dc_scm_bmc_i2c_init; 1611fb6b3c8dSJae Hyun Yoo mc->default_ram_size = 1 * GiB; 1612fb6b3c8dSJae Hyun Yoo mc->default_cpus = mc->min_cpus = mc->max_cpus = 1613fb6b3c8dSJae Hyun Yoo aspeed_soc_num_cpus(amc->soc_name); 1614fb6b3c8dSJae Hyun Yoo }; 1615fb6b3c8dSJae Hyun Yoo 1616ece4cccdSGraeme Gregory static void aspeed_machine_qcom_firework_class_init(ObjectClass *oc, 1617ece4cccdSGraeme Gregory void *data) 1618ece4cccdSGraeme Gregory { 1619ece4cccdSGraeme Gregory MachineClass *mc = MACHINE_CLASS(oc); 1620ece4cccdSGraeme Gregory AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1621ece4cccdSGraeme Gregory 1622ece4cccdSGraeme Gregory mc->desc = "Qualcomm DC-SCM V1/Firework BMC (Cortex A7)"; 1623ece4cccdSGraeme Gregory amc->soc_name = "ast2600-a3"; 1624ece4cccdSGraeme Gregory amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1; 1625ece4cccdSGraeme Gregory amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2; 1626ece4cccdSGraeme Gregory amc->fmc_model = "n25q512a"; 1627ece4cccdSGraeme Gregory amc->spi_model = "n25q512a"; 1628ece4cccdSGraeme Gregory amc->num_cs = 2; 1629ece4cccdSGraeme Gregory amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON; 1630ece4cccdSGraeme Gregory amc->i2c_init = qcom_dc_scm_firework_i2c_init; 1631ece4cccdSGraeme Gregory mc->default_ram_size = 1 * GiB; 1632ece4cccdSGraeme Gregory mc->default_cpus = mc->min_cpus = mc->max_cpus = 1633ece4cccdSGraeme Gregory aspeed_soc_num_cpus(amc->soc_name); 1634ece4cccdSGraeme Gregory }; 1635ece4cccdSGraeme Gregory 1636baa4732bSCédric Le Goater static const TypeInfo aspeed_machine_types[] = { 1637baa4732bSCédric Le Goater { 1638baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("palmetto-bmc"), 1639baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1640baa4732bSCédric Le Goater .class_init = aspeed_machine_palmetto_class_init, 1641baa4732bSCédric Le Goater }, { 164240a38df5SErik Smit .name = MACHINE_TYPE_NAME("supermicrox11-bmc"), 164340a38df5SErik Smit .parent = TYPE_ASPEED_MACHINE, 164440a38df5SErik Smit .class_init = aspeed_machine_supermicrox11_bmc_class_init, 164540a38df5SErik Smit }, { 164647936597SGuenter Roeck .name = MACHINE_TYPE_NAME("supermicro-x11spi-bmc"), 164747936597SGuenter Roeck .parent = TYPE_ASPEED_MACHINE, 164847936597SGuenter Roeck .class_init = aspeed_machine_supermicro_x11spi_bmc_class_init, 164947936597SGuenter Roeck }, { 1650baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("ast2500-evb"), 1651baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1652baa4732bSCédric Le Goater .class_init = aspeed_machine_ast2500_evb_class_init, 1653baa4732bSCédric Le Goater }, { 1654baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("romulus-bmc"), 1655baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1656baa4732bSCédric Le Goater .class_init = aspeed_machine_romulus_class_init, 1657baa4732bSCédric Le Goater }, { 1658143b040fSPatrick Williams .name = MACHINE_TYPE_NAME("sonorapass-bmc"), 1659143b040fSPatrick Williams .parent = TYPE_ASPEED_MACHINE, 1660143b040fSPatrick Williams .class_init = aspeed_machine_sonorapass_class_init, 1661143b040fSPatrick Williams }, { 1662baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("witherspoon-bmc"), 1663baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1664baa4732bSCédric Le Goater .class_init = aspeed_machine_witherspoon_class_init, 1665baa4732bSCédric Le Goater }, { 1666baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("ast2600-evb"), 1667baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1668baa4732bSCédric Le Goater .class_init = aspeed_machine_ast2600_evb_class_init, 1669baa4732bSCédric Le Goater }, { 167034f73a81SKarthikeyan Pasupathi .name = MACHINE_TYPE_NAME("yosemitev2-bmc"), 167134f73a81SKarthikeyan Pasupathi .parent = TYPE_ASPEED_MACHINE, 167234f73a81SKarthikeyan Pasupathi .class_init = aspeed_machine_yosemitev2_class_init, 167334f73a81SKarthikeyan Pasupathi }, { 167463ceb818SCédric Le Goater .name = MACHINE_TYPE_NAME("tacoma-bmc"), 167563ceb818SCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 167663ceb818SCédric Le Goater .class_init = aspeed_machine_tacoma_class_init, 167763ceb818SCédric Le Goater }, { 16786c323abaSKarthikeyan Pasupathi .name = MACHINE_TYPE_NAME("tiogapass-bmc"), 16796c323abaSKarthikeyan Pasupathi .parent = TYPE_ASPEED_MACHINE, 16806c323abaSKarthikeyan Pasupathi .class_init = aspeed_machine_tiogapass_class_init, 16816c323abaSKarthikeyan Pasupathi }, { 168295f068c8SJohn Wang .name = MACHINE_TYPE_NAME("g220a-bmc"), 168395f068c8SJohn Wang .parent = TYPE_ASPEED_MACHINE, 168495f068c8SJohn Wang .class_init = aspeed_machine_g220a_class_init, 168595f068c8SJohn Wang }, { 1686fb6b3c8dSJae Hyun Yoo .name = MACHINE_TYPE_NAME("qcom-dc-scm-v1-bmc"), 1687fb6b3c8dSJae Hyun Yoo .parent = TYPE_ASPEED_MACHINE, 1688fb6b3c8dSJae Hyun Yoo .class_init = aspeed_machine_qcom_dc_scm_v1_class_init, 1689fb6b3c8dSJae Hyun Yoo }, { 1690ece4cccdSGraeme Gregory .name = MACHINE_TYPE_NAME("qcom-firework-bmc"), 1691ece4cccdSGraeme Gregory .parent = TYPE_ASPEED_MACHINE, 1692ece4cccdSGraeme Gregory .class_init = aspeed_machine_qcom_firework_class_init, 1693ece4cccdSGraeme Gregory }, { 169482b6a3f6SJohn Wang .name = MACHINE_TYPE_NAME("fp5280g2-bmc"), 169582b6a3f6SJohn Wang .parent = TYPE_ASPEED_MACHINE, 169682b6a3f6SJohn Wang .class_init = aspeed_machine_fp5280g2_class_init, 169782b6a3f6SJohn Wang }, { 16989cccb912SPatrick Venture .name = MACHINE_TYPE_NAME("quanta-q71l-bmc"), 16999cccb912SPatrick Venture .parent = TYPE_ASPEED_MACHINE, 17009cccb912SPatrick Venture .class_init = aspeed_machine_quanta_q71l_class_init, 17019cccb912SPatrick Venture }, { 170258e52bdbSCédric Le Goater .name = MACHINE_TYPE_NAME("rainier-bmc"), 170358e52bdbSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 170458e52bdbSCédric Le Goater .class_init = aspeed_machine_rainier_class_init, 170558e52bdbSCédric Le Goater }, { 1706febbe308SPeter Delevoryas .name = MACHINE_TYPE_NAME("fuji-bmc"), 1707febbe308SPeter Delevoryas .parent = TYPE_ASPEED_MACHINE, 1708febbe308SPeter Delevoryas .class_init = aspeed_machine_fuji_class_init, 1709febbe308SPeter Delevoryas }, { 1710a20c54b1SPatrick Williams .name = MACHINE_TYPE_NAME("bletchley-bmc"), 1711a20c54b1SPatrick Williams .parent = TYPE_ASPEED_MACHINE, 1712a20c54b1SPatrick Williams .class_init = aspeed_machine_bletchley_class_init, 1713a20c54b1SPatrick Williams }, { 1714fa699e80SPeter Delevoryas .name = MACHINE_TYPE_NAME("fby35-bmc"), 1715fa699e80SPeter Delevoryas .parent = MACHINE_TYPE_NAME("ast2600-evb"), 1716fa699e80SPeter Delevoryas .class_init = aspeed_machine_fby35_class_init, 1717fa699e80SPeter Delevoryas }, { 171866c895b8SJamin Lin .name = MACHINE_TYPE_NAME("ast1030-evb"), 171966c895b8SJamin Lin .parent = TYPE_ASPEED_MACHINE, 172066c895b8SJamin Lin .class_init = aspeed_minibmc_machine_ast1030_evb_class_init, 172166c895b8SJamin Lin }, { 1722fca9ca1bSCédric Le Goater .name = TYPE_ASPEED_MACHINE, 172362c2c2ebSCédric Le Goater .parent = TYPE_MACHINE, 1724888b2b03SPhilippe Mathieu-Daudé .instance_size = sizeof(AspeedMachineState), 17251a15311aSCédric Le Goater .instance_init = aspeed_machine_instance_init, 1726fca9ca1bSCédric Le Goater .class_size = sizeof(AspeedMachineClass), 1727fca9ca1bSCédric Le Goater .class_init = aspeed_machine_class_init, 1728baa4732bSCédric Le Goater .abstract = true, 1729baa4732bSCédric Le Goater } 1730fca9ca1bSCédric Le Goater }; 173174fb1f38SCédric Le Goater 1732baa4732bSCédric Le Goater DEFINE_TYPES(aspeed_machine_types) 1733