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 162ebe31c0aSCédric Le Goater /* 163ebe31c0aSCédric Le Goater * The max ram region is for firmwares that scan the address space 164ebe31c0aSCédric Le Goater * with load/store to guess how much RAM the SoC has. 165ebe31c0aSCédric Le Goater */ 166ebe31c0aSCédric Le Goater static uint64_t max_ram_read(void *opaque, hwaddr offset, unsigned size) 167ebe31c0aSCédric Le Goater { 168ebe31c0aSCédric Le Goater return 0; 169ebe31c0aSCédric Le Goater } 170ebe31c0aSCédric Le Goater 171ebe31c0aSCédric Le Goater static void max_ram_write(void *opaque, hwaddr offset, uint64_t value, 172ebe31c0aSCédric Le Goater unsigned size) 173ebe31c0aSCédric Le Goater { 174ebe31c0aSCédric Le Goater /* Discard writes */ 175ebe31c0aSCédric Le Goater } 176ebe31c0aSCédric Le Goater 177ebe31c0aSCédric Le Goater static const MemoryRegionOps max_ram_ops = { 178ebe31c0aSCédric Le Goater .read = max_ram_read, 179ebe31c0aSCédric Le Goater .write = max_ram_write, 180ebe31c0aSCédric Le Goater .endianness = DEVICE_NATIVE_ENDIAN, 181ebe31c0aSCédric Le Goater }; 182ebe31c0aSCédric Le Goater 1839bb6d140SJoel Stanley #define AST_SMP_MAILBOX_BASE 0x1e6e2180 1849bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_ENTRY (AST_SMP_MAILBOX_BASE + 0x0) 1859bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_GOSIGN (AST_SMP_MAILBOX_BASE + 0x4) 1869bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_READY (AST_SMP_MAILBOX_BASE + 0x8) 1879bb6d140SJoel Stanley #define AST_SMP_MBOX_FIELD_POLLINSN (AST_SMP_MAILBOX_BASE + 0xc) 1889bb6d140SJoel Stanley #define AST_SMP_MBOX_CODE (AST_SMP_MAILBOX_BASE + 0x10) 1899bb6d140SJoel Stanley #define AST_SMP_MBOX_GOSIGN 0xabbaab00 1909bb6d140SJoel Stanley 1919bb6d140SJoel Stanley static void aspeed_write_smpboot(ARMCPU *cpu, 1929bb6d140SJoel Stanley const struct arm_boot_info *info) 1939bb6d140SJoel Stanley { 1949bb6d140SJoel Stanley static const uint32_t poll_mailbox_ready[] = { 1959bb6d140SJoel Stanley /* 1969bb6d140SJoel Stanley * r2 = per-cpu go sign value 1979bb6d140SJoel Stanley * r1 = AST_SMP_MBOX_FIELD_ENTRY 1989bb6d140SJoel Stanley * r0 = AST_SMP_MBOX_FIELD_GOSIGN 1999bb6d140SJoel Stanley */ 2009bb6d140SJoel Stanley 0xee100fb0, /* mrc p15, 0, r0, c0, c0, 5 */ 2019bb6d140SJoel Stanley 0xe21000ff, /* ands r0, r0, #255 */ 2029bb6d140SJoel Stanley 0xe59f201c, /* ldr r2, [pc, #28] */ 2039bb6d140SJoel Stanley 0xe1822000, /* orr r2, r2, r0 */ 2049bb6d140SJoel Stanley 2059bb6d140SJoel Stanley 0xe59f1018, /* ldr r1, [pc, #24] */ 2069bb6d140SJoel Stanley 0xe59f0018, /* ldr r0, [pc, #24] */ 2079bb6d140SJoel Stanley 2089bb6d140SJoel Stanley 0xe320f002, /* wfe */ 2099bb6d140SJoel Stanley 0xe5904000, /* ldr r4, [r0] */ 2109bb6d140SJoel Stanley 0xe1520004, /* cmp r2, r4 */ 2119bb6d140SJoel Stanley 0x1afffffb, /* bne <wfe> */ 2129bb6d140SJoel Stanley 0xe591f000, /* ldr pc, [r1] */ 2139bb6d140SJoel Stanley AST_SMP_MBOX_GOSIGN, 2149bb6d140SJoel Stanley AST_SMP_MBOX_FIELD_ENTRY, 2159bb6d140SJoel Stanley AST_SMP_MBOX_FIELD_GOSIGN, 2169bb6d140SJoel Stanley }; 2179bb6d140SJoel Stanley 2189bb6d140SJoel Stanley rom_add_blob_fixed("aspeed.smpboot", poll_mailbox_ready, 2199bb6d140SJoel Stanley sizeof(poll_mailbox_ready), 2209bb6d140SJoel Stanley info->smp_loader_start); 2219bb6d140SJoel Stanley } 2229bb6d140SJoel Stanley 2239bb6d140SJoel Stanley static void aspeed_reset_secondary(ARMCPU *cpu, 2249bb6d140SJoel Stanley const struct arm_boot_info *info) 2259bb6d140SJoel Stanley { 2269bb6d140SJoel Stanley AddressSpace *as = arm_boot_address_space(cpu, info); 2279bb6d140SJoel Stanley CPUState *cs = CPU(cpu); 2289bb6d140SJoel Stanley 2299bb6d140SJoel Stanley /* info->smp_bootreg_addr */ 2309bb6d140SJoel Stanley address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0, 2319bb6d140SJoel Stanley MEMTXATTRS_UNSPECIFIED, NULL); 2329bb6d140SJoel Stanley cpu_set_pc(cs, info->smp_loader_start); 2339bb6d140SJoel Stanley } 2349bb6d140SJoel Stanley 235d769a1daSCédric Le Goater #define FIRMWARE_ADDR 0x0 236d769a1daSCédric Le Goater 237d769a1daSCédric Le Goater static void write_boot_rom(DriveInfo *dinfo, hwaddr addr, size_t rom_size, 238d769a1daSCédric Le Goater Error **errp) 239d769a1daSCédric Le Goater { 240d769a1daSCédric Le Goater BlockBackend *blk = blk_by_legacy_dinfo(dinfo); 241d769a1daSCédric Le Goater uint8_t *storage; 2420c7209beSCédric Le Goater int64_t size; 243d769a1daSCédric Le Goater 2440c7209beSCédric Le Goater /* The block backend size should have already been 'validated' by 2450c7209beSCédric Le Goater * the creation of the m25p80 object. 2460c7209beSCédric Le Goater */ 2470c7209beSCédric Le Goater size = blk_getlength(blk); 2480c7209beSCédric Le Goater if (size <= 0) { 2490c7209beSCédric Le Goater error_setg(errp, "failed to get flash size"); 2500c7209beSCédric Le Goater return; 2510c7209beSCédric Le Goater } 2520c7209beSCédric Le Goater 2530c7209beSCédric Le Goater if (rom_size > size) { 2540c7209beSCédric Le Goater rom_size = size; 255d769a1daSCédric Le Goater } 256d769a1daSCédric Le Goater 257d769a1daSCédric Le Goater storage = g_new0(uint8_t, rom_size); 258d769a1daSCédric Le Goater if (blk_pread(blk, 0, storage, rom_size) < 0) { 259d769a1daSCédric Le Goater error_setg(errp, "failed to read the initial flash content"); 260d769a1daSCédric Le Goater return; 261d769a1daSCédric Le Goater } 262d769a1daSCédric Le Goater 263d769a1daSCédric Le Goater rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr); 264d769a1daSCédric Le Goater g_free(storage); 265d769a1daSCédric Le Goater } 266d769a1daSCédric Le Goater 267c20b4cccSMarkus Armbruster static void aspeed_board_init_flashes(AspeedSMCState *s, 268c20b4cccSMarkus Armbruster const char *flashtype) 269e1ad9bc4SCédric Le Goater { 270e1ad9bc4SCédric Le Goater int i ; 271e1ad9bc4SCédric Le Goater 272e1ad9bc4SCédric Le Goater for (i = 0; i < s->num_cs; ++i) { 273e1ad9bc4SCédric Le Goater AspeedSMCFlash *fl = &s->flashes[i]; 274e1ad9bc4SCédric Le Goater DriveInfo *dinfo = drive_get_next(IF_MTD); 275e1ad9bc4SCédric Le Goater qemu_irq cs_line; 276e1ad9bc4SCédric Le Goater 27757d479c9SMarkus Armbruster fl->flash = qdev_new(flashtype); 278e1ad9bc4SCédric Le Goater if (dinfo) { 279c20b4cccSMarkus Armbruster qdev_prop_set_drive(fl->flash, "drive", 280c20b4cccSMarkus Armbruster blk_by_legacy_dinfo(dinfo)); 281e1ad9bc4SCédric Le Goater } 28257d479c9SMarkus Armbruster qdev_realize_and_unref(fl->flash, BUS(s->spi), &error_fatal); 283e1ad9bc4SCédric Le Goater 284e1ad9bc4SCédric Le Goater cs_line = qdev_get_gpio_in_named(fl->flash, SSI_GPIO_CS, 0); 285e1ad9bc4SCédric Le Goater sysbus_connect_irq(SYS_BUS_DEVICE(s), i + 1, cs_line); 286e1ad9bc4SCédric Le Goater } 287e1ad9bc4SCédric Le Goater } 288e1ad9bc4SCédric Le Goater 289a29e3e12SAndrew Jeffery static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo) 290a29e3e12SAndrew Jeffery { 291a29e3e12SAndrew Jeffery DeviceState *card; 292a29e3e12SAndrew Jeffery 293756f739bSPhilippe Mathieu-Daudé if (!dinfo) { 294756f739bSPhilippe Mathieu-Daudé return; 295756f739bSPhilippe Mathieu-Daudé } 2963e80f690SMarkus Armbruster card = qdev_new(TYPE_SD_CARD); 297934df912SMarkus Armbruster qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo), 298a29e3e12SAndrew Jeffery &error_fatal); 2993e80f690SMarkus Armbruster qdev_realize_and_unref(card, 3003e80f690SMarkus Armbruster qdev_get_child_bus(DEVICE(sdhci), "sd-bus"), 3013e80f690SMarkus Armbruster &error_fatal); 302a29e3e12SAndrew Jeffery } 303a29e3e12SAndrew Jeffery 304baa4732bSCédric Le Goater static void aspeed_machine_init(MachineState *machine) 305327d8e4eSAndrew Jeffery { 306888b2b03SPhilippe Mathieu-Daudé AspeedMachineState *bmc = ASPEED_MACHINE(machine); 307baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine); 308b033271fSCédric Le Goater AspeedSoCClass *sc; 309d769a1daSCédric Le Goater DriveInfo *drive0 = drive_get(IF_MTD, 0, 0); 310ebe31c0aSCédric Le Goater ram_addr_t max_ram_size; 3112bea128cSEddie James int i; 312d3bad7e7SCédric Le Goater NICInfo *nd = &nd_table[0]; 313327d8e4eSAndrew Jeffery 314ad1a9782SCédric Le Goater memory_region_init(&bmc->ram_container, NULL, "aspeed-ram-container", 3157df9f028SPhilippe Mathieu-Daudé 4 * GiB); 316afcbaed6SIgor Mammedov memory_region_add_subregion(&bmc->ram_container, 0, machine->ram); 317ad1a9782SCédric Le Goater 3189fc7fc4dSMarkus Armbruster object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name); 319327d8e4eSAndrew Jeffery 320b033271fSCédric Le Goater sc = ASPEED_SOC_GET_CLASS(&bmc->soc); 321b033271fSCédric Le Goater 322533eb415SIgor Mammedov /* 323533eb415SIgor Mammedov * This will error out if isize is not supported by memory controller. 324533eb415SIgor Mammedov */ 3256e504a98SPaolo Bonzini object_property_set_uint(OBJECT(&bmc->soc), "ram-size", machine->ram_size, 326533eb415SIgor Mammedov &error_fatal); 327533eb415SIgor Mammedov 328d3bad7e7SCédric Le Goater for (i = 0; i < sc->macs_num; i++) { 329d3bad7e7SCédric Le Goater if ((amc->macs_mask & (1 << i)) && nd->used) { 330d3bad7e7SCédric Le Goater qemu_check_nic_model(nd, TYPE_FTGMAC100); 331d3bad7e7SCédric Le Goater qdev_set_nic_properties(DEVICE(&bmc->soc.ftgmac100[i]), nd); 332d3bad7e7SCédric Le Goater nd++; 333d3bad7e7SCédric Le Goater } 334d3bad7e7SCédric Le Goater } 335d3bad7e7SCédric Le Goater 3365325cc34SMarkus Armbruster object_property_set_int(OBJECT(&bmc->soc), "hw-strap1", amc->hw_strap1, 33787e79af0SAndrew Jeffery &error_abort); 3385325cc34SMarkus Armbruster object_property_set_int(OBJECT(&bmc->soc), "hw-strap2", amc->hw_strap2, 339ccc2c418SCédric Le Goater &error_abort); 3405325cc34SMarkus Armbruster object_property_set_int(OBJECT(&bmc->soc), "num-cs", amc->num_cs, 34126d5df95SCédric Le Goater &error_abort); 3425325cc34SMarkus Armbruster object_property_set_link(OBJECT(&bmc->soc), "dram", 3430df2d9a6SCédric Le Goater OBJECT(machine->ram), &error_abort); 344b6e70d1dSJoel Stanley if (machine->kernel_filename) { 345b6e70d1dSJoel Stanley /* 346b6e70d1dSJoel Stanley * When booting with a -kernel command line there is no u-boot 347b6e70d1dSJoel Stanley * that runs to unlock the SCU. In this case set the default to 348b6e70d1dSJoel Stanley * be unlocked as the kernel expects 349b6e70d1dSJoel Stanley */ 3505325cc34SMarkus Armbruster object_property_set_int(OBJECT(&bmc->soc), "hw-prot-key", 3515325cc34SMarkus Armbruster ASPEED_SCU_PROT_KEY, &error_abort); 352b6e70d1dSJoel Stanley } 353ce189ab2SMarkus Armbruster qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort); 354327d8e4eSAndrew Jeffery 355d783d1feSCédric Le Goater memory_region_add_subregion(get_system_memory(), 356347df6f8SEduardo Habkost sc->memmap[ASPEED_DEV_SDRAM], 357ad1a9782SCédric Le Goater &bmc->ram_container); 358de46f5f4SCédric Le Goater 359ebe31c0aSCédric Le Goater max_ram_size = object_property_get_uint(OBJECT(&bmc->soc), "max-ram-size", 360ebe31c0aSCédric Le Goater &error_abort); 361ebe31c0aSCédric Le Goater memory_region_init_io(&bmc->max_ram, NULL, &max_ram_ops, NULL, 3626e504a98SPaolo Bonzini "max_ram", max_ram_size - machine->ram_size); 3636e504a98SPaolo Bonzini memory_region_add_subregion(&bmc->ram_container, machine->ram_size, &bmc->max_ram); 364ebe31c0aSCédric Le Goater 3659820e52fSCédric Le Goater aspeed_board_init_flashes(&bmc->soc.fmc, bmc->fmc_model ? 3669820e52fSCédric Le Goater bmc->fmc_model : amc->fmc_model); 3679820e52fSCédric Le Goater aspeed_board_init_flashes(&bmc->soc.spi[0], bmc->spi_model ? 3689820e52fSCédric Le Goater bmc->spi_model : amc->spi_model); 369e1ad9bc4SCédric Le Goater 370d769a1daSCédric Le Goater /* Install first FMC flash content as a boot rom. */ 371d769a1daSCédric Le Goater if (drive0) { 372d769a1daSCédric Le Goater AspeedSMCFlash *fl = &bmc->soc.fmc.flashes[0]; 373d769a1daSCédric Le Goater MemoryRegion *boot_rom = g_new(MemoryRegion, 1); 374d769a1daSCédric Le Goater 375d769a1daSCédric Le Goater /* 376d769a1daSCédric Le Goater * create a ROM region using the default mapping window size of 37793bf276dSCédric Le Goater * the flash module. The window size is 64MB for the AST2400 37893bf276dSCédric Le Goater * SoC and 128MB for the AST2500 SoC, which is twice as big as 37993bf276dSCédric Le Goater * needed by the flash modules of the Aspeed machines. 380d769a1daSCédric Le Goater */ 3811a15311aSCédric Le Goater if (ASPEED_MACHINE(machine)->mmio_exec) { 382f489960dSPhilippe Mathieu-Daudé memory_region_init_alias(boot_rom, NULL, "aspeed.boot_rom", 3831a15311aSCédric Le Goater &fl->mmio, 0, fl->size); 3841a15311aSCédric Le Goater memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR, 3851a15311aSCédric Le Goater boot_rom); 3861a15311aSCédric Le Goater } else { 387f489960dSPhilippe Mathieu-Daudé memory_region_init_rom(boot_rom, NULL, "aspeed.boot_rom", 388d769a1daSCédric Le Goater fl->size, &error_abort); 389d769a1daSCédric Le Goater memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR, 390d769a1daSCédric Le Goater boot_rom); 391d769a1daSCédric Le Goater write_boot_rom(drive0, FIRMWARE_ADDR, fl->size, &error_abort); 392d769a1daSCédric Le Goater } 3931a15311aSCédric Le Goater } 394d769a1daSCédric Le Goater 395b7f1a0cbSCédric Le Goater if (machine->kernel_filename && sc->num_cpus > 1) { 3969bb6d140SJoel Stanley /* With no u-boot we must set up a boot stub for the secondary CPU */ 3979bb6d140SJoel Stanley MemoryRegion *smpboot = g_new(MemoryRegion, 1); 398f489960dSPhilippe Mathieu-Daudé memory_region_init_ram(smpboot, NULL, "aspeed.smpboot", 3999bb6d140SJoel Stanley 0x80, &error_abort); 4009bb6d140SJoel Stanley memory_region_add_subregion(get_system_memory(), 4019bb6d140SJoel Stanley AST_SMP_MAILBOX_BASE, smpboot); 4029bb6d140SJoel Stanley 4039bb6d140SJoel Stanley aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot; 4049bb6d140SJoel Stanley aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary; 4059bb6d140SJoel Stanley aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE; 4069bb6d140SJoel Stanley } 4079bb6d140SJoel Stanley 4086e504a98SPaolo Bonzini aspeed_board_binfo.ram_size = machine->ram_size; 409347df6f8SEduardo Habkost aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM]; 410b7f1a0cbSCédric Le Goater aspeed_board_binfo.nb_cpus = sc->num_cpus; 411b033271fSCédric Le Goater 412baa4732bSCédric Le Goater if (amc->i2c_init) { 413baa4732bSCédric Le Goater amc->i2c_init(bmc); 4142cf6cb50SCédric Le Goater } 4152cf6cb50SCédric Le Goater 4160e2c24c6SAndrew Jeffery for (i = 0; i < bmc->soc.sdhci.num_slots; i++) { 417a29e3e12SAndrew Jeffery sdhci_attach_drive(&bmc->soc.sdhci.slots[i], drive_get_next(IF_SD)); 418a29e3e12SAndrew Jeffery } 4192bea128cSEddie James 420a29e3e12SAndrew Jeffery if (bmc->soc.emmc.num_slots) { 421a29e3e12SAndrew Jeffery sdhci_attach_drive(&bmc->soc.emmc.slots[0], drive_get_next(IF_SD)); 4222bea128cSEddie James } 4232bea128cSEddie James 4242744ece8STao Xu arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo); 425327d8e4eSAndrew Jeffery } 426327d8e4eSAndrew Jeffery 427612b219aSPhilippe Mathieu-Daudé static void palmetto_bmc_i2c_init(AspeedMachineState *bmc) 4282cf6cb50SCédric Le Goater { 4292cf6cb50SCédric Le Goater AspeedSoCState *soc = &bmc->soc; 430a87e81b9SCédric Le Goater DeviceState *dev; 4313d165f12SCédric Le Goater uint8_t *eeprom_buf = g_malloc0(32 * 1024); 4322cf6cb50SCédric Le Goater 4332cf6cb50SCédric Le Goater /* The palmetto platform expects a ds3231 RTC but a ds1338 is 4342cf6cb50SCédric Le Goater * enough to provide basic RTC features. Alarms will be missing */ 4351373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68); 436a87e81b9SCédric Le Goater 4377a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, 4383d165f12SCédric Le Goater eeprom_buf); 4393d165f12SCédric Le Goater 440a87e81b9SCédric Le Goater /* add a TMP423 temperature sensor */ 4411373b15bSPhilippe Mathieu-Daudé dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), 4421373b15bSPhilippe Mathieu-Daudé "tmp423", 0x4c)); 4435325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 4445325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 4455325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 4465325cc34SMarkus Armbruster object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort); 4472cf6cb50SCédric Le Goater } 4482cf6cb50SCédric Le Goater 4499cccb912SPatrick Venture static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc) 4509cccb912SPatrick Venture { 4519cccb912SPatrick Venture AspeedSoCState *soc = &bmc->soc; 4529cccb912SPatrick Venture 4539cccb912SPatrick Venture /* 4549cccb912SPatrick Venture * The quanta-q71l platform expects tmp75s which are compatible with 4559cccb912SPatrick Venture * tmp105s. 4569cccb912SPatrick Venture */ 4579cccb912SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c); 4589cccb912SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e); 4599cccb912SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f); 4609cccb912SPatrick Venture 4619cccb912SPatrick Venture /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */ 4629cccb912SPatrick Venture /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */ 4639cccb912SPatrick Venture /* TODO: Add Memory Riser i2c mux and eeproms. */ 4649cccb912SPatrick Venture 4653ec75e39SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74); 4663ec75e39SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77); 4673ec75e39SPatrick Venture 4689cccb912SPatrick Venture /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */ 4693ec75e39SPatrick Venture 4703ec75e39SPatrick Venture /* i2c-7 */ 4713ec75e39SPatrick Venture i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70); 4729cccb912SPatrick Venture /* - i2c@0: pmbus@59 */ 4739cccb912SPatrick Venture /* - i2c@1: pmbus@58 */ 4749cccb912SPatrick Venture /* - i2c@2: pmbus@58 */ 4759cccb912SPatrick Venture /* - i2c@3: pmbus@59 */ 4763ec75e39SPatrick Venture 4779cccb912SPatrick Venture /* TODO: i2c-7: Add PDB FRU eeprom@52 */ 4789cccb912SPatrick Venture /* TODO: i2c-8: Add BMC FRU eeprom@50 */ 4799cccb912SPatrick Venture } 4809cccb912SPatrick Venture 481612b219aSPhilippe Mathieu-Daudé static void ast2500_evb_i2c_init(AspeedMachineState *bmc) 4822cf6cb50SCédric Le Goater { 4832cf6cb50SCédric Le Goater AspeedSoCState *soc = &bmc->soc; 4843d165f12SCédric Le Goater uint8_t *eeprom_buf = g_malloc0(8 * 1024); 4853d165f12SCédric Le Goater 4867a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50, 4873d165f12SCédric Le Goater eeprom_buf); 4882cf6cb50SCédric Le Goater 4892cf6cb50SCédric Le Goater /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */ 4901373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), 491044475f3SPhilippe Mathieu-Daudé TYPE_TMP105, 0x4d); 4926c4567c7SCédric Le Goater 4936c4567c7SCédric Le Goater /* The AST2500 EVB does not have an RTC. Let's pretend that one is 4946c4567c7SCédric Le Goater * plugged on the I2C bus header */ 4951373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32); 4962cf6cb50SCédric Le Goater } 4972cf6cb50SCédric Le Goater 498612b219aSPhilippe Mathieu-Daudé static void ast2600_evb_i2c_init(AspeedMachineState *bmc) 499ccc2c418SCédric Le Goater { 500ccc2c418SCédric Le Goater /* Start with some devices on our I2C busses */ 501ccc2c418SCédric Le Goater ast2500_evb_i2c_init(bmc); 502ccc2c418SCédric Le Goater } 503ccc2c418SCédric Le Goater 504612b219aSPhilippe Mathieu-Daudé static void romulus_bmc_i2c_init(AspeedMachineState *bmc) 5056c4567c7SCédric Le Goater { 5066c4567c7SCédric Le Goater AspeedSoCState *soc = &bmc->soc; 5076c4567c7SCédric Le Goater 5086c4567c7SCédric Le Goater /* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is 5096c4567c7SCédric Le Goater * good enough */ 5101373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32); 5116c4567c7SCédric Le Goater } 5126c4567c7SCédric Le Goater 513612b219aSPhilippe Mathieu-Daudé static void swift_bmc_i2c_init(AspeedMachineState *bmc) 514aae7a18dSAdriana Kobylak { 515aae7a18dSAdriana Kobylak AspeedSoCState *soc = &bmc->soc; 516aae7a18dSAdriana Kobylak 5171373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "pca9552", 0x60); 518aae7a18dSAdriana Kobylak 519aae7a18dSAdriana Kobylak /* The swift board expects a TMP275 but a TMP105 is compatible */ 5201373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "tmp105", 0x48); 521aae7a18dSAdriana Kobylak /* The swift board expects a pca9551 but a pca9552 is compatible */ 5221373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9552", 0x60); 523aae7a18dSAdriana Kobylak 524aae7a18dSAdriana Kobylak /* The swift board expects an Epson RX8900 RTC but a ds1338 is compatible */ 5251373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "ds1338", 0x32); 5261373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x60); 527aae7a18dSAdriana Kobylak 5281373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c); 529aae7a18dSAdriana Kobylak /* The swift board expects a pca9539 but a pca9552 is compatible */ 5301373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "pca9552", 0x74); 531aae7a18dSAdriana Kobylak 5321373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c); 533aae7a18dSAdriana Kobylak /* The swift board expects a pca9539 but a pca9552 is compatible */ 5341373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "pca9552", 535aae7a18dSAdriana Kobylak 0x74); 536aae7a18dSAdriana Kobylak 537aae7a18dSAdriana Kobylak /* The swift board expects a TMP275 but a TMP105 is compatible */ 5381373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12), "tmp105", 0x48); 5391373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12), "tmp105", 0x4a); 540aae7a18dSAdriana Kobylak } 541aae7a18dSAdriana Kobylak 542612b219aSPhilippe Mathieu-Daudé static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc) 543143b040fSPatrick Williams { 544143b040fSPatrick Williams AspeedSoCState *soc = &bmc->soc; 545143b040fSPatrick Williams 546143b040fSPatrick Williams /* bus 2 : */ 5471373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48); 5481373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49); 549143b040fSPatrick Williams /* bus 2 : pca9546 @ 0x73 */ 550143b040fSPatrick Williams 551143b040fSPatrick Williams /* bus 3 : pca9548 @ 0x70 */ 552143b040fSPatrick Williams 553143b040fSPatrick Williams /* bus 4 : */ 554143b040fSPatrick Williams uint8_t *eeprom4_54 = g_malloc0(8 * 1024); 5557a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 556143b040fSPatrick Williams eeprom4_54); 557143b040fSPatrick Williams /* PCA9539 @ 0x76, but PCA9552 is compatible */ 5581373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "pca9552", 0x76); 559143b040fSPatrick Williams /* PCA9539 @ 0x77, but PCA9552 is compatible */ 5601373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "pca9552", 0x77); 561143b040fSPatrick Williams 562143b040fSPatrick Williams /* bus 6 : */ 5631373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48); 5641373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49); 565143b040fSPatrick Williams /* bus 6 : pca9546 @ 0x73 */ 566143b040fSPatrick Williams 567143b040fSPatrick Williams /* bus 8 : */ 568143b040fSPatrick Williams uint8_t *eeprom8_56 = g_malloc0(8 * 1024); 5697a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56, 570143b040fSPatrick Williams eeprom8_56); 5711373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x60); 5721373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x61); 573143b040fSPatrick Williams /* bus 8 : adc128d818 @ 0x1d */ 574143b040fSPatrick Williams /* bus 8 : adc128d818 @ 0x1f */ 575143b040fSPatrick Williams 576143b040fSPatrick Williams /* 577143b040fSPatrick Williams * bus 13 : pca9548 @ 0x71 578143b040fSPatrick Williams * - channel 3: 579143b040fSPatrick Williams * - tmm421 @ 0x4c 580143b040fSPatrick Williams * - tmp421 @ 0x4e 581143b040fSPatrick Williams * - tmp421 @ 0x4f 582143b040fSPatrick Williams */ 583143b040fSPatrick Williams 584143b040fSPatrick Williams } 585143b040fSPatrick Williams 586612b219aSPhilippe Mathieu-Daudé static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc) 58762c2c2ebSCédric Le Goater { 5887cfbde5eSPhilippe Mathieu-Daudé static const struct { 5897cfbde5eSPhilippe Mathieu-Daudé unsigned gpio_id; 5907cfbde5eSPhilippe Mathieu-Daudé LEDColor color; 5917cfbde5eSPhilippe Mathieu-Daudé const char *description; 5927cfbde5eSPhilippe Mathieu-Daudé bool gpio_polarity; 5937cfbde5eSPhilippe Mathieu-Daudé } pca1_leds[] = { 5947cfbde5eSPhilippe Mathieu-Daudé {13, LED_COLOR_GREEN, "front-fault-4", GPIO_POLARITY_ACTIVE_LOW}, 5957cfbde5eSPhilippe Mathieu-Daudé {14, LED_COLOR_GREEN, "front-power-3", GPIO_POLARITY_ACTIVE_LOW}, 5967cfbde5eSPhilippe Mathieu-Daudé {15, LED_COLOR_GREEN, "front-id-5", GPIO_POLARITY_ACTIVE_LOW}, 5977cfbde5eSPhilippe Mathieu-Daudé }; 59862c2c2ebSCédric Le Goater AspeedSoCState *soc = &bmc->soc; 5993d165f12SCédric Le Goater uint8_t *eeprom_buf = g_malloc0(8 * 1024); 60015ce12cfSPhilippe Mathieu-Daudé DeviceState *dev; 6017cfbde5eSPhilippe Mathieu-Daudé LEDState *led; 60262c2c2ebSCédric Le Goater 60363ceb818SCédric Le Goater /* Bus 3: TODO bmp280@77 */ 60463ceb818SCédric Le Goater /* Bus 3: TODO max31785@52 */ 60563ceb818SCédric Le Goater /* Bus 3: TODO dps310@76 */ 606db437ca6SPhilippe Mathieu-Daudé dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60)); 60715ce12cfSPhilippe Mathieu-Daudé qdev_prop_set_string(dev, "description", "pca1"); 6082616f572SPhilippe Mathieu-Daudé i2c_slave_realize_and_unref(I2C_SLAVE(dev), 6092616f572SPhilippe Mathieu-Daudé aspeed_i2c_get_bus(&soc->i2c, 3), 61015ce12cfSPhilippe Mathieu-Daudé &error_fatal); 6118c9a61d7SCédric Le Goater 6127cfbde5eSPhilippe Mathieu-Daudé for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) { 6137cfbde5eSPhilippe Mathieu-Daudé led = led_create_simple(OBJECT(bmc), 6147cfbde5eSPhilippe Mathieu-Daudé pca1_leds[i].gpio_polarity, 6157cfbde5eSPhilippe Mathieu-Daudé pca1_leds[i].color, 6167cfbde5eSPhilippe Mathieu-Daudé pca1_leds[i].description); 6177cfbde5eSPhilippe Mathieu-Daudé qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id, 6187cfbde5eSPhilippe Mathieu-Daudé qdev_get_gpio_in(DEVICE(led), 0)); 6197cfbde5eSPhilippe Mathieu-Daudé } 6201373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c); 6211373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c); 62262c2c2ebSCédric Le Goater 62362c2c2ebSCédric Le Goater /* The Witherspoon expects a TMP275 but a TMP105 is compatible */ 6241373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105, 625044475f3SPhilippe Mathieu-Daudé 0x4a); 6266c4567c7SCédric Le Goater 6276c4567c7SCédric Le Goater /* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is 6286c4567c7SCédric Le Goater * good enough */ 6291373b15bSPhilippe Mathieu-Daudé i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32); 6303d165f12SCédric Le Goater 6317a204cbdSPhilippe Mathieu-Daudé smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51, 6323d165f12SCédric Le Goater eeprom_buf); 633db437ca6SPhilippe Mathieu-Daudé dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60)); 63415ce12cfSPhilippe Mathieu-Daudé qdev_prop_set_string(dev, "description", "pca0"); 6352616f572SPhilippe Mathieu-Daudé i2c_slave_realize_and_unref(I2C_SLAVE(dev), 6362616f572SPhilippe Mathieu-Daudé aspeed_i2c_get_bus(&soc->i2c, 11), 63715ce12cfSPhilippe Mathieu-Daudé &error_fatal); 63863ceb818SCédric Le Goater /* Bus 11: TODO ucd90160@64 */ 63962c2c2ebSCédric Le Goater } 64062c2c2ebSCédric Le Goater 64195f068c8SJohn Wang static void g220a_bmc_i2c_init(AspeedMachineState *bmc) 64295f068c8SJohn Wang { 64395f068c8SJohn Wang AspeedSoCState *soc = &bmc->soc; 64495f068c8SJohn Wang DeviceState *dev; 64595f068c8SJohn Wang 64695f068c8SJohn Wang dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), 64795f068c8SJohn Wang "emc1413", 0x4c)); 64895f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 64995f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 65095f068c8SJohn Wang object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 65195f068c8SJohn Wang 65295f068c8SJohn Wang dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12), 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, 13), 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); 6636f5f6507SJohn Wang 6646f5f6507SJohn Wang static uint8_t eeprom_buf[2 * 1024] = { 6656f5f6507SJohn Wang 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe, 6666f5f6507SJohn Wang 0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65, 6676f5f6507SJohn Wang 0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32, 6686f5f6507SJohn Wang 0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42, 6696f5f6507SJohn Wang 0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45, 6706f5f6507SJohn Wang 0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1, 6716f5f6507SJohn Wang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, 6726f5f6507SJohn Wang }; 6736f5f6507SJohn Wang smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57, 6746f5f6507SJohn Wang eeprom_buf); 67595f068c8SJohn Wang } 67695f068c8SJohn Wang 677fa6d98c0SJoel Stanley static void aspeed_eeprom_init(I2CBus *bus, uint8_t addr, uint32_t rsize) 678fa6d98c0SJoel Stanley { 679fa6d98c0SJoel Stanley I2CSlave *i2c_dev = i2c_slave_new("at24c-eeprom", addr); 680fa6d98c0SJoel Stanley DeviceState *dev = DEVICE(i2c_dev); 681fa6d98c0SJoel Stanley 682fa6d98c0SJoel Stanley qdev_prop_set_uint32(dev, "rom-size", rsize); 683fa6d98c0SJoel Stanley i2c_slave_realize_and_unref(i2c_dev, bus, &error_abort); 684fa6d98c0SJoel Stanley } 685fa6d98c0SJoel Stanley 68658e52bdbSCédric Le Goater static void rainier_bmc_i2c_init(AspeedMachineState *bmc) 68758e52bdbSCédric Le Goater { 68858e52bdbSCédric Le Goater AspeedSoCState *soc = &bmc->soc; 689fa6d98c0SJoel Stanley I2CSlave *i2c_mux; 690fa6d98c0SJoel Stanley 691fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB); 69258e52bdbSCédric Le Goater 69358e52bdbSCédric Le Goater /* The rainier expects a TMP275 but a TMP105 is compatible */ 69458e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105, 69558e52bdbSCédric Le Goater 0x48); 69658e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105, 69758e52bdbSCédric Le Goater 0x49); 69858e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105, 69958e52bdbSCédric Le Goater 0x4a); 700fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), 701fa6d98c0SJoel Stanley "pca9546", 0x70); 702fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 703fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 704fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB); 70558e52bdbSCédric Le Goater 70658e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105, 70758e52bdbSCédric Le Goater 0x48); 70858e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105, 70958e52bdbSCédric Le Goater 0x49); 710fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), 711fa6d98c0SJoel Stanley "pca9546", 0x70); 712fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 713fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 71458e52bdbSCédric Le Goater 71558e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105, 71658e52bdbSCédric Le Goater 0x48); 71758e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105, 71858e52bdbSCédric Le Goater 0x4a); 71958e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105, 72058e52bdbSCédric Le Goater 0x4b); 721fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), 722fa6d98c0SJoel Stanley "pca9546", 0x70); 723fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 724fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 725fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB); 726fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB); 72758e52bdbSCédric Le Goater 72858e52bdbSCédric Le Goater /* Bus 7: TODO dps310@76 */ 72958e52bdbSCédric Le Goater /* Bus 7: TODO max31785@52 */ 73058e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9552", 0x61); 73158e52bdbSCédric Le Goater /* Bus 7: TODO si7021-a20@20 */ 73258e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105, 73358e52bdbSCédric Le Goater 0x48); 734fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB); 735fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB); 73658e52bdbSCédric Le Goater 73758e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105, 73858e52bdbSCédric Le Goater 0x48); 73958e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105, 74058e52bdbSCédric Le Goater 0x4a); 741fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50, 64 * KiB); 742fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 64 * KiB); 74358e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x61); 74458e52bdbSCédric Le Goater /* Bus 8: ucd90320@11 */ 74558e52bdbSCédric Le Goater /* Bus 8: ucd90320@b */ 74658e52bdbSCédric Le Goater /* Bus 8: ucd90320@c */ 74758e52bdbSCédric Le Goater 74858e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c); 74958e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d); 750fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB); 75158e52bdbSCédric Le Goater 75258e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c); 75358e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d); 754fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB); 75558e52bdbSCédric Le Goater 75658e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105, 75758e52bdbSCédric Le Goater 0x48); 75858e52bdbSCédric Le Goater i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105, 75958e52bdbSCédric Le Goater 0x49); 760fa6d98c0SJoel Stanley i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), 761fa6d98c0SJoel Stanley "pca9546", 0x70); 762fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 763fa6d98c0SJoel Stanley aspeed_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 764fa6d98c0SJoel Stanley 765fa6d98c0SJoel Stanley 766fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB); 767fa6d98c0SJoel Stanley 768fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB); 769fa6d98c0SJoel Stanley 770fa6d98c0SJoel Stanley aspeed_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB); 77158e52bdbSCédric Le Goater } 77258e52bdbSCédric Le Goater 7731a15311aSCédric Le Goater static bool aspeed_get_mmio_exec(Object *obj, Error **errp) 7741a15311aSCédric Le Goater { 7751a15311aSCédric Le Goater return ASPEED_MACHINE(obj)->mmio_exec; 7761a15311aSCédric Le Goater } 7771a15311aSCédric Le Goater 7781a15311aSCédric Le Goater static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp) 7791a15311aSCédric Le Goater { 7801a15311aSCédric Le Goater ASPEED_MACHINE(obj)->mmio_exec = value; 7811a15311aSCédric Le Goater } 7821a15311aSCédric Le Goater 7831a15311aSCédric Le Goater static void aspeed_machine_instance_init(Object *obj) 7841a15311aSCédric Le Goater { 7851a15311aSCédric Le Goater ASPEED_MACHINE(obj)->mmio_exec = false; 7861a15311aSCédric Le Goater } 7871a15311aSCédric Le Goater 7889820e52fSCédric Le Goater static char *aspeed_get_fmc_model(Object *obj, Error **errp) 7899820e52fSCédric Le Goater { 7909820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 7919820e52fSCédric Le Goater return g_strdup(bmc->fmc_model); 7929820e52fSCédric Le Goater } 7939820e52fSCédric Le Goater 7949820e52fSCédric Le Goater static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp) 7959820e52fSCédric Le Goater { 7969820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 7979820e52fSCédric Le Goater 7989820e52fSCédric Le Goater g_free(bmc->fmc_model); 7999820e52fSCédric Le Goater bmc->fmc_model = g_strdup(value); 8009820e52fSCédric Le Goater } 8019820e52fSCédric Le Goater 8029820e52fSCédric Le Goater static char *aspeed_get_spi_model(Object *obj, Error **errp) 8039820e52fSCédric Le Goater { 8049820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 8059820e52fSCédric Le Goater return g_strdup(bmc->spi_model); 8069820e52fSCédric Le Goater } 8079820e52fSCédric Le Goater 8089820e52fSCédric Le Goater static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp) 8099820e52fSCédric Le Goater { 8109820e52fSCédric Le Goater AspeedMachineState *bmc = ASPEED_MACHINE(obj); 8119820e52fSCédric Le Goater 8129820e52fSCédric Le Goater g_free(bmc->spi_model); 8139820e52fSCédric Le Goater bmc->spi_model = g_strdup(value); 8149820e52fSCédric Le Goater } 8159820e52fSCédric Le Goater 8161a15311aSCédric Le Goater static void aspeed_machine_class_props_init(ObjectClass *oc) 8171a15311aSCédric Le Goater { 8181a15311aSCédric Le Goater object_class_property_add_bool(oc, "execute-in-place", 8191a15311aSCédric Le Goater aspeed_get_mmio_exec, 820d2623129SMarkus Armbruster aspeed_set_mmio_exec); 8211a15311aSCédric Le Goater object_class_property_set_description(oc, "execute-in-place", 8227eecec7dSMarkus Armbruster "boot directly from CE0 flash device"); 8239820e52fSCédric Le Goater 8249820e52fSCédric Le Goater object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model, 8259820e52fSCédric Le Goater aspeed_set_fmc_model); 8269820e52fSCédric Le Goater object_class_property_set_description(oc, "fmc-model", 8279820e52fSCédric Le Goater "Change the FMC Flash model"); 8289820e52fSCédric Le Goater object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model, 8299820e52fSCédric Le Goater aspeed_set_spi_model); 8309820e52fSCédric Le Goater object_class_property_set_description(oc, "spi-model", 8319820e52fSCédric Le Goater "Change the SPI Flash model"); 8321a15311aSCédric Le Goater } 8331a15311aSCédric Le Goater 834b7f1a0cbSCédric Le Goater static int aspeed_soc_num_cpus(const char *soc_name) 835b7f1a0cbSCédric Le Goater { 836b7f1a0cbSCédric Le Goater AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(soc_name)); 837b7f1a0cbSCédric Le Goater return sc->num_cpus; 838b7f1a0cbSCédric Le Goater } 839b7f1a0cbSCédric Le Goater 840fca9ca1bSCédric Le Goater static void aspeed_machine_class_init(ObjectClass *oc, void *data) 84162c2c2ebSCédric Le Goater { 84262c2c2ebSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 843d3bad7e7SCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 84462c2c2ebSCédric Le Goater 845fca9ca1bSCédric Le Goater mc->init = aspeed_machine_init; 84662c2c2ebSCédric Le Goater mc->no_floppy = 1; 84762c2c2ebSCédric Le Goater mc->no_cdrom = 1; 84862c2c2ebSCédric Le Goater mc->no_parallel = 1; 849afcbaed6SIgor Mammedov mc->default_ram_id = "ram"; 850d3bad7e7SCédric Le Goater amc->macs_mask = ASPEED_MAC0_ON; 8511a15311aSCédric Le Goater 8521a15311aSCédric Le Goater aspeed_machine_class_props_init(oc); 85362c2c2ebSCédric Le Goater } 85462c2c2ebSCédric Le Goater 855baa4732bSCédric Le Goater static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data) 856baa4732bSCédric Le Goater { 857baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 858baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 859baa4732bSCédric Le Goater 860baa4732bSCédric Le Goater mc->desc = "OpenPOWER Palmetto BMC (ARM926EJ-S)"; 861baa4732bSCédric Le Goater amc->soc_name = "ast2400-a1"; 862baa4732bSCédric Le Goater amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1; 863baa4732bSCédric Le Goater amc->fmc_model = "n25q256a"; 864baa4732bSCédric Le Goater amc->spi_model = "mx25l25635e"; 865baa4732bSCédric Le Goater amc->num_cs = 1; 866baa4732bSCédric Le Goater amc->i2c_init = palmetto_bmc_i2c_init; 867baa4732bSCédric Le Goater mc->default_ram_size = 256 * MiB; 868b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 869b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 870baa4732bSCédric Le Goater }; 871baa4732bSCédric Le Goater 8729cccb912SPatrick Venture static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data) 8739cccb912SPatrick Venture { 8749cccb912SPatrick Venture MachineClass *mc = MACHINE_CLASS(oc); 8759cccb912SPatrick Venture AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 8769cccb912SPatrick Venture 8779cccb912SPatrick Venture mc->desc = "Quanta-Q71l BMC (ARM926EJ-S)"; 8789cccb912SPatrick Venture amc->soc_name = "ast2400-a1"; 8799cccb912SPatrick Venture amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1; 8809cccb912SPatrick Venture amc->fmc_model = "n25q256a"; 8819cccb912SPatrick Venture amc->spi_model = "mx25l25635e"; 8829cccb912SPatrick Venture amc->num_cs = 1; 8839cccb912SPatrick Venture amc->i2c_init = quanta_q71l_bmc_i2c_init; 8849cccb912SPatrick Venture mc->default_ram_size = 128 * MiB; 8859cccb912SPatrick Venture mc->default_cpus = mc->min_cpus = mc->max_cpus = 8869cccb912SPatrick Venture aspeed_soc_num_cpus(amc->soc_name); 8879cccb912SPatrick Venture } 8889cccb912SPatrick Venture 88940a38df5SErik Smit static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc, 89040a38df5SErik Smit void *data) 89140a38df5SErik Smit { 89240a38df5SErik Smit MachineClass *mc = MACHINE_CLASS(oc); 89340a38df5SErik Smit AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 89440a38df5SErik Smit 89540a38df5SErik Smit mc->desc = "Supermicro X11 BMC (ARM926EJ-S)"; 89640a38df5SErik Smit amc->soc_name = "ast2400-a1"; 89740a38df5SErik Smit amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1; 89840a38df5SErik Smit amc->fmc_model = "mx25l25635e"; 89940a38df5SErik Smit amc->spi_model = "mx25l25635e"; 90040a38df5SErik Smit amc->num_cs = 1; 90140a38df5SErik Smit amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 90240a38df5SErik Smit amc->i2c_init = palmetto_bmc_i2c_init; 90340a38df5SErik Smit mc->default_ram_size = 256 * MiB; 90440a38df5SErik Smit } 90540a38df5SErik Smit 906baa4732bSCédric Le Goater static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data) 907baa4732bSCédric Le Goater { 908baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 909baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 910baa4732bSCédric Le Goater 911baa4732bSCédric Le Goater mc->desc = "Aspeed AST2500 EVB (ARM1176)"; 912baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1"; 913baa4732bSCédric Le Goater amc->hw_strap1 = AST2500_EVB_HW_STRAP1; 914baa4732bSCédric Le Goater amc->fmc_model = "w25q256"; 915baa4732bSCédric Le Goater amc->spi_model = "mx25l25635e"; 916baa4732bSCédric Le Goater amc->num_cs = 1; 917baa4732bSCédric Le Goater amc->i2c_init = ast2500_evb_i2c_init; 918baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB; 919b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 920b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 921baa4732bSCédric Le Goater }; 922baa4732bSCédric Le Goater 923baa4732bSCédric Le Goater static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data) 924baa4732bSCédric Le Goater { 925baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 926baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 927baa4732bSCédric Le Goater 928baa4732bSCédric Le Goater mc->desc = "OpenPOWER Romulus BMC (ARM1176)"; 929baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1"; 930baa4732bSCédric Le Goater amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1; 931baa4732bSCédric Le Goater amc->fmc_model = "n25q256a"; 932baa4732bSCédric Le Goater amc->spi_model = "mx66l1g45g"; 933baa4732bSCédric Le Goater amc->num_cs = 2; 934baa4732bSCédric Le Goater amc->i2c_init = romulus_bmc_i2c_init; 935baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB; 936b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 937b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 938baa4732bSCédric Le Goater }; 939baa4732bSCédric Le Goater 940143b040fSPatrick Williams static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data) 941143b040fSPatrick Williams { 942143b040fSPatrick Williams MachineClass *mc = MACHINE_CLASS(oc); 943143b040fSPatrick Williams AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 944143b040fSPatrick Williams 945143b040fSPatrick Williams mc->desc = "OCP SonoraPass BMC (ARM1176)"; 946143b040fSPatrick Williams amc->soc_name = "ast2500-a1"; 947143b040fSPatrick Williams amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1; 948143b040fSPatrick Williams amc->fmc_model = "mx66l1g45g"; 949143b040fSPatrick Williams amc->spi_model = "mx66l1g45g"; 950143b040fSPatrick Williams amc->num_cs = 2; 951143b040fSPatrick Williams amc->i2c_init = sonorapass_bmc_i2c_init; 952143b040fSPatrick Williams mc->default_ram_size = 512 * MiB; 953b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 954b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 955143b040fSPatrick Williams }; 956143b040fSPatrick Williams 957baa4732bSCédric Le Goater static void aspeed_machine_swift_class_init(ObjectClass *oc, void *data) 958baa4732bSCédric Le Goater { 959baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 960baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 961baa4732bSCédric Le Goater 962baa4732bSCédric Le Goater mc->desc = "OpenPOWER Swift BMC (ARM1176)"; 963baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1"; 964baa4732bSCédric Le Goater amc->hw_strap1 = SWIFT_BMC_HW_STRAP1; 965baa4732bSCédric Le Goater amc->fmc_model = "mx66l1g45g"; 966baa4732bSCédric Le Goater amc->spi_model = "mx66l1g45g"; 967baa4732bSCédric Le Goater amc->num_cs = 2; 968baa4732bSCédric Le Goater amc->i2c_init = swift_bmc_i2c_init; 969baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB; 970b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 971b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 97263a9c7e0SCédric Le Goater 97363a9c7e0SCédric Le Goater mc->deprecation_reason = "redundant system. Please use a similar " 97463a9c7e0SCédric Le Goater "OpenPOWER BMC, Witherspoon or Romulus."; 975baa4732bSCédric Le Goater }; 976baa4732bSCédric Le Goater 977baa4732bSCédric Le Goater static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data) 978baa4732bSCédric Le Goater { 979baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 980baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 981baa4732bSCédric Le Goater 982baa4732bSCédric Le Goater mc->desc = "OpenPOWER Witherspoon BMC (ARM1176)"; 983baa4732bSCédric Le Goater amc->soc_name = "ast2500-a1"; 984baa4732bSCédric Le Goater amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1; 985baa4732bSCédric Le Goater amc->fmc_model = "mx25l25635e"; 986baa4732bSCédric Le Goater amc->spi_model = "mx66l1g45g"; 987baa4732bSCédric Le Goater amc->num_cs = 2; 988baa4732bSCédric Le Goater amc->i2c_init = witherspoon_bmc_i2c_init; 989baa4732bSCédric Le Goater mc->default_ram_size = 512 * MiB; 990b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 991b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 992baa4732bSCédric Le Goater }; 993baa4732bSCédric Le Goater 994baa4732bSCédric Le Goater static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data) 995baa4732bSCédric Le Goater { 996baa4732bSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 997baa4732bSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 998baa4732bSCédric Le Goater 999f548f201SPeter Maydell mc->desc = "Aspeed AST2600 EVB (Cortex-A7)"; 1000*c5811bb3SJoel Stanley amc->soc_name = "ast2600-a3"; 1001baa4732bSCédric Le Goater amc->hw_strap1 = AST2600_EVB_HW_STRAP1; 1002baa4732bSCédric Le Goater amc->hw_strap2 = AST2600_EVB_HW_STRAP2; 1003baa4732bSCédric Le Goater amc->fmc_model = "w25q512jv"; 1004baa4732bSCédric Le Goater amc->spi_model = "mx66u51235f"; 1005baa4732bSCédric Le Goater amc->num_cs = 1; 100629193286SGuenter Roeck amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON | 100729193286SGuenter Roeck ASPEED_MAC3_ON; 1008baa4732bSCédric Le Goater amc->i2c_init = ast2600_evb_i2c_init; 1009baa4732bSCédric Le Goater mc->default_ram_size = 1 * GiB; 1010b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1011b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 1012baa4732bSCédric Le Goater }; 1013baa4732bSCédric Le Goater 101463ceb818SCédric Le Goater static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data) 101563ceb818SCédric Le Goater { 101663ceb818SCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 101763ceb818SCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 101863ceb818SCédric Le Goater 1019f548f201SPeter Maydell mc->desc = "OpenPOWER Tacoma BMC (Cortex-A7)"; 1020*c5811bb3SJoel Stanley amc->soc_name = "ast2600-a3"; 102163ceb818SCédric Le Goater amc->hw_strap1 = TACOMA_BMC_HW_STRAP1; 102263ceb818SCédric Le Goater amc->hw_strap2 = TACOMA_BMC_HW_STRAP2; 102363ceb818SCédric Le Goater amc->fmc_model = "mx66l1g45g"; 102463ceb818SCédric Le Goater amc->spi_model = "mx66l1g45g"; 102563ceb818SCédric Le Goater amc->num_cs = 2; 1026d3bad7e7SCédric Le Goater amc->macs_mask = ASPEED_MAC2_ON; 102763ceb818SCédric Le Goater amc->i2c_init = witherspoon_bmc_i2c_init; /* Same board layout */ 102863ceb818SCédric Le Goater mc->default_ram_size = 1 * GiB; 1029b7f1a0cbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 1030b7f1a0cbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 103163ceb818SCédric Le Goater }; 103263ceb818SCédric Le Goater 103395f068c8SJohn Wang static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data) 103495f068c8SJohn Wang { 103595f068c8SJohn Wang MachineClass *mc = MACHINE_CLASS(oc); 103695f068c8SJohn Wang AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 103795f068c8SJohn Wang 103895f068c8SJohn Wang mc->desc = "Bytedance G220A BMC (ARM1176)"; 103995f068c8SJohn Wang amc->soc_name = "ast2500-a1"; 104095f068c8SJohn Wang amc->hw_strap1 = G220A_BMC_HW_STRAP1; 104195f068c8SJohn Wang amc->fmc_model = "n25q512a"; 104295f068c8SJohn Wang amc->spi_model = "mx25l25635e"; 104395f068c8SJohn Wang amc->num_cs = 2; 10445bb825c8SGuenter Roeck amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 104595f068c8SJohn Wang amc->i2c_init = g220a_bmc_i2c_init; 104695f068c8SJohn Wang mc->default_ram_size = 1024 * MiB; 104795f068c8SJohn Wang mc->default_cpus = mc->min_cpus = mc->max_cpus = 104895f068c8SJohn Wang aspeed_soc_num_cpus(amc->soc_name); 104995f068c8SJohn Wang }; 105095f068c8SJohn Wang 105158e52bdbSCédric Le Goater static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data) 105258e52bdbSCédric Le Goater { 105358e52bdbSCédric Le Goater MachineClass *mc = MACHINE_CLASS(oc); 105458e52bdbSCédric Le Goater AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 105558e52bdbSCédric Le Goater 1056f548f201SPeter Maydell mc->desc = "IBM Rainier BMC (Cortex-A7)"; 1057*c5811bb3SJoel Stanley amc->soc_name = "ast2600-a3"; 105858e52bdbSCédric Le Goater amc->hw_strap1 = RAINIER_BMC_HW_STRAP1; 105958e52bdbSCédric Le Goater amc->hw_strap2 = RAINIER_BMC_HW_STRAP2; 106058e52bdbSCédric Le Goater amc->fmc_model = "mx66l1g45g"; 106158e52bdbSCédric Le Goater amc->spi_model = "mx66l1g45g"; 106258e52bdbSCédric Le Goater amc->num_cs = 2; 106358e52bdbSCédric Le Goater amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON; 106458e52bdbSCédric Le Goater amc->i2c_init = rainier_bmc_i2c_init; 106558e52bdbSCédric Le Goater mc->default_ram_size = 1 * GiB; 106658e52bdbSCédric Le Goater mc->default_cpus = mc->min_cpus = mc->max_cpus = 106758e52bdbSCédric Le Goater aspeed_soc_num_cpus(amc->soc_name); 106858e52bdbSCédric Le Goater }; 106958e52bdbSCédric Le Goater 1070baa4732bSCédric Le Goater static const TypeInfo aspeed_machine_types[] = { 1071baa4732bSCédric Le Goater { 1072baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("palmetto-bmc"), 1073baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1074baa4732bSCédric Le Goater .class_init = aspeed_machine_palmetto_class_init, 1075baa4732bSCédric Le Goater }, { 107640a38df5SErik Smit .name = MACHINE_TYPE_NAME("supermicrox11-bmc"), 107740a38df5SErik Smit .parent = TYPE_ASPEED_MACHINE, 107840a38df5SErik Smit .class_init = aspeed_machine_supermicrox11_bmc_class_init, 107940a38df5SErik Smit }, { 1080baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("ast2500-evb"), 1081baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1082baa4732bSCédric Le Goater .class_init = aspeed_machine_ast2500_evb_class_init, 1083baa4732bSCédric Le Goater }, { 1084baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("romulus-bmc"), 1085baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1086baa4732bSCédric Le Goater .class_init = aspeed_machine_romulus_class_init, 1087baa4732bSCédric Le Goater }, { 1088baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("swift-bmc"), 1089baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1090baa4732bSCédric Le Goater .class_init = aspeed_machine_swift_class_init, 1091baa4732bSCédric Le Goater }, { 1092143b040fSPatrick Williams .name = MACHINE_TYPE_NAME("sonorapass-bmc"), 1093143b040fSPatrick Williams .parent = TYPE_ASPEED_MACHINE, 1094143b040fSPatrick Williams .class_init = aspeed_machine_sonorapass_class_init, 1095143b040fSPatrick Williams }, { 1096baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("witherspoon-bmc"), 1097baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1098baa4732bSCédric Le Goater .class_init = aspeed_machine_witherspoon_class_init, 1099baa4732bSCédric Le Goater }, { 1100baa4732bSCédric Le Goater .name = MACHINE_TYPE_NAME("ast2600-evb"), 1101baa4732bSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 1102baa4732bSCédric Le Goater .class_init = aspeed_machine_ast2600_evb_class_init, 1103baa4732bSCédric Le Goater }, { 110463ceb818SCédric Le Goater .name = MACHINE_TYPE_NAME("tacoma-bmc"), 110563ceb818SCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 110663ceb818SCédric Le Goater .class_init = aspeed_machine_tacoma_class_init, 110763ceb818SCédric Le Goater }, { 110895f068c8SJohn Wang .name = MACHINE_TYPE_NAME("g220a-bmc"), 110995f068c8SJohn Wang .parent = TYPE_ASPEED_MACHINE, 111095f068c8SJohn Wang .class_init = aspeed_machine_g220a_class_init, 111195f068c8SJohn Wang }, { 11129cccb912SPatrick Venture .name = MACHINE_TYPE_NAME("quanta-q71l-bmc"), 11139cccb912SPatrick Venture .parent = TYPE_ASPEED_MACHINE, 11149cccb912SPatrick Venture .class_init = aspeed_machine_quanta_q71l_class_init, 11159cccb912SPatrick Venture }, { 111658e52bdbSCédric Le Goater .name = MACHINE_TYPE_NAME("rainier-bmc"), 111758e52bdbSCédric Le Goater .parent = TYPE_ASPEED_MACHINE, 111858e52bdbSCédric Le Goater .class_init = aspeed_machine_rainier_class_init, 111958e52bdbSCédric Le Goater }, { 1120fca9ca1bSCédric Le Goater .name = TYPE_ASPEED_MACHINE, 112162c2c2ebSCédric Le Goater .parent = TYPE_MACHINE, 1122888b2b03SPhilippe Mathieu-Daudé .instance_size = sizeof(AspeedMachineState), 11231a15311aSCédric Le Goater .instance_init = aspeed_machine_instance_init, 1124fca9ca1bSCédric Le Goater .class_size = sizeof(AspeedMachineClass), 1125fca9ca1bSCédric Le Goater .class_init = aspeed_machine_class_init, 1126baa4732bSCédric Le Goater .abstract = true, 1127baa4732bSCédric Le Goater } 1128fca9ca1bSCédric Le Goater }; 112974fb1f38SCédric Le Goater 1130baa4732bSCédric Le Goater DEFINE_TYPES(aspeed_machine_types) 1131