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