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