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