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