1 /* 2 * OpenPOWER Palmetto BMC 3 * 4 * Andrew Jeffery <andrew@aj.id.au> 5 * 6 * Copyright 2016 IBM Corp. 7 * 8 * This code is licensed under the GPL version 2 or later. See 9 * the COPYING file in the top-level directory. 10 */ 11 12 #include "qemu/osdep.h" 13 #include "qapi/error.h" 14 #include "hw/arm/boot.h" 15 #include "hw/arm/aspeed.h" 16 #include "hw/arm/aspeed_soc.h" 17 #include "hw/arm/aspeed_eeprom.h" 18 #include "hw/block/flash.h" 19 #include "hw/i2c/i2c_mux_pca954x.h" 20 #include "hw/i2c/smbus_eeprom.h" 21 #include "hw/gpio/pca9552.h" 22 #include "hw/nvram/eeprom_at24c.h" 23 #include "hw/sensor/tmp105.h" 24 #include "hw/misc/led.h" 25 #include "hw/qdev-properties.h" 26 #include "system/block-backend.h" 27 #include "system/reset.h" 28 #include "hw/loader.h" 29 #include "qemu/error-report.h" 30 #include "qemu/datadir.h" 31 #include "qemu/units.h" 32 #include "hw/qdev-clock.h" 33 #include "system/system.h" 34 35 static struct arm_boot_info aspeed_board_binfo = { 36 .board_id = -1, /* device-tree-only board */ 37 }; 38 39 struct AspeedMachineState { 40 /* Private */ 41 MachineState parent_obj; 42 /* Public */ 43 44 AspeedSoCState *soc; 45 MemoryRegion boot_rom; 46 bool mmio_exec; 47 uint32_t uart_chosen; 48 char *fmc_model; 49 char *spi_model; 50 uint32_t hw_strap1; 51 }; 52 53 /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */ 54 #if HOST_LONG_BITS == 32 55 #define ASPEED_RAM_SIZE(sz) MIN((sz), 1 * GiB) 56 #else 57 #define ASPEED_RAM_SIZE(sz) (sz) 58 #endif 59 60 /* Palmetto hardware value: 0x120CE416 */ 61 #define PALMETTO_BMC_HW_STRAP1 ( \ 62 SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_256MB) | \ 63 SCU_AST2400_HW_STRAP_DRAM_CONFIG(2 /* DDR3 with CL=6, CWL=5 */) | \ 64 SCU_AST2400_HW_STRAP_ACPI_DIS | \ 65 SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) | \ 66 SCU_HW_STRAP_VGA_CLASS_CODE | \ 67 SCU_HW_STRAP_LPC_RESET_PIN | \ 68 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) | \ 69 SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \ 70 SCU_HW_STRAP_SPI_WIDTH | \ 71 SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \ 72 SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT)) 73 74 /* TODO: Find the actual hardware value */ 75 #define SUPERMICROX11_BMC_HW_STRAP1 ( \ 76 SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) | \ 77 SCU_AST2400_HW_STRAP_DRAM_CONFIG(2) | \ 78 SCU_AST2400_HW_STRAP_ACPI_DIS | \ 79 SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) | \ 80 SCU_HW_STRAP_VGA_CLASS_CODE | \ 81 SCU_HW_STRAP_LPC_RESET_PIN | \ 82 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) | \ 83 SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \ 84 SCU_HW_STRAP_SPI_WIDTH | \ 85 SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \ 86 SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT)) 87 88 /* TODO: Find the actual hardware value */ 89 #define SUPERMICRO_X11SPI_BMC_HW_STRAP1 ( \ 90 AST2500_HW_STRAP1_DEFAULTS | \ 91 SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 92 SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 93 SCU_AST2500_HW_STRAP_UART_DEBUG | \ 94 SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 95 SCU_HW_STRAP_SPI_WIDTH | \ 96 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN)) 97 98 /* AST2500 evb hardware value: 0xF100C2E6 */ 99 #define AST2500_EVB_HW_STRAP1 (( \ 100 AST2500_HW_STRAP1_DEFAULTS | \ 101 SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 102 SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 103 SCU_AST2500_HW_STRAP_UART_DEBUG | \ 104 SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 105 SCU_HW_STRAP_MAC1_RGMII | \ 106 SCU_HW_STRAP_MAC0_RGMII) & \ 107 ~SCU_HW_STRAP_2ND_BOOT_WDT) 108 109 /* Romulus hardware value: 0xF10AD206 */ 110 #define ROMULUS_BMC_HW_STRAP1 ( \ 111 AST2500_HW_STRAP1_DEFAULTS | \ 112 SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 113 SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 114 SCU_AST2500_HW_STRAP_UART_DEBUG | \ 115 SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 116 SCU_AST2500_HW_STRAP_ACPI_ENABLE | \ 117 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER)) 118 119 /* Sonorapass hardware value: 0xF100D216 */ 120 #define SONORAPASS_BMC_HW_STRAP1 ( \ 121 SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 122 SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 123 SCU_AST2500_HW_STRAP_UART_DEBUG | \ 124 SCU_AST2500_HW_STRAP_RESERVED28 | \ 125 SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 126 SCU_HW_STRAP_VGA_CLASS_CODE | \ 127 SCU_HW_STRAP_LPC_RESET_PIN | \ 128 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \ 129 SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \ 130 SCU_HW_STRAP_VGA_BIOS_ROM | \ 131 SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \ 132 SCU_AST2500_HW_STRAP_RESERVED1) 133 134 #define G220A_BMC_HW_STRAP1 ( \ 135 SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 136 SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 137 SCU_AST2500_HW_STRAP_UART_DEBUG | \ 138 SCU_AST2500_HW_STRAP_RESERVED28 | \ 139 SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 140 SCU_HW_STRAP_2ND_BOOT_WDT | \ 141 SCU_HW_STRAP_VGA_CLASS_CODE | \ 142 SCU_HW_STRAP_LPC_RESET_PIN | \ 143 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \ 144 SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \ 145 SCU_HW_STRAP_VGA_SIZE_SET(VGA_64M_DRAM) | \ 146 SCU_AST2500_HW_STRAP_RESERVED1) 147 148 /* FP5280G2 hardware value: 0XF100D286 */ 149 #define FP5280G2_BMC_HW_STRAP1 ( \ 150 SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \ 151 SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \ 152 SCU_AST2500_HW_STRAP_UART_DEBUG | \ 153 SCU_AST2500_HW_STRAP_RESERVED28 | \ 154 SCU_AST2500_HW_STRAP_DDR4_ENABLE | \ 155 SCU_HW_STRAP_VGA_CLASS_CODE | \ 156 SCU_HW_STRAP_LPC_RESET_PIN | \ 157 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \ 158 SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \ 159 SCU_HW_STRAP_MAC1_RGMII | \ 160 SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \ 161 SCU_AST2500_HW_STRAP_RESERVED1) 162 163 /* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */ 164 #define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1 165 166 /* Quanta-Q71l hardware value */ 167 #define QUANTA_Q71L_BMC_HW_STRAP1 ( \ 168 SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) | \ 169 SCU_AST2400_HW_STRAP_DRAM_CONFIG(2/* DDR3 with CL=6, CWL=5 */) | \ 170 SCU_AST2400_HW_STRAP_ACPI_DIS | \ 171 SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_24M_IN) | \ 172 SCU_HW_STRAP_VGA_CLASS_CODE | \ 173 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_PASS_THROUGH) | \ 174 SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \ 175 SCU_HW_STRAP_SPI_WIDTH | \ 176 SCU_HW_STRAP_VGA_SIZE_SET(VGA_8M_DRAM) | \ 177 SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT)) 178 179 /* AST2600 evb hardware value */ 180 #define AST2600_EVB_HW_STRAP1 0x000000C0 181 #define AST2600_EVB_HW_STRAP2 0x00000003 182 183 #ifdef TARGET_AARCH64 184 /* AST2700 evb hardware value */ 185 /* SCU HW Strap1 */ 186 #define AST2700_EVB_HW_STRAP1 0x00000800 187 /* SCUIO HW Strap1 */ 188 #define AST2700_EVB_HW_STRAP2 0x00000700 189 #endif 190 191 /* Rainier hardware value: (QEMU prototype) */ 192 #define RAINIER_BMC_HW_STRAP1 (0x00422016 | SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC) 193 #define RAINIER_BMC_HW_STRAP2 0x80000848 194 195 /* Fuji hardware value */ 196 #define FUJI_BMC_HW_STRAP1 0x00000000 197 #define FUJI_BMC_HW_STRAP2 0x00000000 198 199 /* Bletchley hardware value */ 200 /* TODO: Leave same as EVB for now. */ 201 #define BLETCHLEY_BMC_HW_STRAP1 AST2600_EVB_HW_STRAP1 202 #define BLETCHLEY_BMC_HW_STRAP2 AST2600_EVB_HW_STRAP2 203 204 /* Qualcomm DC-SCM hardware value */ 205 #define QCOM_DC_SCM_V1_BMC_HW_STRAP1 0x00000000 206 #define QCOM_DC_SCM_V1_BMC_HW_STRAP2 0x00000041 207 208 #define AST_SMP_MAILBOX_BASE 0x1e6e2180 209 #define AST_SMP_MBOX_FIELD_ENTRY (AST_SMP_MAILBOX_BASE + 0x0) 210 #define AST_SMP_MBOX_FIELD_GOSIGN (AST_SMP_MAILBOX_BASE + 0x4) 211 #define AST_SMP_MBOX_FIELD_READY (AST_SMP_MAILBOX_BASE + 0x8) 212 #define AST_SMP_MBOX_FIELD_POLLINSN (AST_SMP_MAILBOX_BASE + 0xc) 213 #define AST_SMP_MBOX_CODE (AST_SMP_MAILBOX_BASE + 0x10) 214 #define AST_SMP_MBOX_GOSIGN 0xabbaab00 215 216 static void aspeed_write_smpboot(ARMCPU *cpu, 217 const struct arm_boot_info *info) 218 { 219 AddressSpace *as = arm_boot_address_space(cpu, info); 220 static const ARMInsnFixup poll_mailbox_ready[] = { 221 /* 222 * r2 = per-cpu go sign value 223 * r1 = AST_SMP_MBOX_FIELD_ENTRY 224 * r0 = AST_SMP_MBOX_FIELD_GOSIGN 225 */ 226 { 0xee100fb0 }, /* mrc p15, 0, r0, c0, c0, 5 */ 227 { 0xe21000ff }, /* ands r0, r0, #255 */ 228 { 0xe59f201c }, /* ldr r2, [pc, #28] */ 229 { 0xe1822000 }, /* orr r2, r2, r0 */ 230 231 { 0xe59f1018 }, /* ldr r1, [pc, #24] */ 232 { 0xe59f0018 }, /* ldr r0, [pc, #24] */ 233 234 { 0xe320f002 }, /* wfe */ 235 { 0xe5904000 }, /* ldr r4, [r0] */ 236 { 0xe1520004 }, /* cmp r2, r4 */ 237 { 0x1afffffb }, /* bne <wfe> */ 238 { 0xe591f000 }, /* ldr pc, [r1] */ 239 { AST_SMP_MBOX_GOSIGN }, 240 { AST_SMP_MBOX_FIELD_ENTRY }, 241 { AST_SMP_MBOX_FIELD_GOSIGN }, 242 { 0, FIXUP_TERMINATOR } 243 }; 244 static const uint32_t fixupcontext[FIXUP_MAX] = { 0 }; 245 246 arm_write_bootloader("aspeed.smpboot", as, info->smp_loader_start, 247 poll_mailbox_ready, fixupcontext); 248 } 249 250 static void aspeed_reset_secondary(ARMCPU *cpu, 251 const struct arm_boot_info *info) 252 { 253 AddressSpace *as = arm_boot_address_space(cpu, info); 254 CPUState *cs = CPU(cpu); 255 256 /* info->smp_bootreg_addr */ 257 address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0, 258 MEMTXATTRS_UNSPECIFIED, NULL); 259 cpu_set_pc(cs, info->smp_loader_start); 260 } 261 262 static void write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size, 263 Error **errp) 264 { 265 g_autofree void *storage = NULL; 266 int64_t size; 267 268 /* 269 * The block backend size should have already been 'validated' by 270 * the creation of the m25p80 object. 271 */ 272 size = blk_getlength(blk); 273 if (size <= 0) { 274 error_setg(errp, "failed to get flash size"); 275 return; 276 } 277 278 if (rom_size > size) { 279 rom_size = size; 280 } 281 282 storage = g_malloc0(rom_size); 283 if (blk_pread(blk, 0, rom_size, storage, 0) < 0) { 284 error_setg(errp, "failed to read the initial flash content"); 285 return; 286 } 287 288 rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr); 289 } 290 291 /* 292 * Create a ROM and copy the flash contents at the expected address 293 * (0x0). Boots faster than execute-in-place. 294 */ 295 static void aspeed_install_boot_rom(AspeedMachineState *bmc, BlockBackend *blk, 296 uint64_t rom_size) 297 { 298 AspeedSoCState *soc = bmc->soc; 299 AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(soc); 300 301 memory_region_init_rom(&bmc->boot_rom, NULL, "aspeed.boot_rom", rom_size, 302 &error_abort); 303 memory_region_add_subregion_overlap(&soc->spi_boot_container, 0, 304 &bmc->boot_rom, 1); 305 write_boot_rom(blk, sc->memmap[ASPEED_DEV_SPI_BOOT], 306 rom_size, &error_abort); 307 } 308 309 #define VBOOTROM_FILE_NAME "ast27x0_bootrom.bin" 310 311 /* 312 * This function locates the vbootrom image file specified via the command line 313 * using the -bios option. It loads the specified image into the vbootrom 314 * memory region and handles errors if the file cannot be found or loaded. 315 */ 316 static void aspeed_load_vbootrom(AspeedMachineState *bmc, const char *bios_name, 317 Error **errp) 318 { 319 g_autofree char *filename = NULL; 320 AspeedSoCState *soc = bmc->soc; 321 int ret; 322 323 filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name); 324 if (!filename) { 325 error_setg(errp, "Could not find vbootrom image '%s'", bios_name); 326 return; 327 } 328 329 ret = load_image_mr(filename, &soc->vbootrom); 330 if (ret < 0) { 331 error_setg(errp, "Failed to load vbootrom image '%s'", bios_name); 332 return; 333 } 334 } 335 336 void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype, 337 unsigned int count, int unit0) 338 { 339 int i; 340 341 if (!flashtype) { 342 return; 343 } 344 345 for (i = 0; i < count; ++i) { 346 DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i); 347 DeviceState *dev; 348 349 dev = qdev_new(flashtype); 350 if (dinfo) { 351 qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo)); 352 } 353 qdev_prop_set_uint8(dev, "cs", i); 354 qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal); 355 } 356 } 357 358 static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo, bool emmc, 359 bool boot_emmc) 360 { 361 DeviceState *card; 362 363 if (!dinfo) { 364 return; 365 } 366 card = qdev_new(emmc ? TYPE_EMMC : TYPE_SD_CARD); 367 368 /* 369 * Force the boot properties of the eMMC device only when the 370 * machine is strapped to boot from eMMC. Without these 371 * settings, the machine would not boot. 372 * 373 * This also allows the machine to use an eMMC device without 374 * boot areas when booting from the flash device (or -kernel) 375 * Ideally, the device and its properties should be defined on 376 * the command line. 377 */ 378 if (emmc && boot_emmc) { 379 qdev_prop_set_uint64(card, "boot-partition-size", 1 * MiB); 380 qdev_prop_set_uint8(card, "boot-config", 0x1 << 3); 381 } 382 qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo), 383 &error_fatal); 384 qdev_realize_and_unref(card, 385 qdev_get_child_bus(DEVICE(sdhci), "sd-bus"), 386 &error_fatal); 387 } 388 389 static void connect_serial_hds_to_uarts(AspeedMachineState *bmc) 390 { 391 AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc); 392 AspeedSoCState *s = bmc->soc; 393 AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s); 394 int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default; 395 396 aspeed_soc_uart_set_chr(s, uart_chosen, serial_hd(0)); 397 for (int i = 1, uart = sc->uarts_base; i < sc->uarts_num; uart++) { 398 if (uart == uart_chosen) { 399 continue; 400 } 401 aspeed_soc_uart_set_chr(s, uart, serial_hd(i++)); 402 } 403 } 404 405 static void aspeed_machine_init(MachineState *machine) 406 { 407 AspeedMachineState *bmc = ASPEED_MACHINE(machine); 408 AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine); 409 AspeedSoCClass *sc; 410 int i; 411 const char *bios_name = NULL; 412 DriveInfo *emmc0 = NULL; 413 bool boot_emmc; 414 415 bmc->soc = ASPEED_SOC(object_new(amc->soc_name)); 416 object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc)); 417 object_unref(OBJECT(bmc->soc)); 418 sc = ASPEED_SOC_GET_CLASS(bmc->soc); 419 420 /* 421 * This will error out if the RAM size is not supported by the 422 * memory controller of the SoC. 423 */ 424 object_property_set_uint(OBJECT(bmc->soc), "ram-size", machine->ram_size, 425 &error_fatal); 426 427 for (i = 0; i < sc->macs_num; i++) { 428 if ((amc->macs_mask & (1 << i)) && 429 !qemu_configure_nic_device(DEVICE(&bmc->soc->ftgmac100[i]), 430 true, NULL)) { 431 break; /* No configs left; stop asking */ 432 } 433 } 434 435 object_property_set_int(OBJECT(bmc->soc), "hw-strap1", bmc->hw_strap1, 436 &error_abort); 437 object_property_set_int(OBJECT(bmc->soc), "hw-strap2", amc->hw_strap2, 438 &error_abort); 439 object_property_set_link(OBJECT(bmc->soc), "memory", 440 OBJECT(get_system_memory()), &error_abort); 441 object_property_set_link(OBJECT(bmc->soc), "dram", 442 OBJECT(machine->ram), &error_abort); 443 if (amc->sdhci_wp_inverted) { 444 for (i = 0; i < bmc->soc->sdhci.num_slots; i++) { 445 object_property_set_bool(OBJECT(&bmc->soc->sdhci.slots[i]), 446 "wp-inverted", true, &error_abort); 447 } 448 } 449 if (machine->kernel_filename) { 450 /* 451 * When booting with a -kernel command line there is no u-boot 452 * that runs to unlock the SCU. In this case set the default to 453 * be unlocked as the kernel expects 454 */ 455 object_property_set_int(OBJECT(bmc->soc), "hw-prot-key", 456 ASPEED_SCU_PROT_KEY, &error_abort); 457 } 458 connect_serial_hds_to_uarts(bmc); 459 qdev_realize(DEVICE(bmc->soc), NULL, &error_abort); 460 461 if (defaults_enabled()) { 462 aspeed_board_init_flashes(&bmc->soc->fmc, 463 bmc->fmc_model ? bmc->fmc_model : amc->fmc_model, 464 amc->num_cs, 0); 465 aspeed_board_init_flashes(&bmc->soc->spi[0], 466 bmc->spi_model ? bmc->spi_model : amc->spi_model, 467 1, amc->num_cs); 468 } 469 470 if (machine->kernel_filename && sc->num_cpus > 1) { 471 /* With no u-boot we must set up a boot stub for the secondary CPU */ 472 MemoryRegion *smpboot = g_new(MemoryRegion, 1); 473 memory_region_init_ram(smpboot, NULL, "aspeed.smpboot", 474 0x80, &error_abort); 475 memory_region_add_subregion(get_system_memory(), 476 AST_SMP_MAILBOX_BASE, smpboot); 477 478 aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot; 479 aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary; 480 aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE; 481 } 482 483 aspeed_board_binfo.ram_size = machine->ram_size; 484 aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM]; 485 486 if (amc->i2c_init) { 487 amc->i2c_init(bmc); 488 } 489 490 for (i = 0; i < bmc->soc->sdhci.num_slots && defaults_enabled(); i++) { 491 sdhci_attach_drive(&bmc->soc->sdhci.slots[i], 492 drive_get(IF_SD, 0, i), false, false); 493 } 494 495 boot_emmc = sc->boot_from_emmc(bmc->soc); 496 497 if (bmc->soc->emmc.num_slots && defaults_enabled()) { 498 emmc0 = drive_get(IF_SD, 0, bmc->soc->sdhci.num_slots); 499 sdhci_attach_drive(&bmc->soc->emmc.slots[0], emmc0, true, boot_emmc); 500 } 501 502 if (!bmc->mmio_exec) { 503 DeviceState *dev = ssi_get_cs(bmc->soc->fmc.spi, 0); 504 BlockBackend *fmc0 = dev ? m25p80_get_blk(dev) : NULL; 505 506 if (fmc0 && !boot_emmc) { 507 uint64_t rom_size = memory_region_size(&bmc->soc->spi_boot); 508 aspeed_install_boot_rom(bmc, fmc0, rom_size); 509 } else if (emmc0) { 510 aspeed_install_boot_rom(bmc, blk_by_legacy_dinfo(emmc0), 64 * KiB); 511 } 512 } 513 514 if (amc->vbootrom) { 515 bios_name = machine->firmware ?: VBOOTROM_FILE_NAME; 516 aspeed_load_vbootrom(bmc, bios_name, &error_abort); 517 } 518 519 arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo); 520 } 521 522 static void palmetto_bmc_i2c_init(AspeedMachineState *bmc) 523 { 524 AspeedSoCState *soc = bmc->soc; 525 DeviceState *dev; 526 uint8_t *eeprom_buf = g_malloc0(32 * 1024); 527 528 /* 529 * The palmetto platform expects a ds3231 RTC but a ds1338 is 530 * enough to provide basic RTC features. Alarms will be missing 531 */ 532 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68); 533 534 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, 535 eeprom_buf); 536 537 /* add a TMP423 temperature sensor */ 538 dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), 539 "tmp423", 0x4c)); 540 object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 541 object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 542 object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 543 object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort); 544 } 545 546 static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc) 547 { 548 AspeedSoCState *soc = bmc->soc; 549 550 /* 551 * The quanta-q71l platform expects tmp75s which are compatible with 552 * tmp105s. 553 */ 554 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c); 555 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e); 556 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f); 557 558 /* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */ 559 /* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */ 560 /* TODO: Add Memory Riser i2c mux and eeproms. */ 561 562 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74); 563 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77); 564 565 /* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */ 566 567 /* i2c-7 */ 568 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70); 569 /* - i2c@0: pmbus@59 */ 570 /* - i2c@1: pmbus@58 */ 571 /* - i2c@2: pmbus@58 */ 572 /* - i2c@3: pmbus@59 */ 573 574 /* TODO: i2c-7: Add PDB FRU eeprom@52 */ 575 /* TODO: i2c-8: Add BMC FRU eeprom@50 */ 576 } 577 578 static void ast2500_evb_i2c_init(AspeedMachineState *bmc) 579 { 580 AspeedSoCState *soc = bmc->soc; 581 uint8_t *eeprom_buf = g_malloc0(8 * 1024); 582 583 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50, 584 eeprom_buf); 585 586 /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */ 587 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), 588 TYPE_TMP105, 0x4d); 589 } 590 591 static void ast2600_evb_i2c_init(AspeedMachineState *bmc) 592 { 593 AspeedSoCState *soc = bmc->soc; 594 uint8_t *eeprom_buf = g_malloc0(8 * 1024); 595 596 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 597 eeprom_buf); 598 599 /* LM75 is compatible with TMP105 driver */ 600 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), 601 TYPE_TMP105, 0x4d); 602 } 603 604 static void yosemitev2_bmc_i2c_init(AspeedMachineState *bmc) 605 { 606 AspeedSoCState *soc = bmc->soc; 607 608 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x51, 128 * KiB); 609 at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 128 * KiB, 610 yosemitev2_bmc_fruid, yosemitev2_bmc_fruid_len); 611 /* TMP421 */ 612 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "tmp421", 0x1f); 613 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4e); 614 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4f); 615 616 } 617 618 static void romulus_bmc_i2c_init(AspeedMachineState *bmc) 619 { 620 AspeedSoCState *soc = bmc->soc; 621 622 /* 623 * The romulus board expects Epson RX8900 I2C RTC but a ds1338 is 624 * good enough 625 */ 626 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32); 627 } 628 629 static void tiogapass_bmc_i2c_init(AspeedMachineState *bmc) 630 { 631 AspeedSoCState *soc = bmc->soc; 632 633 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 128 * KiB); 634 at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 6), 0x54, 128 * KiB, 635 tiogapass_bmc_fruid, tiogapass_bmc_fruid_len); 636 /* TMP421 */ 637 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "tmp421", 0x1f); 638 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4f); 639 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4e); 640 } 641 642 static void create_pca9552(AspeedSoCState *soc, int bus_id, int addr) 643 { 644 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, bus_id), 645 TYPE_PCA9552, addr); 646 } 647 648 static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc) 649 { 650 AspeedSoCState *soc = bmc->soc; 651 652 /* bus 2 : */ 653 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48); 654 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49); 655 /* bus 2 : pca9546 @ 0x73 */ 656 657 /* bus 3 : pca9548 @ 0x70 */ 658 659 /* bus 4 : */ 660 uint8_t *eeprom4_54 = g_malloc0(8 * 1024); 661 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 662 eeprom4_54); 663 /* PCA9539 @ 0x76, but PCA9552 is compatible */ 664 create_pca9552(soc, 4, 0x76); 665 /* PCA9539 @ 0x77, but PCA9552 is compatible */ 666 create_pca9552(soc, 4, 0x77); 667 668 /* bus 6 : */ 669 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48); 670 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49); 671 /* bus 6 : pca9546 @ 0x73 */ 672 673 /* bus 8 : */ 674 uint8_t *eeprom8_56 = g_malloc0(8 * 1024); 675 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56, 676 eeprom8_56); 677 create_pca9552(soc, 8, 0x60); 678 create_pca9552(soc, 8, 0x61); 679 /* bus 8 : adc128d818 @ 0x1d */ 680 /* bus 8 : adc128d818 @ 0x1f */ 681 682 /* 683 * bus 13 : pca9548 @ 0x71 684 * - channel 3: 685 * - tmm421 @ 0x4c 686 * - tmp421 @ 0x4e 687 * - tmp421 @ 0x4f 688 */ 689 690 } 691 692 static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc) 693 { 694 static const struct { 695 unsigned gpio_id; 696 LEDColor color; 697 const char *description; 698 bool gpio_polarity; 699 } pca1_leds[] = { 700 {13, LED_COLOR_GREEN, "front-fault-4", GPIO_POLARITY_ACTIVE_LOW}, 701 {14, LED_COLOR_GREEN, "front-power-3", GPIO_POLARITY_ACTIVE_LOW}, 702 {15, LED_COLOR_GREEN, "front-id-5", GPIO_POLARITY_ACTIVE_LOW}, 703 }; 704 AspeedSoCState *soc = bmc->soc; 705 uint8_t *eeprom_buf = g_malloc0(8 * 1024); 706 DeviceState *dev; 707 LEDState *led; 708 709 /* Bus 3: TODO bmp280@77 */ 710 dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60)); 711 qdev_prop_set_string(dev, "description", "pca1"); 712 i2c_slave_realize_and_unref(I2C_SLAVE(dev), 713 aspeed_i2c_get_bus(&soc->i2c, 3), 714 &error_fatal); 715 716 for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) { 717 led = led_create_simple(OBJECT(bmc), 718 pca1_leds[i].gpio_polarity, 719 pca1_leds[i].color, 720 pca1_leds[i].description); 721 qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id, 722 qdev_get_gpio_in(DEVICE(led), 0)); 723 } 724 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76); 725 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "max31785", 0x52); 726 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c); 727 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c); 728 729 /* The Witherspoon expects a TMP275 but a TMP105 is compatible */ 730 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105, 731 0x4a); 732 733 /* 734 * The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is 735 * good enough 736 */ 737 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32); 738 739 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51, 740 eeprom_buf); 741 dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60)); 742 qdev_prop_set_string(dev, "description", "pca0"); 743 i2c_slave_realize_and_unref(I2C_SLAVE(dev), 744 aspeed_i2c_get_bus(&soc->i2c, 11), 745 &error_fatal); 746 /* Bus 11: TODO ucd90160@64 */ 747 } 748 749 static void g220a_bmc_i2c_init(AspeedMachineState *bmc) 750 { 751 AspeedSoCState *soc = bmc->soc; 752 DeviceState *dev; 753 754 dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), 755 "emc1413", 0x4c)); 756 object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 757 object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 758 object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 759 760 dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12), 761 "emc1413", 0x4c)); 762 object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 763 object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 764 object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 765 766 dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13), 767 "emc1413", 0x4c)); 768 object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort); 769 object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort); 770 object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort); 771 772 static uint8_t eeprom_buf[2 * 1024] = { 773 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe, 774 0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65, 775 0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32, 776 0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42, 777 0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45, 778 0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1, 779 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, 780 }; 781 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57, 782 eeprom_buf); 783 } 784 785 static void fp5280g2_bmc_i2c_init(AspeedMachineState *bmc) 786 { 787 AspeedSoCState *soc = bmc->soc; 788 I2CSlave *i2c_mux; 789 790 /* The at24c256 */ 791 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 1), 0x50, 32768); 792 793 /* The fp5280g2 expects a TMP112 but a TMP105 is compatible */ 794 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105, 795 0x48); 796 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), TYPE_TMP105, 797 0x49); 798 799 i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), 800 "pca9546", 0x70); 801 /* It expects a TMP112 but a TMP105 is compatible */ 802 i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0), TYPE_TMP105, 803 0x4a); 804 805 /* It expects a ds3232 but a ds1338 is good enough */ 806 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "ds1338", 0x68); 807 808 /* It expects a pca9555 but a pca9552 is compatible */ 809 create_pca9552(soc, 8, 0x30); 810 } 811 812 static void rainier_bmc_i2c_init(AspeedMachineState *bmc) 813 { 814 AspeedSoCState *soc = bmc->soc; 815 I2CSlave *i2c_mux; 816 817 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB); 818 819 create_pca9552(soc, 3, 0x61); 820 821 /* The rainier expects a TMP275 but a TMP105 is compatible */ 822 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105, 823 0x48); 824 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105, 825 0x49); 826 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105, 827 0x4a); 828 i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), 829 "pca9546", 0x70); 830 at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 831 at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 832 at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB); 833 create_pca9552(soc, 4, 0x60); 834 835 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105, 836 0x48); 837 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105, 838 0x49); 839 create_pca9552(soc, 5, 0x60); 840 create_pca9552(soc, 5, 0x61); 841 i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), 842 "pca9546", 0x70); 843 at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 844 at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 845 846 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105, 847 0x48); 848 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105, 849 0x4a); 850 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105, 851 0x4b); 852 i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), 853 "pca9546", 0x70); 854 at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 855 at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 856 at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB); 857 at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB); 858 859 create_pca9552(soc, 7, 0x30); 860 create_pca9552(soc, 7, 0x31); 861 create_pca9552(soc, 7, 0x32); 862 create_pca9552(soc, 7, 0x33); 863 create_pca9552(soc, 7, 0x60); 864 create_pca9552(soc, 7, 0x61); 865 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76); 866 /* Bus 7: TODO si7021-a20@20 */ 867 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105, 868 0x48); 869 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "max31785", 0x52); 870 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB); 871 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB); 872 873 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105, 874 0x48); 875 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105, 876 0x4a); 877 at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50, 878 64 * KiB, rainier_bb_fruid, rainier_bb_fruid_len); 879 at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 880 64 * KiB, rainier_bmc_fruid, rainier_bmc_fruid_len); 881 create_pca9552(soc, 8, 0x60); 882 create_pca9552(soc, 8, 0x61); 883 /* Bus 8: ucd90320@11 */ 884 /* Bus 8: ucd90320@b */ 885 /* Bus 8: ucd90320@c */ 886 887 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c); 888 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d); 889 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB); 890 891 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c); 892 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d); 893 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB); 894 895 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105, 896 0x48); 897 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105, 898 0x49); 899 i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), 900 "pca9546", 0x70); 901 at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB); 902 at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB); 903 create_pca9552(soc, 11, 0x60); 904 905 906 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB); 907 create_pca9552(soc, 13, 0x60); 908 909 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB); 910 create_pca9552(soc, 14, 0x60); 911 912 at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB); 913 create_pca9552(soc, 15, 0x60); 914 } 915 916 static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr, 917 I2CBus **channels) 918 { 919 I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr); 920 for (int i = 0; i < 8; i++) { 921 channels[i] = pca954x_i2c_get_bus(mux, i); 922 } 923 } 924 925 #define TYPE_LM75 TYPE_TMP105 926 #define TYPE_TMP75 TYPE_TMP105 927 #define TYPE_TMP422 "tmp422" 928 929 static void fuji_bmc_i2c_init(AspeedMachineState *bmc) 930 { 931 AspeedSoCState *soc = bmc->soc; 932 I2CBus *i2c[144] = {}; 933 934 for (int i = 0; i < 16; i++) { 935 i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i); 936 } 937 I2CBus *i2c180 = i2c[2]; 938 I2CBus *i2c480 = i2c[8]; 939 I2CBus *i2c600 = i2c[11]; 940 941 get_pca9548_channels(i2c180, 0x70, &i2c[16]); 942 get_pca9548_channels(i2c480, 0x70, &i2c[24]); 943 /* NOTE: The device tree skips [32, 40) in the alias numbering */ 944 get_pca9548_channels(i2c600, 0x77, &i2c[40]); 945 get_pca9548_channels(i2c[24], 0x71, &i2c[48]); 946 get_pca9548_channels(i2c[25], 0x72, &i2c[56]); 947 get_pca9548_channels(i2c[26], 0x76, &i2c[64]); 948 get_pca9548_channels(i2c[27], 0x76, &i2c[72]); 949 for (int i = 0; i < 8; i++) { 950 get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]); 951 } 952 953 i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c); 954 i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d); 955 956 /* 957 * EEPROM 24c64 size is 64Kbits or 8 Kbytes 958 * 24c02 size is 2Kbits or 256 bytes 959 */ 960 at24c_eeprom_init(i2c[19], 0x52, 8 * KiB); 961 at24c_eeprom_init(i2c[20], 0x50, 256); 962 at24c_eeprom_init(i2c[22], 0x52, 256); 963 964 i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x48); 965 i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x49); 966 i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x4a); 967 i2c_slave_create_simple(i2c[3], TYPE_TMP422, 0x4c); 968 969 at24c_eeprom_init(i2c[8], 0x51, 8 * KiB); 970 i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a); 971 972 i2c_slave_create_simple(i2c[50], TYPE_LM75, 0x4c); 973 at24c_eeprom_init(i2c[50], 0x52, 8 * KiB); 974 i2c_slave_create_simple(i2c[51], TYPE_TMP75, 0x48); 975 i2c_slave_create_simple(i2c[52], TYPE_TMP75, 0x49); 976 977 i2c_slave_create_simple(i2c[59], TYPE_TMP75, 0x48); 978 i2c_slave_create_simple(i2c[60], TYPE_TMP75, 0x49); 979 980 at24c_eeprom_init(i2c[65], 0x53, 8 * KiB); 981 i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x49); 982 i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x48); 983 at24c_eeprom_init(i2c[68], 0x52, 8 * KiB); 984 at24c_eeprom_init(i2c[69], 0x52, 8 * KiB); 985 at24c_eeprom_init(i2c[70], 0x52, 8 * KiB); 986 at24c_eeprom_init(i2c[71], 0x52, 8 * KiB); 987 988 at24c_eeprom_init(i2c[73], 0x53, 8 * KiB); 989 i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x49); 990 i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x48); 991 at24c_eeprom_init(i2c[76], 0x52, 8 * KiB); 992 at24c_eeprom_init(i2c[77], 0x52, 8 * KiB); 993 at24c_eeprom_init(i2c[78], 0x52, 8 * KiB); 994 at24c_eeprom_init(i2c[79], 0x52, 8 * KiB); 995 at24c_eeprom_init(i2c[28], 0x50, 256); 996 997 for (int i = 0; i < 8; i++) { 998 at24c_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB); 999 i2c_slave_create_simple(i2c[82 + i * 8], TYPE_TMP75, 0x48); 1000 i2c_slave_create_simple(i2c[83 + i * 8], TYPE_TMP75, 0x4b); 1001 i2c_slave_create_simple(i2c[84 + i * 8], TYPE_TMP75, 0x4a); 1002 } 1003 } 1004 1005 #define TYPE_TMP421 "tmp421" 1006 1007 static void bletchley_bmc_i2c_init(AspeedMachineState *bmc) 1008 { 1009 AspeedSoCState *soc = bmc->soc; 1010 I2CBus *i2c[13] = {}; 1011 for (int i = 0; i < 13; i++) { 1012 if ((i == 8) || (i == 11)) { 1013 continue; 1014 } 1015 i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i); 1016 } 1017 1018 /* Bus 0 - 5 all have the same config. */ 1019 for (int i = 0; i < 6; i++) { 1020 /* Missing model: ti,ina230 @ 0x45 */ 1021 /* Missing model: mps,mp5023 @ 0x40 */ 1022 i2c_slave_create_simple(i2c[i], TYPE_TMP421, 0x4f); 1023 /* Missing model: nxp,pca9539 @ 0x76, but PCA9552 works enough */ 1024 i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x76); 1025 i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x67); 1026 /* Missing model: fsc,fusb302 @ 0x22 */ 1027 } 1028 1029 /* Bus 6 */ 1030 at24c_eeprom_init(i2c[6], 0x56, 65536); 1031 /* Missing model: nxp,pcf85263 @ 0x51 , but ds1338 works enough */ 1032 i2c_slave_create_simple(i2c[6], "ds1338", 0x51); 1033 1034 1035 /* Bus 7 */ 1036 at24c_eeprom_init(i2c[7], 0x54, 65536); 1037 1038 /* Bus 9 */ 1039 i2c_slave_create_simple(i2c[9], TYPE_TMP421, 0x4f); 1040 1041 /* Bus 10 */ 1042 i2c_slave_create_simple(i2c[10], TYPE_TMP421, 0x4f); 1043 /* Missing model: ti,hdc1080 @ 0x40 */ 1044 i2c_slave_create_simple(i2c[10], TYPE_PCA9552, 0x67); 1045 1046 /* Bus 12 */ 1047 /* Missing model: adi,adm1278 @ 0x11 */ 1048 i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4c); 1049 i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4d); 1050 i2c_slave_create_simple(i2c[12], TYPE_PCA9552, 0x67); 1051 } 1052 1053 static void fby35_i2c_init(AspeedMachineState *bmc) 1054 { 1055 AspeedSoCState *soc = bmc->soc; 1056 I2CBus *i2c[16]; 1057 1058 for (int i = 0; i < 16; i++) { 1059 i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i); 1060 } 1061 1062 i2c_slave_create_simple(i2c[2], TYPE_LM75, 0x4f); 1063 i2c_slave_create_simple(i2c[8], TYPE_TMP421, 0x1f); 1064 /* Hotswap controller is actually supposed to be mp5920 or ltc4282. */ 1065 i2c_slave_create_simple(i2c[11], "adm1272", 0x44); 1066 i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4e); 1067 i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4f); 1068 1069 at24c_eeprom_init(i2c[4], 0x51, 128 * KiB); 1070 at24c_eeprom_init(i2c[6], 0x51, 128 * KiB); 1071 at24c_eeprom_init_rom(i2c[8], 0x50, 32 * KiB, fby35_nic_fruid, 1072 fby35_nic_fruid_len); 1073 at24c_eeprom_init_rom(i2c[11], 0x51, 128 * KiB, fby35_bb_fruid, 1074 fby35_bb_fruid_len); 1075 at24c_eeprom_init_rom(i2c[11], 0x54, 128 * KiB, fby35_bmc_fruid, 1076 fby35_bmc_fruid_len); 1077 1078 /* 1079 * TODO: There is a multi-master i2c connection to an AST1030 MiniBMC on 1080 * buses 0, 1, 2, 3, and 9. Source address 0x10, target address 0x20 on 1081 * each. 1082 */ 1083 } 1084 1085 static void qcom_dc_scm_bmc_i2c_init(AspeedMachineState *bmc) 1086 { 1087 AspeedSoCState *soc = bmc->soc; 1088 1089 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 15), "tmp105", 0x4d); 1090 } 1091 1092 static void qcom_dc_scm_firework_i2c_init(AspeedMachineState *bmc) 1093 { 1094 AspeedSoCState *soc = bmc->soc; 1095 I2CSlave *therm_mux, *cpuvr_mux; 1096 1097 /* Create the generic DC-SCM hardware */ 1098 qcom_dc_scm_bmc_i2c_init(bmc); 1099 1100 /* Now create the Firework specific hardware */ 1101 1102 /* I2C7 CPUVR MUX */ 1103 cpuvr_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), 1104 "pca9546", 0x70); 1105 i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 0), "pca9548", 0x72); 1106 i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 1), "pca9548", 0x72); 1107 i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 2), "pca9548", 0x72); 1108 i2c_slave_create_simple(pca954x_i2c_get_bus(cpuvr_mux, 3), "pca9548", 0x72); 1109 1110 /* I2C8 Thermal Diodes*/ 1111 therm_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), 1112 "pca9548", 0x70); 1113 i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 0), TYPE_LM75, 0x4C); 1114 i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 1), TYPE_LM75, 0x4C); 1115 i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 2), TYPE_LM75, 0x48); 1116 i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 3), TYPE_LM75, 0x48); 1117 i2c_slave_create_simple(pca954x_i2c_get_bus(therm_mux, 4), TYPE_LM75, 0x48); 1118 1119 /* I2C9 Fan Controller (MAX31785) */ 1120 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x52); 1121 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "max31785", 0x54); 1122 } 1123 1124 static bool aspeed_get_mmio_exec(Object *obj, Error **errp) 1125 { 1126 return ASPEED_MACHINE(obj)->mmio_exec; 1127 } 1128 1129 static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp) 1130 { 1131 ASPEED_MACHINE(obj)->mmio_exec = value; 1132 } 1133 1134 static void aspeed_machine_instance_init(Object *obj) 1135 { 1136 AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(obj); 1137 1138 ASPEED_MACHINE(obj)->mmio_exec = false; 1139 ASPEED_MACHINE(obj)->hw_strap1 = amc->hw_strap1; 1140 } 1141 1142 static char *aspeed_get_fmc_model(Object *obj, Error **errp) 1143 { 1144 AspeedMachineState *bmc = ASPEED_MACHINE(obj); 1145 return g_strdup(bmc->fmc_model); 1146 } 1147 1148 static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp) 1149 { 1150 AspeedMachineState *bmc = ASPEED_MACHINE(obj); 1151 1152 g_free(bmc->fmc_model); 1153 bmc->fmc_model = g_strdup(value); 1154 } 1155 1156 static char *aspeed_get_spi_model(Object *obj, Error **errp) 1157 { 1158 AspeedMachineState *bmc = ASPEED_MACHINE(obj); 1159 return g_strdup(bmc->spi_model); 1160 } 1161 1162 static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp) 1163 { 1164 AspeedMachineState *bmc = ASPEED_MACHINE(obj); 1165 1166 g_free(bmc->spi_model); 1167 bmc->spi_model = g_strdup(value); 1168 } 1169 1170 static char *aspeed_get_bmc_console(Object *obj, Error **errp) 1171 { 1172 AspeedMachineState *bmc = ASPEED_MACHINE(obj); 1173 AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc); 1174 int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default; 1175 1176 return g_strdup_printf("uart%d", aspeed_uart_index(uart_chosen)); 1177 } 1178 1179 static void aspeed_set_bmc_console(Object *obj, const char *value, Error **errp) 1180 { 1181 AspeedMachineState *bmc = ASPEED_MACHINE(obj); 1182 AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc); 1183 AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(amc->soc_name)); 1184 int val; 1185 int uart_first = aspeed_uart_first(sc); 1186 int uart_last = aspeed_uart_last(sc); 1187 1188 if (sscanf(value, "uart%u", &val) != 1) { 1189 error_setg(errp, "Bad value for \"uart\" property"); 1190 return; 1191 } 1192 1193 /* The number of UART depends on the SoC */ 1194 if (val < uart_first || val > uart_last) { 1195 error_setg(errp, "\"uart\" should be in range [%d - %d]", 1196 uart_first, uart_last); 1197 return; 1198 } 1199 bmc->uart_chosen = val + ASPEED_DEV_UART0; 1200 } 1201 1202 static void aspeed_machine_class_props_init(ObjectClass *oc) 1203 { 1204 object_class_property_add_bool(oc, "execute-in-place", 1205 aspeed_get_mmio_exec, 1206 aspeed_set_mmio_exec); 1207 object_class_property_set_description(oc, "execute-in-place", 1208 "boot directly from CE0 flash device"); 1209 1210 object_class_property_add_str(oc, "bmc-console", aspeed_get_bmc_console, 1211 aspeed_set_bmc_console); 1212 object_class_property_set_description(oc, "bmc-console", 1213 "Change the default UART to \"uartX\""); 1214 1215 object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model, 1216 aspeed_set_fmc_model); 1217 object_class_property_set_description(oc, "fmc-model", 1218 "Change the FMC Flash model"); 1219 object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model, 1220 aspeed_set_spi_model); 1221 object_class_property_set_description(oc, "spi-model", 1222 "Change the SPI Flash model"); 1223 } 1224 1225 static void aspeed_machine_class_init_cpus_defaults(MachineClass *mc) 1226 { 1227 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(mc); 1228 AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(amc->soc_name)); 1229 1230 mc->default_cpus = sc->num_cpus; 1231 mc->min_cpus = sc->num_cpus; 1232 mc->max_cpus = sc->num_cpus; 1233 mc->valid_cpu_types = sc->valid_cpu_types; 1234 } 1235 1236 static bool aspeed_machine_ast2600_get_boot_from_emmc(Object *obj, Error **errp) 1237 { 1238 AspeedMachineState *bmc = ASPEED_MACHINE(obj); 1239 1240 return !!(bmc->hw_strap1 & SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC); 1241 } 1242 1243 static void aspeed_machine_ast2600_set_boot_from_emmc(Object *obj, bool value, 1244 Error **errp) 1245 { 1246 AspeedMachineState *bmc = ASPEED_MACHINE(obj); 1247 1248 if (value) { 1249 bmc->hw_strap1 |= SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC; 1250 } else { 1251 bmc->hw_strap1 &= ~SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC; 1252 } 1253 } 1254 1255 static void aspeed_machine_ast2600_class_emmc_init(ObjectClass *oc) 1256 { 1257 object_class_property_add_bool(oc, "boot-emmc", 1258 aspeed_machine_ast2600_get_boot_from_emmc, 1259 aspeed_machine_ast2600_set_boot_from_emmc); 1260 object_class_property_set_description(oc, "boot-emmc", 1261 "Set or unset boot from EMMC"); 1262 } 1263 1264 static void aspeed_machine_class_init(ObjectClass *oc, const void *data) 1265 { 1266 MachineClass *mc = MACHINE_CLASS(oc); 1267 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1268 1269 mc->init = aspeed_machine_init; 1270 mc->no_floppy = 1; 1271 mc->no_cdrom = 1; 1272 mc->no_parallel = 1; 1273 mc->default_ram_id = "ram"; 1274 amc->macs_mask = ASPEED_MAC0_ON; 1275 amc->uart_default = ASPEED_DEV_UART5; 1276 1277 aspeed_machine_class_props_init(oc); 1278 } 1279 1280 static void aspeed_machine_palmetto_class_init(ObjectClass *oc, 1281 const void *data) 1282 { 1283 MachineClass *mc = MACHINE_CLASS(oc); 1284 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1285 1286 mc->desc = "OpenPOWER Palmetto BMC (ARM926EJ-S)"; 1287 amc->soc_name = "ast2400-a1"; 1288 amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1; 1289 amc->fmc_model = "n25q256a"; 1290 amc->spi_model = "mx25l25635f"; 1291 amc->num_cs = 1; 1292 amc->i2c_init = palmetto_bmc_i2c_init; 1293 mc->auto_create_sdcard = true; 1294 mc->default_ram_size = 256 * MiB; 1295 aspeed_machine_class_init_cpus_defaults(mc); 1296 }; 1297 1298 static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, 1299 const void *data) 1300 { 1301 MachineClass *mc = MACHINE_CLASS(oc); 1302 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1303 1304 mc->desc = "Quanta-Q71l BMC (ARM926EJ-S)"; 1305 amc->soc_name = "ast2400-a1"; 1306 amc->hw_strap1 = QUANTA_Q71L_BMC_HW_STRAP1; 1307 amc->fmc_model = "n25q256a"; 1308 amc->spi_model = "mx25l25635e"; 1309 amc->num_cs = 1; 1310 amc->i2c_init = quanta_q71l_bmc_i2c_init; 1311 mc->auto_create_sdcard = true; 1312 mc->default_ram_size = 128 * MiB; 1313 aspeed_machine_class_init_cpus_defaults(mc); 1314 } 1315 1316 static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc, 1317 const void *data) 1318 { 1319 MachineClass *mc = MACHINE_CLASS(oc); 1320 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1321 1322 mc->desc = "Supermicro X11 BMC (ARM926EJ-S)"; 1323 amc->soc_name = "ast2400-a1"; 1324 amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1; 1325 amc->fmc_model = "mx25l25635e"; 1326 amc->spi_model = "mx25l25635e"; 1327 amc->num_cs = 1; 1328 amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 1329 amc->i2c_init = palmetto_bmc_i2c_init; 1330 mc->auto_create_sdcard = true; 1331 mc->default_ram_size = 256 * MiB; 1332 aspeed_machine_class_init_cpus_defaults(mc); 1333 } 1334 1335 static void aspeed_machine_supermicro_x11spi_bmc_class_init(ObjectClass *oc, 1336 const void *data) 1337 { 1338 MachineClass *mc = MACHINE_CLASS(oc); 1339 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1340 1341 mc->desc = "Supermicro X11 SPI BMC (ARM1176)"; 1342 amc->soc_name = "ast2500-a1"; 1343 amc->hw_strap1 = SUPERMICRO_X11SPI_BMC_HW_STRAP1; 1344 amc->fmc_model = "mx25l25635e"; 1345 amc->spi_model = "mx25l25635e"; 1346 amc->num_cs = 1; 1347 amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 1348 amc->i2c_init = palmetto_bmc_i2c_init; 1349 mc->auto_create_sdcard = true; 1350 mc->default_ram_size = 512 * MiB; 1351 aspeed_machine_class_init_cpus_defaults(mc); 1352 } 1353 1354 static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, 1355 const void *data) 1356 { 1357 MachineClass *mc = MACHINE_CLASS(oc); 1358 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1359 1360 mc->desc = "Aspeed AST2500 EVB (ARM1176)"; 1361 amc->soc_name = "ast2500-a1"; 1362 amc->hw_strap1 = AST2500_EVB_HW_STRAP1; 1363 amc->fmc_model = "mx25l25635e"; 1364 amc->spi_model = "mx25l25635f"; 1365 amc->num_cs = 1; 1366 amc->i2c_init = ast2500_evb_i2c_init; 1367 mc->auto_create_sdcard = true; 1368 mc->default_ram_size = 512 * MiB; 1369 aspeed_machine_class_init_cpus_defaults(mc); 1370 }; 1371 1372 static void aspeed_machine_yosemitev2_class_init(ObjectClass *oc, 1373 const void *data) 1374 { 1375 MachineClass *mc = MACHINE_CLASS(oc); 1376 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1377 1378 mc->desc = "Facebook YosemiteV2 BMC (ARM1176)"; 1379 amc->soc_name = "ast2500-a1"; 1380 amc->hw_strap1 = AST2500_EVB_HW_STRAP1; 1381 amc->hw_strap2 = 0; 1382 amc->fmc_model = "n25q256a"; 1383 amc->spi_model = "mx25l25635e"; 1384 amc->num_cs = 2; 1385 amc->i2c_init = yosemitev2_bmc_i2c_init; 1386 mc->auto_create_sdcard = true; 1387 mc->default_ram_size = 512 * MiB; 1388 aspeed_machine_class_init_cpus_defaults(mc); 1389 }; 1390 1391 static void aspeed_machine_romulus_class_init(ObjectClass *oc, 1392 const void *data) 1393 { 1394 MachineClass *mc = MACHINE_CLASS(oc); 1395 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1396 1397 mc->desc = "OpenPOWER Romulus BMC (ARM1176)"; 1398 amc->soc_name = "ast2500-a1"; 1399 amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1; 1400 amc->fmc_model = "n25q256a"; 1401 amc->spi_model = "mx66l1g45g"; 1402 amc->num_cs = 2; 1403 amc->i2c_init = romulus_bmc_i2c_init; 1404 mc->auto_create_sdcard = true; 1405 mc->default_ram_size = 512 * MiB; 1406 aspeed_machine_class_init_cpus_defaults(mc); 1407 }; 1408 1409 static void aspeed_machine_tiogapass_class_init(ObjectClass *oc, 1410 const void *data) 1411 { 1412 MachineClass *mc = MACHINE_CLASS(oc); 1413 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1414 1415 mc->desc = "Facebook Tiogapass BMC (ARM1176)"; 1416 amc->soc_name = "ast2500-a1"; 1417 amc->hw_strap1 = AST2500_EVB_HW_STRAP1; 1418 amc->hw_strap2 = 0; 1419 amc->fmc_model = "n25q256a"; 1420 amc->spi_model = "mx25l25635e"; 1421 amc->num_cs = 2; 1422 amc->i2c_init = tiogapass_bmc_i2c_init; 1423 mc->auto_create_sdcard = true; 1424 mc->default_ram_size = 1 * GiB; 1425 aspeed_machine_class_init_cpus_defaults(mc); 1426 }; 1427 1428 static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, 1429 const void *data) 1430 { 1431 MachineClass *mc = MACHINE_CLASS(oc); 1432 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1433 1434 mc->desc = "OCP SonoraPass BMC (ARM1176)"; 1435 amc->soc_name = "ast2500-a1"; 1436 amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1; 1437 amc->fmc_model = "mx66l1g45g"; 1438 amc->spi_model = "mx66l1g45g"; 1439 amc->num_cs = 2; 1440 amc->i2c_init = sonorapass_bmc_i2c_init; 1441 mc->auto_create_sdcard = true; 1442 mc->default_ram_size = 512 * MiB; 1443 aspeed_machine_class_init_cpus_defaults(mc); 1444 }; 1445 1446 static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, 1447 const void *data) 1448 { 1449 MachineClass *mc = MACHINE_CLASS(oc); 1450 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1451 1452 mc->desc = "OpenPOWER Witherspoon BMC (ARM1176)"; 1453 amc->soc_name = "ast2500-a1"; 1454 amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1; 1455 amc->fmc_model = "mx25l25635f"; 1456 amc->spi_model = "mx66l1g45g"; 1457 amc->num_cs = 2; 1458 amc->i2c_init = witherspoon_bmc_i2c_init; 1459 mc->auto_create_sdcard = true; 1460 mc->default_ram_size = 512 * MiB; 1461 aspeed_machine_class_init_cpus_defaults(mc); 1462 }; 1463 1464 static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, 1465 const void *data) 1466 { 1467 MachineClass *mc = MACHINE_CLASS(oc); 1468 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1469 1470 mc->desc = "Aspeed AST2600 EVB (Cortex-A7)"; 1471 amc->soc_name = "ast2600-a3"; 1472 amc->hw_strap1 = AST2600_EVB_HW_STRAP1; 1473 amc->hw_strap2 = AST2600_EVB_HW_STRAP2; 1474 amc->fmc_model = "mx66u51235f"; 1475 amc->spi_model = "mx66u51235f"; 1476 amc->num_cs = 1; 1477 amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON | 1478 ASPEED_MAC3_ON; 1479 amc->sdhci_wp_inverted = true; 1480 amc->i2c_init = ast2600_evb_i2c_init; 1481 mc->auto_create_sdcard = true; 1482 mc->default_ram_size = 1 * GiB; 1483 aspeed_machine_class_init_cpus_defaults(mc); 1484 aspeed_machine_ast2600_class_emmc_init(oc); 1485 }; 1486 1487 static void aspeed_machine_g220a_class_init(ObjectClass *oc, const void *data) 1488 { 1489 MachineClass *mc = MACHINE_CLASS(oc); 1490 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1491 1492 mc->desc = "Bytedance G220A BMC (ARM1176)"; 1493 amc->soc_name = "ast2500-a1"; 1494 amc->hw_strap1 = G220A_BMC_HW_STRAP1; 1495 amc->fmc_model = "n25q512a"; 1496 amc->spi_model = "mx25l25635e"; 1497 amc->num_cs = 2; 1498 amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 1499 amc->i2c_init = g220a_bmc_i2c_init; 1500 mc->auto_create_sdcard = true; 1501 mc->default_ram_size = 1024 * MiB; 1502 aspeed_machine_class_init_cpus_defaults(mc); 1503 }; 1504 1505 static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc, 1506 const void *data) 1507 { 1508 MachineClass *mc = MACHINE_CLASS(oc); 1509 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1510 1511 mc->desc = "Inspur FP5280G2 BMC (ARM1176)"; 1512 amc->soc_name = "ast2500-a1"; 1513 amc->hw_strap1 = FP5280G2_BMC_HW_STRAP1; 1514 amc->fmc_model = "n25q512a"; 1515 amc->spi_model = "mx25l25635e"; 1516 amc->num_cs = 2; 1517 amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON; 1518 amc->i2c_init = fp5280g2_bmc_i2c_init; 1519 mc->auto_create_sdcard = true; 1520 mc->default_ram_size = 512 * MiB; 1521 aspeed_machine_class_init_cpus_defaults(mc); 1522 }; 1523 1524 static void aspeed_machine_rainier_class_init(ObjectClass *oc, const void *data) 1525 { 1526 MachineClass *mc = MACHINE_CLASS(oc); 1527 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1528 1529 mc->desc = "IBM Rainier BMC (Cortex-A7)"; 1530 amc->soc_name = "ast2600-a3"; 1531 amc->hw_strap1 = RAINIER_BMC_HW_STRAP1; 1532 amc->hw_strap2 = RAINIER_BMC_HW_STRAP2; 1533 amc->fmc_model = "mx66l1g45g"; 1534 amc->spi_model = "mx66l1g45g"; 1535 amc->num_cs = 2; 1536 amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON; 1537 amc->i2c_init = rainier_bmc_i2c_init; 1538 mc->auto_create_sdcard = true; 1539 mc->default_ram_size = 1 * GiB; 1540 aspeed_machine_class_init_cpus_defaults(mc); 1541 aspeed_machine_ast2600_class_emmc_init(oc); 1542 }; 1543 1544 #define FUJI_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB) 1545 1546 static void aspeed_machine_fuji_class_init(ObjectClass *oc, const void *data) 1547 { 1548 MachineClass *mc = MACHINE_CLASS(oc); 1549 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1550 1551 mc->desc = "Facebook Fuji BMC (Cortex-A7)"; 1552 amc->soc_name = "ast2600-a3"; 1553 amc->hw_strap1 = FUJI_BMC_HW_STRAP1; 1554 amc->hw_strap2 = FUJI_BMC_HW_STRAP2; 1555 amc->fmc_model = "mx66l1g45g"; 1556 amc->spi_model = "mx66l1g45g"; 1557 amc->num_cs = 2; 1558 amc->macs_mask = ASPEED_MAC3_ON; 1559 amc->i2c_init = fuji_bmc_i2c_init; 1560 amc->uart_default = ASPEED_DEV_UART1; 1561 mc->auto_create_sdcard = true; 1562 mc->default_ram_size = FUJI_BMC_RAM_SIZE; 1563 aspeed_machine_class_init_cpus_defaults(mc); 1564 }; 1565 1566 #define BLETCHLEY_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB) 1567 1568 static void aspeed_machine_bletchley_class_init(ObjectClass *oc, 1569 const void *data) 1570 { 1571 MachineClass *mc = MACHINE_CLASS(oc); 1572 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1573 1574 mc->desc = "Facebook Bletchley BMC (Cortex-A7)"; 1575 amc->soc_name = "ast2600-a3"; 1576 amc->hw_strap1 = BLETCHLEY_BMC_HW_STRAP1; 1577 amc->hw_strap2 = BLETCHLEY_BMC_HW_STRAP2; 1578 amc->fmc_model = "w25q01jvq"; 1579 amc->spi_model = NULL; 1580 amc->num_cs = 2; 1581 amc->macs_mask = ASPEED_MAC2_ON; 1582 amc->i2c_init = bletchley_bmc_i2c_init; 1583 mc->auto_create_sdcard = true; 1584 mc->default_ram_size = BLETCHLEY_BMC_RAM_SIZE; 1585 aspeed_machine_class_init_cpus_defaults(mc); 1586 } 1587 1588 static void fby35_reset(MachineState *state, ResetType type) 1589 { 1590 AspeedMachineState *bmc = ASPEED_MACHINE(state); 1591 AspeedGPIOState *gpio = &bmc->soc->gpio; 1592 1593 qemu_devices_reset(type); 1594 1595 /* Board ID: 7 (Class-1, 4 slots) */ 1596 object_property_set_bool(OBJECT(gpio), "gpioV4", true, &error_fatal); 1597 object_property_set_bool(OBJECT(gpio), "gpioV5", true, &error_fatal); 1598 object_property_set_bool(OBJECT(gpio), "gpioV6", true, &error_fatal); 1599 object_property_set_bool(OBJECT(gpio), "gpioV7", false, &error_fatal); 1600 1601 /* Slot presence pins, inverse polarity. (False means present) */ 1602 object_property_set_bool(OBJECT(gpio), "gpioH4", false, &error_fatal); 1603 object_property_set_bool(OBJECT(gpio), "gpioH5", true, &error_fatal); 1604 object_property_set_bool(OBJECT(gpio), "gpioH6", true, &error_fatal); 1605 object_property_set_bool(OBJECT(gpio), "gpioH7", true, &error_fatal); 1606 1607 /* Slot 12v power pins, normal polarity. (True means powered-on) */ 1608 object_property_set_bool(OBJECT(gpio), "gpioB2", true, &error_fatal); 1609 object_property_set_bool(OBJECT(gpio), "gpioB3", false, &error_fatal); 1610 object_property_set_bool(OBJECT(gpio), "gpioB4", false, &error_fatal); 1611 object_property_set_bool(OBJECT(gpio), "gpioB5", false, &error_fatal); 1612 } 1613 1614 static void aspeed_machine_fby35_class_init(ObjectClass *oc, const void *data) 1615 { 1616 MachineClass *mc = MACHINE_CLASS(oc); 1617 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1618 1619 mc->desc = "Facebook fby35 BMC (Cortex-A7)"; 1620 mc->reset = fby35_reset; 1621 amc->fmc_model = "mx66l1g45g"; 1622 amc->num_cs = 2; 1623 amc->macs_mask = ASPEED_MAC3_ON; 1624 amc->i2c_init = fby35_i2c_init; 1625 mc->auto_create_sdcard = true; 1626 /* FIXME: Replace this macro with something more general */ 1627 mc->default_ram_size = FUJI_BMC_RAM_SIZE; 1628 aspeed_machine_class_init_cpus_defaults(mc); 1629 } 1630 1631 #define AST1030_INTERNAL_FLASH_SIZE (1024 * 1024) 1632 /* Main SYSCLK frequency in Hz (200MHz) */ 1633 #define SYSCLK_FRQ 200000000ULL 1634 1635 static void aspeed_minibmc_machine_init(MachineState *machine) 1636 { 1637 AspeedMachineState *bmc = ASPEED_MACHINE(machine); 1638 AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine); 1639 Clock *sysclk; 1640 1641 sysclk = clock_new(OBJECT(machine), "SYSCLK"); 1642 clock_set_hz(sysclk, SYSCLK_FRQ); 1643 1644 bmc->soc = ASPEED_SOC(object_new(amc->soc_name)); 1645 object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc)); 1646 object_unref(OBJECT(bmc->soc)); 1647 qdev_connect_clock_in(DEVICE(bmc->soc), "sysclk", sysclk); 1648 1649 object_property_set_link(OBJECT(bmc->soc), "memory", 1650 OBJECT(get_system_memory()), &error_abort); 1651 connect_serial_hds_to_uarts(bmc); 1652 qdev_realize(DEVICE(bmc->soc), NULL, &error_abort); 1653 1654 if (defaults_enabled()) { 1655 aspeed_board_init_flashes(&bmc->soc->fmc, 1656 bmc->fmc_model ? bmc->fmc_model : amc->fmc_model, 1657 amc->num_cs, 1658 0); 1659 1660 aspeed_board_init_flashes(&bmc->soc->spi[0], 1661 bmc->spi_model ? bmc->spi_model : amc->spi_model, 1662 amc->num_cs, amc->num_cs); 1663 1664 aspeed_board_init_flashes(&bmc->soc->spi[1], 1665 bmc->spi_model ? bmc->spi_model : amc->spi_model, 1666 amc->num_cs, (amc->num_cs * 2)); 1667 } 1668 1669 if (amc->i2c_init) { 1670 amc->i2c_init(bmc); 1671 } 1672 1673 armv7m_load_kernel(ARM_CPU(first_cpu), 1674 machine->kernel_filename, 1675 0, 1676 AST1030_INTERNAL_FLASH_SIZE); 1677 } 1678 1679 static void ast1030_evb_i2c_init(AspeedMachineState *bmc) 1680 { 1681 AspeedSoCState *soc = bmc->soc; 1682 1683 /* U10 24C08 connects to SDA/SCL Group 1 by default */ 1684 uint8_t *eeprom_buf = g_malloc0(32 * 1024); 1685 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, eeprom_buf); 1686 1687 /* U11 LM75 connects to SDA/SCL Group 2 by default */ 1688 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d); 1689 } 1690 1691 static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc, 1692 const void *data) 1693 { 1694 MachineClass *mc = MACHINE_CLASS(oc); 1695 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1696 1697 mc->desc = "Aspeed AST1030 MiniBMC (Cortex-M4)"; 1698 amc->soc_name = "ast1030-a1"; 1699 amc->hw_strap1 = 0; 1700 amc->hw_strap2 = 0; 1701 mc->init = aspeed_minibmc_machine_init; 1702 amc->i2c_init = ast1030_evb_i2c_init; 1703 mc->default_ram_size = 0; 1704 amc->fmc_model = "w25q80bl"; 1705 amc->spi_model = "w25q256"; 1706 amc->num_cs = 2; 1707 amc->macs_mask = 0; 1708 aspeed_machine_class_init_cpus_defaults(mc); 1709 } 1710 1711 #ifdef TARGET_AARCH64 1712 static void ast2700_evb_i2c_init(AspeedMachineState *bmc) 1713 { 1714 AspeedSoCState *soc = bmc->soc; 1715 1716 /* LM75 is compatible with TMP105 driver */ 1717 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), 1718 TYPE_TMP105, 0x4d); 1719 } 1720 1721 static void aspeed_machine_ast2700a0_evb_class_init(ObjectClass *oc, 1722 const void *data) 1723 { 1724 MachineClass *mc = MACHINE_CLASS(oc); 1725 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1726 1727 mc->alias = "ast2700-evb"; 1728 mc->desc = "Aspeed AST2700 A0 EVB (Cortex-A35)"; 1729 amc->soc_name = "ast2700-a0"; 1730 amc->hw_strap1 = AST2700_EVB_HW_STRAP1; 1731 amc->hw_strap2 = AST2700_EVB_HW_STRAP2; 1732 amc->fmc_model = "w25q01jvq"; 1733 amc->spi_model = "w25q512jv"; 1734 amc->num_cs = 2; 1735 amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON; 1736 amc->uart_default = ASPEED_DEV_UART12; 1737 amc->i2c_init = ast2700_evb_i2c_init; 1738 amc->vbootrom = true; 1739 mc->auto_create_sdcard = true; 1740 mc->default_ram_size = 1 * GiB; 1741 aspeed_machine_class_init_cpus_defaults(mc); 1742 } 1743 1744 static void aspeed_machine_ast2700a1_evb_class_init(ObjectClass *oc, 1745 const void *data) 1746 { 1747 MachineClass *mc = MACHINE_CLASS(oc); 1748 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1749 1750 mc->desc = "Aspeed AST2700 A1 EVB (Cortex-A35)"; 1751 amc->soc_name = "ast2700-a1"; 1752 amc->hw_strap1 = AST2700_EVB_HW_STRAP1; 1753 amc->hw_strap2 = AST2700_EVB_HW_STRAP2; 1754 amc->fmc_model = "w25q01jvq"; 1755 amc->spi_model = "w25q512jv"; 1756 amc->num_cs = 2; 1757 amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON; 1758 amc->uart_default = ASPEED_DEV_UART12; 1759 amc->i2c_init = ast2700_evb_i2c_init; 1760 amc->vbootrom = true; 1761 mc->auto_create_sdcard = true; 1762 mc->default_ram_size = 1 * GiB; 1763 aspeed_machine_class_init_cpus_defaults(mc); 1764 } 1765 #endif 1766 1767 static void aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass *oc, 1768 const void *data) 1769 { 1770 MachineClass *mc = MACHINE_CLASS(oc); 1771 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1772 1773 mc->desc = "Qualcomm DC-SCM V1 BMC (Cortex A7)"; 1774 amc->soc_name = "ast2600-a3"; 1775 amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1; 1776 amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2; 1777 amc->fmc_model = "n25q512a"; 1778 amc->spi_model = "n25q512a"; 1779 amc->num_cs = 2; 1780 amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON; 1781 amc->i2c_init = qcom_dc_scm_bmc_i2c_init; 1782 mc->auto_create_sdcard = true; 1783 mc->default_ram_size = 1 * GiB; 1784 aspeed_machine_class_init_cpus_defaults(mc); 1785 }; 1786 1787 static void aspeed_machine_qcom_firework_class_init(ObjectClass *oc, 1788 const void *data) 1789 { 1790 MachineClass *mc = MACHINE_CLASS(oc); 1791 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); 1792 1793 mc->desc = "Qualcomm DC-SCM V1/Firework BMC (Cortex A7)"; 1794 amc->soc_name = "ast2600-a3"; 1795 amc->hw_strap1 = QCOM_DC_SCM_V1_BMC_HW_STRAP1; 1796 amc->hw_strap2 = QCOM_DC_SCM_V1_BMC_HW_STRAP2; 1797 amc->fmc_model = "n25q512a"; 1798 amc->spi_model = "n25q512a"; 1799 amc->num_cs = 2; 1800 amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON; 1801 amc->i2c_init = qcom_dc_scm_firework_i2c_init; 1802 mc->auto_create_sdcard = true; 1803 mc->default_ram_size = 1 * GiB; 1804 aspeed_machine_class_init_cpus_defaults(mc); 1805 }; 1806 1807 static const TypeInfo aspeed_machine_types[] = { 1808 { 1809 .name = MACHINE_TYPE_NAME("palmetto-bmc"), 1810 .parent = TYPE_ASPEED_MACHINE, 1811 .class_init = aspeed_machine_palmetto_class_init, 1812 }, { 1813 .name = MACHINE_TYPE_NAME("supermicrox11-bmc"), 1814 .parent = TYPE_ASPEED_MACHINE, 1815 .class_init = aspeed_machine_supermicrox11_bmc_class_init, 1816 }, { 1817 .name = MACHINE_TYPE_NAME("supermicro-x11spi-bmc"), 1818 .parent = TYPE_ASPEED_MACHINE, 1819 .class_init = aspeed_machine_supermicro_x11spi_bmc_class_init, 1820 }, { 1821 .name = MACHINE_TYPE_NAME("ast2500-evb"), 1822 .parent = TYPE_ASPEED_MACHINE, 1823 .class_init = aspeed_machine_ast2500_evb_class_init, 1824 }, { 1825 .name = MACHINE_TYPE_NAME("romulus-bmc"), 1826 .parent = TYPE_ASPEED_MACHINE, 1827 .class_init = aspeed_machine_romulus_class_init, 1828 }, { 1829 .name = MACHINE_TYPE_NAME("sonorapass-bmc"), 1830 .parent = TYPE_ASPEED_MACHINE, 1831 .class_init = aspeed_machine_sonorapass_class_init, 1832 }, { 1833 .name = MACHINE_TYPE_NAME("witherspoon-bmc"), 1834 .parent = TYPE_ASPEED_MACHINE, 1835 .class_init = aspeed_machine_witherspoon_class_init, 1836 }, { 1837 .name = MACHINE_TYPE_NAME("ast2600-evb"), 1838 .parent = TYPE_ASPEED_MACHINE, 1839 .class_init = aspeed_machine_ast2600_evb_class_init, 1840 }, { 1841 .name = MACHINE_TYPE_NAME("yosemitev2-bmc"), 1842 .parent = TYPE_ASPEED_MACHINE, 1843 .class_init = aspeed_machine_yosemitev2_class_init, 1844 }, { 1845 .name = MACHINE_TYPE_NAME("tiogapass-bmc"), 1846 .parent = TYPE_ASPEED_MACHINE, 1847 .class_init = aspeed_machine_tiogapass_class_init, 1848 }, { 1849 .name = MACHINE_TYPE_NAME("g220a-bmc"), 1850 .parent = TYPE_ASPEED_MACHINE, 1851 .class_init = aspeed_machine_g220a_class_init, 1852 }, { 1853 .name = MACHINE_TYPE_NAME("qcom-dc-scm-v1-bmc"), 1854 .parent = TYPE_ASPEED_MACHINE, 1855 .class_init = aspeed_machine_qcom_dc_scm_v1_class_init, 1856 }, { 1857 .name = MACHINE_TYPE_NAME("qcom-firework-bmc"), 1858 .parent = TYPE_ASPEED_MACHINE, 1859 .class_init = aspeed_machine_qcom_firework_class_init, 1860 }, { 1861 .name = MACHINE_TYPE_NAME("fp5280g2-bmc"), 1862 .parent = TYPE_ASPEED_MACHINE, 1863 .class_init = aspeed_machine_fp5280g2_class_init, 1864 }, { 1865 .name = MACHINE_TYPE_NAME("quanta-q71l-bmc"), 1866 .parent = TYPE_ASPEED_MACHINE, 1867 .class_init = aspeed_machine_quanta_q71l_class_init, 1868 }, { 1869 .name = MACHINE_TYPE_NAME("rainier-bmc"), 1870 .parent = TYPE_ASPEED_MACHINE, 1871 .class_init = aspeed_machine_rainier_class_init, 1872 }, { 1873 .name = MACHINE_TYPE_NAME("fuji-bmc"), 1874 .parent = TYPE_ASPEED_MACHINE, 1875 .class_init = aspeed_machine_fuji_class_init, 1876 }, { 1877 .name = MACHINE_TYPE_NAME("bletchley-bmc"), 1878 .parent = TYPE_ASPEED_MACHINE, 1879 .class_init = aspeed_machine_bletchley_class_init, 1880 }, { 1881 .name = MACHINE_TYPE_NAME("fby35-bmc"), 1882 .parent = MACHINE_TYPE_NAME("ast2600-evb"), 1883 .class_init = aspeed_machine_fby35_class_init, 1884 }, { 1885 .name = MACHINE_TYPE_NAME("ast1030-evb"), 1886 .parent = TYPE_ASPEED_MACHINE, 1887 .class_init = aspeed_minibmc_machine_ast1030_evb_class_init, 1888 #ifdef TARGET_AARCH64 1889 }, { 1890 .name = MACHINE_TYPE_NAME("ast2700a0-evb"), 1891 .parent = TYPE_ASPEED_MACHINE, 1892 .class_init = aspeed_machine_ast2700a0_evb_class_init, 1893 }, { 1894 .name = MACHINE_TYPE_NAME("ast2700a1-evb"), 1895 .parent = TYPE_ASPEED_MACHINE, 1896 .class_init = aspeed_machine_ast2700a1_evb_class_init, 1897 #endif 1898 }, { 1899 .name = TYPE_ASPEED_MACHINE, 1900 .parent = TYPE_MACHINE, 1901 .instance_size = sizeof(AspeedMachineState), 1902 .instance_init = aspeed_machine_instance_init, 1903 .class_size = sizeof(AspeedMachineClass), 1904 .class_init = aspeed_machine_class_init, 1905 .abstract = true, 1906 } 1907 }; 1908 1909 DEFINE_TYPES(aspeed_machine_types) 1910