arm: do not use ram_size global
[qemu/ar7.git] / hw / arm / aspeed.c
bloba17b75f4940a534a080d92d372f3c10b07d2257a
1 /*
2 * OpenPOWER Palmetto BMC
4 * Andrew Jeffery <andrew@aj.id.au>
6 * Copyright 2016 IBM Corp.
8 * This code is licensed under the GPL version 2 or later. See
9 * the COPYING file in the top-level directory.
12 #include "qemu/osdep.h"
13 #include "qapi/error.h"
14 #include "cpu.h"
15 #include "exec/address-spaces.h"
16 #include "hw/arm/boot.h"
17 #include "hw/arm/aspeed.h"
18 #include "hw/arm/aspeed_soc.h"
19 #include "hw/boards.h"
20 #include "hw/i2c/smbus_eeprom.h"
21 #include "hw/misc/pca9552.h"
22 #include "hw/misc/tmp105.h"
23 #include "hw/misc/led.h"
24 #include "hw/qdev-properties.h"
25 #include "qemu/log.h"
26 #include "sysemu/block-backend.h"
27 #include "sysemu/sysemu.h"
28 #include "hw/loader.h"
29 #include "qemu/error-report.h"
30 #include "qemu/units.h"
32 static struct arm_boot_info aspeed_board_binfo = {
33 .board_id = -1, /* device-tree-only board */
36 struct AspeedMachineState {
37 /* Private */
38 MachineState parent_obj;
39 /* Public */
41 AspeedSoCState soc;
42 MemoryRegion ram_container;
43 MemoryRegion max_ram;
44 bool mmio_exec;
45 char *fmc_model;
46 char *spi_model;
49 /* Palmetto hardware value: 0x120CE416 */
50 #define PALMETTO_BMC_HW_STRAP1 ( \
51 SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_256MB) | \
52 SCU_AST2400_HW_STRAP_DRAM_CONFIG(2 /* DDR3 with CL=6, CWL=5 */) | \
53 SCU_AST2400_HW_STRAP_ACPI_DIS | \
54 SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) | \
55 SCU_HW_STRAP_VGA_CLASS_CODE | \
56 SCU_HW_STRAP_LPC_RESET_PIN | \
57 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) | \
58 SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
59 SCU_HW_STRAP_SPI_WIDTH | \
60 SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \
61 SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
63 /* TODO: Find the actual hardware value */
64 #define SUPERMICROX11_BMC_HW_STRAP1 ( \
65 SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) | \
66 SCU_AST2400_HW_STRAP_DRAM_CONFIG(2) | \
67 SCU_AST2400_HW_STRAP_ACPI_DIS | \
68 SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) | \
69 SCU_HW_STRAP_VGA_CLASS_CODE | \
70 SCU_HW_STRAP_LPC_RESET_PIN | \
71 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) | \
72 SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
73 SCU_HW_STRAP_SPI_WIDTH | \
74 SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \
75 SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
77 /* AST2500 evb hardware value: 0xF100C2E6 */
78 #define AST2500_EVB_HW_STRAP1 (( \
79 AST2500_HW_STRAP1_DEFAULTS | \
80 SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \
81 SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \
82 SCU_AST2500_HW_STRAP_UART_DEBUG | \
83 SCU_AST2500_HW_STRAP_DDR4_ENABLE | \
84 SCU_HW_STRAP_MAC1_RGMII | \
85 SCU_HW_STRAP_MAC0_RGMII) & \
86 ~SCU_HW_STRAP_2ND_BOOT_WDT)
88 /* Romulus hardware value: 0xF10AD206 */
89 #define ROMULUS_BMC_HW_STRAP1 ( \
90 AST2500_HW_STRAP1_DEFAULTS | \
91 SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \
92 SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \
93 SCU_AST2500_HW_STRAP_UART_DEBUG | \
94 SCU_AST2500_HW_STRAP_DDR4_ENABLE | \
95 SCU_AST2500_HW_STRAP_ACPI_ENABLE | \
96 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER))
98 /* Sonorapass hardware value: 0xF100D216 */
99 #define SONORAPASS_BMC_HW_STRAP1 ( \
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_RESERVED28 | \
104 SCU_AST2500_HW_STRAP_DDR4_ENABLE | \
105 SCU_HW_STRAP_VGA_CLASS_CODE | \
106 SCU_HW_STRAP_LPC_RESET_PIN | \
107 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \
108 SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \
109 SCU_HW_STRAP_VGA_BIOS_ROM | \
110 SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \
111 SCU_AST2500_HW_STRAP_RESERVED1)
113 /* Swift hardware value: 0xF11AD206 */
114 #define SWIFT_BMC_HW_STRAP1 ( \
115 AST2500_HW_STRAP1_DEFAULTS | \
116 SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \
117 SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \
118 SCU_AST2500_HW_STRAP_UART_DEBUG | \
119 SCU_AST2500_HW_STRAP_DDR4_ENABLE | \
120 SCU_H_PLL_BYPASS_EN | \
121 SCU_AST2500_HW_STRAP_ACPI_ENABLE | \
122 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER))
124 #define G220A_BMC_HW_STRAP1 ( \
125 SCU_AST2500_HW_STRAP_SPI_AUTOFETCH_ENABLE | \
126 SCU_AST2500_HW_STRAP_GPIO_STRAP_ENABLE | \
127 SCU_AST2500_HW_STRAP_UART_DEBUG | \
128 SCU_AST2500_HW_STRAP_RESERVED28 | \
129 SCU_AST2500_HW_STRAP_DDR4_ENABLE | \
130 SCU_HW_STRAP_2ND_BOOT_WDT | \
131 SCU_HW_STRAP_VGA_CLASS_CODE | \
132 SCU_HW_STRAP_LPC_RESET_PIN | \
133 SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER) | \
134 SCU_AST2500_HW_STRAP_SET_AXI_AHB_RATIO(AXI_AHB_RATIO_2_1) | \
135 SCU_HW_STRAP_VGA_SIZE_SET(VGA_64M_DRAM) | \
136 SCU_AST2500_HW_STRAP_RESERVED1)
138 /* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */
139 #define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1
141 /* AST2600 evb hardware value */
142 #define AST2600_EVB_HW_STRAP1 0x000000C0
143 #define AST2600_EVB_HW_STRAP2 0x00000003
145 /* Tacoma hardware value */
146 #define TACOMA_BMC_HW_STRAP1 0x00000000
147 #define TACOMA_BMC_HW_STRAP2 0x00000040
150 * The max ram region is for firmwares that scan the address space
151 * with load/store to guess how much RAM the SoC has.
153 static uint64_t max_ram_read(void *opaque, hwaddr offset, unsigned size)
155 return 0;
158 static void max_ram_write(void *opaque, hwaddr offset, uint64_t value,
159 unsigned size)
161 /* Discard writes */
164 static const MemoryRegionOps max_ram_ops = {
165 .read = max_ram_read,
166 .write = max_ram_write,
167 .endianness = DEVICE_NATIVE_ENDIAN,
170 #define AST_SMP_MAILBOX_BASE 0x1e6e2180
171 #define AST_SMP_MBOX_FIELD_ENTRY (AST_SMP_MAILBOX_BASE + 0x0)
172 #define AST_SMP_MBOX_FIELD_GOSIGN (AST_SMP_MAILBOX_BASE + 0x4)
173 #define AST_SMP_MBOX_FIELD_READY (AST_SMP_MAILBOX_BASE + 0x8)
174 #define AST_SMP_MBOX_FIELD_POLLINSN (AST_SMP_MAILBOX_BASE + 0xc)
175 #define AST_SMP_MBOX_CODE (AST_SMP_MAILBOX_BASE + 0x10)
176 #define AST_SMP_MBOX_GOSIGN 0xabbaab00
178 static void aspeed_write_smpboot(ARMCPU *cpu,
179 const struct arm_boot_info *info)
181 static const uint32_t poll_mailbox_ready[] = {
183 * r2 = per-cpu go sign value
184 * r1 = AST_SMP_MBOX_FIELD_ENTRY
185 * r0 = AST_SMP_MBOX_FIELD_GOSIGN
187 0xee100fb0, /* mrc p15, 0, r0, c0, c0, 5 */
188 0xe21000ff, /* ands r0, r0, #255 */
189 0xe59f201c, /* ldr r2, [pc, #28] */
190 0xe1822000, /* orr r2, r2, r0 */
192 0xe59f1018, /* ldr r1, [pc, #24] */
193 0xe59f0018, /* ldr r0, [pc, #24] */
195 0xe320f002, /* wfe */
196 0xe5904000, /* ldr r4, [r0] */
197 0xe1520004, /* cmp r2, r4 */
198 0x1afffffb, /* bne <wfe> */
199 0xe591f000, /* ldr pc, [r1] */
200 AST_SMP_MBOX_GOSIGN,
201 AST_SMP_MBOX_FIELD_ENTRY,
202 AST_SMP_MBOX_FIELD_GOSIGN,
205 rom_add_blob_fixed("aspeed.smpboot", poll_mailbox_ready,
206 sizeof(poll_mailbox_ready),
207 info->smp_loader_start);
210 static void aspeed_reset_secondary(ARMCPU *cpu,
211 const struct arm_boot_info *info)
213 AddressSpace *as = arm_boot_address_space(cpu, info);
214 CPUState *cs = CPU(cpu);
216 /* info->smp_bootreg_addr */
217 address_space_stl_notdirty(as, AST_SMP_MBOX_FIELD_GOSIGN, 0,
218 MEMTXATTRS_UNSPECIFIED, NULL);
219 cpu_set_pc(cs, info->smp_loader_start);
222 #define FIRMWARE_ADDR 0x0
224 static void write_boot_rom(DriveInfo *dinfo, hwaddr addr, size_t rom_size,
225 Error **errp)
227 BlockBackend *blk = blk_by_legacy_dinfo(dinfo);
228 uint8_t *storage;
229 int64_t size;
231 /* The block backend size should have already been 'validated' by
232 * the creation of the m25p80 object.
234 size = blk_getlength(blk);
235 if (size <= 0) {
236 error_setg(errp, "failed to get flash size");
237 return;
240 if (rom_size > size) {
241 rom_size = size;
244 storage = g_new0(uint8_t, rom_size);
245 if (blk_pread(blk, 0, storage, rom_size) < 0) {
246 error_setg(errp, "failed to read the initial flash content");
247 return;
250 rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr);
251 g_free(storage);
254 static void aspeed_board_init_flashes(AspeedSMCState *s,
255 const char *flashtype)
257 int i ;
259 for (i = 0; i < s->num_cs; ++i) {
260 AspeedSMCFlash *fl = &s->flashes[i];
261 DriveInfo *dinfo = drive_get_next(IF_MTD);
262 qemu_irq cs_line;
264 fl->flash = qdev_new(flashtype);
265 if (dinfo) {
266 qdev_prop_set_drive(fl->flash, "drive",
267 blk_by_legacy_dinfo(dinfo));
269 qdev_realize_and_unref(fl->flash, BUS(s->spi), &error_fatal);
271 cs_line = qdev_get_gpio_in_named(fl->flash, SSI_GPIO_CS, 0);
272 sysbus_connect_irq(SYS_BUS_DEVICE(s), i + 1, cs_line);
276 static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo)
278 DeviceState *card;
280 if (!dinfo) {
281 return;
283 card = qdev_new(TYPE_SD_CARD);
284 qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
285 &error_fatal);
286 qdev_realize_and_unref(card,
287 qdev_get_child_bus(DEVICE(sdhci), "sd-bus"),
288 &error_fatal);
291 static void aspeed_machine_init(MachineState *machine)
293 AspeedMachineState *bmc = ASPEED_MACHINE(machine);
294 AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
295 AspeedSoCClass *sc;
296 DriveInfo *drive0 = drive_get(IF_MTD, 0, 0);
297 ram_addr_t max_ram_size;
298 int i;
299 NICInfo *nd = &nd_table[0];
301 memory_region_init(&bmc->ram_container, NULL, "aspeed-ram-container",
302 4 * GiB);
303 memory_region_add_subregion(&bmc->ram_container, 0, machine->ram);
305 object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
307 sc = ASPEED_SOC_GET_CLASS(&bmc->soc);
310 * This will error out if isize is not supported by memory controller.
312 object_property_set_uint(OBJECT(&bmc->soc), "ram-size", machine->ram_size,
313 &error_fatal);
315 for (i = 0; i < sc->macs_num; i++) {
316 if ((amc->macs_mask & (1 << i)) && nd->used) {
317 qemu_check_nic_model(nd, TYPE_FTGMAC100);
318 qdev_set_nic_properties(DEVICE(&bmc->soc.ftgmac100[i]), nd);
319 nd++;
323 object_property_set_int(OBJECT(&bmc->soc), "hw-strap1", amc->hw_strap1,
324 &error_abort);
325 object_property_set_int(OBJECT(&bmc->soc), "hw-strap2", amc->hw_strap2,
326 &error_abort);
327 object_property_set_int(OBJECT(&bmc->soc), "num-cs", amc->num_cs,
328 &error_abort);
329 object_property_set_link(OBJECT(&bmc->soc), "dram",
330 OBJECT(&bmc->ram_container), &error_abort);
331 if (machine->kernel_filename) {
333 * When booting with a -kernel command line there is no u-boot
334 * that runs to unlock the SCU. In this case set the default to
335 * be unlocked as the kernel expects
337 object_property_set_int(OBJECT(&bmc->soc), "hw-prot-key",
338 ASPEED_SCU_PROT_KEY, &error_abort);
340 qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
342 memory_region_add_subregion(get_system_memory(),
343 sc->memmap[ASPEED_DEV_SDRAM],
344 &bmc->ram_container);
346 max_ram_size = object_property_get_uint(OBJECT(&bmc->soc), "max-ram-size",
347 &error_abort);
348 memory_region_init_io(&bmc->max_ram, NULL, &max_ram_ops, NULL,
349 "max_ram", max_ram_size - machine->ram_size);
350 memory_region_add_subregion(&bmc->ram_container, machine->ram_size, &bmc->max_ram);
352 aspeed_board_init_flashes(&bmc->soc.fmc, bmc->fmc_model ?
353 bmc->fmc_model : amc->fmc_model);
354 aspeed_board_init_flashes(&bmc->soc.spi[0], bmc->spi_model ?
355 bmc->spi_model : amc->spi_model);
357 /* Install first FMC flash content as a boot rom. */
358 if (drive0) {
359 AspeedSMCFlash *fl = &bmc->soc.fmc.flashes[0];
360 MemoryRegion *boot_rom = g_new(MemoryRegion, 1);
363 * create a ROM region using the default mapping window size of
364 * the flash module. The window size is 64MB for the AST2400
365 * SoC and 128MB for the AST2500 SoC, which is twice as big as
366 * needed by the flash modules of the Aspeed machines.
368 if (ASPEED_MACHINE(machine)->mmio_exec) {
369 memory_region_init_alias(boot_rom, NULL, "aspeed.boot_rom",
370 &fl->mmio, 0, fl->size);
371 memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
372 boot_rom);
373 } else {
374 memory_region_init_rom(boot_rom, NULL, "aspeed.boot_rom",
375 fl->size, &error_abort);
376 memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
377 boot_rom);
378 write_boot_rom(drive0, FIRMWARE_ADDR, fl->size, &error_abort);
382 if (machine->kernel_filename && sc->num_cpus > 1) {
383 /* With no u-boot we must set up a boot stub for the secondary CPU */
384 MemoryRegion *smpboot = g_new(MemoryRegion, 1);
385 memory_region_init_ram(smpboot, NULL, "aspeed.smpboot",
386 0x80, &error_abort);
387 memory_region_add_subregion(get_system_memory(),
388 AST_SMP_MAILBOX_BASE, smpboot);
390 aspeed_board_binfo.write_secondary_boot = aspeed_write_smpboot;
391 aspeed_board_binfo.secondary_cpu_reset_hook = aspeed_reset_secondary;
392 aspeed_board_binfo.smp_loader_start = AST_SMP_MBOX_CODE;
395 aspeed_board_binfo.ram_size = machine->ram_size;
396 aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM];
397 aspeed_board_binfo.nb_cpus = sc->num_cpus;
399 if (amc->i2c_init) {
400 amc->i2c_init(bmc);
403 for (i = 0; i < bmc->soc.sdhci.num_slots; i++) {
404 sdhci_attach_drive(&bmc->soc.sdhci.slots[i], drive_get_next(IF_SD));
407 if (bmc->soc.emmc.num_slots) {
408 sdhci_attach_drive(&bmc->soc.emmc.slots[0], drive_get_next(IF_SD));
411 arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo);
414 static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
416 AspeedSoCState *soc = &bmc->soc;
417 DeviceState *dev;
418 uint8_t *eeprom_buf = g_malloc0(32 * 1024);
420 /* The palmetto platform expects a ds3231 RTC but a ds1338 is
421 * enough to provide basic RTC features. Alarms will be missing */
422 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
424 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
425 eeprom_buf);
427 /* add a TMP423 temperature sensor */
428 dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
429 "tmp423", 0x4c));
430 object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
431 object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
432 object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
433 object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort);
436 static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
438 AspeedSoCState *soc = &bmc->soc;
439 uint8_t *eeprom_buf = g_malloc0(8 * 1024);
441 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50,
442 eeprom_buf);
444 /* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
445 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
446 TYPE_TMP105, 0x4d);
448 /* The AST2500 EVB does not have an RTC. Let's pretend that one is
449 * plugged on the I2C bus header */
450 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
453 static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
455 /* Start with some devices on our I2C busses */
456 ast2500_evb_i2c_init(bmc);
459 static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
461 AspeedSoCState *soc = &bmc->soc;
463 /* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
464 * good enough */
465 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
468 static void swift_bmc_i2c_init(AspeedMachineState *bmc)
470 AspeedSoCState *soc = &bmc->soc;
472 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "pca9552", 0x60);
474 /* The swift board expects a TMP275 but a TMP105 is compatible */
475 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "tmp105", 0x48);
476 /* The swift board expects a pca9551 but a pca9552 is compatible */
477 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9552", 0x60);
479 /* The swift board expects an Epson RX8900 RTC but a ds1338 is compatible */
480 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "ds1338", 0x32);
481 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x60);
483 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c);
484 /* The swift board expects a pca9539 but a pca9552 is compatible */
485 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "pca9552", 0x74);
487 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c);
488 /* The swift board expects a pca9539 but a pca9552 is compatible */
489 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "pca9552",
490 0x74);
492 /* The swift board expects a TMP275 but a TMP105 is compatible */
493 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12), "tmp105", 0x48);
494 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12), "tmp105", 0x4a);
497 static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc)
499 AspeedSoCState *soc = &bmc->soc;
501 /* bus 2 : */
502 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48);
503 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x49);
504 /* bus 2 : pca9546 @ 0x73 */
506 /* bus 3 : pca9548 @ 0x70 */
508 /* bus 4 : */
509 uint8_t *eeprom4_54 = g_malloc0(8 * 1024);
510 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54,
511 eeprom4_54);
512 /* PCA9539 @ 0x76, but PCA9552 is compatible */
513 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "pca9552", 0x76);
514 /* PCA9539 @ 0x77, but PCA9552 is compatible */
515 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "pca9552", 0x77);
517 /* bus 6 : */
518 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x48);
519 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp105", 0x49);
520 /* bus 6 : pca9546 @ 0x73 */
522 /* bus 8 : */
523 uint8_t *eeprom8_56 = g_malloc0(8 * 1024);
524 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 8), 0x56,
525 eeprom8_56);
526 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x60);
527 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "pca9552", 0x61);
528 /* bus 8 : adc128d818 @ 0x1d */
529 /* bus 8 : adc128d818 @ 0x1f */
532 * bus 13 : pca9548 @ 0x71
533 * - channel 3:
534 * - tmm421 @ 0x4c
535 * - tmp421 @ 0x4e
536 * - tmp421 @ 0x4f
541 static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
543 static const struct {
544 unsigned gpio_id;
545 LEDColor color;
546 const char *description;
547 bool gpio_polarity;
548 } pca1_leds[] = {
549 {13, LED_COLOR_GREEN, "front-fault-4", GPIO_POLARITY_ACTIVE_LOW},
550 {14, LED_COLOR_GREEN, "front-power-3", GPIO_POLARITY_ACTIVE_LOW},
551 {15, LED_COLOR_GREEN, "front-id-5", GPIO_POLARITY_ACTIVE_LOW},
553 AspeedSoCState *soc = &bmc->soc;
554 uint8_t *eeprom_buf = g_malloc0(8 * 1024);
555 DeviceState *dev;
556 LEDState *led;
558 /* Bus 3: TODO bmp280@77 */
559 /* Bus 3: TODO max31785@52 */
560 /* Bus 3: TODO dps310@76 */
561 dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
562 qdev_prop_set_string(dev, "description", "pca1");
563 i2c_slave_realize_and_unref(I2C_SLAVE(dev),
564 aspeed_i2c_get_bus(&soc->i2c, 3),
565 &error_fatal);
567 for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) {
568 led = led_create_simple(OBJECT(bmc),
569 pca1_leds[i].gpio_polarity,
570 pca1_leds[i].color,
571 pca1_leds[i].description);
572 qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id,
573 qdev_get_gpio_in(DEVICE(led), 0));
575 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c);
576 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c);
578 /* The Witherspoon expects a TMP275 but a TMP105 is compatible */
579 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105,
580 0x4a);
582 /* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
583 * good enough */
584 i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
586 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51,
587 eeprom_buf);
588 dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
589 qdev_prop_set_string(dev, "description", "pca0");
590 i2c_slave_realize_and_unref(I2C_SLAVE(dev),
591 aspeed_i2c_get_bus(&soc->i2c, 11),
592 &error_fatal);
593 /* Bus 11: TODO ucd90160@64 */
596 static void g220a_bmc_i2c_init(AspeedMachineState *bmc)
598 AspeedSoCState *soc = &bmc->soc;
599 DeviceState *dev;
601 dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3),
602 "emc1413", 0x4c));
603 object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
604 object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
605 object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
607 dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12),
608 "emc1413", 0x4c));
609 object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
610 object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
611 object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
613 dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13),
614 "emc1413", 0x4c));
615 object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
616 object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
617 object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
619 static uint8_t eeprom_buf[2 * 1024] = {
620 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe,
621 0x01, 0x06, 0x00, 0xc9, 0x42, 0x79, 0x74, 0x65,
622 0x64, 0x61, 0x6e, 0x63, 0x65, 0xc5, 0x47, 0x32,
623 0x32, 0x30, 0x41, 0xc4, 0x41, 0x41, 0x42, 0x42,
624 0xc4, 0x43, 0x43, 0x44, 0x44, 0xc4, 0x45, 0x45,
625 0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1,
626 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7,
628 smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57,
629 eeprom_buf);
632 static bool aspeed_get_mmio_exec(Object *obj, Error **errp)
634 return ASPEED_MACHINE(obj)->mmio_exec;
637 static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp)
639 ASPEED_MACHINE(obj)->mmio_exec = value;
642 static void aspeed_machine_instance_init(Object *obj)
644 ASPEED_MACHINE(obj)->mmio_exec = false;
647 static char *aspeed_get_fmc_model(Object *obj, Error **errp)
649 AspeedMachineState *bmc = ASPEED_MACHINE(obj);
650 return g_strdup(bmc->fmc_model);
653 static void aspeed_set_fmc_model(Object *obj, const char *value, Error **errp)
655 AspeedMachineState *bmc = ASPEED_MACHINE(obj);
657 g_free(bmc->fmc_model);
658 bmc->fmc_model = g_strdup(value);
661 static char *aspeed_get_spi_model(Object *obj, Error **errp)
663 AspeedMachineState *bmc = ASPEED_MACHINE(obj);
664 return g_strdup(bmc->spi_model);
667 static void aspeed_set_spi_model(Object *obj, const char *value, Error **errp)
669 AspeedMachineState *bmc = ASPEED_MACHINE(obj);
671 g_free(bmc->spi_model);
672 bmc->spi_model = g_strdup(value);
675 static void aspeed_machine_class_props_init(ObjectClass *oc)
677 object_class_property_add_bool(oc, "execute-in-place",
678 aspeed_get_mmio_exec,
679 aspeed_set_mmio_exec);
680 object_class_property_set_description(oc, "execute-in-place",
681 "boot directly from CE0 flash device");
683 object_class_property_add_str(oc, "fmc-model", aspeed_get_fmc_model,
684 aspeed_set_fmc_model);
685 object_class_property_set_description(oc, "fmc-model",
686 "Change the FMC Flash model");
687 object_class_property_add_str(oc, "spi-model", aspeed_get_spi_model,
688 aspeed_set_spi_model);
689 object_class_property_set_description(oc, "spi-model",
690 "Change the SPI Flash model");
693 static int aspeed_soc_num_cpus(const char *soc_name)
695 AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(soc_name));
696 return sc->num_cpus;
699 static void aspeed_machine_class_init(ObjectClass *oc, void *data)
701 MachineClass *mc = MACHINE_CLASS(oc);
702 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
704 mc->init = aspeed_machine_init;
705 mc->no_floppy = 1;
706 mc->no_cdrom = 1;
707 mc->no_parallel = 1;
708 mc->default_ram_id = "ram";
709 amc->macs_mask = ASPEED_MAC0_ON;
711 aspeed_machine_class_props_init(oc);
714 static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
716 MachineClass *mc = MACHINE_CLASS(oc);
717 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
719 mc->desc = "OpenPOWER Palmetto BMC (ARM926EJ-S)";
720 amc->soc_name = "ast2400-a1";
721 amc->hw_strap1 = PALMETTO_BMC_HW_STRAP1;
722 amc->fmc_model = "n25q256a";
723 amc->spi_model = "mx25l25635e";
724 amc->num_cs = 1;
725 amc->i2c_init = palmetto_bmc_i2c_init;
726 mc->default_ram_size = 256 * MiB;
727 mc->default_cpus = mc->min_cpus = mc->max_cpus =
728 aspeed_soc_num_cpus(amc->soc_name);
731 static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc,
732 void *data)
734 MachineClass *mc = MACHINE_CLASS(oc);
735 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
737 mc->desc = "Supermicro X11 BMC (ARM926EJ-S)";
738 amc->soc_name = "ast2400-a1";
739 amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1;
740 amc->fmc_model = "mx25l25635e";
741 amc->spi_model = "mx25l25635e";
742 amc->num_cs = 1;
743 amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
744 amc->i2c_init = palmetto_bmc_i2c_init;
745 mc->default_ram_size = 256 * MiB;
748 static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data)
750 MachineClass *mc = MACHINE_CLASS(oc);
751 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
753 mc->desc = "Aspeed AST2500 EVB (ARM1176)";
754 amc->soc_name = "ast2500-a1";
755 amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
756 amc->fmc_model = "w25q256";
757 amc->spi_model = "mx25l25635e";
758 amc->num_cs = 1;
759 amc->i2c_init = ast2500_evb_i2c_init;
760 mc->default_ram_size = 512 * MiB;
761 mc->default_cpus = mc->min_cpus = mc->max_cpus =
762 aspeed_soc_num_cpus(amc->soc_name);
765 static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data)
767 MachineClass *mc = MACHINE_CLASS(oc);
768 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
770 mc->desc = "OpenPOWER Romulus BMC (ARM1176)";
771 amc->soc_name = "ast2500-a1";
772 amc->hw_strap1 = ROMULUS_BMC_HW_STRAP1;
773 amc->fmc_model = "n25q256a";
774 amc->spi_model = "mx66l1g45g";
775 amc->num_cs = 2;
776 amc->i2c_init = romulus_bmc_i2c_init;
777 mc->default_ram_size = 512 * MiB;
778 mc->default_cpus = mc->min_cpus = mc->max_cpus =
779 aspeed_soc_num_cpus(amc->soc_name);
782 static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data)
784 MachineClass *mc = MACHINE_CLASS(oc);
785 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
787 mc->desc = "OCP SonoraPass BMC (ARM1176)";
788 amc->soc_name = "ast2500-a1";
789 amc->hw_strap1 = SONORAPASS_BMC_HW_STRAP1;
790 amc->fmc_model = "mx66l1g45g";
791 amc->spi_model = "mx66l1g45g";
792 amc->num_cs = 2;
793 amc->i2c_init = sonorapass_bmc_i2c_init;
794 mc->default_ram_size = 512 * MiB;
795 mc->default_cpus = mc->min_cpus = mc->max_cpus =
796 aspeed_soc_num_cpus(amc->soc_name);
799 static void aspeed_machine_swift_class_init(ObjectClass *oc, void *data)
801 MachineClass *mc = MACHINE_CLASS(oc);
802 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
804 mc->desc = "OpenPOWER Swift BMC (ARM1176)";
805 amc->soc_name = "ast2500-a1";
806 amc->hw_strap1 = SWIFT_BMC_HW_STRAP1;
807 amc->fmc_model = "mx66l1g45g";
808 amc->spi_model = "mx66l1g45g";
809 amc->num_cs = 2;
810 amc->i2c_init = swift_bmc_i2c_init;
811 mc->default_ram_size = 512 * MiB;
812 mc->default_cpus = mc->min_cpus = mc->max_cpus =
813 aspeed_soc_num_cpus(amc->soc_name);
816 static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data)
818 MachineClass *mc = MACHINE_CLASS(oc);
819 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
821 mc->desc = "OpenPOWER Witherspoon BMC (ARM1176)";
822 amc->soc_name = "ast2500-a1";
823 amc->hw_strap1 = WITHERSPOON_BMC_HW_STRAP1;
824 amc->fmc_model = "mx25l25635e";
825 amc->spi_model = "mx66l1g45g";
826 amc->num_cs = 2;
827 amc->i2c_init = witherspoon_bmc_i2c_init;
828 mc->default_ram_size = 512 * MiB;
829 mc->default_cpus = mc->min_cpus = mc->max_cpus =
830 aspeed_soc_num_cpus(amc->soc_name);
833 static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
835 MachineClass *mc = MACHINE_CLASS(oc);
836 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
838 mc->desc = "Aspeed AST2600 EVB (Cortex A7)";
839 amc->soc_name = "ast2600-a1";
840 amc->hw_strap1 = AST2600_EVB_HW_STRAP1;
841 amc->hw_strap2 = AST2600_EVB_HW_STRAP2;
842 amc->fmc_model = "w25q512jv";
843 amc->spi_model = "mx66u51235f";
844 amc->num_cs = 1;
845 amc->macs_mask = ASPEED_MAC1_ON | ASPEED_MAC2_ON | ASPEED_MAC3_ON;
846 amc->i2c_init = ast2600_evb_i2c_init;
847 mc->default_ram_size = 1 * GiB;
848 mc->default_cpus = mc->min_cpus = mc->max_cpus =
849 aspeed_soc_num_cpus(amc->soc_name);
852 static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data)
854 MachineClass *mc = MACHINE_CLASS(oc);
855 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
857 mc->desc = "OpenPOWER Tacoma BMC (Cortex A7)";
858 amc->soc_name = "ast2600-a1";
859 amc->hw_strap1 = TACOMA_BMC_HW_STRAP1;
860 amc->hw_strap2 = TACOMA_BMC_HW_STRAP2;
861 amc->fmc_model = "mx66l1g45g";
862 amc->spi_model = "mx66l1g45g";
863 amc->num_cs = 2;
864 amc->macs_mask = ASPEED_MAC2_ON;
865 amc->i2c_init = witherspoon_bmc_i2c_init; /* Same board layout */
866 mc->default_ram_size = 1 * GiB;
867 mc->default_cpus = mc->min_cpus = mc->max_cpus =
868 aspeed_soc_num_cpus(amc->soc_name);
871 static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data)
873 MachineClass *mc = MACHINE_CLASS(oc);
874 AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
876 mc->desc = "Bytedance G220A BMC (ARM1176)";
877 amc->soc_name = "ast2500-a1";
878 amc->hw_strap1 = G220A_BMC_HW_STRAP1;
879 amc->fmc_model = "n25q512a";
880 amc->spi_model = "mx25l25635e";
881 amc->num_cs = 2;
882 amc->macs_mask = ASPEED_MAC1_ON | ASPEED_MAC2_ON;
883 amc->i2c_init = g220a_bmc_i2c_init;
884 mc->default_ram_size = 1024 * MiB;
885 mc->default_cpus = mc->min_cpus = mc->max_cpus =
886 aspeed_soc_num_cpus(amc->soc_name);
889 static const TypeInfo aspeed_machine_types[] = {
891 .name = MACHINE_TYPE_NAME("palmetto-bmc"),
892 .parent = TYPE_ASPEED_MACHINE,
893 .class_init = aspeed_machine_palmetto_class_init,
894 }, {
895 .name = MACHINE_TYPE_NAME("supermicrox11-bmc"),
896 .parent = TYPE_ASPEED_MACHINE,
897 .class_init = aspeed_machine_supermicrox11_bmc_class_init,
898 }, {
899 .name = MACHINE_TYPE_NAME("ast2500-evb"),
900 .parent = TYPE_ASPEED_MACHINE,
901 .class_init = aspeed_machine_ast2500_evb_class_init,
902 }, {
903 .name = MACHINE_TYPE_NAME("romulus-bmc"),
904 .parent = TYPE_ASPEED_MACHINE,
905 .class_init = aspeed_machine_romulus_class_init,
906 }, {
907 .name = MACHINE_TYPE_NAME("swift-bmc"),
908 .parent = TYPE_ASPEED_MACHINE,
909 .class_init = aspeed_machine_swift_class_init,
910 }, {
911 .name = MACHINE_TYPE_NAME("sonorapass-bmc"),
912 .parent = TYPE_ASPEED_MACHINE,
913 .class_init = aspeed_machine_sonorapass_class_init,
914 }, {
915 .name = MACHINE_TYPE_NAME("witherspoon-bmc"),
916 .parent = TYPE_ASPEED_MACHINE,
917 .class_init = aspeed_machine_witherspoon_class_init,
918 }, {
919 .name = MACHINE_TYPE_NAME("ast2600-evb"),
920 .parent = TYPE_ASPEED_MACHINE,
921 .class_init = aspeed_machine_ast2600_evb_class_init,
922 }, {
923 .name = MACHINE_TYPE_NAME("tacoma-bmc"),
924 .parent = TYPE_ASPEED_MACHINE,
925 .class_init = aspeed_machine_tacoma_class_init,
926 }, {
927 .name = MACHINE_TYPE_NAME("g220a-bmc"),
928 .parent = TYPE_ASPEED_MACHINE,
929 .class_init = aspeed_machine_g220a_class_init,
930 }, {
931 .name = TYPE_ASPEED_MACHINE,
932 .parent = TYPE_MACHINE,
933 .instance_size = sizeof(AspeedMachineState),
934 .instance_init = aspeed_machine_instance_init,
935 .class_size = sizeof(AspeedMachineClass),
936 .class_init = aspeed_machine_class_init,
937 .abstract = true,
941 DEFINE_TYPES(aspeed_machine_types)