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" 173ec75e39SPatrick Venture #include "hw/i2c/i2c_mux_pca954x.h" 1893198b6cSCorey Minyard #include "hw/i2c/smbus_eeprom.h" 19044475f3SPhilippe Mathieu-Daudé #include "hw/misc/pca9552.h" 205e9ae4b1SCorey Minyard #include "hw/sensor/tmp105.h" 217cfbde5eSPhilippe Mathieu-Daudé #include "hw/misc/led.h" 22a27bd6c7SMarkus Armbruster #include "hw/qdev-properties.h" 23e1ad9bc4SCédric Le Goater #include "sysemu/block-backend.h" 24d769a1daSCédric Le Goater #include "hw/loader.h" 25d769a1daSCédric Le Goater #include "qemu/error-report.h" 26a9df9622SJoel Stanley #include "qemu/units.h" 27327d8e4eSAndrew Jeffery 2874fb1f38SCédric Le Goater static struct arm_boot_info aspeed_board_binfo = { 29b033271fSCédric Le Goater .board_id = -1, /* device-tree-only board */ 30327d8e4eSAndrew Jeffery }; 31327d8e4eSAndrew Jeffery 32612b219aSPhilippe Mathieu-Daudé struct AspeedMachineState { 33888b2b03SPhilippe Mathieu-Daudé /* Private */ 34888b2b03SPhilippe Mathieu-Daudé MachineState parent_obj; 35888b2b03SPhilippe Mathieu-Daudé /* Public */ 36888b2b03SPhilippe Mathieu-Daudé 37ff90606fSCédric Le Goater AspeedSoCState soc; 38ad1a9782SCédric Le Goater MemoryRegion ram_container; 39ebe31c0aSCédric Le Goater MemoryRegion max_ram; 40888b2b03SPhilippe Mathieu-Daudé bool mmio_exec; 419820e52fSCédric Le Goater char *fmc_model; 429820e52fSCédric Le Goater char *spi_model; 43ea066d39SThomas Huth }; 44327d8e4eSAndrew Jeffery 45ef17f836SCédric Le Goater /* Palmetto hardware value: 0x120CE416 */ 468da33ef7SCédric Le Goater #define PALMETTO_BMC_HW_STRAP1 ( \ 478da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_256MB) | \ 488da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_DRAM_CONFIG(2 /* DDR3 with CL=6, CWL=5 */) | \ 498da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_ACPI_DIS | \ 508da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) | \ 518da33ef7SCédric Le Goater SCU_HW_STRAP_VGA_CLASS_CODE | \ 528da33ef7SCédric Le Goater SCU_HW_STRAP_LPC_RESET_PIN | \ 538da33ef7SCédric Le Goater SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) | \ 548da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \ 558da33ef7SCédric Le Goater SCU_HW_STRAP_SPI_WIDTH | \ 568da33ef7SCédric Le Goater SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \ 578da33ef7SCédric Le Goater SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT)) 588da33ef7SCédric Le Goater 5940a38df5SErik Smit /* TODO: Find the actual hardware value */ 6040a38df5SErik Smit #define SUPERMICROX11_BMC_HW_STRAP1 ( \ 6140a38df5SErik Smit SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) | \ 6240a38df5SErik Smit SCU_AST2400_HW_STRAP_DRAM_CONFIG(2) | \ 6340a38df5SErik Smit SCU_AST2400_HW_STRAP_ACPI_DIS | \ 6440a38df5SErik Smit SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) | \ 6540a38df5SErik Smit SCU_HW_STRAP_VGA_CLASS_CODE | \ 6640a38df5SErik Smit SCU_HW_STRAP_LPC_RESET_PIN | \ 6740a38df5SErik Smit SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) | \ 6840a38df5SErik Smit SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \ 6940a38df5SErik Smit SCU_HW_STRAP_SPI_WIDTH | \ 7040a38df5SErik Smit SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \ 7140a38df5SErik Smit SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT)) 7240a38df5SErik Smit 73ef17f836SCédric Le Goater /* AST2500 evb hardware value: 0xF100C2E6 */ 749a7c1750SCédric Le Goater #define AST2500_EVB_HW_STRAP1 (( \ 759a7c1750SCédric Le Goater AST2500_HW_STRAP1_DEFAULTS | \ 769a7c1750SCédric Le Goater SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 779a7c1750SCédric Le Goater SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 789a7c1750SCédric Le Goater SCU_AST2500_HW_STRAP_UART_DEBUG | \ 799a7c1750SCédric Le Goater SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 809a7c1750SCédric Le Goater SCU_HW_STRAP_MAC1_RGMII | \ 819a7c1750SCédric Le Goater SCU_HW_STRAP_MAC0_RGMII) & \ 829a7c1750SCédric Le Goater ~SCU_HW_STRAP_2ND_BOOT_WDT) 839a7c1750SCédric Le Goater 84ef17f836SCédric Le Goater /* Romulus hardware value: 0xF10AD206 */ 85ef17f836SCédric Le Goater #define ROMULUS_BMC_HW_STRAP1 ( \ 86ef17f836SCédric Le Goater AST2500_HW_STRAP1_DEFAULTS | \ 87ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 88ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 89ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_UART_DEBUG | \ 90ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 91ef17f836SCédric Le Goater SCU_AST2500_HW_STRAP_ACPI_ENABLE | \ 92ef17f836SCédric Le Goater SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER)) 93ef17f836SCédric Le Goater 94143b040fSPatrick Williams /* Sonorapass hardware value: 0xF100D216 */ 95143b040fSPatrick Williams #define SONORAPASS_BMC_HW_STRAP1 ( \ 96143b040fSPatrick Williams SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 97143b040fSPatrick Williams SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 98143b040fSPatrick Williams SCU_AST2500_HW_STRAP_UART_DEBUG | \ 99143b040fSPatrick Williams SCU_AST2500_HW_STRAP_RESERVED28 | \ 100143b040fSPatrick Williams SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 101143b040fSPatrick Williams SCU_HW_STRAP_VGA_CLASS_CODE | \ 102143b040fSPatrick Williams SCU_HW_STRAP_LPC_RESET_PIN | \ 103143b040fSPatrick Williams SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \ 104143b040fSPatrick Williams SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \ 105143b040fSPatrick Williams SCU_HW_STRAP_VGA_BIOS_ROM | \ 106143b040fSPatrick Williams SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \ 107143b040fSPatrick Williams SCU_AST2500_HW_STRAP_RESERVED1) 108143b040fSPatrick Williams 109aae7a18dSAdriana Kobylak /* Swift hardware value: 0xF11AD206 */ 110aae7a18dSAdriana Kobylak #define SWIFT_BMC_HW_STRAP1 ( \ 111aae7a18dSAdriana Kobylak AST2500_HW_STRAP1_DEFAULTS | \ 112aae7a18dSAdriana Kobylak SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 113aae7a18dSAdriana Kobylak SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 114aae7a18dSAdriana Kobylak SCU_AST2500_HW_STRAP_UART_DEBUG | \ 115aae7a18dSAdriana Kobylak SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 116aae7a18dSAdriana Kobylak SCU_H_PLL_BYPASS_EN | \ 117aae7a18dSAdriana Kobylak SCU_AST2500_HW_STRAP_ACPI_ENABLE | \ 118aae7a18dSAdriana Kobylak SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER)) 119aae7a18dSAdriana Kobylak 12095f068c8SJohn Wang #define G220A_BMC_HW_STRAP1 ( \ 12195f068c8SJohn Wang SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 12295f068c8SJohn Wang SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 12395f068c8SJohn Wang SCU_AST2500_HW_STRAP_UART_DEBUG | \ 12495f068c8SJohn Wang SCU_AST2500_HW_STRAP_RESERVED28 | \ 12595f068c8SJohn Wang SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 12695f068c8SJohn Wang SCU_HW_STRAP_2ND_BOOT_WDT | \ 12795f068c8SJohn Wang SCU_HW_STRAP_VGA_CLASS_CODE | \ 12895f068c8SJohn Wang SCU_HW_STRAP_LPC_RESET_PIN | \ 12995f068c8SJohn Wang SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \ 13095f068c8SJohn Wang SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \ 13195f068c8SJohn Wang SCU_HW_STRAP_VGA_SIZE_SET(VGA_64M_DRAM) | \ 13295f068c8SJohn Wang SCU_AST2500_HW_STRAP_RESERVED1) 13395f068c8SJohn Wang 13462c2c2ebSCédric Le Goater /* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */ 13562c2c2ebSCédric Le Goater #define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1 13662c2c2ebSCédric Le Goater 1379cccb912SPatrick Venture /* Quanta-Q71l hardware value */ 1389cccb912SPatrick Venture #define QUANTA_Q71L_BMC_HW_STRAP1 ( \ 1399cccb912SPatrick Venture SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) | \ 1409cccb912SPatrick Venture SCU_AST2400_HW_STRAP_DRAM_CONFIG(2/* DDR3 with CL=6, CWL=5 */) | \ 1419cccb912SPatrick Venture SCU_AST2400_HW_STRAP_ACPI_DIS | \ 1429cccb912SPatrick Venture SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_24M_IN) | \ 1439cccb912SPatrick Venture SCU_HW_STRAP_VGA_CLASS_CODE | \ 1449cccb912SPatrick Venture SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_PASS_THROUGH) | \ 1459cccb912SPatrick Venture SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \ 1469cccb912SPatrick Venture SCU_HW_STRAP_SPI_WIDTH | \ 1479cccb912SPatrick Venture SCU_HW_STRAP_VGA_SIZE_SET(VGA_8M_DRAM) | \ 1489cccb912SPatrick Venture SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT)) 1499cccb912SPatrick Venture 150ccc2c418SCédric Le Goater /* AST2600 evb hardware value */ 151ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP1 0x000000C0 152ccc2c418SCédric Le Goater #define AST2600_EVB_HW_STRAP2 0x00000003 153ccc2c418SCédric Le Goater 15463ceb818SCédric Le Goater /* Tacoma hardware value */ 15563ceb818SCédric Le Goater #define TACOMA_BMC_HW_STRAP1 0x00000000 1567582591aSJoel Stanley #define TACOMA_BMC_HW_STRAP2 0x00000040 15763ceb818SCédric Le Goater 15858e52bdbSCédric Le Goater /* Rainier hardware value: (QEMU prototype) */ 15958e52bdbSCédric Le Goater #define RAINIER_BMC_HW_STRAP1 0x00000000 16058e52bdbSCédric Le Goater #define RAINIER_BMC_HW_STRAP2 0x00000000 16158e52bdbSCédric Le Goater 162*febbe308SPeter Delevoryas /* Fuji hardware value */ 163*febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP1 0x00000000 164*febbe308SPeter Delevoryas #define FUJI_BMC_HW_STRAP2 0x00000000 165*febbe308SPeter Delevoryas 166ebe31c0aSCédric Le Goater /* 167ebe31c0aSCédric Le Goater * The max ram region is for firmwares that scan the address space 168ebe31c0aSCédric Le Goater * with load/store to guess how much RAM the SoC has. 169ebe31c0aSCédric Le Goater */ 170ebe31c0aSCédric Le Goater static uint64_t max_ram_read(void *opaque, hwaddr offset, unsigned size) 171ebe31c0aSCédric Le Goater { 172ebe31c0aSCédric Le Goater return 0; 173ebe31c0aSCédric Le Goater } 174ebe31c0aSCédric Le Goater 175ebe31c0aSCédric Le Goater static void max_ram_write(void *opaque, hwaddr offset, uint64_t value, 176ebe31c0aSCédric Le Goater unsigned size) 177ebe31c0aSCédric Le Goater { 178ebe31c0aSCédric Le Goater /* Discard writes */ 179ebe31c0aSCédric Le Goater } 180ebe31c0aSCédric Le Goater 181ebe31c0aSCédric Le Goater static const MemoryRegionOps max_ram_ops = { 182ebe31c0aSCédric Le Goater .read = max_ram_read, 183ebe31c0aSCédric Le Goater .write = max_ram_write, 184ebe31c0aSCédric Le Goater .endianness = DEVICE_NATIVE_ENDIAN, 185ebe31c0aSCédric Le Goater }; 186ebe31c0aSCédric Le Goater 1879bb6d140SJoel Stanley #define AST_SMP_MAILBOX_BASE 0x1e6e2180 1889bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_ENTRY (AST_SMP_MAILBOX_BASE + 0x0) 1899bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_GOSIGN (AST_SMP_MAILBOX_BASE + 0x4) 1909bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_READY (AST_SMP_MAILBOX_BASE + 0x8) 1919bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_POLLINSN (AST_SMP_MAILBOX_BASE + 0xc) 1929bb6d140SJoel Stanley #define AST_SMP_MBOX_CODE (AST_SMP_MAILBOX_BASE + 0x10) 1939bb6d140SJoel Stanley #define AST_SMP_MBOX_GOSIGN 0xabbaab00 1949bb6d140SJoel Stanley 1959bb6d140SJoel Stanley static void aspeed_write_smpboot(ARMCPU *cpu, 1969bb6d140SJoel Stanley const struct arm_boot_info *info) 1979bb6d140SJoel Stanley { 1989bb6d140SJoel Stanley static const uint32_t poll_mailbox_ready[] = { 1999bb6d140SJoel Stanley /* 2009bb6d140SJoel Stanley * r2 = per-cpu go sign value 2019bb6d140SJoel Stanley * r1 = AST_SMP_MBOX_FIELD_ENTRY 2029bb6d140SJoel Stanley * r0 = AST_SMP_MBOX_FIELD_GOSIGN 2039bb6d140SJoel Stanley */ 2049bb6d140SJoel Stanley 0xee100fb0, /* mrc p15, 0, r0, c0, c0, 5 */ 2059bb6d140SJoel Stanley 0xe21000ff, /* ands r0, r0, #255 */ 2069bb6d140SJoel Stanley 0xe59f201c, /* ldr r2, [pc, #28] */ 2079bb6d140SJoel Stanley 0xe1822000, /* orr r2, r2, r0 */ 2089bb6d140SJoel Stanley 2099bb6d140SJoel Stanley 0xe59f1018, /* ldr r1, [pc, #24] */ 2109bb6d140SJoel Stanley 0xe59f0018, /* ldr r0, [pc, #24] */ 2119bb6d140SJoel Stanley 2129bb6d140SJoel Stanley 0xe320f002, /* wfe */ 2139bb6d140SJoel Stanley 0xe5904000, /* ldr r4, [r0] */ 2149bb6d140SJoel Stanley 0xe1520004, /* cmp r2, r4 */ 2159bb6d140SJoel Stanley 0x1afffffb, /* bne <wfe> */ 2169bb6d140SJoel Stanley 0xe591f000, /* ldr pc, [r1] */ 2179bb6d140SJoel Stanley AST_SMP_MBOX_GOSIGN, 2189bb6d140SJoel Stanley AST_SMP_MBOX_FIELD_ENTRY, 2199bb6d140SJoel Stanley AST_SMP_MBOX_FIELD_GOSIGN, 2209bb6d140SJoel Stanley }; 2219bb6d140SJoel Stanley 2229bb6d140SJoel Stanley rom_add_blob_fixed("aspeed.smpboot", poll_mailbox_ready, 2239bb6d140SJoel Stanley sizeof(poll_mailbox_ready), 2249bb6d140SJoel Stanley info->smp_loader_start); 2259bb6d140SJoel Stanley } 2269bb6d140SJoel Stanley 2279bb6d140SJoel Stanley static void aspeed_reset_secondary(ARMCPU *cpu, 2289bb6d140SJoel Stanley const struct arm_boot_info *info) 2299bb6d140SJoel Stanley { 2309bb6d140SJoel Stanley AddressSpace *as = arm_boot_address_space(cpu, info); 2319bb6d140SJoel Stanley CPUState *cs = CPU(cpu); 2329bb6d140SJoel Stanley 2339bb6d140SJoel Stanley /* info->smp_bootreg_addr */ 2349bb6d140SJoel Stanley address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0, 2359bb6d140SJoel Stanley MEMTXATTRS_UNSPECIFIED, NULL); 2369bb6d140SJoel Stanley cpu_set_pc(cs, info->smp_loader_start); 2379bb6d140SJoel Stanley } 2389bb6d140SJoel Stanley 239d769a1daSCédric Le Goater #define FIRMWARE_ADDR 0x0 240d769a1daSCédric Le Goater 241d769a1daSCédric Le Goater static void write_boot_rom(DriveInfo *dinfo, hwaddr addr, size_t rom_size, 242d769a1daSCédric Le Goater Error **errp) 243d769a1daSCédric Le Goater { 244d769a1daSCédric Le Goater BlockBackend *blk = blk_by_legacy_dinfo(dinfo); 245d769a1daSCédric Le Goater uint8_t *storage; 2460c7209beSCédric Le Goater int64_t size; 247d769a1daSCédric Le Goater 2480c7209beSCédric Le Goater /* The block backend size should have already been 'validated' by 2490c7209beSCédric Le Goater * the creation of the m25p80 object. 2500c7209beSCédric Le Goater */ 2510c7209beSCédric Le Goater size = blk_getlength(blk); 2520c7209beSCédric Le Goater if (size <= 0) { 2530c7209beSCédric Le Goater error_setg(errp, "failed to get flash size"); 2540c7209beSCédric Le Goater return; 2550c7209beSCédric Le Goater } 2560c7209beSCédric Le Goater 2570c7209beSCédric Le Goater if (rom_size > size) { 2580c7209beSCédric Le Goater rom_size = size; 259d769a1daSCédric Le Goater } 260d769a1daSCédric Le Goater 261d769a1daSCédric Le Goater storage = g_new0(uint8_t, rom_size); 262d769a1daSCédric Le Goater if (blk_pread(blk, 0, storage, rom_size) < 0) { 263d769a1daSCédric Le Goater error_setg(errp, "failed to read the initial flash content"); 264d769a1daSCédric Le Goater return; 265d769a1daSCédric Le Goater } 266d769a1daSCédric Le Goater 267d769a1daSCédric Le Goater rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr); 268d769a1daSCédric Le Goater g_free(storage); 269d769a1daSCédric Le Goater } 270d769a1daSCédric Le Goater 271c20b4cccSMarkus Armbruster static void aspeed_board_init_flashes(AspeedSMCState *s, 272c20b4cccSMarkus Armbruster const char *flashtype) 273e1ad9bc4SCédric Le Goater { 274e1ad9bc4SCédric Le Goater int i ; 275e1ad9bc4SCédric Le Goater 276e1ad9bc4SCédric Le Goater for (i = 0; i < s->num_cs; ++i) { 277e1ad9bc4SCédric Le Goater AspeedSMCFlash *fl = &s->flashes[i]; 278e1ad9bc4SCédric Le Goater DriveInfo *dinfo = drive_get_next(IF_MTD); 279e1ad9bc4SCédric Le Goater qemu_irq cs_line; 280e1ad9bc4SCédric Le Goater 28157d479c9SMarkus Armbruster fl->flash = qdev_new(flashtype); 282e1ad9bc4SCédric Le Goater if (dinfo) { 283c20b4cccSMarkus Armbruster qdev_prop_set_drive(fl->flash, "drive", 284c20b4cccSMarkus Armbruster blk_by_legacy_dinfo(dinfo)); 285e1ad9bc4SCédric Le Goater } 28657d479c9SMarkus Armbruster qdev_realize_and_unref(fl->flash, BUS(s->spi), &error_fatal); 287e1ad9bc4SCédric Le Goater 288e1ad9bc4SCédric Le Goater cs_line = qdev_get_gpio_in_named(fl->flash, SSI_GPIO_CS, 0); 289e1ad9bc4SCédric Le Goater sysbus_connect_irq(SYS_BUS_DEVICE(s), i + 1, cs_line); 290e1ad9bc4SCédric Le Goater } 291e1ad9bc4SCédric Le Goater } 292e1ad9bc4SCédric Le Goater 293a29e3e12SAndrew Jeffery static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo) 294a29e3e12SAndrew Jeffery { 295a29e3e12SAndrew Jeffery DeviceState *card; 296a29e3e12SAndrew Jeffery 297756f739bSPhilippe Mathieu-Daudé if (!dinfo) { 298756f739bSPhilippe Mathieu-Daudé return; 299756f739bSPhilippe Mathieu-Daudé } 3003e80f690SMarkus Armbruster card = qdev_new(TYPE_SD_CARD); 301934df912SMarkus Armbruster qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo), 302a29e3e12SAndrew Jeffery &error_fatal); 3033e80f690SMarkus Armbruster qdev_realize_and_unref(card, 3043e80f690SMarkus Armbruster qdev_get_child_bus(DEVICE(sdhci), "sd-bus"), 3053e80f690SMarkus Armbruster &error_fatal); 306a29e3e12SAndrew Jeffery } 307a29e3e12SAndrew Jeffery 308baa4732bSCédric Le Goater static void aspeed_machine_init(MachineState *machine) 309327d8e4eSAndrew Jeffery { 310888b2b03SPhilippe Mathieu-Daudé AspeedMachineState *bmc = ASPEED_MACHINE(machine); 311baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine); 312b033271fSCédric Le Goater AspeedSoCClass *sc; 313d769a1daSCédric Le Goater DriveInfo *drive0 = drive_get(IF_MTD, 0, 0); 314ebe31c0aSCédric Le Goater ram_addr_t max_ram_size; 3152bea128cSEddie James int i; 316d3bad7e7SCédric Le Goater NICInfo *nd = &nd_table[0]; 317327d8e4eSAndrew Jeffery 318ad1a9782SCédric Le Goater memory_region_init(&bmc->ram_container, NULL, "aspeed-ram-container", 3197df9f028SPhilippe Mathieu-Daudé 4 * GiB); 320afcbaed6SIgor Mammedov memory_region_add_subregion(&bmc->ram_container, 0, machine->ram); 321ad1a9782SCédric Le Goater 3229fc7fc4dSMarkus Armbruster object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name); 323327d8e4eSAndrew Jeffery 324b033271fSCédric Le Goater sc = ASPEED_SOC_GET_CLASS(&bmc->soc); 325b033271fSCédric Le Goater 326533eb415SIgor Mammedov /* 327533eb415SIgor Mammedov * This will error out if isize is not supported by memory controller. 328533eb415SIgor Mammedov */ 3296e504a98SPaolo Bonzini object_property_set_uint(OBJECT(&bmc->soc), "ram-size", machine->ram_size, 330533eb415SIgor Mammedov &error_fatal); 331533eb415SIgor Mammedov 332d3bad7e7SCédric Le Goater for (i = 0; i < sc->macs_num; i++) { 333d3bad7e7SCédric Le Goater if ((amc->macs_mask & (1 << i)) && nd->used) { 334d3bad7e7SCédric Le Goater qemu_check_nic_model(nd, TYPE_FTGMAC100); 335d3bad7e7SCédric Le Goater qdev_set_nic_properties(DEVICE(&bmc->soc.ftgmac100[i]), nd); 336d3bad7e7SCédric Le Goater nd++; 337d3bad7e7SCédric Le Goater } 338d3bad7e7SCédric Le Goater } 339d3bad7e7SCédric Le Goater 3405325cc34SMarkus Armbruster object_property_set_int(OBJECT(&bmc->soc), "hw-strap1", amc->hw_strap1, 34187e79af0SAndrew Jeffery &error_abort); 3425325cc34SMarkus Armbruster object_property_set_int(OBJECT(&bmc->soc), "hw-strap2", amc->hw_strap2, 343ccc2c418SCédric Le Goater &error_abort); 3445325cc34SMarkus Armbruster object_property_set_int(OBJECT(&bmc->soc), "num-cs", amc->num_cs, 34526d5df95SCédric Le Goater &error_abort); 3465325cc34SMarkus Armbruster object_property_set_link(OBJECT(&bmc->soc), "dram", 3470df2d9a6SCédric Le Goater OBJECT(machine->ram), &error_abort); 348b6e70d1dSJoel Stanley if (machine->kernel_filename) { 349b6e70d1dSJoel Stanley /* 350b6e70d1dSJoel Stanley * When booting with a -kernel command line there is no u-boot 351b6e70d1dSJoel Stanley * that runs to unlock the SCU. In this case set the default to 352b6e70d1dSJoel Stanley * be unlocked as the kernel expects 353b6e70d1dSJoel Stanley */ 3545325cc34SMarkus Armbruster object_property_set_int(OBJECT(&bmc->soc), "hw-prot-key", 3555325cc34SMarkus Armbruster ASPEED_SCU_PROT_KEY, &error_abort); 356b6e70d1dSJoel Stanley } 3575d63d0c7SPeter Delevoryas qdev_prop_set_uint32(DEVICE(&bmc->soc), "uart-default", 3585d63d0c7SPeter Delevoryas amc->uart_default); 359ce189ab2SMarkus Armbruster qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort); 360327d8e4eSAndrew Jeffery 361d783d1feSCédric Le Goater memory_region_add_subregion(get_system_memory(), 362347df6f8SEduardo Habkost sc->memmap[ASPEED_DEV_SDRAM], 363ad1a9782SCédric Le Goater &bmc->ram_container); 364de46f5f4SCédric Le Goater 365ebe31c0aSCédric Le Goater max_ram_size = object_property_get_uint(OBJECT(&bmc->soc), "max-ram-size", 366ebe31c0aSCédric Le Goater &error_abort); 367ebe31c0aSCédric Le Goater memory_region_init_io(&bmc->max_ram, NULL, &max_ram_ops, NULL, 3686e504a98SPaolo Bonzini "max_ram", max_ram_size - machine->ram_size); 3696e504a98SPaolo Bonzini memory_region_add_subregion(&bmc->ram_container, machine->ram_size, &bmc->max_ram); 370ebe31c0aSCédric Le Goater 3719820e52fSCédric Le Goater aspeed_board_init_flashes(&bmc->soc.fmc, bmc->fmc_model ? 3729820e52fSCédric Le Goater bmc->fmc_model : amc->fmc_model); 3739820e52fSCédric Le Goater aspeed_board_init_flashes(&bmc->soc.spi[0], bmc->spi_model ? 3749820e52fSCédric Le Goater bmc->spi_model : amc->spi_model); 375e1ad9bc4SCédric Le Goater 376d769a1daSCédric Le Goater /* Install first FMC flash content as a boot rom. */ 377d769a1daSCédric Le Goater if (drive0) { 378d769a1daSCédric Le Goater AspeedSMCFlash *fl = &bmc->soc.fmc.flashes[0]; 379d769a1daSCédric Le Goater MemoryRegion *boot_rom = g_new(MemoryRegion, 1); 380d769a1daSCédric Le Goater 381d769a1daSCédric Le Goater /* 382d769a1daSCédric Le Goater * create a ROM region using the default mapping window size of 38393bf276dSCédric Le Goater * the flash module. The window size is 64MB for the AST2400 38493bf276dSCédric Le Goater * SoC and 128MB for the AST2500 SoC, which is twice as big as 38593bf276dSCédric Le Goater * needed by the flash modules of the Aspeed machines. 386d769a1daSCédric Le Goater */ 3871a15311aSCédric Le Goater if (ASPEED_MACHINE(machine)->mmio_exec) { 388f489960dSPhilippe Mathieu-Daudé memory_region_init_alias(boot_rom, NULL, "aspeed.boot_rom", 3891a15311aSCédric Le Goater &fl->mmio, 0, fl->size); 3901a15311aSCédric Le Goater memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR, 3911a15311aSCédric Le Goater boot_rom); 3921a15311aSCédric Le Goater } else { 393f489960dSPhilippe Mathieu-Daudé memory_region_init_rom(boot_rom, NULL, "aspeed.boot_rom", 394d769a1daSCédric Le Goater fl->size, &error_abort); 395d769a1daSCédric Le Goater memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR, 396d769a1daSCédric Le Goater boot_rom); 397d769a1daSCédric Le Goater write_boot_rom(drive0, FIRMWARE_ADDR, fl->size, &error_abort); 398d769a1daSCédric Le Goater } 3991a15311aSCédric Le Goater } 400d769a1daSCédric Le Goater 401b7f1a0cbSCédric Le Goater if (machine->kernel_filename && sc->num_cpus > 1) { 4029bb6d140SJoel Stanley /* With no u-boot we must set up a boot stub for the secondary CPU */ 4039bb6d140SJoel Stanley MemoryRegion *smpboot = g_new(MemoryRegion, 1); 404f489960dSPhilippe Mathieu-Daudé memory_region_init_ram(smpboot, NULL, "aspeed.smpboot", 4059bb6d140SJoel Stanley 0x80, &error_abort); 4069bb6d140SJoel Stanley memory_region_add_subregion(get_system_memory(), 4079bb6d140SJoel Stanley AST_SMP_MAILBOX_BASE, smpboot); 4089bb6d140SJoel Stanley 4099bb6d140SJoel Stanley aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot; 4109bb6d140SJoel Stanley aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary; 4119bb6d140SJoel Stanley aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE; 4129bb6d140SJoel Stanley } 4139bb6d140SJoel Stanley 4146e504a98SPaolo Bonzini aspeed_board_binfo.ram_size = machine->ram_size; 415347df6f8SEduardo Habkost aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM]; 416b7f1a0cbSCédric Le Goater aspeed_board_binfo.nb_cpus = sc->num_cpus; 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++) { 423a29e3e12SAndrew Jeffery sdhci_attach_drive(&bmc->soc.sdhci.slots[i], drive_get_next(IF_SD)); 424a29e3e12SAndrew Jeffery } 4252bea128cSEddie James 426a29e3e12SAndrew Jeffery if (bmc->soc.emmc.num_slots) { 427a29e3e12SAndrew Jeffery sdhci_attach_drive(&bmc->soc.emmc.slots[0], drive_get_next(IF_SD)); 4282bea128cSEddie James } 4292bea128cSEddie James 4302744ece8STao Xu arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo); 431327d8e4eSAndrew Jeffery } 432327d8e4eSAndrew Jeffery 433612b219aSPhilippe Mathieu-Daudé static void palmetto_bmc_i2c_init(AspeedMachineState *bmc) 4342cf6cb50SCédric Le Goater { 4352cf6cb50SCédric Le Goater AspeedSoCState *soc = &bmc->soc; 436a87e81b9SCédric Le Goater DeviceState *dev; 4373d165f12SCédric Le Goater uint8_t *eeprom_buf = g_malloc0(32 * 1024); 4382cf6cb50SCédric Le Goater 4392cf6cb50SCédric Le Goater /* The palmetto platform expects a ds3231 RTC but a ds1338 is 4402cf6cb50SCédric Le Goater * enough to provide basic RTC features. Alarms will be missing */ 4411373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68); 442a87e81b9SCédric Le Goater 4437a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, 4443d165f12SCédric Le Goater eeprom_buf); 4453d165f12SCédric Le Goater 446a87e81b9SCédric Le Goater /* add a TMP423 temperature sensor */ 4471373b15bSPhilippe Mathieu-Daudé dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), 4481373b15bSPhilippe Mathieu-Daudé "tmp423", 0x4c)); 4495325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 4505325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 4515325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 4525325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort); 4532cf6cb50SCédric Le Goater } 4542cf6cb50SCédric Le Goater 4559cccb912SPatrick Venture static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc) 4569cccb912SPatrick Venture { 4579cccb912SPatrick Venture AspeedSoCState *soc = &bmc->soc; 4589cccb912SPatrick Venture 4599cccb912SPatrick Venture /* 4609cccb912SPatrick Venture * The quanta-q71l platform expects tmp75s which are compatible with 4619cccb912SPatrick Venture * tmp105s. 4629cccb912SPatrick Venture */ 4639cccb912SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c); 4649cccb912SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e); 4659cccb912SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f); 4669cccb912SPatrick Venture 4679cccb912SPatrick Venture /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */ 4689cccb912SPatrick Venture /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */ 4699cccb912SPatrick Venture /* TODO: Add Memory Riser i2c mux and eeproms. */ 4709cccb912SPatrick Venture 4713ec75e39SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74); 4723ec75e39SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77); 4733ec75e39SPatrick Venture 4749cccb912SPatrick Venture /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */ 4753ec75e39SPatrick Venture 4763ec75e39SPatrick Venture /* i2c-7 */ 4773ec75e39SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70); 4789cccb912SPatrick Venture /* - i2c@0: pmbus@59 */ 4799cccb912SPatrick Venture /* - i2c@1: pmbus@58 */ 4809cccb912SPatrick Venture /* - i2c@2: pmbus@58 */ 4819cccb912SPatrick Venture /* - i2c@3: pmbus@59 */ 4823ec75e39SPatrick Venture 4839cccb912SPatrick Venture /* TODO: i2c-7: Add PDB FRU eeprom@52 */ 4849cccb912SPatrick Venture /* TODO: i2c-8: Add BMC FRU eeprom@50 */ 4859cccb912SPatrick Venture } 4869cccb912SPatrick Venture 487612b219aSPhilippe Mathieu-Daudé static void ast2500_evb_i2c_init(AspeedMachineState *bmc) 4882cf6cb50SCédric Le Goater { 4892cf6cb50SCédric Le Goater AspeedSoCState *soc = &bmc->soc; 4903d165f12SCédric Le Goater uint8_t *eeprom_buf = g_malloc0(8 * 1024); 4913d165f12SCédric Le Goater 4927a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50, 4933d165f12SCédric Le Goater eeprom_buf); 4942cf6cb50SCédric Le Goater 4952cf6cb50SCédric Le Goater /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */ 4961373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), 497044475f3SPhilippe Mathieu-Daudé TYPE_TMP105, 0x4d); 4986c4567c7SCédric Le Goater 4996c4567c7SCédric Le Goater /* The AST2500 EVB does not have an RTC. Let's pretend that one is 5006c4567c7SCédric Le Goater * plugged on the I2C bus header */ 5011373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32); 5022cf6cb50SCédric Le Goater } 5032cf6cb50SCédric Le Goater 504612b219aSPhilippe Mathieu-Daudé static void ast2600_evb_i2c_init(AspeedMachineState *bmc) 505ccc2c418SCédric Le Goater { 506ccc2c418SCédric Le Goater /* Start with some devices on our I2C busses */ 507ccc2c418SCédric Le Goater ast2500_evb_i2c_init(bmc); 508ccc2c418SCédric Le Goater } 509ccc2c418SCédric Le Goater 510612b219aSPhilippe Mathieu-Daudé static void romulus_bmc_i2c_init(AspeedMachineState *bmc) 5116c4567c7SCédric Le Goater { 5126c4567c7SCédric Le Goater AspeedSoCState *soc = &bmc->soc; 5136c4567c7SCédric Le Goater 5146c4567c7SCédric Le Goater /* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is 5156c4567c7SCédric Le Goater * good enough */ 5161373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32); 5176c4567c7SCédric Le Goater } 5186c4567c7SCédric Le Goater 519612b219aSPhilippe Mathieu-Daudé static void swift_bmc_i2c_init(AspeedMachineState *bmc) 520aae7a18dSAdriana Kobylak { 521aae7a18dSAdriana Kobylak AspeedSoCState *soc = &bmc->soc; 522aae7a18dSAdriana Kobylak 5231373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "pca9552", 0x60); 524aae7a18dSAdriana Kobylak 525aae7a18dSAdriana Kobylak /* The swift board expects a TMP275 but a TMP105 is compatible */ 5261373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "tmp105", 0x48); 527aae7a18dSAdriana Kobylak /* The swift board expects a pca9551 but a pca9552 is compatible */ 5281373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9552", 0x60); 529aae7a18dSAdriana Kobylak 530aae7a18dSAdriana Kobylak /* The swift board expects an Epson RX8900 RTC but a ds1338 is compatible */ 5311373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "ds1338", 0x32); 5321373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x60); 533aae7a18dSAdriana Kobylak 5341373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c); 535aae7a18dSAdriana Kobylak /* The swift board expects a pca9539 but a pca9552 is compatible */ 5361373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "pca9552", 0x74); 537aae7a18dSAdriana Kobylak 5381373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c); 539aae7a18dSAdriana Kobylak /* The swift board expects a pca9539 but a pca9552 is compatible */ 5401373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "pca9552", 541aae7a18dSAdriana Kobylak 0x74); 542aae7a18dSAdriana Kobylak 543aae7a18dSAdriana Kobylak /* The swift board expects a TMP275 but a TMP105 is compatible */ 5441373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12), "tmp105", 0x48); 5451373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12), "tmp105", 0x4a); 546aae7a18dSAdriana Kobylak } 547aae7a18dSAdriana Kobylak 548612b219aSPhilippe Mathieu-Daudé static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc) 549143b040fSPatrick Williams { 550143b040fSPatrick Williams AspeedSoCState *soc = &bmc->soc; 551143b040fSPatrick Williams 552143b040fSPatrick Williams /* bus 2 : */ 5531373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48); 5541373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49); 555143b040fSPatrick Williams /* bus 2 : pca9546 @ 0x73 */ 556143b040fSPatrick Williams 557143b040fSPatrick Williams /* bus 3 : pca9548 @ 0x70 */ 558143b040fSPatrick Williams 559143b040fSPatrick Williams /* bus 4 : */ 560143b040fSPatrick Williams uint8_t *eeprom4_54 = g_malloc0(8 * 1024); 5617a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 562143b040fSPatrick Williams eeprom4_54); 563143b040fSPatrick Williams /* PCA9539 @ 0x76, but PCA9552 is compatible */ 5641373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "pca9552", 0x76); 565143b040fSPatrick Williams /* PCA9539 @ 0x77, but PCA9552 is compatible */ 5661373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "pca9552", 0x77); 567143b040fSPatrick Williams 568143b040fSPatrick Williams /* bus 6 : */ 5691373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48); 5701373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49); 571143b040fSPatrick Williams /* bus 6 : pca9546 @ 0x73 */ 572143b040fSPatrick Williams 573143b040fSPatrick Williams /* bus 8 : */ 574143b040fSPatrick Williams uint8_t *eeprom8_56 = g_malloc0(8 * 1024); 5757a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56, 576143b040fSPatrick Williams eeprom8_56); 5771373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x60); 5781373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x61); 579143b040fSPatrick Williams /* bus 8 : adc128d818 @ 0x1d */ 580143b040fSPatrick Williams /* bus 8 : adc128d818 @ 0x1f */ 581143b040fSPatrick Williams 582143b040fSPatrick Williams /* 583143b040fSPatrick Williams * bus 13 : pca9548 @ 0x71 584143b040fSPatrick Williams * - channel 3: 585143b040fSPatrick Williams * - tmm421 @ 0x4c 586143b040fSPatrick Williams * - tmp421 @ 0x4e 587143b040fSPatrick Williams * - tmp421 @ 0x4f 588143b040fSPatrick Williams */ 589143b040fSPatrick Williams 590143b040fSPatrick Williams } 591143b040fSPatrick Williams 592612b219aSPhilippe Mathieu-Daudé static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc) 59362c2c2ebSCédric Le Goater { 5947cfbde5eSPhilippe Mathieu-Daudé static const struct { 5957cfbde5eSPhilippe Mathieu-Daudé unsigned gpio_id; 5967cfbde5eSPhilippe Mathieu-Daudé LEDColor color; 5977cfbde5eSPhilippe Mathieu-Daudé const char *description; 5987cfbde5eSPhilippe Mathieu-Daudé bool gpio_polarity; 5997cfbde5eSPhilippe Mathieu-Daudé } pca1_leds[] = { 6007cfbde5eSPhilippe Mathieu-Daudé {13, LED_COLOR_GREEN, "front-fault-4", GPIO_POLARITY_ACTIVE_LOW}, 6017cfbde5eSPhilippe Mathieu-Daudé {14, LED_COLOR_GREEN, "front-power-3", GPIO_POLARITY_ACTIVE_LOW}, 6027cfbde5eSPhilippe Mathieu-Daudé {15, LED_COLOR_GREEN, "front-id-5", GPIO_POLARITY_ACTIVE_LOW}, 6037cfbde5eSPhilippe Mathieu-Daudé }; 60462c2c2ebSCédric Le Goater AspeedSoCState *soc = &bmc->soc; 6053d165f12SCédric Le Goater uint8_t *eeprom_buf = g_malloc0(8 * 1024); 60615ce12cfSPhilippe Mathieu-Daudé DeviceState *dev; 6077cfbde5eSPhilippe Mathieu-Daudé LEDState *led; 60862c2c2ebSCédric Le Goater 60963ceb818SCédric Le Goater /* Bus 3: TODO bmp280@77 */ 61063ceb818SCédric Le Goater /* Bus 3: TODO max31785@52 */ 611db437ca6SPhilippe Mathieu-Daudé dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60)); 61215ce12cfSPhilippe Mathieu-Daudé qdev_prop_set_string(dev, "description", "pca1"); 6132616f572SPhilippe Mathieu-Daudé i2c_slave_realize_and_unref(I2C_SLAVE(dev), 6142616f572SPhilippe Mathieu-Daudé aspeed_i2c_get_bus(&soc->i2c, 3), 61515ce12cfSPhilippe Mathieu-Daudé &error_fatal); 6168c9a61d7SCédric Le Goater 6177cfbde5eSPhilippe Mathieu-Daudé for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) { 6187cfbde5eSPhilippe Mathieu-Daudé led = led_create_simple(OBJECT(bmc), 6197cfbde5eSPhilippe Mathieu-Daudé pca1_leds[i].gpio_polarity, 6207cfbde5eSPhilippe Mathieu-Daudé pca1_leds[i].color, 6217cfbde5eSPhilippe Mathieu-Daudé pca1_leds[i].description); 6227cfbde5eSPhilippe Mathieu-Daudé qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id, 6237cfbde5eSPhilippe Mathieu-Daudé qdev_get_gpio_in(DEVICE(led), 0)); 6247cfbde5eSPhilippe Mathieu-Daudé } 625b61ea6e7SJoel Stanley i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76); 6261373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c); 6271373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c); 62862c2c2ebSCédric Le Goater 62962c2c2ebSCédric Le Goater /* The Witherspoon expects a TMP275 but a TMP105 is compatible */ 6301373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105, 631044475f3SPhilippe Mathieu-Daudé 0x4a); 6326c4567c7SCédric Le Goater 6336c4567c7SCédric Le Goater /* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is 6346c4567c7SCédric Le Goater * good enough */ 6351373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32); 6363d165f12SCédric Le Goater 6377a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51, 6383d165f12SCédric Le Goater eeprom_buf); 639db437ca6SPhilippe Mathieu-Daudé dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60)); 64015ce12cfSPhilippe Mathieu-Daudé qdev_prop_set_string(dev, "description", "pca0"); 6412616f572SPhilippe Mathieu-Daudé i2c_slave_realize_and_unref(I2C_SLAVE(dev), 6422616f572SPhilippe Mathieu-Daudé aspeed_i2c_get_bus(&soc->i2c, 11), 64315ce12cfSPhilippe Mathieu-Daudé &error_fatal); 64463ceb818SCédric Le Goater /* Bus 11: TODO ucd90160@64 */ 64562c2c2ebSCédric Le Goater } 64662c2c2ebSCédric Le Goater 64795f068c8SJohn Wang static void g220a_bmc_i2c_init(AspeedMachineState *bmc) 64895f068c8SJohn Wang { 64995f068c8SJohn Wang AspeedSoCState *soc = &bmc->soc; 65095f068c8SJohn Wang DeviceState *dev; 65195f068c8SJohn Wang 65295f068c8SJohn Wang dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), 65395f068c8SJohn Wang "emc1413", 0x4c)); 65495f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 65595f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 65695f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 65795f068c8SJohn Wang 65895f068c8SJohn Wang dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12), 65995f068c8SJohn Wang "emc1413", 0x4c)); 66095f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 66195f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 66295f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 66395f068c8SJohn Wang 66495f068c8SJohn Wang dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13), 66595f068c8SJohn Wang "emc1413", 0x4c)); 66695f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 66795f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 66895f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 6696f5f6507SJohn Wang 6706f5f6507SJohn Wang static uint8_t eeprom_buf[2 * 1024] = { 6716f5f6507SJohn Wang 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe, 6726f5f6507SJohn Wang 0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65, 6736f5f6507SJohn Wang 0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32, 6746f5f6507SJohn Wang 0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42, 6756f5f6507SJohn Wang 0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45, 6766f5f6507SJohn Wang 0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1, 6776f5f6507SJohn Wang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, 6786f5f6507SJohn Wang }; 6796f5f6507SJohn Wang smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57, 6806f5f6507SJohn Wang eeprom_buf); 68195f068c8SJohn Wang } 68295f068c8SJohn Wang 683fa6d98c0SJoel Stanley static void aspeed_eeprom_init(I2CBus *bus, uint8_t addr, uint32_t rsize) 684fa6d98c0SJoel Stanley { 685fa6d98c0SJoel Stanley I2CSlave *i2c_dev = i2c_slave_new("at24c-eeprom", addr); 686fa6d98c0SJoel Stanley DeviceState *dev = DEVICE(i2c_dev); 687fa6d98c0SJoel Stanley 688fa6d98c0SJoel Stanley qdev_prop_set_uint32(dev, "rom-size", rsize); 689fa6d98c0SJoel Stanley i2c_slave_realize_and_unref(i2c_dev, bus, &error_abort); 690fa6d98c0SJoel Stanley } 691fa6d98c0SJoel Stanley 69258e52bdbSCédric Le Goater static void rainier_bmc_i2c_init(AspeedMachineState *bmc) 69358e52bdbSCédric Le Goater { 69458e52bdbSCédric Le Goater AspeedSoCState *soc = &bmc->soc; 695fa6d98c0SJoel Stanley I2CSlave *i2c_mux; 696fa6d98c0SJoel Stanley 697fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB); 69858e52bdbSCédric Le Goater 69958e52bdbSCédric Le Goater /* The rainier expects a TMP275 but a TMP105 is compatible */ 70058e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105, 70158e52bdbSCédric Le Goater 0x48); 70258e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105, 70358e52bdbSCédric Le Goater 0x49); 70458e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105, 70558e52bdbSCédric Le Goater 0x4a); 706fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), 707fa6d98c0SJoel Stanley "pca9546", 0x70); 708fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 709fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 710fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB); 71158e52bdbSCédric Le Goater 71258e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105, 71358e52bdbSCédric Le Goater 0x48); 71458e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105, 71558e52bdbSCédric Le Goater 0x49); 716fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), 717fa6d98c0SJoel Stanley "pca9546", 0x70); 718fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 719fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 72058e52bdbSCédric Le Goater 72158e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105, 72258e52bdbSCédric Le Goater 0x48); 72358e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105, 72458e52bdbSCédric Le Goater 0x4a); 72558e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105, 72658e52bdbSCédric Le Goater 0x4b); 727fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), 728fa6d98c0SJoel Stanley "pca9546", 0x70); 729fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 730fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 731fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB); 732fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB); 73358e52bdbSCédric Le Goater 73458e52bdbSCédric Le Goater /* Bus 7: TODO max31785@52 */ 73558e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9552", 0x61); 736b61ea6e7SJoel Stanley i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76); 73758e52bdbSCédric Le Goater /* Bus 7: TODO si7021-a20@20 */ 73858e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105, 73958e52bdbSCédric Le Goater 0x48); 740fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB); 741fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB); 74258e52bdbSCédric Le Goater 74358e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105, 74458e52bdbSCédric Le Goater 0x48); 74558e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105, 74658e52bdbSCédric Le Goater 0x4a); 747fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50, 64 * KiB); 748fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 64 * KiB); 74958e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x61); 75058e52bdbSCédric Le Goater /* Bus 8: ucd90320@11 */ 75158e52bdbSCédric Le Goater /* Bus 8: ucd90320@b */ 75258e52bdbSCédric Le Goater /* Bus 8: ucd90320@c */ 75358e52bdbSCédric Le Goater 75458e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c); 75558e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d); 756fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB); 75758e52bdbSCédric Le Goater 75858e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c); 75958e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d); 760fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB); 76158e52bdbSCédric Le Goater 76258e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105, 76358e52bdbSCédric Le Goater 0x48); 76458e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105, 76558e52bdbSCédric Le Goater 0x49); 766fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), 767fa6d98c0SJoel Stanley "pca9546", 0x70); 768fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 769fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 770fa6d98c0SJoel Stanley 771fa6d98c0SJoel Stanley 772fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB); 773fa6d98c0SJoel Stanley 774fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB); 775fa6d98c0SJoel Stanley 776fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB); 77758e52bdbSCédric Le Goater } 77858e52bdbSCédric Le Goater 779*febbe308SPeter Delevoryas static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr, 780*febbe308SPeter Delevoryas I2CBus **channels) 781*febbe308SPeter Delevoryas { 782*febbe308SPeter Delevoryas I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr); 783*febbe308SPeter Delevoryas for (int i = 0; i < 8; i++) { 784*febbe308SPeter Delevoryas channels[i] = pca954x_i2c_get_bus(mux, i); 785*febbe308SPeter Delevoryas } 786*febbe308SPeter Delevoryas } 787*febbe308SPeter Delevoryas 788*febbe308SPeter Delevoryas #define TYPE_LM75 TYPE_TMP105 789*febbe308SPeter Delevoryas #define TYPE_TMP75 TYPE_TMP105 790*febbe308SPeter Delevoryas #define TYPE_TMP422 "tmp422" 791*febbe308SPeter Delevoryas 792*febbe308SPeter Delevoryas static void fuji_bmc_i2c_init(AspeedMachineState *bmc) 793*febbe308SPeter Delevoryas { 794*febbe308SPeter Delevoryas AspeedSoCState *soc = &bmc->soc; 795*febbe308SPeter Delevoryas I2CBus *i2c[144] = {}; 796*febbe308SPeter Delevoryas 797*febbe308SPeter Delevoryas for (int i = 0; i < 16; i++) { 798*febbe308SPeter Delevoryas i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i); 799*febbe308SPeter Delevoryas } 800*febbe308SPeter Delevoryas I2CBus *i2c180 = i2c[2]; 801*febbe308SPeter Delevoryas I2CBus *i2c480 = i2c[8]; 802*febbe308SPeter Delevoryas I2CBus *i2c600 = i2c[11]; 803*febbe308SPeter Delevoryas 804*febbe308SPeter Delevoryas get_pca9548_channels(i2c180, 0x70, &i2c[16]); 805*febbe308SPeter Delevoryas get_pca9548_channels(i2c480, 0x70, &i2c[24]); 806*febbe308SPeter Delevoryas /* NOTE: The device tree skips [32, 40) in the alias numbering */ 807*febbe308SPeter Delevoryas get_pca9548_channels(i2c600, 0x77, &i2c[40]); 808*febbe308SPeter Delevoryas get_pca9548_channels(i2c[24], 0x71, &i2c[48]); 809*febbe308SPeter Delevoryas get_pca9548_channels(i2c[25], 0x72, &i2c[56]); 810*febbe308SPeter Delevoryas get_pca9548_channels(i2c[26], 0x76, &i2c[64]); 811*febbe308SPeter Delevoryas get_pca9548_channels(i2c[27], 0x76, &i2c[72]); 812*febbe308SPeter Delevoryas for (int i = 0; i < 8; i++) { 813*febbe308SPeter Delevoryas get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]); 814*febbe308SPeter Delevoryas } 815*febbe308SPeter Delevoryas 816*febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c); 817*febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d); 818*febbe308SPeter Delevoryas 819*febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[19], 0x52, 64 * KiB); 820*febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[20], 0x50, 2 * KiB); 821*febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[22], 0x52, 2 * KiB); 822*febbe308SPeter Delevoryas 823*febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x48); 824*febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x49); 825*febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x4a); 826*febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[3], TYPE_TMP422, 0x4c); 827*febbe308SPeter Delevoryas 828*febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[8], 0x51, 64 * KiB); 829*febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a); 830*febbe308SPeter Delevoryas 831*febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[50], TYPE_LM75, 0x4c); 832*febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[50], 0x52, 64 * KiB); 833*febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[51], TYPE_TMP75, 0x48); 834*febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[52], TYPE_TMP75, 0x49); 835*febbe308SPeter Delevoryas 836*febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[59], TYPE_TMP75, 0x48); 837*febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[60], TYPE_TMP75, 0x49); 838*febbe308SPeter Delevoryas 839*febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[65], 0x53, 64 * KiB); 840*febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x49); 841*febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x48); 842*febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[68], 0x52, 64 * KiB); 843*febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[69], 0x52, 64 * KiB); 844*febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[70], 0x52, 64 * KiB); 845*febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[71], 0x52, 64 * KiB); 846*febbe308SPeter Delevoryas 847*febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[73], 0x53, 64 * KiB); 848*febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x49); 849*febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x48); 850*febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[76], 0x52, 64 * KiB); 851*febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[77], 0x52, 64 * KiB); 852*febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[78], 0x52, 64 * KiB); 853*febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[79], 0x52, 64 * KiB); 854*febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[28], 0x50, 2 * KiB); 855*febbe308SPeter Delevoryas 856*febbe308SPeter Delevoryas for (int i = 0; i < 8; i++) { 857*febbe308SPeter Delevoryas aspeed_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB); 858*febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[82 + i * 8], TYPE_TMP75, 0x48); 859*febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[83 + i * 8], TYPE_TMP75, 0x4b); 860*febbe308SPeter Delevoryas i2c_slave_create_simple(i2c[84 + i * 8], TYPE_TMP75, 0x4a); 861*febbe308SPeter Delevoryas } 862*febbe308SPeter Delevoryas } 863*febbe308SPeter Delevoryas 8641a15311aSCédric Le Goater static bool aspeed_get_mmio_exec(Object *obj, Error **errp) 8651a15311aSCédric Le Goater { 8661a15311aSCédric Le Goater return ASPEED_MACHINE(obj)->mmio_exec; 8671a15311aSCédric Le Goater } 8681a15311aSCédric Le Goater 8691a15311aSCédric Le Goater static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp) 8701a15311aSCédric Le Goater { 8711a15311aSCédric Le Goater ASPEED_MACHINE(obj)->mmio_exec = value; 8721a15311aSCédric Le Goater } 8731a15311aSCédric Le Goater 8741a15311aSCédric Le Goater static void aspeed_machine_instance_init(Object *obj) 8751a15311aSCédric Le Goater { 8761a15311aSCédric Le Goater ASPEED_MACHINE(obj)->mmio_exec = false; 8771a15311aSCédric Le Goater } 8781a15311aSCédric Le Goater 8799820e52fSCédric Le Goater static char *aspeed_get_fmc_model(Object *obj, Error **errp) 8809820e52fSCédric Le Goater { 8819820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 8829820e52fSCédric Le Goater return g_strdup(bmc->fmc_model); 8839820e52fSCédric Le Goater } 8849820e52fSCédric Le Goater 8859820e52fSCédric Le Goater static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp) 8869820e52fSCédric Le Goater { 8879820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 8889820e52fSCédric Le Goater 8899820e52fSCédric Le Goater g_free(bmc->fmc_model); 8909820e52fSCédric Le Goater bmc->fmc_model = g_strdup(value); 8919820e52fSCédric Le Goater } 8929820e52fSCédric Le Goater 8939820e52fSCédric Le Goater static char *aspeed_get_spi_model(Object *obj, Error **errp) 8949820e52fSCédric Le Goater { 8959820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 8969820e52fSCédric Le Goater return g_strdup(bmc->spi_model); 8979820e52fSCédric Le Goater } 8989820e52fSCédric Le Goater 8999820e52fSCédric Le Goater static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp) 9009820e52fSCédric Le Goater { 9019820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 9029820e52fSCédric Le Goater 9039820e52fSCédric Le Goater g_free(bmc->spi_model); 9049820e52fSCédric Le Goater bmc->spi_model = g_strdup(value); 9059820e52fSCédric Le Goater } 9069820e52fSCédric Le Goater 9071a15311aSCédric Le Goater static void aspeed_machine_class_props_init(ObjectClass *oc) 9081a15311aSCédric Le Goater { 9091a15311aSCédric Le Goater object_class_property_add_bool(oc, "execute-in-place", 9101a15311aSCédric Le Goater aspeed_get_mmio_exec, 911d2623129SMarkus Armbruster aspeed_set_mmio_exec); 9121a15311aSCédric Le Goater object_class_property_set_description(oc, "execute-in-place", 9137eecec7dSMarkus Armbruster "boot directly from CE0 flash device"); 9149820e52fSCédric Le Goater 9159820e52fSCédric Le Goater object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model, 9169820e52fSCédric Le Goater aspeed_set_fmc_model); 9179820e52fSCédric Le Goater object_class_property_set_description(oc, "fmc-model", 9189820e52fSCédric Le Goater "Change the FMC Flash model"); 9199820e52fSCédric Le Goater object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model, 9209820e52fSCédric Le Goater aspeed_set_spi_model); 9219820e52fSCédric Le Goater object_class_property_set_description(oc, "spi-model", 9229820e52fSCédric Le Goater "Change the SPI Flash model"); 9231a15311aSCédric Le Goater } 9241a15311aSCédric Le Goater 925b7f1a0cbSCédric Le Goater static int aspeed_soc_num_cpus(const char *soc_name) 926b7f1a0cbSCédric Le Goater { 927b7f1a0cbSCédric Le Goater AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(soc_name)); 928b7f1a0cbSCédric Le Goater return sc->num_cpus; 929b7f1a0cbSCédric Le Goater } 930b7f1a0cbSCédric Le Goater 931fca9ca1bSCédric Le Goater static void aspeed_machine_class_init(ObjectClass *oc, void *data) 93262c2c2ebSCédric Le Goater { 93362c2c2ebSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 934d3bad7e7SCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 93562c2c2ebSCédric Le Goater 936fca9ca1bSCédric Le Goater mc->init = aspeed_machine_init; 93762c2c2ebSCédric Le Goater mc->no_floppy = 1; 93862c2c2ebSCédric Le Goater mc->no_cdrom = 1; 93962c2c2ebSCédric Le Goater mc->no_parallel = 1; 940afcbaed6SIgor Mammedov mc->default_ram_id = "ram"; 941d3bad7e7SCédric Le Goater amc->macs_mask = ASPEED_MAC0_ON; 9425d63d0c7SPeter Delevoryas amc->uart_default = ASPEED_DEV_UART5; 9431a15311aSCédric Le Goater 9441a15311aSCédric Le Goater aspeed_machine_class_props_init(oc); 94562c2c2ebSCédric Le Goater } 94662c2c2ebSCédric Le Goater 947baa4732bSCédric Le Goater static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data) 948baa4732bSCédric Le Goater { 949baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 950baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 951baa4732bSCédric Le Goater 952baa4732bSCédric Le Goater mc->desc = "OpenPOWER Palmetto BMC (ARM926EJ-S)"; 953baa4732bSCédric Le Goater amc->soc_name = "ast2400-a1"; 954baa4732bSCédric Le Goater amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1; 955baa4732bSCédric Le Goater amc->fmc_model = "n25q256a"; 956baa4732bSCédric Le Goater amc->spi_model = "mx25l25635e"; 957baa4732bSCédric Le Goater amc->num_cs = 1; 958baa4732bSCédric Le Goater amc->i2c_init = palmetto_bmc_i2c_init; 959baa4732bSCédric Le Goater mc->default_ram_size = 256 * MiB; 960b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 961b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 962baa4732bSCédric Le Goater }; 963baa4732bSCédric Le Goater 9649cccb912SPatrick Venture static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data) 9659cccb912SPatrick Venture { 9669cccb912SPatrick Venture MachineClass *mc = MACHINE_CLASS(oc); 9679cccb912SPatrick Venture AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 9689cccb912SPatrick Venture 9699cccb912SPatrick Venture mc->desc = "Quanta-Q71l BMC (ARM926EJ-S)"; 9709cccb912SPatrick Venture amc->soc_name = "ast2400-a1"; 9719cccb912SPatrick Venture amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1; 9729cccb912SPatrick Venture amc->fmc_model = "n25q256a"; 9739cccb912SPatrick Venture amc->spi_model = "mx25l25635e"; 9749cccb912SPatrick Venture amc->num_cs = 1; 9759cccb912SPatrick Venture amc->i2c_init = quanta_q71l_bmc_i2c_init; 9769cccb912SPatrick Venture mc->default_ram_size = 128 * MiB; 9779cccb912SPatrick Venture mc->default_cpus = mc->min_cpus = mc->max_cpus = 9789cccb912SPatrick Venture aspeed_soc_num_cpus(amc->soc_name); 9799cccb912SPatrick Venture } 9809cccb912SPatrick Venture 98140a38df5SErik Smit static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc, 98240a38df5SErik Smit void *data) 98340a38df5SErik Smit { 98440a38df5SErik Smit MachineClass *mc = MACHINE_CLASS(oc); 98540a38df5SErik Smit AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 98640a38df5SErik Smit 98740a38df5SErik Smit mc->desc = "Supermicro X11 BMC (ARM926EJ-S)"; 98840a38df5SErik Smit amc->soc_name = "ast2400-a1"; 98940a38df5SErik Smit amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1; 99040a38df5SErik Smit amc->fmc_model = "mx25l25635e"; 99140a38df5SErik Smit amc->spi_model = "mx25l25635e"; 99240a38df5SErik Smit amc->num_cs = 1; 99340a38df5SErik Smit amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 99440a38df5SErik Smit amc->i2c_init = palmetto_bmc_i2c_init; 99540a38df5SErik Smit mc->default_ram_size = 256 * MiB; 99640a38df5SErik Smit } 99740a38df5SErik Smit 998baa4732bSCédric Le Goater static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data) 999baa4732bSCédric Le Goater { 1000baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1001baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1002baa4732bSCédric Le Goater 1003baa4732bSCédric Le Goater mc->desc = "Aspeed AST2500 EVB (ARM1176)"; 1004baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1"; 1005baa4732bSCédric Le Goater amc->hw_strap1 = AST2500_EVB_HW_STRAP1; 1006baa4732bSCédric Le Goater amc->fmc_model = "w25q256"; 1007baa4732bSCédric Le Goater amc->spi_model = "mx25l25635e"; 1008baa4732bSCédric Le Goater amc->num_cs = 1; 1009baa4732bSCédric Le Goater amc->i2c_init = ast2500_evb_i2c_init; 1010baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB; 1011b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1012b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1013baa4732bSCédric Le Goater }; 1014baa4732bSCédric Le Goater 1015baa4732bSCédric Le Goater static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data) 1016baa4732bSCédric Le Goater { 1017baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1018baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1019baa4732bSCédric Le Goater 1020baa4732bSCédric Le Goater mc->desc = "OpenPOWER Romulus BMC (ARM1176)"; 1021baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1"; 1022baa4732bSCédric Le Goater amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1; 1023baa4732bSCédric Le Goater amc->fmc_model = "n25q256a"; 1024baa4732bSCédric Le Goater amc->spi_model = "mx66l1g45g"; 1025baa4732bSCédric Le Goater amc->num_cs = 2; 1026baa4732bSCédric Le Goater amc->i2c_init = romulus_bmc_i2c_init; 1027baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB; 1028b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1029b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1030baa4732bSCédric Le Goater }; 1031baa4732bSCédric Le Goater 1032143b040fSPatrick Williams static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data) 1033143b040fSPatrick Williams { 1034143b040fSPatrick Williams MachineClass *mc = MACHINE_CLASS(oc); 1035143b040fSPatrick Williams AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1036143b040fSPatrick Williams 1037143b040fSPatrick Williams mc->desc = "OCP SonoraPass BMC (ARM1176)"; 1038143b040fSPatrick Williams amc->soc_name = "ast2500-a1"; 1039143b040fSPatrick Williams amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1; 1040143b040fSPatrick Williams amc->fmc_model = "mx66l1g45g"; 1041143b040fSPatrick Williams amc->spi_model = "mx66l1g45g"; 1042143b040fSPatrick Williams amc->num_cs = 2; 1043143b040fSPatrick Williams amc->i2c_init = sonorapass_bmc_i2c_init; 1044143b040fSPatrick Williams mc->default_ram_size = 512 * MiB; 1045b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1046b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1047143b040fSPatrick Williams }; 1048143b040fSPatrick Williams 1049baa4732bSCédric Le Goater static void aspeed_machine_swift_class_init(ObjectClass *oc, void *data) 1050baa4732bSCédric Le Goater { 1051baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1052baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1053baa4732bSCédric Le Goater 1054baa4732bSCédric Le Goater mc->desc = "OpenPOWER Swift BMC (ARM1176)"; 1055baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1"; 1056baa4732bSCédric Le Goater amc->hw_strap1 = SWIFT_BMC_HW_STRAP1; 1057baa4732bSCédric Le Goater amc->fmc_model = "mx66l1g45g"; 1058baa4732bSCédric Le Goater amc->spi_model = "mx66l1g45g"; 1059baa4732bSCédric Le Goater amc->num_cs = 2; 1060baa4732bSCédric Le Goater amc->i2c_init = swift_bmc_i2c_init; 1061baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB; 1062b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1063b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 106463a9c7e0SCédric Le Goater 106563a9c7e0SCédric Le Goater mc->deprecation_reason = "redundant system. Please use a similar " 106663a9c7e0SCédric Le Goater "OpenPOWER BMC, Witherspoon or Romulus."; 1067baa4732bSCédric Le Goater }; 1068baa4732bSCédric Le Goater 1069baa4732bSCédric Le Goater static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data) 1070baa4732bSCédric Le Goater { 1071baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1072baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1073baa4732bSCédric Le Goater 1074baa4732bSCédric Le Goater mc->desc = "OpenPOWER Witherspoon BMC (ARM1176)"; 1075baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1"; 1076baa4732bSCédric Le Goater amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1; 1077baa4732bSCédric Le Goater amc->fmc_model = "mx25l25635e"; 1078baa4732bSCédric Le Goater amc->spi_model = "mx66l1g45g"; 1079baa4732bSCédric Le Goater amc->num_cs = 2; 1080baa4732bSCédric Le Goater amc->i2c_init = witherspoon_bmc_i2c_init; 1081baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB; 1082b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1083b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1084baa4732bSCédric Le Goater }; 1085baa4732bSCédric Le Goater 1086baa4732bSCédric Le Goater static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data) 1087baa4732bSCédric Le Goater { 1088baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 1089baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1090baa4732bSCédric Le Goater 1091f548f201SPeter Maydell mc->desc = "Aspeed AST2600 EVB (Cortex-A7)"; 1092c5811bb3SJoel Stanley amc->soc_name = "ast2600-a3"; 1093baa4732bSCédric Le Goater amc->hw_strap1 = AST2600_EVB_HW_STRAP1; 1094baa4732bSCédric Le Goater amc->hw_strap2 = AST2600_EVB_HW_STRAP2; 1095baa4732bSCédric Le Goater amc->fmc_model = "w25q512jv"; 1096baa4732bSCédric Le Goater amc->spi_model = "mx66u51235f"; 1097baa4732bSCédric Le Goater amc->num_cs = 1; 109829193286SGuenter Roeck amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON | 109929193286SGuenter Roeck ASPEED_MAC3_ON; 1100baa4732bSCédric Le Goater amc->i2c_init = ast2600_evb_i2c_init; 1101baa4732bSCédric Le Goater mc->default_ram_size = 1 * GiB; 1102b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1103b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1104baa4732bSCédric Le Goater }; 1105baa4732bSCédric Le Goater 110663ceb818SCédric Le Goater static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data) 110763ceb818SCédric Le Goater { 110863ceb818SCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 110963ceb818SCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 111063ceb818SCédric Le Goater 1111f548f201SPeter Maydell mc->desc = "OpenPOWER Tacoma BMC (Cortex-A7)"; 1112c5811bb3SJoel Stanley amc->soc_name = "ast2600-a3"; 111363ceb818SCédric Le Goater amc->hw_strap1 = TACOMA_BMC_HW_STRAP1; 111463ceb818SCédric Le Goater amc->hw_strap2 = TACOMA_BMC_HW_STRAP2; 111563ceb818SCédric Le Goater amc->fmc_model = "mx66l1g45g"; 111663ceb818SCédric Le Goater amc->spi_model = "mx66l1g45g"; 111763ceb818SCédric Le Goater amc->num_cs = 2; 1118d3bad7e7SCédric Le Goater amc->macs_mask = ASPEED_MAC2_ON; 111963ceb818SCédric Le Goater amc->i2c_init = witherspoon_bmc_i2c_init; /* Same board layout */ 112063ceb818SCédric Le Goater mc->default_ram_size = 1 * GiB; 1121b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1122b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 112363ceb818SCédric Le Goater }; 112463ceb818SCédric Le Goater 112595f068c8SJohn Wang static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data) 112695f068c8SJohn Wang { 112795f068c8SJohn Wang MachineClass *mc = MACHINE_CLASS(oc); 112895f068c8SJohn Wang AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 112995f068c8SJohn Wang 113095f068c8SJohn Wang mc->desc = "Bytedance G220A BMC (ARM1176)"; 113195f068c8SJohn Wang amc->soc_name = "ast2500-a1"; 113295f068c8SJohn Wang amc->hw_strap1 = G220A_BMC_HW_STRAP1; 113395f068c8SJohn Wang amc->fmc_model = "n25q512a"; 113495f068c8SJohn Wang amc->spi_model = "mx25l25635e"; 113595f068c8SJohn Wang amc->num_cs = 2; 11365bb825c8SGuenter Roeck amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 113795f068c8SJohn Wang amc->i2c_init = g220a_bmc_i2c_init; 113895f068c8SJohn Wang mc->default_ram_size = 1024 * MiB; 113995f068c8SJohn Wang mc->default_cpus = mc->min_cpus = mc->max_cpus = 114095f068c8SJohn Wang aspeed_soc_num_cpus(amc->soc_name); 114195f068c8SJohn Wang }; 114295f068c8SJohn Wang 114358e52bdbSCédric Le Goater static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data) 114458e52bdbSCédric Le Goater { 114558e52bdbSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 114658e52bdbSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 114758e52bdbSCédric Le Goater 1148f548f201SPeter Maydell mc->desc = "IBM Rainier BMC (Cortex-A7)"; 1149c5811bb3SJoel Stanley amc->soc_name = "ast2600-a3"; 115058e52bdbSCédric Le Goater amc->hw_strap1 = RAINIER_BMC_HW_STRAP1; 115158e52bdbSCédric Le Goater amc->hw_strap2 = RAINIER_BMC_HW_STRAP2; 115258e52bdbSCédric Le Goater amc->fmc_model = "mx66l1g45g"; 115358e52bdbSCédric Le Goater amc->spi_model = "mx66l1g45g"; 115458e52bdbSCédric Le Goater amc->num_cs = 2; 115558e52bdbSCédric Le Goater amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON; 115658e52bdbSCédric Le Goater amc->i2c_init = rainier_bmc_i2c_init; 115758e52bdbSCédric Le Goater mc->default_ram_size = 1 * GiB; 115858e52bdbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 115958e52bdbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 116058e52bdbSCédric Le Goater }; 116158e52bdbSCédric Le Goater 1162*febbe308SPeter Delevoryas /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */ 1163*febbe308SPeter Delevoryas #if HOST_LONG_BITS == 32 1164*febbe308SPeter Delevoryas #define FUJI_BMC_RAM_SIZE (1 * GiB) 1165*febbe308SPeter Delevoryas #else 1166*febbe308SPeter Delevoryas #define FUJI_BMC_RAM_SIZE (2 * GiB) 1167*febbe308SPeter Delevoryas #endif 1168*febbe308SPeter Delevoryas 1169*febbe308SPeter Delevoryas static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data) 1170*febbe308SPeter Delevoryas { 1171*febbe308SPeter Delevoryas MachineClass *mc = MACHINE_CLASS(oc); 1172*febbe308SPeter Delevoryas AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1173*febbe308SPeter Delevoryas 1174*febbe308SPeter Delevoryas mc->desc = "Facebook Fuji BMC (Cortex-A7)"; 1175*febbe308SPeter Delevoryas amc->soc_name = "ast2600-a3"; 1176*febbe308SPeter Delevoryas amc->hw_strap1 = FUJI_BMC_HW_STRAP1; 1177*febbe308SPeter Delevoryas amc->hw_strap2 = FUJI_BMC_HW_STRAP2; 1178*febbe308SPeter Delevoryas amc->fmc_model = "mx66l1g45g"; 1179*febbe308SPeter Delevoryas amc->spi_model = "mx66l1g45g"; 1180*febbe308SPeter Delevoryas amc->num_cs = 2; 1181*febbe308SPeter Delevoryas amc->macs_mask = ASPEED_MAC3_ON; 1182*febbe308SPeter Delevoryas amc->i2c_init = fuji_bmc_i2c_init; 1183*febbe308SPeter Delevoryas amc->uart_default = ASPEED_DEV_UART1; 1184*febbe308SPeter Delevoryas mc->default_ram_size = FUJI_BMC_RAM_SIZE; 1185*febbe308SPeter Delevoryas mc->default_cpus = mc->min_cpus = mc->max_cpus = 1186*febbe308SPeter Delevoryas aspeed_soc_num_cpus(amc->soc_name); 1187*febbe308SPeter Delevoryas }; 1188*febbe308SPeter Delevoryas 1189baa4732bSCédric Le Goater static const TypeInfo aspeed_machine_types[] = { 1190baa4732bSCédric Le Goater { 1191baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("palmetto-bmc"), 1192baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1193baa4732bSCédric Le Goater .class_init = aspeed_machine_palmetto_class_init, 1194baa4732bSCédric Le Goater }, { 119540a38df5SErik Smit .name = MACHINE_TYPE_NAME("supermicrox11-bmc"), 119640a38df5SErik Smit .parent = TYPE_ASPEED_MACHINE, 119740a38df5SErik Smit .class_init = aspeed_machine_supermicrox11_bmc_class_init, 119840a38df5SErik Smit }, { 1199baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("ast2500-evb"), 1200baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1201baa4732bSCédric Le Goater .class_init = aspeed_machine_ast2500_evb_class_init, 1202baa4732bSCédric Le Goater }, { 1203baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("romulus-bmc"), 1204baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1205baa4732bSCédric Le Goater .class_init = aspeed_machine_romulus_class_init, 1206baa4732bSCédric Le Goater }, { 1207baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("swift-bmc"), 1208baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1209baa4732bSCédric Le Goater .class_init = aspeed_machine_swift_class_init, 1210baa4732bSCédric Le Goater }, { 1211143b040fSPatrick Williams .name = MACHINE_TYPE_NAME("sonorapass-bmc"), 1212143b040fSPatrick Williams .parent = TYPE_ASPEED_MACHINE, 1213143b040fSPatrick Williams .class_init = aspeed_machine_sonorapass_class_init, 1214143b040fSPatrick Williams }, { 1215baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("witherspoon-bmc"), 1216baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1217baa4732bSCédric Le Goater .class_init = aspeed_machine_witherspoon_class_init, 1218baa4732bSCédric Le Goater }, { 1219baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("ast2600-evb"), 1220baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1221baa4732bSCédric Le Goater .class_init = aspeed_machine_ast2600_evb_class_init, 1222baa4732bSCédric Le Goater }, { 122363ceb818SCédric Le Goater .name = MACHINE_TYPE_NAME("tacoma-bmc"), 122463ceb818SCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 122563ceb818SCédric Le Goater .class_init = aspeed_machine_tacoma_class_init, 122663ceb818SCédric Le Goater }, { 122795f068c8SJohn Wang .name = MACHINE_TYPE_NAME("g220a-bmc"), 122895f068c8SJohn Wang .parent = TYPE_ASPEED_MACHINE, 122995f068c8SJohn Wang .class_init = aspeed_machine_g220a_class_init, 123095f068c8SJohn Wang }, { 12319cccb912SPatrick Venture .name = MACHINE_TYPE_NAME("quanta-q71l-bmc"), 12329cccb912SPatrick Venture .parent = TYPE_ASPEED_MACHINE, 12339cccb912SPatrick Venture .class_init = aspeed_machine_quanta_q71l_class_init, 12349cccb912SPatrick Venture }, { 123558e52bdbSCédric Le Goater .name = MACHINE_TYPE_NAME("rainier-bmc"), 123658e52bdbSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 123758e52bdbSCédric Le Goater .class_init = aspeed_machine_rainier_class_init, 123858e52bdbSCédric Le Goater }, { 1239*febbe308SPeter Delevoryas .name = MACHINE_TYPE_NAME("fuji-bmc"), 1240*febbe308SPeter Delevoryas .parent = TYPE_ASPEED_MACHINE, 1241*febbe308SPeter Delevoryas .class_init = aspeed_machine_fuji_class_init, 1242*febbe308SPeter Delevoryas }, { 1243fca9ca1bSCédric Le Goater .name = TYPE_ASPEED_MACHINE, 124462c2c2ebSCédric Le Goater .parent = TYPE_MACHINE, 1245888b2b03SPhilippe Mathieu-Daudé .instance_size = sizeof(AspeedMachineState), 12461a15311aSCédric Le Goater .instance_init = aspeed_machine_instance_init, 1247fca9ca1bSCédric Le Goater .class_size = sizeof(AspeedMachineClass), 1248fca9ca1bSCédric Le Goater .class_init = aspeed_machine_class_init, 1249baa4732bSCédric Le Goater .abstract = true, 1250baa4732bSCédric Le Goater } 1251fca9ca1bSCédric Le Goater }; 125274fb1f38SCédric Le Goater 1253baa4732bSCédric Le Goater DEFINE_TYPES(aspeed_machine_types) 1254