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